본문 바로가기
AI Research/Deep Learning

[딥러닝 기본지식] 최적화 함수(optimizer)의 이해 - 최적화 함수의 정의와 다양한 종류들

by ga.0_0.ga 2023. 3. 3.
728x90
반응형

이전 게시물에서 손실 함수의 값을 최소로 하는 매개변수를 찾는 방법인 경사하강법에 대해 설명했습니다. 이를 최적화(optimization)라고 합니다. 현재의 손살 함수 값이 감소하는 방향으로 매개변수를 갱신하는 것입니다.

지금까지 최적의 매개변수 값을 찾는 단서로 매개변수의 기울기(미분)를 이용했습니다. 이번 게시물에서는 최적화를 시키는 다양한 방법들에 대해 설명하겠습니다.

- BGD(Batch Gradient Descent, 배치 경사하강법)

- SGD(Stochastic Gradient Descent, 확률적 경사하강법)

- MSGD(Mini-Batch Stochastic Gradient Descent, 미니-배치 확률적 경사하강법)

- Momentum(모멘텀)

- Adagrad

- Adam

▶ BGD(Batch Gradient Descent, 배치 경사하강법)

학습데이터 전체를 하나로 묶어서 학습시키는 경사하강법입니다. 전체 데이터에 대한 손실 평균을 구하고 미분을 통해 기울기를 구한 뒤 경사하강법으로 최적화 시킵니다. 전체 데이터를 한번에 학습시켜버리기 때문에 업데이트 횟수가 굉장히 적으며, 모든 데이터에 대해 한번에 계산해야 하기 때문에 많은 메모리가 필요하고 계산비용이 많이 듭니다. 그러나 항상 같은 데이터에 대해 기울기를 구하기 때문에 안정적으로 수렴하고 global minimum 을 찾아갈 수 있습니다.

BGD 시각화

▶ SGD(Stochastic Gradient Descent, 확률적 경사하강법)

확률적 경사하강법은 전체 데이터 중 단 하나의 데이터를 이용하여 경사하강법을 1회 진행하는 방법입니다. 전체 데이터 중 무작위로 선택된 하나의 데이터로 학습을 하기 때문에 확률적이라고 부릅니다. 배치 경사하강법에 비해 적은 데이터로 학습이 가능하고, 적은 데이터를 사용하기 때문에 속도가 빠르다는 장점이 있습니다. 아래 그림은 SGD를 시각화한 모습인데 빨간선이 진동하는 이유는, 각 랜덤하게 선택된 데이터에 대한 손실 값의 기울기가 약간씩 다르기 때문입니다. 손실값의 평균이 아닌 개별 데이터에 대해 미분을 수행하면 기울기의 방향이 매번 크게 바뀝니다. 그러나 결국은 학습 데이터 전체에 대대 보편적으로 좋은 값을 내는 방향으로 수렴합니다. 다만, global minimum에 도달하기는 어렵습니다. 아래는 SGD의 수식과 시각화 그림입니다.

SGD 시각화

▶ MSGD(Mini-Batch Stochastic Gradient Descent, 미니-배치 확률적 경사하강법)

대부분의 딥러닝 라이브러리에 구현되어 있는 SGD는 이 방법으로 구현되어 있습니다. SGD와 BGD의 절충안으로, 전체 데이터를 batch size 개로 나눠 배치 학습 시키는 것입니다. 총 10개의 batch가 나온다면 1에폭당 10번의 매개변수 업데이트가 이루어지는 것입니다. 한 배치의 손실값의 평균으로 경사하강법을 진행하기 때문에 SGD 만큼 심하게는 아니지만 비슷하게 진동하듯이 그려집니다. 그때문에 local minima를 어느정도 벗어날 수 있습니다. 역시 일부데이터를 이용하기 때문에 BGD보다 계산량이 적습니다.

MSGD 시각화

▶ Momentum(모멘텀)

모멘텀은 쉽게 말해 운동량입니다. 관성이라는 물리학 법칙을 응용한 방법입니다. 쉽게 말해 SGD에 관성을 더해주는 것입니다. 관성을 주는 이유는 local minima에 빠졌을 때 관성의 힘으로 벗어나기 위해서 입니다. 이를 식으로 쓰면 아래와 같습니다.

W는 갱신할 매개변수, 그 다음 aL/aW는 w에 대한 손실함수의 기울기, n은 학습률입니다. SGD와 비교하여 v라는 변수가 추가되는데, v라는 변수는 속도에 해당합니다. 첫번째식은 기울기 방향으로 힘을 받아 물체가 가속된다는 물리 법칙을 나타냅니다. av항은 물체가 아무런 힘을 받지 않을 때 서서히 하강시키는 역할을 합니다.

momentum 시각화

모멘텀의 갱신 경로는 공이 그릇 바닥을 구르듯이 움직입니다. SGD와 비교했을 때 진동하는 정도가 덜한 것을 알 수 있습니다. 이는 x축으로 변하는 힘은 아주 작지만 방향은 변하지 않아서 한 방향으로 일정하게 가속하기 때문입니다. 거꾸로 y축의 힘은 크지만 위 아래로 번갈아가면 받아서 상충하여 y축 방향의 속도는 아넝적이지 않게됩니다. 또한 모멘텀은 기존에 이동하던 방향에 관성이 있어 local minima에 빠져도 쉽게 벗어날 수 있고 더 좋은 minima로 이동할 수 있습니다.(SGD는 local minima에 빠지면 기울기가 0이 되어 이동하지 못합니다.)

▶ Adagrad

신경망에서 학습률(learning rate)은 매우 중요합니다. 이 값이 너무 작으면 학습 시간이 길어지고, 너무 크면 발산하여 학습이 잘 되지 않습니다. 이 방법은 학습률에 초점을 맞춘 방식입니다. 이 학습률을 정하는 효과적인 방법으로 학습률 감소(learning rate decay)가 있습니다. 학습을 진행하면서 학습률을 점점 줄여나가는데, 처음에는 크게 학습하고, 나중에는 점점 조금씩 작게 학습하는 방법입니다. Adagrad는 업데이트 횟수에 따라 학습률을 조절하는 옵션이 추가된 방법입니다. 많이 변화하지 않는 매개변수들은 학습률을 크게 하고, 자주 변화하는 매개 변수들에 대해서는 학습률을 작게 설정해줍니다. 즉, 각각의 매개변수에 맞춤형 값을 적용하는 것입니다. 아래는 Adagrad의 수식입니다.

두번째 식에서 n이 학습률을 뜻합니다. h라는 변수가 새로 등장하는데 기존 기울기 값을 제곱하여 계속 더해줍니다. 그리고 매개변수를 갱신할 때 root(h)를 곱해 학습률을 조정합니다.

Adagrad 시각화

그림을 보면 최솟값을 향해 효율적으로 움직이는 것을 알 수 있습니다.

▶ Adam

모멘텀과 Adagrad를 융합한 방법입니다.

Adam 시각화

▶ 기타

이 외에도 NAG(Nesterov Accelerated Gradient), AdaDelta(Adaptive Delta), RMSProp(Root Mean Square Propagation), AdamW등이 있습니다.

▶ 어떤 최적화 함수를 선택하는 것이 가장 좋을까?

여러가지 기법을 살펴봤는데 시각화 그림을 보면 AdaGrad가 가장 좋아보입니다. 하지만! 정답은 없습니다. 풀어야할 문제가 무엇이냐에 따라 달라집니다. 모든 문제에 뛰어난 함수는 아직까지 존재하지 않습니다. 다만 요즘은 Adam과 SGD가 가장 많이 쓰인다고는 합니다.

▶ 최적화 함수 한눈에 보기!

728x90
반응형

댓글