Improving Deep Neural Networks - 2 week
이번 주차에는 학습 알고리즘의 속도를 빠르게 만들어줄 최적화 알고리즘에 대해 배워보자
머신 러닝은 경험적으로 알 수 있는 내용에 많이 의존하며, 그냥 많이 해보기가 중요하다고 한다
그렇기에 속도가 빠른 건 중요하다
Mini-batch Gradient Descent
벡터화로 m이 크더라도 효율적으로 계산을 할 수 있다
근데 m이 너무 크다면?
모든 training example을 반복하는데 좀 오랜 시간이 걸릴 것이다
전체 훈련세트를 끝내기 전에, 조금씩 조금씩 처리를 하면 시간이 더 적게 걸린다고 한다
이러한 작은 학습 예제를 배치(batch)라고 한다
각 배치는 중괄호를 사용하여 아래와 같이 표기하자
\(X^{\left\{1\right\}} (n_x,batch size), Y^{\left\{m\right\}} (1,batch size)\)
중괄호 : 배치 번호, 대괄호 : 레이버 번호, 소괄호 : 예제 번호
배치는 한 번에 처리하는 데이터의 묶음이구나
아하 배치가 뭔지 알았다
배치를 이용한 학습은 아래와 같이 진행된다
모든 training example을 한 번에 경사하강을 하지 않고
배치를 순회하며 각각 gradient descent를 천천히 시켜준다
이 과정을 하나의 epoch라고 부른다 (1epoch = 1 pass through data)
배치 경사 하강법 (batch gradient descent)은 전체 학습 데이터를 하나의 배치로 보고 학습하는 것이다(배치 크기가 m)
아하 지금까지 하던게 이거구나
mini-batch gradient descent는 전체 데이터를 여러 개의 배치로 나눈 것이다
Understanding Mini-batch Gradient Descent
batch GD를 시행하면 시행하다 점진적으로 감소한다
그러나 mini-batch GD는 좀 노이즈가 발생 할 수도 있다
mini-batch의 크기는 어떻게 해야 할까
미니 배치 사이즈가 m이라면 그냥 batch GD가 된다
미니배치 사이즈가 1이라면 SGD가 된다
미니 배치에는 나머지 1~m를 사용한다
size=m인 GD는 경우는 너무 오랜 시간이 걸린다
SGD는 모든 예제를 순회하기에 벡터화의 장점을 잃는다
그렇기에 미니 배치의 크기를 너무 작거나 크기 않게 설정해야 가장 빠른 학습 속도를 얻을 수 있다
배치 사이즈를 어떻게 정하는지 알아보자
만약 테스트 셋이 작을 경우(m <2000 쯤?) 그냥 batch GD를 써도 괜찮다
보통 64, 128, 256, ~, 1024와 같은 크기로 만든다
GPU와 CPU 처리 크기 때문이다(컴시개에서 들은 것 같기도?)
결국 배치 크기도 하이퍼 파라미터니, 다 시도하고 빠른 걸로 사용하자!
Exponentially Weighted Averages
GD보다 빠른 이런저런 알고리즘을 배워보기 전에
exponentially weighted average(~~ moving average라고도 함) 이란 걸 사용할 줄 알아야 한다
이 방식을 사용하면 구간의 평균, 지난 데이터의 평균값과 비슷한 데이터를 얻을 수 있다
\(1\over {1-\beta}\)의 기간 평균이 나온다
기존 값은 세타, 변한 데이터는 v로 표기한다.
\(v_t = \beta v_{t-1} + (1-\beta)\theta _t \) ,(\(v_0 = 0)\)
베타가 작아질수록 이상치에 민감하며, 노이즈가 생긴다
그러나 데이터에 더 민감하게 움직인다
Understanding Exponentially Weighted Averages
지수를 곱해 계속 과거 영향력이 줄어든다
영향을 주지 않는 매우 작은 값이 어느 정도인지 직관적으로 와닿지 않았는데
대충 1/e 정도면 영향이 적다고 한다
아래와 같은 방법으로 구현한다
\(v_\theta =0\)
Repeat {
Get next \(\theta _t\)
\(v_\theta = \beta v_\theta +(1-\beta )\theta _ t\)
}
메모리를 적게 써서 좋다
Bias Correction in Exponentially Weighted Averages
bias correction을 이용하면 지수 가중 평균의 계산을 조금 더 좋은 성능으로 할 수 있다
\(v_0\)를 0으로 초기화하였기에, 초기 값들은 좀 작게 나올 것이다
그렇기에 각 값에 bais를 주자
각 값을 아래와 같이 나누어준다
\(v^{correction}={v_t\over {1-\beta^t}}\)
t가 커짐에 따라 분모는 1에 가까워진다
Gradient Descent with Momentum
momentum 혹은 gradient descent with momentum이라는 알고리즘은 보통 GD보다 빠르다
요약하면 위에서 배운 지수 가중 평균으로 가중치를 업데이트하는 알고리즘이다
위 문제에서 가로로 이동이 세로로 보다 빠르면 빠른 학습이 될 것 같다
모멘텀을 사용해 보자
수도 코드는 아래와 같다
Momentum:
on iteration t:
compute dw, db on mini-batch
\(v_{dw} = \beta v_{dw} +\beta dw\)
\(v_{db} = \beta v_{db} +\beta db\)
\(w=w-\alpha v_{dw}\), \(b=b-\alpha v_{db}\)
빨간 점으로 수렴하는 과정에서 y축 이동의 평균은 0에 가깝다
그렇기에 세로로는 적게 움직이리라 예측할 수 있다
모멘텀은 관성과 같은 느낌으로 가속도를 주는 느낌이라 받아들이면 된다 (\(v_{dw} = \beta v_{dw}\)(속도) + \(\beta dw \)(가속도))
RMSprop
또 다른 속도를 높이는 알고리즘으로 RMSprop(Root Mean Square prop)이 있다
on iteration t:
compute dw, db on mini-batch
\(s_{dw} = \beta s_{dw} +\beta dw^2\)
\(s_{db} = \beta s_{db} +\beta db^2\)
\(w=w-\alpha {dw \over \sqrt{s_{dw}}}\),
\(b=b-\alpha {db \over \sqrt{s_{db}}}\)
가중 평균이므로 진동이 있어 항이 커지는 경우는 d 값이 작아지고, 아닌 경우는 d값이 커져 빠르게 수렴하게 된다
모멘텀과 비슷하게 변동을 무디게, 관성을 키우는 효과가 있다
Adam Optimization Algorithm
아담 알고리즘은 위에서 배운 모멘텀과 RMSprop을 합쳐둔 알고리즘이다
웬만한 경우에는 잘 작동한다고 한다
\(v_{dw} =0, s_{dw}=0,v_{db}=0,s_{db}=0\)
on iteration t:
compute dw, db on mini-batch
#momentum
\(v_{dw} = \beta_1 v_{dw} +\beta_1 dw\)
\(v_{db} = \beta_1 v_{db} +\beta_1 db\)
#RMSprop
\(s_{dw} = \beta_2 s_{dw} +\beta_2 dw^2\)
\(s_{db} = \beta_2 s_{db} +\beta_2 db^2\)
#bias correction
\(v_{dw}^{corr}=v_{dw} / (1-\beta_2^t)\), \(v_{db}^{corr}=v_{db} / (1-\beta_2^t)\)
\(s_{dw}^{corr}=s_{dw} / (1-\beta_2^t)\), \(s_{db}^{corr}=s_{db} / (1-\beta_2^t)\)
#update
\(w=w-\alpha {v_{dw}^{corr} \over \sqrt{s_{dw}^{corr}}+\epsilon}\),
\(b=b-\alpha {v_{db}^{corr} \over \sqrt{s_{db}^{corr}}+\epsilon}\)
이번 주차에 배운 게 다 쓰인다
하이퍼 파라미터가 많이 쓰인다
\(\alpha\) : 튜닝이 필요하다
\(\beta_1\) : 0.9로 권장된다
\(\beta_2\) : 0.999로 권장된다
\(\epsilon\) : \(10^{-8}\)로 권장된다
Adam은 Adaptive Moment Estimation의 약자이다 (사람 이름이 아니다)
갑자기 adam coates란 친구분과 연관이 없다고 하셨다
Learning Rate Decay
시간이 지남에 따라 learning rate를 줄이면 속도를 높일 수 있다
직관적으로 \(\alpha\)가 크면 수렴 과정에서 마지막쯤에는 뭔가 좀 더 넘어가서 반복될 것 같다
그리고 시작부터 작은 크기로 하면 학습에 너무 오랜 시간 걸릴 것이다
그렇기에 아래와 같은 식으로 학습률을 감소시키자
decayRate와\(\alpha _0\)도 물론 하이퍼 파라미터다
물론 위의 방식 말고도 다양한 방법이 있다
\(\alpha=0.95^{epochNum} \alpha _0\)
\(\alpha={k\over \sqrt {epochNum}} \alpha _0\)
등등..
심지어 그냥 학습률 좀 느리네 하고 직접 바꾸는 방법도 있다
The Problem of Local Optima
그러나 마법의 힘으로 고차원에선 이런 것보단 아래의 안장점이 주로 발생한다
교수님께서 그리신 흥미로운 말 그림이다
안장점은 학습 속도를 늦추게 만들 수 있다
이건 Adam 같은 학습 알고리즘이 해결에 도움이 된다