본문 바로가기

딥러닝 & 머신러닝/딥러닝 지식

손실 함수 최적화에서 모멘텀(Momentum)의 필요성

Gradient 잡음 현상이라는 것이 있습니다. 머신러닝은 훈련 집합만, 그것도 그 안의 미니 배치들을 사용해서 손실(loss) 함수 값이 최저가 되도록 하는 최적의 가중치를 만드는 gradient를 추정하므로 오류, 즉 잡음이 있을 수밖에 없습니다.

 

모멘텀은 gradient에 스무딩(smoothing)을 가하여 잡음 효과를 줄이고, 이로써 손실 함수의 최저점으로 더 빠르게 가중치 값들이 수렴할 수 있도록 도와줍니다. 즉, 오버슈팅(overshooting)을 방지합니다.

 

오버슈팅에 대해서 더 설명하겠습니다. 이는 손실 함수의 landscape(모양)가 찌그러지면 모델 학습이 잘 안 되는 이유 또한 설명합니다. 아래 그림을 참고하세요.

 

위 그림은 가중치 w1, w2의 값에 따라서 loss를 줄일 수 있는 loss landscape입니다. loss는 궁극적으로 가중치 조정으로만 줄일 수 있다는 것을 알고 계세요. loss landscape는 맨 안쪽이 loss=0인 지점인, 움푹 파진 호수 모양입니다.

 

이상적인 가중치 업데이트는 빨간색 점선 벡터값을 갖고 이루어져야 합니다. 즉, 한 번에 쏙 loss=0인 지점으로 들어가면 아주 좋겠죠. 하지만 실제론 그렇지 않습니다.

 

w1, w2 축을 기준으로 loss landscape를 절삭했을 때, 시작 지점에서 w1의 gradient인 ▽w1은 아주 완만해 -0.1로 가정하지만, w2의 gradient인 ▽w2는 그에 비해 매우 가팔라서 100으로 가정하겠습니다. 그럼 w1과 w2가 업데이트되는 크기와 방향을 나타내는 벡터는 그림의 파란색 화살표들과 같습니다. 두 벡터를 더해보면 빨간색 실선 벡터값을 갖고 실제로 가중치 업데이트가 이루어집니다.

 

 

따라서, 실제로는 이상적 업데이트 방향과 완전히 다른 방향으로 loss=0인 곳을 향해 업데이트가 이루어집니다. 즉, 위 그림과 같이, 한참 헤매다가 loss landscape의 최저점에 도달합니다. 즉, 오버슈팅이란 gradient가 커야 할 것은 그 값이 작고(▽w1), gradient가 작아야 할 것은 그 값이 커서(▽w2), 완전히 다른 방향으로 w1, w2를 업데이트하기 때문에 loss landscape의 최저점을 향한 수렴이 잘 안 되는 현상을 뜻합니다.

 

이렇게 그냥 일반적인 Gradient Descent (GD) 만을 이용하면 매우 큰 방향으로 왔다갔다 하면서 loss=0, 즉 Global Minima에 도달하게 되는데, 이는 매우 비효율적이며 시간이 오래 걸립니다. 이러한 문제를 해결하기 위해 미니 배치마다 GD를 수행하는 Stochastic Gradient Descent (SGD) 방법이 도입되었고, 이 외에도 많은 옵티마이징 방법이 제안되었습니다. 그럼 이 글에서 다루고자 하는 모멘텀은 어떻게 일반적인 GD의 문제점을 해결할까요?

 

모멘텀(momentum)은 이렇게 loss 함수의 최저점을 향한 가중치 업데이트 여행을 조금 덜 헤매게 해줍니다. 모멘텀이 포함된 가중치 업데이트 공식은 아래와 같습니다.

 

 

여기서 ∂J/∂θ는 가중치 θ에서 loss 함수 J의 gradient 값, ρ는 학습률(learning rate)을 나타냅니다. v는 속도 벡터를 의미하는데, 수식에서 알 수 있듯이 이전 gradient를 누적한 것입니다. 이때 시작점에서의 v는 0입니다. α는 이전 gradient에 얼마나 큰 의미를 부여할지 결정하는 상수입니다. α는 0일 때 모멘텀이 없는 경우의 가중치 업데이트 공식과 같은데, 1에 가까울수록 이전 gradient에 더 큰 가중값을 두는 셈입니다.

 

즉, 모멘텀이란 과거에 이동했던 방식을 참고하여, 가중치가 조금 덜 헤매면서 loss landscape의 최저점을 향해 움직이도록 도와주는 요소입니다.