티스토리 뷰

728x90

1. 개요

 가중치를 조절하는 방법으로 다들 경사 하강법을 알고 계실 것이라 생각합니다. 경사 하강법은 정확하게 가중치를 찾아가지만 가중치를 변경할때마다 전체 데이터에 대해 미분해야 하므로 계산량이 매우 많습니다. 즉 많은 계산량때문에 속도가 느리고, 추가적으로 최적해를 찾기 전 학습을 멈출 수도 있습니다. 이러한 점을 보안한 다양한 경사 하강법이 등장하였고 몇 가지를 소개하려고 합니다.



2. SGD(확률적 경사 하강법)

 확률적 경사 하강법(Stochastic Gradient Descent)는 경사 하강법과 다르게 한번 학습할 때 모든 데이터에 대해 가중치를 조절하는 것이 아니라, 램덤하게 추출한 일부 데이터에 대해 가중치를 조절합니다. 결과적으로 속도는 개선되었지만 최적 해의 정확도는 낮습니다.

 수식은 경사 하강법과 같습니다. 

Cost(w)에 사용되는 x, 즉 입력 데이터의 수가 전체가 아닌 확률적으로 선택된 부분이 사용됩니다. 아래 수식에서 α(알파)는 Learning Rate를 뜻합니다. 많은 곳에서는 η(에타)를 Learning Rate로 사용하던데 저는 편의상 α(알파)로 표시하였습니다.


파이썬 소스 코드

Keras 소스 코드


3. Momentum(모멘텀)

 모멘텀(momentum)이란 단어는 관성, 탄력, 가속도라는 뜻입니다. 모멘텀 SGD는 경사 하강법에 관성을 더해 주는 것입니다. 경사 하강법과 마찬가지로 매번 기울기를 구하지만, 가중치를 수정하기전 이전 수정 방향(+,-)를 참고하여 같은 방향으로 일정한 비율만 수정되게 하는 방법입니다. 수정이 양(+) 방향, 음(-) 방향 순차적으로 일어나는 지그재그 현상이 줄어들고, 이전 이동 값을 고려해여 일정 비율만큼 다음 값을 결정하므로 관성의 효과를 낼 수 있습니다.


 우선 아래 수식에서 α는 Learning Rate, m은 momentum 계수입니다. 

m의 정확한 용어는 아니지만 저희는 그냥 모멘텀(운동량) 또는 모멘텀 계수라고 부릅니다. 보통 0.9로 설정하며 교차 검증을 한다면 0.5에서 시작하여 0.9, 0.95, 0.99 순서로 증가시켜 검증합니다. 예시로 맨 처음 gradient()의 값이 0.5이고 두 번째 gradient 값이 -0.3이라 할 때 m이 0.9라면 V(1)은 -0.5, V(2)는 0.9 * -0.5 +0.3 = -0.45 + 0.3 = -0.15이다. 이처럼 gradient의 방향이 변경되어도 이전 방향과 크기에 영향받아 다른 방향으로 가중치가 변경될 수 있습니다.


파이썬 소스 코드
Tensorflow 소스 코드
Keras 소스 코드



4. Nesterov Accelrated Gradient(NAG, 네스테로프 모멘텀)

 네스테로프 모멘텀은 momentum값과 gradient값이 더해저 실제(actual)값을 만드는 기존 모멘텀과 달리 momentum값이 적용된 지점에서 gradient값이 계산됩니다. 수식으로 말씀드리면 gradient를 구할 때 분모()의 W(가중치)에 먼저 mV(t-1)값을 더해 계산하는 것입니다. 

이 단계를 추가함으로 V(t)를 계산하기 전 모멘텀 방법으로 인해 이동될 방향을 미리 예측하고 해당 방향으로 얼마간 미리 이동한 뒤 gradient를 계산한는 효과를 얻을 수 있습니다. 즉 한 단계를 미리 예측함으로써 불필요한 이동을 줄입니다.


 수식은 다음과 같습니다.


파이썬 소스 코드
Tensorflow 소스 코드
Keras 소스 코드


5. Adagrad(Adaptive Gradient, 아다그라드)

 아다그라드는 변수의 업데이트 횟수에 따라 학습률(Learning rate)를 조절하는 옵션이 추가된 최적화 방법입니다. 여기서 변수란 가중치(W) 벡터의 하나의 값(w[i])을 말합니다. 아다그라드는 많이 변화하지 않은 변수들은 학습률(step size)를 크게하고, 반대로 많이 변화한 변수들에 대해서는 학습률을 적게합니다. 이는 많이 변화한 변수는 최적값에 근접했을 것이라는 가정하에 작은 크기로 이동하면서 세밀한 값을 조정하고, 반대로 적게 변화한 변수들은 학습률을 크게하여 빠르게 loss값을 줄입니다.


 아다그라드는 같은 입력 데이터가 여러번 학습되는 학습모델에 유용하게 쓰이는데 대표적으로 언어와 관련된 word2vec이나 GloVe에 유용합니다. 이는 학습 단어의 등장 확률에 따라 변수의 사용 비율이 확연하게 차이나기 때문에 많이 등장한 단어는 가중치를 적게 수정하고 적게 등장한 단어는 많이 수정할 수 있기 때문입니다.


 수식은 다음과 같습니다.



 G(t)의 수식을 보면 현재 gradient의 제곱에 G(t-1) 값이 더해집니다. 이는 각 step의 모든 gradient에 대한 sum of squares라는 것을 알 수 있습니다.

 W(t+1)를 구하는 식에서 G(t)는 ε(입실론)값과 더해진 후 루트가 적용되고 α(알파)에 나누어 집니다. 여기서 ε(입실론)은 아주 작은 상수를 의미하며, 0으로 나누는 것을 방지해 줍니다. 그리고 α(알파)는 Learning Rate를 나타내며 G(t)의 크기에 따라 값이 변합니다. 


파이썬 소스 코드
Tensorflow 소스 코드
Keras 소스 코드


6. RMSprop(알엠에스프롭)

  RMSprop(알엠에스프롭)은 아다그라드의 G(t)의 값이 무한히 커지는 것을 방지하고자 제안된 방법으로, 논문과 같은 형태로 발표된 다른 방법들과 달리 제프리 힌튼 교수와 제자들이 코세라(Coursera) 수업에서 소개하였습니다. 링크를 클릭하시면 영상 페이지로 들어가실수 있으며 이론과 수식 도출에 대해 설명하고 있습니다. RMSprop은 지수 이동평균을 이용한 방법입니다. 


우선 지수 이동평균에 대해 알아보겠습니다. 지수 이동평균이란 쉽게 말해 최근 값을 더 잘 반영하기 위해 최근 값에 값과 이전 값에 각각 가중치를 주어 계산한는 방법입니다. 

위 식에서 지수 이동편균값은 x, 현재 값은 p, 가중치는 α(알파)이며, 아래 첨자 k는 step 또는 시간, 마지막으로 N은 값의 개수라고 보시면 됩니다. 만약 처음부터 현재까지 계산을 하게 된다고 한다면 N과 k의 값은 같으며 가중치 α(알파)는 N이 작을 수록 커집니다. 


계산식을 풀어써 보면 위와 같은데 식을 보면 알 수 있듯이 1주기가 지날 때마다 (1-α)라는 가중치가 이전 값에 곱해지는데, (1-α) 값이 1보다 작기 때문에 시간이 지날수록 영향력이 줄어드는 효과를 볼 수 있습니다. 참고로 필터이론에서는 이런 가중치를 forgetting factor 또는 decaying factor라고 합니다.


RMSprop 수식은 다음과 같습니다.

기존 Adagrad에서는 G(t)를 구성하는 두 항이 그냥 더 해지지만  RMSprop에서는 지수평균으로 더해집니다.


파이썬 소스 코드
Tensorflow 소스 코드
Keras 소스 코드



8. Adam(Adaptive Moment Estimation, 아담)

  Adam은 Momentum과 RMSprop를 합친? 경사 하강법입니다. RMSprop의 특징인 gradient의 제곱을 지수평균한 값을 사용하며 Momentum의 특징으로 gradient를 제곱하지 않은 값을 사용하여 지수평균을 구하고 수식에 활용합니다. 


수식은 다음과 같습니다.

기존 RMSprop과 momentum과 다르게 M(t)와 V(t)가 바로 W(t+1) 수식에 들어가는 것이 아니라 와 가 들어갑니다. 이 부분을 논문에서는 바이어스가 수정된 값으로 변경하는 과정이라고 합니다. 이전에 저희가 알아야할 것은 초기 M(0)와 V(0)값이 0으로 초기화 되는데 시작값이 0이기 때문에 이동평균을 구하면 0으로 편향된 값추정이 발생할 수 있습니다. 특히 초기 감쇠 속도가 작은 경우 (즉, β가 1에 가까울 때)에 발생합니다. 이를 방지하기 위해 값을 나누어 바이어스 보정을 해줍니다. 은 M(t)와 V(t)의 기대값을 구하는 과정에서 찾을 수 있다고 하는데 수학적 지식이 부족하여 어떻게 발견되는지 설명드리기가 힘들 것 같습니다. 추가적으로 α=0.001, β1로는 0.9, β2로는 0.999, ϵ 으로는 10^-8 값이 가장 좋은 Default값이라고 논문에 명시되어 있습니다. 

 

Tensorflow 소스 코드
Keras 소스 코드


7. AdaDelta(Adaptive Delta, 아다델타)

  AdaDelta는 Adagrad, RMSprop, Momentum 모두를 합친 경사하강법이다. 논문에는 크게 2개의 특징을 소개합니다. 

 첫 번째는 Adagrad 특징인 모든 step의 gradient 제곱의 합을 window size를 두어 window size만큼의 합으로 변경합니다. 이후 RMSprop과 똑같지 지수이동평균을 적용합니다. 

 두 번째는 헤시안(Hessian) 근사법(Approximation)을 이용한 단위(Units) 수정입니다. 


 논문에서는 가중치와 가중치 변화량의 단위가 같아야한다라고 명시되어 있습니다. 그리고 SGD, Momentum, Adagrad는 업데이트가 기울기 양의 비율을 포함하므로 정확한 단위를 가지지 않고 따라서 업데이트는 단위가 없다라고 설명합니다. 그리고 위 수식을 보면 알수 있듯이 △x의 단위는 x의 단위가 아닌 x의 단위의 역수와 관계가 있다는 것을 알 수 있습니다. 반대로 AdaDelta경우 Newton's method을 이용하여 아래 수식과 같이 △x와 x의 단위간의 관계를 만듭니다.


솔찍하게 저도 units 수정에 대한 이점을 정확하게 무엇인지 잘 모르겠습니다. 다만 헤시안 역행렬이 적용이 되었고 헤시안 역행렬의 이점이 추가었다라고 생각하고 있습니다. 그래서 헤이안 함수에 대해 잠시 설명드릴까 합니다.


특정 함수에 대해 gradient는 일차미분(first derivative)를 나타내는 반면 Hessian은 함수의 이차미분(second derivative)를 나타냅니다. 즉, Hessian은 함수의 곡률(curvature) 특성을 나타내는 행렬로서 최적화 문제에 적용할 경우 Hessian을 이용하면 특정 지점 근처에서 함수를 2차 항까지 근사시킬 수 있습니다. (second-order Taylor expansion)

더 큰 장점은 critical point의 종류를 판별할 수 있다는 것입니다. gradient는 함수에서 일차미분이 0이 되는 부분인 critical point (stationary point)를 찾을 수 있지만 Hessian은 해당 지점이 극대인지 극소인지 아니면 Saddle point인지 알 수 있습니다.


경사 하강법에서는 First Order Methods가 적용된 하강법에서는 1차 미분만 하여 gradient가 0인 지점을 찾습니다. 그렇다보니 saddle point에서 문제가 발생할 수 있습니다. 반면 Second Order Methods를 사용한 AdaDelta는 saddle point에서 문제가 발생하지 않지만 2차 미분까지 하기때문에 계산속도가 상대적으로 느립니다.


수식은 다음과 같습니다.

G(t) -> △w(t) -> S(t) -> W(t+1) 순서로 계산이 되며 loop 크기만큼 반복됩니다.


Tensorflow 소스 코드
Keras 소스 코드




    ▪ 책 모두의 딥러닝(저자 조태호)

    ▪ https://ko.coursera.org/learn/deep-neural-network/lecture/BhJlm/rmsprop

    ▪ https://keras.io/optimizers/

    ▪ https://arxiv.org/pdf/1412.6980.pdf

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함