최적화(oprimization)이란?
손실함수 값을 최소화하는 파라미터(weight, bias)를 구하는 과정입니다.
실제값과 예측값의 차이인 손실함수를 최소화하는 최적의 파라미터를 찾는 것이 딥러닝 학습의 목표임을 기억합시다!
optimizer 종류와 특징
[ Gradient Descent (경사하강법) ]
경사하강법에 대해서 알아보기 전에 gradient(기울기)의 개념을 이해할 필요가 있습니다.
Gradient(기울기)란?
미분 가능한 N개의 다변수 함수 f를 각 축이 가리키는 방향마다 편미분한 것입니다.
위 수식은 x와 y로 이루어진 함수 f의 gradient를 표현한 것입니다. 이처럼 gradient는 스칼라 함수를 입력 받아 벡터 장을 생성하는 역할을 합니다. gradient(f)는 x,y의 함수이자 모든 x,y축에 대응되는 벡터를 생성할 수 있습니다.
Gradient Descent (경사하강법)이란?
손실함수의 최솟값을 찾아 경사를 타고 하강하는 기법
- 임의의 weight를 선정하고 경사하강을 하게 됩니다
- 그 순간의 기울기를 구하고 기울기 부호의 반대 방향으로 이동합니다
- 기울기가 0이 되는 지점(최솟값)에 도달할 때 까지 이동합니다
- 기울기<0일때 오른쪽으로, 기울기>0 왼쪽으로 이동합니다 (위 그림에서 기울기가 양수이므로 왼쪽으로 이동하고 있음을 볼 수 있습니다)
- 수식은 new weight = old weight - (학습률*편미분값)입니다. 최적의 weight를 찾기 위해 손실함수를 w에 대해 편미분하고 학습률과 곱한 값을 이전 weight에서 빼서 업데이트할 새로운 weight를 구합니다.
- 손실함수 값이 거의 변하지 않을 때까지 위 과정을 반복하여 weigth를 업데이트합니다.
- η(학습률, learing rate) : 어떤 비율만큼 파라미터를 업데이트할 것인지를 결정하며 0~1사이 값을 가집니다. 사용자가 직접 설정해주어야하는 하이퍼파라미터인데, 학습률이 너무 작으면 시간이 너무 오래 걸리고, 너무 크면 손실함수 그래프에서 벗어나는 경우가 발생하므로 적절한 학습률을 사용하는 것이 중요합니다.
한계점
① local minimum에 빠질 위험
- 임의의 weight를 초기에 선정하는 위치에 따라 최적의 값이 달라질 수 있습니다
- 우리는 전체 함수의 최솟값(global minimum)을 찾아야하는데 그래프 일부에서 최솟값(local minimum)에 빠지면 기울기가 0이 되어 더 이상 weight 업데이트가 되지 않습니다.
② saddle point (안장점) 문제
- saddle point(안장점) : 기울기가 0이지만 극값이 아닌 지점
- A-B 사이에서 최솟값을 가지고, C-D 사이에서 최댓값을 가집니다
- 미분값이 0이지만 극값을 가질 수 없습니다.
- 경사 하강법에서 미분값(기울기)가 0이 되면 더이상 weight가 업데이트 되지 않아 안장점을 탈출 할 수 없습니다.
경사하강법 종류
[ Batch Gradient Descent ]
- 전체 데이터셋을 한 번 다 본 후에 loss를 구해서 weight를 업데이트하는 과정
- 업데이트를 하고 new weight로 전체 데이터셋에 대해 loss를 구하고 weight를 업데이트하는 과정을 반복합니다.
- 컴퓨터 메모리 문제가 발생하며 업데이트 시간이 오래 걸립니다.
[ Stochastic Gradient Descent ]
- 데이터 1개를 보고 weight를 업데이트 x N (학습데이터 갯수) 한 후에, 데이터를 랜덤하게 섞고 다시 데이터 1개를 보고 weight업데이트 x N (학습데이터 갯수) 를 epochs 만큼 반복합니다.
- 데이터 셋을 다 볼 떄마다 섞어주면(suffle) 각기 다른 순서로 weight가 업데이트 됩니다
[ mini-Batch Gradient Descent ]
- 데이터를 배치단위로 보고, 미니배치간의 loss을 구하고 평균을 내서 weight업데이트를 합니다.
- 병렬처리가 가능해서 GPU에 도움을 줍니다.
Batch Gradient Descent, Stochastic Gradient Descent, mini-Batch Gradient Descent 모두 local minimum, saddle point문제를 가지고 있으며, Stochastic Gradient Descent, mini-Batch Gradient Descent는 전체 데이터에 대한 Batch Gradient Descent에 비해 길을 헤매면서 내려간다는 문제가 있습니다
[ Momentum ]
- 경사하강법으로 이동할떄 관성을 부여하는 최적화 기법입니다
- 수식에서 v(t)는 t번째 time step에서의 w의 이동벡터이며, γ는 관성계수(∽0.9), η는 학습률입니다
- 이동벡터를 활용하여 이전 step에서의 기울기를 고려한 알고리름입니다
- 이전에 이동했던 방향(v(t-1))도 어느정도(γ) 고려해서 움직이자..
- local minimum에 빠질 수 있는 상황에 대처할 수 있습니다
- global minimum에 도달하면 추가적인 관성을 받아도 올라갈 수 없습니다
- 하지만, 관성으로 인해 최적값을 지나치기도 합니다.
[ AdaGrad (Adaptive Gradient) ]
- feature 별로 학습률을 adaptive하게 조절하는 최적화 기법입니다.
- feature마다 중요도, 크기 등이 다 다르기 떄문에 모든 feature마다 같은 학습률을 적용하는것은 비효율적이다.
- feature 별 특성을 고려하서 학습을 효율적으로 돕습니다
- 큰 기울기를 가져서 학습이 많이 된 feature는 학습률을 감소시키고, 학습이 적게 된 feature는 학습이 잘되도록 학습률 높힙니다
- g(t)는 t번째 time step에서 기울기 누적 크기이며 ε는 분모가 0이 되는 것을 막기 위한 작은 양수값(∽10^-6)입니다.
- g(t)값은 점차 커지기 때문에 학습을 오래하면 η/√g(t)+ε 가 0에 가까워져서 학습이 더이상 진행 안될 수 있습니다
- 모델 학습이 잘되어서 weight가 업데이트 되지 않는 것인지 g(t)값이 너무 커져서 추가학습이 안되는 것인지 판단하기 힘듭니다 → 개선방안 : RMSProp
[ RMSProp (Root Mean Squared Propagation) ]
- feature 별로 학습률을 조절하되, 이전 time step에서의 기울기를 단순히 같은 비율로 누적하지 않고 지수이동평균을 활용하여 기울기를 업데이트합니다.
- 지수이동평균(Exponential Moving Average, EMA) : 가장최근 time step에서의 기울기를 많이 반영하고, 오래 전의 time step에서의 기울기는 조금만 반영
- g(t)는 t번째 time step까지의 기울기 누적크기이며 γ는 지수이동평균의 업데이트 계수, ε는 분모가 0이 되는 것을 막기 위한 작은 양수값(∽10^-6)입니다.
- t번째 time step의 누적기울기 g(t)는 이전 step 누적기울기 g(t-1)에 지수이동평균 γ를 곱해 점차 작게 만들어주고, 새로운 기울기에는 1-γ를 곱하고 이 두 값을 더하여 기울기 누적 크기를 구합니다. 이 값의 제곱근의 역수를 학습률과 곱합니다
- g(t)를 계산할 떄 g(t-1)과 새로운 기울기값을 보정하지 않고 그대로 더했기 떄문에, AdaGra처럼 학습이 진행될수록 g(t)가 무한정 커지는 경우가 발생하지만, RMSProp은 γ가 g(t)가 무한정 커지는 것을 방지해주므로 보다 오래 학습할 수 있습니다.
- feature마다 적절한 학습률을 적용하여 효율적인 학습 진행이 가능합니다.
[ Adadelta ]
- AdaGrad의 g(t)가 무한정 커져서 학습이 끝나지 않았는데 학습이 중단되는 문제를 보완하기 위한 또 다른 방법입니다.
- RMSProp와 동일하게 이전 time step의 기울기를 모두 누적하지 않고 지수이동평균을 활용하여 g(t)를 구합니다
- 학습률을 일반적인 η값을 사용하는 것이 아니라 지수평균을 이용한 변화량으로 사용합니다
- d(t)는 지수평균을 이용한 학습률을 계산하는 것이며, Δx(t)는 그에 따른 가중치 변화량입니다.
[ Adam (Adaptive Moment Estimation) ]
- adam은 Momentum과 RMSProp을 합친 알고리즘으로, 학습의 방향과 크기를 모두 개선한 기법입니다.
- β1은 momentum의 지수이동평균(∽0.9), β2는 RMSProp의 지수이동평균(∽0.999)입니다.
- ^m과 ^g는 학습초기에 m(t)와 g(t)가 0에 가까워지는 편향 문제를 해결하기 위한 보정값 입니다.
- ^m과 ^g을 만드는 과정 : 편향보정
- ^m과 ^g는 학습 초기에 m(t), g(t)의 식에서 m(t-1),g(t-1)=0이고, (1-β1)∇f(w(t-1))과 (1-β2)(∇f(w(t-1)))^2가 너무 작기 때문에 0으로 수렴하는 것을 방지함니다
- 학습을 계속 진행하다보면 (1-β1), (1-β2)는 1에 가까워져서 ^m, ^g는 결국 m(t)와 g(t)와 같은 값이 됩니다.
- ε∽10^-8, η∽0.001
[ NAG (Nesterov Accelerated Gradient) ]
- momentum에서 개선된 알고리즘으로, 미리 경사를 황인 할 수 있게하고 경사에 맞춰 속도를 조절하는 방식의 기법입니다.
- ∇f를 w(t-1)에서 계산하는 것이 아닌 관성에 의해 이동한 w(t-1)+γv(t-1)에서 계산합니다
- γ=0일 떄, 경사하강법과 같은 알고리즘이 됩니다.
- 학습이 어느정도 된 상황에서 momentum 효과로 최적값을 지나칠수 있는 문제를 방지합니다
- momentum은 관성으로 인해 최적값을 지나칠 수 있다는 단점이 있습니다.
- momentum의 경우 이동벡터를 계산할 때 현재 위치에서 기울기와 모멘텀 스텝을 독립적으로 계산한 후 합쳐주는데, NAG는 모멘텀 스텝을 먼저 이동했다고 가정한 휘에 해당 위치에서 기울기를 구하여 스텝을 이동합니다 (아래 그림 참고)
optimizer 동작
위에서 소개해드린 optimizer 기법들 중 몇가지의 동작을 보여주는 사진을 첨부하겠습니다.
'AI > Deep Learning' 카테고리의 다른 글
Batch Normalization (배치정규화) (0) | 2022.10.22 |
---|---|
loss function (손실함수) (0) | 2022.10.20 |
activation function (활성화함수) (0) | 2022.10.20 |
Gradient Vanishing & Exploding (기울기 소실과 폭주) (0) | 2022.10.18 |
weight (가중치) (0) | 2022.07.14 |