SGD를 적용함으로 계산의 복잡도를 줄일 수 있지만, 몇 가지 문제점이 생깁니다.
문제점을 들어가기 앞서 그래디언트 디센트를 설명하기위한 이미지를 하나 이해하고 넘어가겠습니다.
3차원 입체적인 경사를 Scatter형식의 2차원 등고선으로 표현
경사하강법에는 몇가지 문제점이 있습니다. SGD와 같은 업그레이드된 최적화 방법을 적용한다고 해도 경사하강법이 갖는 근본적인 문제입니다
첫째, 노이즈 문제 입니다. Oscillation(진동) 문제라고 하기도 합니다. 바로 적당한 값의 learning rate를 선택하는 것이 너무 어렵다.는 것입니다. 학습률(learning rate)이 낮으면 천천히 가는 대신 최솟값 근처에서 안정적으로 수렴할 수 있지만, 학습률이 높으면 빠르게 가는 대신 최솟값 근처에서 왔다 갔다 주변을 왔다갔다 거리거나 발산해버립니다.이렇게 왔다 갔다 하면서 최솟값을 찾는데 시간을 낭비하는 현상을 Oscillation 문제라고 합니다.
둘째, 극소(Local Minimum) 문제 입니다. 우리는 loss function에서 global minimum 부분 즉, loss가 최소화되는 부분을 찾길 원합니다. 하지만 optimizer가 착각하여 loss function의 수많은 local minimum 중 global minimum에 해당하지 않는 local minimum에 멈추거나 완만한 경사지역 Saddle point 에 빠질 수 있습니다. 우리가 마주칠 대부분의 문제는 Non-convex 함수이므로 단순한 경사하강법으로는 한계가 있습니다.
위의 문제가 일반적인 GD의 문제 였다면, SGD의 문제점은 노이즈가 심하다는 것입니다.
경사면을 따라 최적점을 찾아 가기는 하지만, 미니배치를 이용하기 때문에 완만하게 내려가지 못한다는 것입니다.
그래서 이러한 문제점들을 보완하기위한 SGD변형 알고리즘에 대해 알아보겠습니다.
4.4 Variants of SGD
(1. monentum / 2.Nestrov Monentum / 3.AdaGrid / 4. RMSprop / 5. Adam)
1.SGD with Momentum (Momentum SGD) : 속도를 빠르게!!
가속도(탄력)의 개념을 추가하여 속도에 gradient를 더한 값으로 gradient descent를 수행하는 방식입니다. SGD가 손실함수를 편미분(접선의 기울기)을 가지고 W를 업데이트 했다면, 모멘텀은 현재의 기울기+이전의 기울기를 포함하여 누적된 가속도로 W를 업데이트 합니다.(물리적 관성의 개념)
- SGD의 문제점들(poor conditioning, local minima/saddle point, gradient noise)을 해결하는데 도움이 됩니다. (velocity를 구할 때, 평균을 구하는 것처럼 noise를 경감시키는 효과가 있다)
- 일반적으로 friction rate ρρ를 0.9 혹은 0.99로 사용하고, velocity vv의 초깃값으로 0를 사용합니다.
- 단점은 속도는 빠르지만, 과거값을 누적하는 방식이므로 메모리가 더 필요하다. 또한 최적점(global optima)에서도 이전 가속도가 더해지기 때문에 지나치는 현상이 발생합니다.
2.SGD with Nesterov Momentum
SGD모멘텀의 변형방식입니다. 최적점을 지나치는 현상을 개선하기 위해 이전 가속도를 조금 줄여서 반영하는 방식으로 수정된 알고리즘 입니다. 현재 위치에서 gradient를 계산하는 momentum update와는 달리, velocity만으로 update한 지점에서 계산한 gradient를 사용하여 gradient descent를 수행한다.
모멘텀이 현재의 기울기+이전의 기울기로 구하는 방식이었다면, 네스트로브는 현재의 기울기+이전의 기울기를 구한다음 이전 기울기의 누적치를 빼줌으로써 모멘텀의 추월 현상을 줄여준다는 이론이다. (다른말로, 모멘텀을 진행한 상태에서 그 상태에서 기울기를 계산하여 더하는 것이라고 말하기도 함) 하지만 성능상 크게 향상되지 않아서 디표트 = 모멘텀!!
3.AdaGrad (Adepted 1번째 방식)
속도를 높이는 것보다 일직선으로 향하게 하는 방식이다. 모멘텀 방식이 지그재그 현상을 개선하지 못했다면 AdaGrad방식은 w의 업데이트량을 보정함으로써 해결하는 방식이다. 어댑티브 방식을 사용할 경우 아래 그림과 같이 모멘텀 옵티마이져에서 휘어지는 부분을 보다 일직선으로 만들 수 있다.
경사가 완만해지는 구간에서 (skewed space) 느려지는 단점이 있다. 이유는 제곱된 부분이 끊임없이 누적되기 때문에 나누어주는 수가 커져서 W업데이트가 느려지고 결국 0이 된다.
계산 방식은 현재의 기울기(w1)을 그냥 대입는 것이 아니라 제곱하고(음수도 양수가 되도록) 루트씌워서 (크기만 원상복귀하여 마이너스만 제거) 양수로 만든다음 나누어 준다.( +제곱해 준 부분만 누적되어 저장된다.)
지금은 많이 사용하지 않지만, 연구는 활발하게 진행되는 알고리즘 이라고 한다.
4. RMS Prop (Adepted 2번째 방식)
AdaGrad의 제곱부분을 계속해서 누적할 때, 누적값이 너무 커져서 느려지는 부분을 개선한 방식으로, 이전에 제곱되어 누적된 값과 새롭게 제곱되어 누적되는 부분의 반영비율을 decay라는 상수로 조절해주는 방식이다.
예를들어, 만약 decay가 0.9라면 이전의 누적된 기울기(그래디언트)의 제곱은 90%만 반영해서 누적, 현재 그래디언트의 제곱은 10%만 반영하겠다는 것이다.
이럴경우 속도가 느려졌다면, decay를 줄여서 누적값의 반영을 줄인다면, 나누는(분모)부분이 작아져서 업데이트 속도가 올라갈것이라는 알고리즘이다.
위의 AdaGrad와 마찬가지로 모멘텀의 지그재그 현상은 많이 개선된 듯한 모습니다. 마지막으로 가장 많이 쓰이는 Momentum+RMSProp 을 합친 Adam 알고리즘에 대해 알아보겠습니다.
5.Adam
Adam 은 RMSProp 와 Momentum을 합친 개념입니다. (모멘텀 방식+어댑티브 방식)
Adam의 수식에 대한 자세한 풀이가 알고싶은 분은 링크를 참조하길 바란다. 난 봐도 잘 모르겠는걸… [링크]
Adam은 빠르고 완만하게 잘 가도록 두 알고리즘의 장점만 모아 두었지만, t가 0일때 (시작지점에서) friction coeffitient인 beta2가 0.999가량의 매우 큰 값을 갖게 된다. 이것은 우리가 moment2를 0로 initialize 하였는데 first gradient step에서 moment2는 0에 매우 근접한 값을 갖게되어 moment2를 square root 취하었을때 0에 근접한 값을 갖게하여 결국 시작 step에서 매우큰 gradient step을 갖게된다 이것은 때때로 매우 나쁜 결과로 이끌 수 있다.
이런 문제를 극복하기 위해서 위의 코드에 bias correction을 추가시켜준다고 한다.
강의에서는 다음과 같은 하이퍼파라미터를 사용하는것이 좋다고 말한다. 이런건 그냥 묻지않고 쓰는걸로~