티스토리 뷰

 

 

 

 

Introduction to Machine Learning with Python

Chapter 2. 지도학습


경사 하강법 (Gradient Descent)

 
  • 경사하강법은 예측함수를 만들고, 훈련데이터에 대한 예측결과 오류를 점점 줄여나가는 방법이다.
  • 선형회귀에서 속성이 하나일 때, 즉 키가 입력값이고 몸무계가 목표값일 때를 예로 들자.

    $ \hat{y} = w x + b $

  • 이 경우, 목표값인 $ y $ 에 예측값인 $ \hat{y} $ 가 최대한 근접하도록 $w$ 와 $b$ 값을 구해야 한다.

  • $y$ 와 $\hat{y}$ 의 오류를 수치화한 값이 앞에서 배운 MSE(Mean Squared Error) 이다.

    $ MSE = {1 \over N} \sum_{i=0}^{N-1} (y_i - \hat{y}_i)^2 $ $ = {1 \over N} \sum_{i=0}^{N-1} (y_i - (w x_i + b))^2 $

  • 경사하강법의 목표는 오류(비용 또는 손실) 값인 MSE 를 최소화하는 w, b 값을 찾는 것이다. 그런데 위의 수식을 보면 x 와 y 의 값은 데이터에서 주어진 상수이므로, 오류는 w 와 b 의 2차함수임을 알 수 있다.

    오류를 나타내는 용어는 여러가지이다. 오류(error), 비용(cost), 손실(loss) 등이다. 이를 비용함수(cost function) 이라는 용어로도 사용하는데, 이것은 w 와 b 의 값을 인자로 보기 때문이다.

 

(출처: https://hackernoon.com/gradient-descent-aynk-7cbe95a778da)

 
  • 위의 그림을 보며 설명해 보자. 그림에서 J(w) 는 MSE 를 의미한다. 다른 말로는 비용함수 라고도 한다.
  • w 값에 따라 비용함수의 값이 변하는데, 최종적으로 제일 아래부분에 도달하는 w 값을 찾아야 한다.
  • 경사하강법에서는 w 와 b 에 대해 초기값을 지정하고 시작한다. 예를 들어 w=5, b=1 과 같다. 까만 점이 w=5 라고 가정하면 그 부분에서의 기울기값 만큼 반대방향 으로 w 값을 바꾸어주면 된다.
  • 이렇게 단계적으로 w 값을 바꿔가면서 비용값을 최소화 시키는 방법이 경사를 따라 내려가는 것과 비슷하다고 해서 경사하강법이란 이름으로 부른다.
 
  • 위 그림에서 기울기 값은 아래와 같이 구한다.

    $ {\partial MSE \over \partial w} = -{2 \over N} \sum_{i=0}^{N-1} (y_i - \hat{y}_i) x_{i} $

  • 기울기 만큼 w 값을 줄여나가야 하므로 새로운 w 값은 아래와 같다.

    $ w \Rightarrow w - \eta {\partial MSE \over \partial w} = w + {2 \over N} \eta \sum_{i=0}^{N-1} (y_i - \hat{y}_i) x_{i} $

  • 여기서 $\eta$ 는 학습률(learning rate)로서 한번에 얼마만큼 w 값을 바꿔나갈 지를 지정한 값이다. 보통은 아주 작은 값으로 지정한다.

  • 이런 과정을 여러번 반복하면 결국 비용함수를 최소화하는 w 값을 근사적으로 얻을 수 있다.

 
  • 위에서 선형회귀를 예로 들었지만, sigmoid 함수로 예측함수를 지정하면 로지스틱 회귀가 된다.

    $ \hat{y_i} = {1 \over {1 + e^{-(w x_i + b)}}} $

  • 속성이 하나가 아니라 m 개일 때로 일반화 하면 아래와 같다. (속성계수인 w 값도 m 개가 된다.)

    $ \hat{y_i} = \sum_{j=0}^{m-1} w_j x_{ij} + b $
    or
    $ \hat{y_i} = \sum_{j=0}^{m-1} f(w_j x_{ij} + b) $

 
  • 경사하강법은 신경망딥러닝의 핵심 알고리즘이다. 딥러닝을 이해하려면 경사하강법에 대한 이해는 필수이다.
  • sklearn.linear_model 에 있는 SGDRegressor 와 SGDClassifier 를 활용할 수 있다. 이들은 기존 선형 알고리즘과 결과는 동일하며 단지 내부 알고리즘에 차이가 있을 뿐이다.
  • 경사하강법은 w 값을 변경하는 시기와 관련되어 아래 세가지로 구분한다.
    1. 배치(Batch) 경사하강법 : 샘플을 한번에 모두 넣어 w 값을 한번 바꾼다. 이를 epoch(시대) 수 만큼 반복한다.
    2. 확률적(Stochastic) 경사하강법 : 샘플 하나를 적용할 때 마다 w 값을 바꾼다.
    3. 미니배치(Mini batch) 경사하강법 : 샘플을 여러 세트로 나누어 한 세트를 적용할 때 마다 w 값을 바꾼다. 모든 세트가 끝나면, epoch 만큼 반복한다.
 

[참고] 경사하강법의 일반해

  • 아래 수식을 활용하면 Numpy 를 사용하여 선형회귀나 로지스틱회귀를 구현할 수 있다.

$ \hat{y_i} = f(\sum_{j=0}^{m-1} w_j x_{ij} + b) $
$ Loss = {1 \over N} \sum_{i=0}^{N-1} (y_i - \hat{y}_i)^2 $
$ {\partial Loss \over \partial w_j} = -{2 \over N} \sum_{i=0}^{N-1} [(y_i - \hat{y}_i) \cdot f^\prime \cdot x_{ij}] $
$ \Delta w_j = - \eta {\partial Loss \over \partial w_j} = \eta {2 \over N} \sum_{i=0}^{N-1} [(y_i - \hat{y}_i) \cdot f^\prime \cdot x_{ij}] $
$ \Delta b = - \eta {\partial Loss \over \partial b} = \eta {2 \over N} \sum_{i=0}^{N-1} [(y_i - \hat{y}_i) \cdot f^\prime] $

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함