[Basic] - 확률적 경사 하강법 SGD(Stochastic Gradient Descent)

반응형

경사하강법은 지도 학습에서 Loss 값이 최소가 되게하는 조건을 만족시켜주는 식입니다.

스텝사이즈에서 Loss의 gradient를 곱한 다음에 현재 가중치에서 빼서 다음 가중치로 업데이트를 시켜줍니다.

 

데이터가 엄청 많다면 모델에 큰 너무 배열이 들어오게 됩니다. 배열의 크기가 크다면 연산의 속도가 느리고 하드웨어적으로 메모리가 부족한 문제가 발생할 수 있습니다.

 

그래서 이런 문제를 해결하기 위해 데이터 전체를 넣는 것이 아닌 mini-batch라는 이름을 가진 부분으로 쪼갭니다. 데이터를 그냥 쪼개면 순서에 영향을 미칠 수도 있으니 shuffle한 후에 나눠줍니다.

 

확률적 경사 하강법은 일반 경사하강법과 식이 똑같습니다. 단지 차이는 경사 하강법은 전체 데이터를 이용한다는 것이고 SGD는 일부 데이터를 이용해서 업데이트 한다는 것입니다.

 

 

SGD의 학습률을 봅시다.

딥러닝 학습할 때 Optimizer로 Adam을 거의 디폴트로 선택하죠?

SGD에서 학습률을 정해줄 때 모멘텀 기반의 학습률과 가변 학습률을 합쳐서 만든 방법이에요.

학습률에 해당하는 뮤값을 고정하는게 아닌 Gradient 값을 참고해서 학습률을 조정해주겠다는 것입니다.

 

여러가지 최적화 방법

스케줄링 Scheduling - learning rate를 조절하자 !

  • StepLR → 예를 들어 epoch 10까지는 10의 -3제곱을 lr로 사용하다가 epoch 11부터 10의 -4제곱을 lr로 사용하는 것입니다. 학습 횟수에 따라서 스텝 사이즈를 낮춰주는 방식이죠.
  • ExponentialLR - 감마 값의 epoch 제곱에 뮤값을 곱해줍니다.

ex. 0.9의 0제곱 u = u , 0.9의 1제곱 u = 0.9u , 0.9의 2제곱 u = 0.81 u …

  • Cosine Annealing - Cosine은 파도 물결의 그래프 형태를 가지고 있습니다. 이런 특징을 가지고 스케줄링을 해주는 것인데요, 먼저 Min값과 Max값을 각각 정해줍니다. 작은 값을 사용할 때와 큰 값을 사용할 때를 나눠주는 것이죠.

정리

기본적으로 사용하는 최적화 기법은 Gradient Descent를 사용해서 데이터 전체를 받아서 학습하는 것인데, 이렇게 할 경우 데이터가 많으면 하드웨어적인 문제가 발생할 위험이 있습니다.

 

그래서 SGD를 이용했죠 ? mini-batch라는 것을 만들어서 데이터를 분할하여 학습했습니다.

SGD의 단점은 학습률이 고정되어있다는 것입니다.

 

업데이트하는 양을 조절해주고 싶을 때 두 가지 방법이 있었는데요, 모멘텀기반(Momentum)과 가변학습률(RmsProp) 기반이 있었습니다. 이 두 가지 방법을 합친 Adam을 만들었고, 가장 자주 사용합니다.

 

이미 정해진 기법이 아닌 스텝 사이즈를 전략적으로 변경하는 방법을 스케줄링이라고 했습니다.

스텝사이즈를 어떻게 움직이게 할 것이냐에 대해서 전략을 짜는 것입니다.

스케줄링을 사용할 때는 가변학습률을 사용하지 않고 모멘텀 기법과 함께 사용하거나 일반 SGD와 함께 사용합니다. ( SGD + momentum + Scheduling 조합 추천 )

반응형