티스토리 뷰

Gradient Descent 방법 중 업데이트 시 데이터를 사용하는 기준에 따른 분류 


    • Batch Gradient Descent
    • Stochastic Gradient Descent
    • Mini-batch Gradient Descent

$$ \large \begin{matrix} \\ \vec p_{t+1} = \vec p_t - \lambda \nabla E(\vec p_t) \tag {1} \end{matrix} \\ \\ \lambda \text{ : learning rate } $$


 우선 Batch 경우는 $\vec p_{t+1}$ 업데이트를 할때 주어진 학습 데이터를 전부 사용하여 진행하기 때문에 방향에 대해서는 정확할 수 있지만, 계산량 면에서는 너무 많을 수 있습니다. 다음 경우로 Stochastic 경우는 하나의 데이터 $( x_i , y_i )$ 를 이용하여 업데이트를 진행하기 때문에 속도면에서는 빠를 순 있지만, 정확하지 않을 수도 있습니다. 따라서 현재 가장 많이 사용하는 Mini-Batch 는 전체 학습 데이터  중 임의로 N 개의 sample을 추려서 N 개의 데이터를 통해 업데이틀 진행하기 때문에, Batch 와 Stochastic 을 합쳐 놓았다고 생각 하시면 될 것 같아요. 

 제가 사용할 예제는 학습 데이터가 많지 않기 때문에 Batch Gradient Descent 위주로 설명하면서 진행하도록 할께요.


Gradient Descent Algorithm 종류

    • Naive Gradient Descent
    • Momentum
    • Nestrov Gradient
    • Adagrad
    • Adadelta
    • RMSprop
    • Adam


Naive Gradient Descent

: 식 1로 정의가 됩니다.

Momentum

 관성이라는 말이 딱 들어 맞을 것 같습니다. 이전 업데이트에서 parameter 값이 최적화를 통해 가고 있는 방향에 대해서, 즉 이전 업데이트시 가고 있는 방향에 대한 가중치를 주면서, 진행하는 방식입니다. 느낌이 와닿지 않으면, 관성이란 말을 까먹으시면 안됩니다. 제가 지금 전력으로 달리다가 갑자기 뒤로 돌면, 달리던 방향으로 넘어가겠죠..? 


$$ \large \begin{matrix} \vec m_t &=& \gamma \vec m_{t-1} + \nabla E(\vec p_t) \\ \vec p_{t+1} &=& \vec p_t - \vec m_t \tag {2} \end{matrix} \\ \\ \\ \gamma \text{ : momentum rate } $$

 


import numpy as np
import numdifftools as nd
import matplotlib.pyplot as plt


def optimizer_momentum(xdata,ydata,learning_rate,max_iter,momentum=0.9):

       # implementation moment gradient



동일한 learning rate 로 Gradient descent 와 momentum 결과를 살펴 볼까요? 아래 그림을 보시면, momentum 알고리즘을 왜 사용해야 되는지 알 수 있어요, 단순한 gradient descent 보다 수렴속도가 엄청나네요!!


< Gradient Descent  : iteration >

< Momentum  : iteration >


Adagrad  ( Adaptive Gradient ) 

- 업데이트 컨셉을 많이 최적화 된 parameter 는 learning rate 를 줄이고 최적화가 덜 된 parameter 들은 learning rate 를 더 높게 가져가 보는건 어떨 까요?, 최적화가 많이 되고 안되었다는 기준은 무엇인지 고민할 필요가 있어 보이네요,, 파라미터가 초기값에서 많이 변했다면 ,이 값은 최적화가 더 되었다고 생각해보는 컨셉이 Adagrad 의 핵심  입니다. 아래 수식을 보면 parameter 마다 learning rate 이 다르다는 것이 보이시죠? 한가지 아쉬운 점이 있다면 $g_1 , g_2, \cdots , g_m $ 값이 항상 커지는 방향이라는 거죠,, 한 번 이를 통해서 학습을 진행 해보도록 하겠습니다.

$$ \large \begin{matrix}\ \vec g_t &=& \vec g_{t-1} + \nabla E(\vec p_t) \odot \nabla E(\vec p_t) &=& \begin{bmatrix} g_1 \\ g_2 \\ \vdots \\ g_m \end{bmatrix}\\ \\ \\ \vec p_{t+1} &=& \vec p_t - { \lambda \over \sqrt{ \vec g_t + \epsilon } } \odot \nabla E(\vec p_t) &=& \vec p_t - \lambda \begin{bmatrix} { 1 \over \sqrt {g_1 + \epsilon } } \\ {1 \over \sqrt {g_2 + \epsilon } } \\ \vdots \\ {1 \over \sqrt {g_m + \epsilon } } \end{bmatrix} \odot \nabla E(\vec p_t) \end{matrix} \\ \\ \\ \odot \text{ : element wise multiplication } \quad \lambda \text{ : learning rate} \quad \epsilon \  : \ 10^{-4} \sim 10^{-8}  $$


'머신러닝 > 기초' 카테고리의 다른 글

[ 기본 ] Neural network - feed forward  (0) 2017.06.30
[ 과제 2 ] Gauss-Newton Method  (0) 2017.06.24
[ 과제 1 ] Gradient Descent  (0) 2017.06.16
행렬 연산 (Matrix C)  (0) 2017.05.08
선형회귀(linear regression)-최소자승법  (0) 2017.04.26
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함