이전 게시물에서 손실 함수의 값을 최소로 하는 매개변수를 찾는 방법인 경사하강법에 대해 설명했습니다. 이를 최적화(optimization)라고 합니다. 현재의 손살 함수 값이 감소하는 방향으로 매개변수를 갱신하는 것입니다.
지금까지 최적의 매개변수 값을 찾는 단서로 매개변수의 기울기(미분)를 이용했습니다. 이번 게시물에서는 최적화를 시키는 다양한 방법들에 대해 설명하겠습니다.
- BGD(Batch Gradient Descent, 배치 경사하강법)
- SGD(Stochastic Gradient Descent, 확률적 경사하강법)
- MSGD(Mini-Batch Stochastic Gradient Descent, 미니-배치 확률적 경사하강법)
- Momentum(모멘텀)
- Adagrad
- Adam
▶ BGD(Batch Gradient Descent, 배치 경사하강법)
학습데이터 전체를 하나로 묶어서 학습시키는 경사하강법입니다. 전체 데이터에 대한 손실 평균을 구하고 미분을 통해 기울기를 구한 뒤 경사하강법으로 최적화 시킵니다. 전체 데이터를 한번에 학습시켜버리기 때문에 업데이트 횟수가 굉장히 적으며, 모든 데이터에 대해 한번에 계산해야 하기 때문에 많은 메모리가 필요하고 계산비용이 많이 듭니다. 그러나 항상 같은 데이터에 대해 기울기를 구하기 때문에 안정적으로 수렴하고 global minimum 을 찾아갈 수 있습니다.
▶ SGD(Stochastic Gradient Descent, 확률적 경사하강법)
확률적 경사하강법은 전체 데이터 중 단 하나의 데이터를 이용하여 경사하강법을 1회 진행하는 방법입니다. 전체 데이터 중 무작위로 선택된 하나의 데이터로 학습을 하기 때문에 확률적이라고 부릅니다. 배치 경사하강법에 비해 적은 데이터로 학습이 가능하고, 적은 데이터를 사용하기 때문에 속도가 빠르다는 장점이 있습니다. 아래 그림은 SGD를 시각화한 모습인데 빨간선이 진동하는 이유는, 각 랜덤하게 선택된 데이터에 대한 손실 값의 기울기가 약간씩 다르기 때문입니다. 손실값의 평균이 아닌 개별 데이터에 대해 미분을 수행하면 기울기의 방향이 매번 크게 바뀝니다. 그러나 결국은 학습 데이터 전체에 대대 보편적으로 좋은 값을 내는 방향으로 수렴합니다. 다만, global minimum에 도달하기는 어렵습니다. 아래는 SGD의 수식과 시각화 그림입니다.
▶ MSGD(Mini-Batch Stochastic Gradient Descent, 미니-배치 확률적 경사하강법)
대부분의 딥러닝 라이브러리에 구현되어 있는 SGD는 이 방법으로 구현되어 있습니다. SGD와 BGD의 절충안으로, 전체 데이터를 batch size 개로 나눠 배치 학습 시키는 것입니다. 총 10개의 batch가 나온다면 1에폭당 10번의 매개변수 업데이트가 이루어지는 것입니다. 한 배치의 손실값의 평균으로 경사하강법을 진행하기 때문에 SGD 만큼 심하게는 아니지만 비슷하게 진동하듯이 그려집니다. 그때문에 local minima를 어느정도 벗어날 수 있습니다. 역시 일부데이터를 이용하기 때문에 BGD보다 계산량이 적습니다.
▶ Momentum(모멘텀)
모멘텀은 쉽게 말해 운동량입니다. 관성이라는 물리학 법칙을 응용한 방법입니다. 쉽게 말해 SGD에 관성을 더해주는 것입니다. 관성을 주는 이유는 local minima에 빠졌을 때 관성의 힘으로 벗어나기 위해서 입니다. 이를 식으로 쓰면 아래와 같습니다.
W는 갱신할 매개변수, 그 다음 aL/aW는 w에 대한 손실함수의 기울기, n은 학습률입니다. SGD와 비교하여 v라는 변수가 추가되는데, v라는 변수는 속도에 해당합니다. 첫번째식은 기울기 방향으로 힘을 받아 물체가 가속된다는 물리 법칙을 나타냅니다. av항은 물체가 아무런 힘을 받지 않을 때 서서히 하강시키는 역할을 합니다.
모멘텀의 갱신 경로는 공이 그릇 바닥을 구르듯이 움직입니다. SGD와 비교했을 때 진동하는 정도가 덜한 것을 알 수 있습니다. 이는 x축으로 변하는 힘은 아주 작지만 방향은 변하지 않아서 한 방향으로 일정하게 가속하기 때문입니다. 거꾸로 y축의 힘은 크지만 위 아래로 번갈아가면 받아서 상충하여 y축 방향의 속도는 아넝적이지 않게됩니다. 또한 모멘텀은 기존에 이동하던 방향에 관성이 있어 local minima에 빠져도 쉽게 벗어날 수 있고 더 좋은 minima로 이동할 수 있습니다.(SGD는 local minima에 빠지면 기울기가 0이 되어 이동하지 못합니다.)
▶ Adagrad
신경망에서 학습률(learning rate)은 매우 중요합니다. 이 값이 너무 작으면 학습 시간이 길어지고, 너무 크면 발산하여 학습이 잘 되지 않습니다. 이 방법은 학습률에 초점을 맞춘 방식입니다. 이 학습률을 정하는 효과적인 방법으로 학습률 감소(learning rate decay)가 있습니다. 학습을 진행하면서 학습률을 점점 줄여나가는데, 처음에는 크게 학습하고, 나중에는 점점 조금씩 작게 학습하는 방법입니다. Adagrad는 업데이트 횟수에 따라 학습률을 조절하는 옵션이 추가된 방법입니다. 많이 변화하지 않는 매개변수들은 학습률을 크게 하고, 자주 변화하는 매개 변수들에 대해서는 학습률을 작게 설정해줍니다. 즉, 각각의 매개변수에 맞춤형 값을 적용하는 것입니다. 아래는 Adagrad의 수식입니다.
두번째 식에서 n이 학습률을 뜻합니다. h라는 변수가 새로 등장하는데 기존 기울기 값을 제곱하여 계속 더해줍니다. 그리고 매개변수를 갱신할 때 root(h)를 곱해 학습률을 조정합니다.
그림을 보면 최솟값을 향해 효율적으로 움직이는 것을 알 수 있습니다.
▶ Adam
모멘텀과 Adagrad를 융합한 방법입니다.
▶ 기타
이 외에도 NAG(Nesterov Accelerated Gradient), AdaDelta(Adaptive Delta), RMSProp(Root Mean Square Propagation), AdamW등이 있습니다.
▶ 어떤 최적화 함수를 선택하는 것이 가장 좋을까?
여러가지 기법을 살펴봤는데 시각화 그림을 보면 AdaGrad가 가장 좋아보입니다. 하지만! 정답은 없습니다. 풀어야할 문제가 무엇이냐에 따라 달라집니다. 모든 문제에 뛰어난 함수는 아직까지 존재하지 않습니다. 다만 요즘은 Adam과 SGD가 가장 많이 쓰인다고는 합니다.
▶ 최적화 함수 한눈에 보기!
'AI Research > Deep Learning' 카테고리의 다른 글
[딥러닝 기본지식] 평가 지표(Metrics) (0) | 2023.03.04 |
---|---|
[딥러닝 기본지식] 오차 역전파(backpropagation)의 이해 - 계산그래프와 연쇄법칙(chain rule) (1) | 2023.03.04 |
[딥러닝 기본지식] 경사 하강법(Gradient Descent)의 이해 - 정의 (0) | 2023.03.03 |
[딥러닝 기본지식] 손실 함수(Loss Function)의 이해 - 손실 함수의 정의와 다양한 종류들 (0) | 2023.03.03 |
[딥러닝 기본지식] 활성화 함수(Activation Function)의 이해 - 다양한 활성화 함수의 종류들 (0) | 2023.03.03 |