ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Improving Deep Neural Networks - 2 week
    Google ML Bootcamp 2022/Coursera mission 2022. 7. 13. 00:40

    이번 주차에는 학습 알고리즘의 속도를 빠르게 만들어줄 최적화 알고리즘에 대해 배워보자

    머신 러닝은 경험적으로 알 수 있는 내용에 많이 의존하며, 그냥 많이 해보기가 중요하다고 한다

    그렇기에 속도가 빠른 건 중요하다

    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는 모든 예제를 순회하기에 벡터화의 장점을 잃는다

    그렇기에 미니 배치의 크기를 너무 작거나 크기 않게 설정해야 가장 빠른 학습 속도를 얻을 수 있다

    파란색 : GD, 보라색 : SGD, 초록색 mini-batch GD

    배치 사이즈를 어떻게 정하는지 알아보자

    만약 테스트 셋이 작을 경우(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)\)

    파란 점이 원래 데이터, 빨간색 초록색으로 갈 수록 베타가 1에 가까워 진다

    베타가 작아질수록 이상치에 민감하며, 노이즈가 생긴다

    그러나 데이터에 더 민감하게 움직인다

    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보다 빠르다

    요약하면 위에서 배운 지수 가중 평균으로 가중치를 업데이트하는 알고리즘이다

    learning rate를 적절히 조절해야한다. 너무 크면 보라색 처럼 발산 할 수 있다

    위 문제에서 가로로 이동이 세로로 보다 빠르면 빠른 학습이 될 것 같다

    모멘텀을 사용해 보자

    수도 코드는 아래와 같다

    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

    local minimum이 많아 보인다

    그러나 마법의 힘으로 고차원에선 이런 것보단 아래의 안장점이 주로 발생한다

    ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

    교수님께서 그리신 흥미로운 말 그림이다

    안장점은 학습 속도를 늦추게 만들 수 있다

    이건 Adam 같은 학습 알고리즘이 해결에 도움이 된다

     

     

    댓글

Designed by Tistory.