2020. 12. 13. 16:49ㆍDeep Learning/개념
※ 본 카테고리의 글은 youtube Sung Kim <모두를 위한 딥러닝> 강좌, 책<모두의 딥러닝> 및 다른자료들을 참고하여 작성되었습니다. ※
github: github.com/chaeyeongyoon/DeepLearning_basics
● GD Algorithm (경사 하강법)
간단히 말해 모델 학습 시 cost가 작아지는 방향으로 weights를 조정하는 방법이다.
참고로 bias값도 learning rate와 비슷한 역할을 하며 bias값을 찾을 때도 GD algorithm을 사용한다.
● Backpropagation (오차 역전파)
여러 Layer로 이뤄진 모델에서 GD algorithm 적용하는 방법
그러나 Backpropagation은 deep한 모델에서 성능 저하를 보입니다.
왜? 기존 activation함수인 sigmoid함수의 결과값은 0~1사이이고, sigmoid의 미분값은 0.3이하이다. 따라서 그림과 같이 chain rule에 의해 미분값을 계속 곱해주다보면 (0.1 * 0.01 * 0.05 ...) 미분값이 너무 작아져서 deep해질 수록 Vanishing Gradient 문제가 발생하기 때문이다.
● Activation function
Vanishing Gradient 문제는 Acrivation Function을 바꿔줌으로써 해결할 수 있다.
tanh함수는 함수값과 미분한 값의 범위가 함께 확장되는 효과를 가져왔지만 1보다 작은값이 여전히 존재해 vanishing gradient소실 문제는 해결하지 못 했다.
ReLU를 사용하면 x가 0보다 크기만하면 미분값이 1이 되므로 여러 hidden layer을 거쳐도 처음층에 도달할 때 까지 gradient가 소실되지 않는다.
● Initialize Weights (가중치 초기화)
모델의 성능향상을 위해선 weight에 적절한 초기값을 주는 것도 중요합니다.
예를 들어 만약 0의 값을 모두 준다면, 모든 뉴런이 같은 값을 가지게 되어 학습이 제대로 이뤄지지 않습니다.
두가지 방법만 소개 하겠습니다.
1. fine tuning
2. Xavier Initializer
weights를 너무 크지도 않고 작지도 않게 적당하게 만들어줍니다. fan-in과 fan-out을 사용합니다.
이 방법은 ReLU에선 출력값이 0에 수렴하는 현상을 보여주므로 ReLU에선 사용할 수 없습니다.
이 외에도 He initialization등 여러 Initialization방법이 있습니다.
● 고급 GD Algorithm
발전된 GD Algorithm들이 등장하면서 딥러닝의 발전속도는 더욱 빨라졌습니다.
간단히만 설명하겠습니다.
1. 확률적 경사하강법 (Stochastic Gradient Descent, SGD)
전체 데이터를 사용하지 않고 랜덤하게 추출한 일부데이터를 사용해 더 빠르고 자주 업데이트를 할 수 있다.
But Local minimum에 빠지지 않도록 주의해야한다.
α(알파)는 Learning Rate
2. momentum SGD(모멘텀)
기울기를 구한 후 오차를 수정하기 전에 바로 앞 수정 값과 방향(+, -)을 참고해 같은 방향으로 일정한 비율만 수정되게 하는 방법이다. 즉, 기존에 업데이트 했던 기울기의 일정 %를 남겨두고 현재의 기울기와 더해 업데이트에 사용하는 방식이다.
Loss함수가 밥그릇 모양으로 생겼다고 했을 때, 수정의 방향이 상하로 진동하는 것을 줄여야 한다.
momentum으로 인해 지그재그로 수정이 일어나는 현상이 줄어들게 해준다. 또한 이전 이동 값을 고려해 일정 비율만큼만 다음 값을 결정하므로 관성의 효과를 낼 수 있다.
Local minimum에 빠지는 현상을 방지할 수 있다. 공에 살짝의 관성을 주어 언덕을 넘을 수 있게한 것이라고 생각하면 된다.
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의 방향이 변경되어도 이전 방향과 크기에 영향받아 다른 방향으로 가중치가 변경될 수 있습니다.
3. NAG(Nesterov Accelrated Gradient)(네스테로프모멘텀)
momentum값과 gradient값이 더해저 실제(actual)값을 만드는 기존 모멘텀과 달리 momentum값이 적용된 지점에서 gradient값이 계산됩니다.
이 단계를 추가함으로 V(t)를 계산하기 전 모멘텀 방법으로 인해 이동될 방향을 미리 예측하고 해당 방향으로 얼마간 미리 이동한 뒤 gradient를 계산한는 효과를 얻을 수 있습니다. 즉 한 단계를 미리 예측함으로써 불필요한 이동을 줄입니다.
4. Adagrad(Adaptive Gradient)(아다그라드)
아다그라드는 변수의 업데이트 횟수에 따라 학습률(Learning rate)를 조절하는 옵션이 추가된 최적화 방법입니다.
여기서 변수란 가중치(W) 벡터의 하나의 값(w[i])
아다그라드는 많이 변화하지 않은 변수들은 학습률(step size)를 크게하고, 반대로 많이 변화한 변수들에 대해서는 학습률을 적게합니다.
=>많이 변화한 변수는 최적값에 근접했을 것이라는 가정=>작은 크기로 이동하면서 세밀한 값을 조정
=>적게 변화한 변수들은 학습률을 크게하여 빠르게 loss값을 줄임.
아다그라드는 같은 입력 데이터가 여러번 학습되는 학습모델에 유용ex) word2vec이나 GloVe
학습 단어의 등장 확률에 따라 변수의 사용 비율이 확연하게 차이나기 때문에 많이 등장한 단어는 가중치를 적게 수정하고 적게 등장한 단어는 많이 수정할 수 있기 때문
수식은 다음과 같습니다.
5. RMSProp
아다그라드의 G(t)의 값이 무한히 커지는 것을 방지하고자 제안된 방법
RMSprop은 지수 이동평균을 이용한 방법
지수 이동평균이란 쉽게 말해 최근 값을 더 잘 반영하기 위해 최근 값에 값과 이전 값에 각각 가중치를 주어 계산하는 방법
주기가 지날 때마다 (1-α)라는 가중치가 이전 값에 곱해지는데, (1-α) 값이 1보다 작기 때문에 시간이 지날수록 영향력이 줄어드는 효과(forgetting factor 또는 decaying factor라고 함)
기존 Adagrad에서는 G(t)를 구성하는 두 항이 그냥 더 해지지만 RMSprop에서는 지수평균으로 더해집니다.
6. Adam(Adaptive Moment Estimation)
Momentum + RMSprop
RMSprop의 특징인 gradient의 제곱을 지수평균한 값을 사용하며 Momentum의 특징으로 gradient를 제곱하지 않은 값을 사용하여 지수평균을 구하고 수식에 활용합니다.
기존 RMSprop과 momentum과 다르게 M(t)와 V(t)가 바로 W(t+1) 수식에 들어가는 것이 아니라
와
가 들어갑니다. =>바이어스가 수정된 값으로 변경하는 과정
초기 M(0)와 V(0)값이 0으로 초기화 되는데 시작값이 0이기 때문에 이동평균을 구하면 0으로 편향된 값추정이 발생할 수 있습니다. 특히 초기 감쇠 속도가 작은 경우 (즉, β가 1에 가까울 때)에 발생합니다. 이를 방지하기 위해
1-β^t값을 나누어 바이어스 보정을 해줍니다.
1-β^t은 M(t)와 V(t)의 기대값을 구하는 과정에서 찾을 수 있다고 한다.
(+ α=0.001, β1로는 0.9, β2로는 0.999, ϵ 으로는 10^-8 값이 가장 좋은 Default값이라고 한다.)
다음 표는 모두의 딥러닝 책에 수록된 내용입니다.
고급경사하강법 | 효과 | keras API | |
SGD | 랜덤 추출 일부 데이터 이용해 속도 향상 | 속도 개선 | keras.optimizer.SGD(lr=0.1) |
Momentum | 관성의 방향 고려해 진동과 폭 감소 | 정확도 개선 | keras.optimizer.SGD(lr=0.1, momentum=0.9) |
NAG | 모멘텀 이동시킬 방향으로 미리 이동해 gradient계산, 불필요한 이동 감소 | 정확도 개선 | keras.optimizer.SGD(lr=0.1, momentum=0.9, nesterov=True) |
Adagrad | 변수 업데이트가 잦으면 학습률 작게 해 보폭 조절 | 보폭 크기 개선 | keras.optimizer.Adagrad(lr=0.01, epsilon=1e-6) |
RMSProp | Adagrad의 보폭 민감도 보완 | 보폭 크기 개선 | keras.optimizer.RMSProp(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) |
Adam | momentum + RMSProp | 정확도, 보폭 크기 개선 | keras.optimizer.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0) |
'Deep Learning > 개념' 카테고리의 다른 글
VGG16 (0) | 2020.12.14 |
---|---|
GAN (0) | 2020.12.14 |
RNN (0) | 2020.12.13 |
CNN (0) | 2020.12.13 |
딥러닝이란?<Neural Network> (0) | 2020.12.13 |