(JY) Loss function, 손실함수

(JY) Keras 사용해보기 1. What is keras? 케라스(Keras)는 텐서플로우 라이버러리 중 하나로, 딥러닝 모델 설계와 훈련을 위한 고수준 API이다. 사용자 친화적이고 모델의 구성이 쉽기 때문에 기본 이미지

dsbook.tistory.com

이전 글에서, 손실값을 어떻게 계산하는지, 특히 Cross entropy error 방법에 대해서 알아보았다. 손실값을 계산하는 방법에는 CEE방법 외에도 평균제곱오차(MSE)방법, Huber, Hinge 등 다양한 방법이 존재하며 어떤 데이터를 어떤 방식으로 학습시킬지에 따라 사용하는 사용하는 함수가 달라졌다.

크로스 엔트로피 손실함수에 대해 간략하게 리뷰해보면, 이 손실 함수는 실제값과 로그를 취한 예측값의 곱의 합으로 계산되는 함수이다. 분류 문제를 해결하기 위한 활성화 함수 sigmoid, softmax함수와 결합하여 함께 쓰이며 sigmoid 활성화 함수와 같이 사용될 때는 binary cross-entropy 함수를, 다중 분류 문제를 위해 softmax 활성화 함수가 쓰였으면 categorical cross-entropy 함수와 같이 사용된다.

 

 

1. 오차 역전파, Error Backpropagation

그럼 이렇게 구한 손실값을 써먹을 때가 왔다. 앞서 Fully connected Layer로 모델 구성을 통해 각 이미지가 어떻게 분류됐는지 쭉 계산해 왔다. 이것을 순전파라고 한다. 말 그대로 층을 거쳐가면서 앞쪽으로 Input값을 보내는 과정이다. 하지만 한 번 학습했다고 그 출력 값이 정확하지는 않을 것이다. 그러기 위해 우리는 그 출력 값과 실제값이 얼마나 차이가 나는지 계산했다. 그러면 그 손실값을 다시 앞으로 보내 출력 값이 정확하게 나오도록 각각의 Layer의 노드들의 가중치와 편향(bias)을 업데이트해주는 과정을 오차역전파라고 한다.

 

 

2. 최적화, Optimizer

오차역전파로 노드들의 가중치와 편향(bias)을 계속 업데이트하여 만들어진 모델을 통해 더 나은 결과를 얻을 수 있도록 해준다는 것을 알았다. 하지만 위처럼 간단한 모델이라면 그 오차를 계산하고 업데이트하는데 많은 시간이 걸리지 않겠지만, 데이터의 양이 늘어나거나 hidden layer, 은닉층의 개수가 늘어날수록 계산이 복잡해지고 시간도 오래 걸릴 것이다. 따라서 이 시간을 줄이기 위해 고안한 방법이 경사하강법(Gradient Descent)를 이용하는 것이다.

경사하강법이란, 위의 손실 함수 그래프에서 학습의 반복을 통해 손실된 값의 최저점을 찾는 방식이다. 여기서 "경사를 탄다"는 것은 해당 손실 함수의 미분 값을 계산하는 것을 의미하며, 이 미분 값이 최소(0)가 되는 지점으로 다가간다는 것을 의미한다. 울창한 산맥의 어느 지점에서 마을(최저점)로 내려오는 방법을 찾는 것과 유사하다고 생각하면 이해하기 쉽다.

물론 이 방법에도 몇 가지 문제점이 존재한다. 우선, 정도의 문제가 있다. 학습을 몇 번 반복할 것인지, 학습률(learning rate)은 어떻게 할 것인지에 따라 드는 시간과 비용이 달라진다. 최적 반복 횟수를 구하기 위해서는 반복 횟수와 학습률을 조절해가면서 시간과 정확도를 비교해보는 수밖에 없다. 두 번째 문제점으로는, 아예 엉뚱한 최저점을 찾을 수 있다는 것이다. 위의 그림처럼 최저점이 1개라면 문제가 없지만, 만약 극솟점이 여러 개 있다고 하면, 그리고 엉뚱한 극소점을 향해 학습되고 있다면, 학습 결과는 아예 달라져버릴 수도 있다. 이 문제를 해결하기 위해 많은 사람들이 노력해왔으며, 그 결과 경사하강법을 발전시키기 위한 다양한 함수들이 탄생했다.

 

허용호, 자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.

 

  • SGD (Stochastic Gradient Decent) : 앞서 경사하강법을 그대로 사용하면 연산 횟수가 너무 많아지게 된다. 따라서 일단 대충대충 조금씩만 훑어보고 일단 빨리빨리 가보자는 것이 SGD 방법이다. 전체 학습 데이터(batch) 대신 일부 조그마한 데이터 모음(mini-batch)에 대해서만 학습을 시켜 빠르게 빠르게 조절해 가는 방법이다. 이 방법을 이용해 최종 목적지까지 찾아가는데 조금 많이 헤맬지는 몰라도 아무튼 경사하강법보다 빨리 목적지 근처에 도착할 수 있었다. 하지만 이 방법 역시 무작정 기울어진 방향으로 이동하는 방식이기 때문에 탐색 경로가 비효율적이다. 좀 더 효율적인 방법을 찾기 위해선 어느 방향으로 갈지, 탐색 방향과 얼마나 큰 보폭(학습률)으로 발을 디딜지, 스텝 사이즈를 잘 잡아야 한다.
  • Momentum : 이동방향에 관성을 주는 방법이다. 현재 기울기가 향하는 방향과는 별개로 그동안 내려왔던 이동 방식을 기억하면서 그 방향으로 일정 정도를 추가적으로 이동하는 방식이다. 이 방법을 통해 그나마 SGD보다 덜 헤매면서 목적지 근처에 무사히 내려올 수 있다.
  • NAG (Nesterov Accelerated Gradient) : Moment 방법이 현재 기울기가 향하는 방향에 관성 방향을 더하는 것이라면, NAG는 관성 방향을 먼저 고려하여 그 방향으로 이동한 후 그 방향에서 기울기를 구해 기울기 방향으로 이동하는 방법이다. Moment의 경우에는 멈춰야 할 시점에서도 관성에 의해 훨씬 멀리 갈 수 있다는 단점이 존재하지만, NAG에서는 일단 관성으로 이동한 뒤 어떻게 이동해야 할지 결정하므로 제동을 거는데 훨씬 더 용이하다.
  • Adagrad (Adaptive Gradient) : 변수들을 업데이트할 때 각각의 변수마다 스텝 사이즈를 다르게 설정해서 이동하는 방식이다. 지금까지 많이 변했던 변수들은 스텝사이즈를 작게하고, 변하지 않았던 변수들은 스텝사이즈를 크게 하자는 것이 기본적인 아이디어이다. 자주 등장했거나 변화를 많이 한 변수들은 그만큼 목적지에 가까이 있을 확률이 높기 때문에 세세하게 조정을 하는 것이고, 그렇지 않은 변수들은 도달하기 위해선 많이 변해야 하기 때문에 큼직큼직하게 조정을 하는 것이다. 다만 학습을 너무 진행하면 스텝 사이즈가 너무 작아져 결국 거의 움직이지 않게 될 문제가 있다.
  • RMSProp, AdaDelta : Adagrad의 단점을 보안하기 위한 방법이다. 둘 다 Adagrad와 비슷하지만 RMSProp 방법의 경우, 상대적인 크기 차이를 유지하면서 이동하기 때문에 스텝 사이즈가 너무 작아져서 멈추는 것을 막는 방법이다. Adagrad가 어떤 단점을 갖는지, 그리고 RMSProp와 AdaDelta는 그것을 어떻게 극복했는지 살펴보려면 수학적으로 접근해야 하기 때문에 이 부분에서는 생략하겠다.
  • Adam : RMSProp와 Momentum을 합친 알고리즘이다. 일단 잘 모르겠으면 Adam을 사용하라고 하자.

위 방법들이 어떻게 작동하는지 수학적으로 알고 싶으면 아래 두 글을 참조하는 것이 도움이 될 것이다.

 

수식과 코드로 보는 경사하강법(SGD,Momentum,NAG,Adagrad,RMSprop,Adam,AdaDelta)

1. 개요 가중치를 조절하는 방법으로 다들 경사 하강법을 알고 계실 것이라 생각합니다. 경사 하강법은 정확하게 가중치를 찾아가지만 가중치를 변경할때마다 전체 데이터에 대해 미분해야 하��

twinw.tistory.com

 

Gradient Descent Optimization Algorithms 정리

Neural network의 weight을 조절하는 과정에는 보통 ‘Gradient Descent’ 라는 방법을 사용한다. 이는 네트워크의 parameter들을 $\theta$라고 했을 때, 네트워크에서 내놓는 결과값과 실제 결과값 사이의 차이

shuuki4.github.io

 

 

3. Summary

손실 값을 계산하고 각 노드들의 가중치와 편향(bias)을 업데이트 하면서 학습시키는 방법에 대해 살펴보았다. 각 노드들을 오차역전파로 업데이트 하는데, 이 때 경사하강법을 이용해서 가중치를 업데이트 한다. 경사하강법은 시간이 지나면서 발전해왔고, SGD, Momentum, NAG, Nadam, Adagrad, RMSProp, AdaDelta, Adam 등으로 계승되어 왔으며, 현재 가장 인기있고 많이 사용하는 최적화 방법으로는 Adam 최적화 함수를 이용해 가중치를 업데이트 하는 것이다. Keras 라이브러리에선 위의 경사하강법을 함수로 제공한다.

 

Keras documentation: Optimizers

Optimizers Usage with compile() & fit() An optimizer is one of the two arguments required for compiling a Keras model: from tensorflow import keras from tensorflow.keras import layers model = keras.Sequential() model.add(layers.Dense(64, kernel_initializer

keras.io

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기