정리 노트

확률적 경사 하강법의 변형들 본문

개념 정리/머신러닝 & 딥러닝 & A.I

확률적 경사 하강법의 변형들

꿈만 꾸는 학부생 2022. 12. 10. 15:35
728x90

이 포스트는 국민대학교 소프트웨어학부 '인공지능' 강의를 듣고 요약하는 포스트입니다. 원하시는 정보가 없을 수도 있습니다. 이 점 유의 바랍니다. 오류 지적은 매우 환영합니다!


2022.10.20 - [개념 정리/머신러닝 & 딥러닝 & A.I] - 확률적 경사 하강(SGD)

 

확률적 경사 하강(SGD)

이 포스트는 국민대학교 소프트웨어학부 '컴퓨터 비전' 강의를 듣고 요약하는 포스트입니다. 원하시는 정보가 없을 수도 있습니다. 이 점 유의 바랍니다. 질문과 오류 지적은 매우 환영합니다! G

study-note-99.tistory.com

이번 글에서는 확률적 경사 하강법의 변형들을 살펴보겠습니다. 확률적 경사 하강법에 대한 내용은 제가 전에 적었던 글을 읽고 오시면 조금이나마 감을 잡으실 수 있을 것입니다.

경사 하강법이 가지고 있는 문제점

일반적인 경사 하강법(Gradient Descent)과 확률적 경사 하강법(Stochastic Gradient Descent)에는 공통적으로 경사 하강법이라 가지고 있는 문제점이 몇 가지 있습니다.

  1. 지역 최적화(Local Minima): 손실 함수의 모양이 convex하지 않은 경우, 함수의 극값이 0이 곳을 찾아도 그곳이 전체 함수의 최솟값이라는 보장을 할 수 없습니다.
  2. 안장점(Saddle Points): 함수의 경사도가 평탄한 구조(경사도의 변화가 거의 없는 구간)에서 학습이 멈출 수도 있습니다.
  3. 잡음 현상: 확률적 경사 하강법 과정에서 배치 안에 잡음이 있을 경우, 이 잡음까지 경사도에 반영될 수 있습니다.

weight과 cost의 관계가 convex하지 않은 경우

모델의 weight과 cost 간의 관계가 위와 같이 convex 한 모양을 가지지 않는다고 합시다. 만약 가로축이 -3인 부근에서 경사 하강법이 시작되면 -2 부근에서 최적의 값을 찾을 것입니다. 하지만 (0, 1) 구간에 있는 최솟값보다 크기 때문에 전체를 기준으로 최적의 값이 아닙니다.

관성

잡음의 문제를 해결하기 위해 '관성(가속도)'가 등장했습니다. 여기서의 관성은 지금까지 어떻게 이동했었는지 기억하며 기존 방향으로 일정 이상 추가적으로 이동하는 것을 얘기합니다. 관성을 적용하면 경사도에 부드러움을 줄 수 있어 잡음의 효과를 줄일 수 있습니다. 또한 수렴 속도도 빨라져서 local minima나 안장점의 문제도 완화시킬 수 있게 됩니다.

관성을 이용한 확률적 경사 하강법

관성(momentum)이 적용된 SGD 알고리즘은 아래와 같습니다.

source: [도서]Deep Learning(by Ian Goodfellow, Yoshua Bengio, Aaron Courville)

이 알고리즘에서 속도 벡터 v가 등장합니다. 속도 벡터는 그동안의 경사도를 누적한 것으로 초기에는 영벡터로 초기화한 상태로 시작됩니다. 그리고 momentum parameter는 관성을 얼마나 부여할지 결정하는 파라미터입니다. 0이면 관성이 아예 없게 되므로 기존의 경사도 갱신하는 방법과 동일하게 됩니다. 1에 가까워질수록 이전 경사도 정보들에 큰 가중치를 주게 되므로 모델의 파라미터가 그리는 궤적이 매끄러워지게 됩니다.

이를 바탕으로 위 알고리즘을 아래처럼 다시 설명할 수 있습니다.

  1. 모델의 현재 파라미터의 경사도 계산
  2. (momentum parameter) * 속도 벡터 - (learning rate) * 경사도 식을 통해 속도 벡터 갱신
  3. 현재 모델의 파라미터와 속도 벡터를 더해서 새롭게 경사도 갱신

네스테로프 가속 경사도 관성(Nesterov Accelerated Gradient, NAG)

관성을 이용한 다른 경사 하강법으로 네스테로프 가속 경사도가 있습니다. 위에서 설명한 방법과 다른 방법으로 경사도가 갱신됩니다.

source: [도서]Deep Learning

  1. 현재의 속도 벡터가 적용된 모델의 파라미터 계산
  2. 계산된 파리미터에서의 경사도 계산
  3. (momentum parameter) * 속도 벡터 - (learning rate) * 경사도 식을 통해 속도 벡터 갱신
  4. 계산된 파라미터와 속도 벡터를 더해서 새롭게 경사도 갱신

위에서는 현재 모델의 파라미터에서 경사도를 계산했습니다. 여기서는 관성에 의해 이동된 모델의 파라미터에서 경사도를 계산했습니다. 바로 이 경사도를 계산하는 때의 차이가 두 알고리즘의 차이입니다.

source: https://medium.com/konvergen/momentum-method-and-nesterov-accelerated-gradient-487ba776c987

적응적 학습률 기반의 확률적 경사 하강법

기존 경사도 갱신 과정에서는 모든 매개 변수들(𝜃)에 같은 학습률(𝜌)이 적용됐었습니다.

$$ \rho{\partial J\over\partial\theta} =  \left( \rho{\partial J\over\partial\theta_1}, \rho{\partial J\over\partial\theta_2}, ..., \rho{\partial J\over\partial\theta_k} \right)^T $$

이런 상황에서 새롭게 등장한 것이 적응적 학습률(adaptive learning rates or per-parameter learning rates)입니다. 이 방법은 각 매개 변수의 상황마다 학습률을 조절해서 사용하는 방법입니다.

Adaptive Gradient(AdaGrad)

source: [도서]Deep Learning

AdaGrad 알고리즘에서는 r 벡터가 새로 등장합니다. 벡터 r은 이전의 경사도를 누적한 벡터입니다. 이는 초기에 영벡터로 초기화됩니다. \( \delta \)는 0으로 나누는 것을 방지하기 위해 추가된 아주 작은 상수입니다. AdaGrad 알고리즘의 순서는 다음과 같습니다.

  1. 현재 파라미터(𝜃)에 대해 gradient를 구합니다.
  2. 계산한 gradient를 자기 자신과 element-wise 곱셈한 후 r 벡터에 더해줍니다.
  3. 벡터 r과 gradient(g)를 이용해 Δ𝜃를 계산합니다.
  4. 𝜃 + Δ𝜃 를 통해 𝜃를 갱신합니다.

벡터 r을 수식으로 표현하면 아래와 같습니다.

$$ r = \left( r_1, r_2, ..., r_k \right)^T = \left( r_1 + g_1^2, r_2 + g_2^2, r_k + g_k^2 \right)^T $$

Δ𝜃를 수식으로 표현하면 아래와 같습니다.

$$ \Delta\theta = \left( \Delta\theta_1, \Delta\theta_2,..., \Delta\theta_k \right)^T = \left( -\frac{\rho g_1}{\epsilon+\sqrt{r_1}}, -\frac{\rho g_2}{\epsilon+\sqrt{r_2}}, ..., -\frac{\rho g_k}{\epsilon+\sqrt{r_k}} \right)^T $$

\(r_k\)의 값의 크기에 따라 \( \Delta\theta_k \)의 크기가 달라질 것입니다.

RMSProp

RMSProp은 AdaGrad의 문제점을 보완하기 위해 등장했습니다. AdaGrad 알고리즘에서는 단순히 경사도의 제곱을 벡터 r에 더해줬습니다. 따라서 예전의 경사도와 최근의 경사도는 같은 비중을 가지게 됩니다. 그러면 벡터 r의 값은 점점 커져서 모델의 수렴을 방해할 가능성이 생깁니다. 따라서 RMSProp에서는 벡터 r을 새로운 방법으로 갱신합니다.

source: [도서]Deep Learning

$$ r = \rho r + \left(1 - \rho \right) g^2 $$

\( \rho \)의 값이 작을수록 최근 경사도에 가중치를 많이 부여하게 됩니다. 이 식에서도 경사도끼리의 곱은 element-wise 곱셈입니다.

Adaptive Momentum(Adam)

Adam 알고리즘은 RMSProp 알고리즘에 관성을 추가로 적용한 알고리즘입니다.

source: [도서]Deep Learning

  1. 현재 모델의 gradient를 계산
  2. 속도 벡터 s 갱신(관성)
  3. 경사도 누적 벡터 r 갱신(RMSProp)
  4. 벡터 r, s에 추가적인 계산 진행
  5. 벡터 r, s를 이용해서 Δ𝜃 계산
  6. Δ𝜃를 이용해 모델의 가중치 갱신

 

728x90

'개념 정리 > 머신러닝 & 딥러닝 & A.I' 카테고리의 다른 글

RNN(Recurrent Neural Network)  (2) 2022.12.12
GAN  (0) 2022.12.11
배치 정규화(Batch Normalization)  (0) 2022.12.04
Computational Graph(연산 그래프)  (0) 2022.11.25
규제(Regularize)  (0) 2022.11.25