Optimizer

Optimizer

Optimizer는 딥러닝에서 Network가 빠르고 정확하게 학습하는 것을 목표로 한다. 주로 Gradient Descent Algorithm을 기반으로한 SGD에서 변형된 여러종류의 Optimizer가 사용되고 있다.

optimizer

아래는 대표적인 Optimizer 기법들이 최적값을 찾아가는 그래프로 각각의 특성이 잘 드라나 있다.

optimizer1

Optimizer2

optimizer3

초기 SGD는 고정된 learning rate에 의해 동일한 스텝으로 학습되기 때문에 느린 학습속도를 보여준다. 하지만, 학습과정에서 안정성이 가장 높은 기법이라고 할 수 있다.
관성을 이용한 Momentum과 NAG는 학습이 충분히 되지 않았다면 SGD와 비교했을 때, 매우 안좋은 성능을 보여줄 수 있다.
아래부터는 각 기법에 따른 특징과 update방식을 정리한다.

Momentum

위 그래프에서 보다싶이 SGD는 다른 기법에 비해 매우느리다.(BGD가 느려서 mini batch로 구분했지만…)
ωt+1=ωtηωJ(ωt)\omega_{t+1} = \omega_{t}-\eta\nabla_\omega J(\omega_t)
위와 같이 기울기 값이 이전과 동일하다면 step의 길이도 동일하게 update된다.
또한, 기울기 값이 0이되는 지점에서 update가 되지않기 때문에 global이 아닌 local minima에 수렴할 수 있다.

자세한 내용은 아래 참조

Momentum은 빠른학습속도와 local minima를 문제를 개선하고자 SGD에 관성의 개념을 적용했다.
Vt=m×Vt1ηωJ(ωt)V_t = m\times V_{t-1}-\eta \nabla_\omega J(\omega_t)
VtV_t는 이전 이동거리와 관성계수 mm에 따라 parameter를 update하도록 수식이 적용되었다.
ωt+1=ωt+Vt\omega_{t+1} = \omega_t + V_t
일반적으로 관성계수 mm은 0.9를 사용한다.
관성개념이 적용되어 수렴되는 최적 parameter를 더욱 빠르게 학습할 수 있으며 gradient값이 0인 곳에서도 관성에 의해 업데이트가 수행될 수 있다.

Nesterov Accelrated Gradient (NAG)

Momentum은 현재 update과정에서의 기울기 값을 기반으로 미래값을 도출하도록 되어있다. 따라서, 최적의 parameter를 관성에 의해 지나칠 수 있게 된다.
NAG에서는 Momentum으로 이동된 지점에서의 기울기를 활용하여 update를 수행하기 때문에 이러한 문제를 해소할 수 있게 된다.

수식과 코드로 보는 경사하강법(SGD,Momentum,NAG,Adagrad,RMSprop ...

Vt=m×Vt1ηωJ(ωtm×Vt1)V_t = m\times V_{t-1}-\eta \nabla_\omega J(\omega_t-m\times V_{t-1})
ωt+1=ωt+Vt\omega_{t+1} = \omega_t + V_t
위 NAG의 update 식에서도 ωJ(ωtm×Vt1)\nabla_\omega J(\omega_t-m\times V_{t-1})와 같이 관성에 의해 이동된 곳에서의 기울기를 적용하는것을 볼 수 있다. 이는 관성에 의해 빨리 이동하는 이점을 누리면서도 멈춰야하는 곳에서 효과적으로 제동할 수 있게 된다.

Adaptive Gradient (Adagrad)

Adagrad에서는 동일 기준으로 update되던 각각의 parameter에 개별 기준을 적용하였다.
즉, 지속적으로 변화하던 parameter는 최적값에 가까워졌을것이고 한 번도 변하지 않은 parameter는 더 큰 변화를 줘야한다는 것이 Adagrad의 개념이다.
Adagrad의 update 수식은 아래와 같다.

Gt=Gt1+(ωJ(ωt))2=i=1kωiJ(ωi)G_{t} = G_{t-1} + (\nabla_\omega J(\omega_t))^2 =\sum_{i=1}^k \nabla_{\omega_i} J(\omega_i)
ωt+1=ωtηGt+ϵωJ(ωt)\omega_{t+1} = \omega_t-\frac{\eta}{\surd{G_t+\epsilon}}\cdot \nabla_\omega J(\omega_t)

GtG_t는 Network의 parameter수 k차원의 벡터로 이동한 거리를 나타내는 척도로 사용되어 Gradient의 sum of squares를 저장하고 있다. 이후 parameter update시 learning rate에 반비례로 적용되어 높은 값을 가지는 parameter에서는 상대적으로 적은 변화를 주고 반대로 적게 이동한 parameter에서는 큰 변화를 주게 된다.
ϵ\epsilon은 작은 값으로 0으로 나누어지는 것을 방지하기 위해 사용된다.

Adagrad에도 단점이 있다. parameter별 상대적인 변화로 update를 수행하는 개념은 좋았으나 학습이 진행됨에 따라 변화 폭이 눈에 띄게 줄어들어 결국 움직이지 않게 된다.

RMSProp

Adagrad에서 문제점을 개선하기 위해 GtG_t계산식에 지수이동평균을 적용하였다. 이로인해 학습의 최소 step은 유지할 수 있게 된 셈이다.
update 식은 다음과 같다.

Gt=γGt1+(1γ)(ωJ(ωt))2G_{t} = \gamma G_{t-1} + (1-\gamma)(\nabla_\omega J(\omega_t))^2
ωt+1=ωtηGt+ϵωJ(ωt)\omega_{t+1} = \omega_t-\frac{\eta}{\sqrt{G_t+\epsilon}}\cdot \nabla_\omega J(\omega_t)

γ\gamma는 지수이동평균 필터링에서 보통 forgetting factor, decaying factor라 불리며 hyperparameter로 0.9~0.999의 값을 취한다.
식에서와 같이 학습이 진행됨에 따라 parameter사이 차별화는 유지하되 학습속도가 지속적으로 줄어들어 0에 수렴하는 것은 방지 할 수 있게 된다.

Adaptive Delta (Adadelta)

RMSProp과 같이 Adagrad의 개선을 위해 제안된 방법이다. GtG_t계산식은 RMSProp과 동일하게 수행되지만, update과정에서 learning rate를 사용하는 대신 이를 대신하는 무언가가 추가되었다…(momentum와 비슷해 보이지만 뭔가 다른느낌)
Δω=s+ϵGt+ϵωJ(ωt)\Delta_\omega = \frac{\sqrt{s+\epsilon}}{\sqrt{G_t+\epsilon}}\cdot \nabla_\omega J(\omega_t)
ωt+1=ωtΔω\omega_{t+1}=\omega_t-\Delta_\omega
s=γs+(1γ)Δω2s=\gamma s+(1-\gamma)\Delta_\omega^2
식을 보면 지수이동평균이 적용된 ssGtG_t에 의해 step의 크기가 결정되도록 되어있다. 이는 Second-order optimization을 approximate하기 위함이라지만 공부가 필요할 듯하다.

Adaptive Moment Estimation (Adam)

RMSProp와 Momentum 기법을 합친 optimizer. Momentum에서 관성계수 mm과 함께 계산된 VtV_t로 parameter를 업데이트하지만 Adam에서는 기울기 값과 기울기의 제곱값의 지수이동평균을 활용하여 step변화량을 조절한다.

mt=β1mt1+(1β1)ωJ(ωt)m_t=\beta_1 m_{t-1}+(1-\beta_1)\nabla_\omega J(\omega_t)
vt=β2mt1+(1β2)(ωJ(ωt))2v_t=\beta_2 m_{t-1}+(1-\beta_2)(\nabla_\omega J(\omega_t))^2
ωt+1=ωtmtηvt+ϵ\omega_{t+1}=\omega_t-m_t\frac{\eta}{\sqrt{v_t+\epsilon}}

hyperparameter는 각각 ϵ=18\epsilon = 1^{-8}, β1=0.9\beta_1=0.9, β2=0.999\beta_2=0.999의 값들이 추천된다.
Adam에서는 초기 몇번의 update에서 0으로 편향되어 있어 이를 보정하는 매커니즘이 반영되어있다.

'Algorithm > Deep Learning' 카테고리의 다른 글

Gradient Descent Algorithm  (0) 2020.05.05
Gradient Descent Algorithm

Gradient Descent Algorithm

Network의 parameter update에는 보통 Gradient Descent Algorithm을 사용한다. parameter θ\theta 에 대한 Loss function J(θ)J(\theta) 의 값을 최소화하기 위해 기울기 값 θJ(θ)\nabla_\theta J(\theta) 을 활용한다.

Loss를 최소화한다는 의미?

parameter θ\theta를 바꿔가며 출력의 Loss를 계산하면 아래와 같은 그래프가 나온다하자. 여기서 학습목표는 loss function J(θ)J(\theta)의 값이 최소가 되는 θ\theta를 찾는 것이다.
gradient-0
위 그림에서 loss가 가장 적은 곳은J(θ)J(\theta)함수를 θ\theta로 편미분했을때 기울기 θJ(θ)\nabla_\theta J(\theta)가 0 이 되는 지점으로 θ\theta값을 기울기의 반대방향으로 이동하여 도달할 수 있다.
한 iteration에서 update되는 θt+1\theta_{t+1} 의 계산식은 아래와 같다.
θt+1=θtηθJ(θ)\theta_{t+1} = \theta_{t}-\eta\nabla_\theta J(\theta)
learning rate η\eta 는 update에서 기울기를 타고 내려가는 한번의 step을 조절하는 hyperparameter로 활용된다.

Gradient Descent Algorithm은 update방식에 따라 크게 BGD와 SGD로 구분되고 변형되어가면서 더 빠르게 최적의 parameter로 학습할 수 있게되었다.

Batch Gradient Descent (BGD)

Batch는 모델학습 과정에서 GPU의 병렬처리기능을 효율적(GPU메모리의 크기에 따라 선정하여 학습속도를 효과적으로 줄일 수 있음)으로 활용하기 위해 입력벡터를 하나의 집단으로 묶어놓은 것을 말한다.
(여기서 말하는 Batch는 엄밀히 말하면 mini-batch라하지만 편의상 Batch라한다.)

BGD는 parameter update의 가장 기본적인 모델이다. 입력으로 전체 데이터를 활용하기 때문에 어느정도 보장된 학습결과를 도출할 수 있지만, 한 step을 나아가기 위해 전체데이터의 loss를 계산하는 등 학습속도가 너무 낮다는 문제점이 있다.

Stochastic Gradient Descent (SGD)

BGD는 학습시 전체 데이터를 이용하므로 학습속도가 너무 느리다는 단점이 있다. SGD에서는 학습시 전체데이터(Batch)를 활용하지 않고 Mini-batch를 활용하여 한 step을 진행하게 된다.
이 방법은 BGD보다 다소 부정확할 수 있지만, 학습에 더 짧은 시간이 소요되고 더 많은 step을 진행하면 BGD와 비슷한 결과를 도출 할 수 있다.
또한, SGD를 활용할 경우 BGD에서 발생하는 local minima를 회피하여 더 좋은 학습결과를 도출 할수도 있다.

보통 우리가 Network를 학습할 때는 이 SGD를 활용하거나 SGD의 변형알고리즘을 활용한다.
내가 보려고 올리는 기술 블로그 (6 Page) :: 내가 보려고 올리는 기술 ...

'Algorithm > Deep Learning' 카테고리의 다른 글

Optimizer 의 종류와 특성 (Momentum, RMSProp, Adam)  (0) 2020.05.05

+ Recent posts