본문 바로가기
프로젝트(진행중)/머신러닝 한 걸음씩

EP 01. 경사하강법

by 일말고프로젝트 2021. 7. 19.

사실 아무 생각 없이 모델을 최적화 시킬 때 쓰는 방법으로만 알고 있었는데, 자세하게 밟고 넘어가야 할 것 같아서 정리

정리할 개념들과 순서는 다음과 같다.

 

- 개념

- 원리

- 구현

 

1. 경사하강법 개념

 

경사 하강법(傾斜下降法, Gradient descent)은 1차 근삿값발견용 최적화 알고리즘이다. 기본 개념은 함수의 
기울기(경사)를 구하고 경사의 절댓값이 낮은 쪽으로 계속 이동시켜 극값에 이를 때까지 반복시키는 것이다.
                                                                                                                           -위키백과-

 

수학적 개념으로 이해해보면 극값, 즉 미분값이 0이 되는 점을 찾아가는 과정 정도로 이해하면 될 것 같다. 머신러닝에서의 경사하강법으로 이해해보면 비용함수(Cost Function)를 최소화 하기 위한 과정이다. 비용 함수는 실제값과 예측값의 차이를 가장 작게 만드는 가설함수를 도출하는 함수이다. 

 

2. 경사하강법 원리

https://bioinformaticsandme.tistory.com/125

 

도식적으로 이해해보면 위 그래프와 같이 시작점(Starting Point)에 시작점에서의 곡선의 기울기를 계산해 상수만큼 곱해 이동하는 과정이다. 이렇게 되면 점이 점점 오른쪽으로 이동함에 따라 기울기는 완만해지고, 이동하는 거리도 줄게 되고, 결국 Final Value에 수렴하게 된다. 이때 시작점이 Final Value보다 오른쪽에 위치해도 기울기가 양수가 되며 왼쪽으로 이동해 결국 수렴한다. 수학적으로 이해해보면(아래 공식) 시작점에서 일정한 크기를 곱한 기울기만큼 이동해 새로운 출발점을 정의해 다시 진행함을 알 수 있다.

https://myjamong.tistory.com/83

 

3. 구현

import numpy as np

np.random.seed(123)

def f(x):
    return 3*x + 2

X = 8 * np.random.rand(100, 1)
Y = f(X) + np.random.rand(100,1)

##모델 적합시키기##

from sklearn.linear_model import LinearRegression

LR = LinearRegression()
LR.fit(X,Y)

LR.coef_, LR.intercept_

(array([[2.98655962]]), array([2.55902793]))

 

##경사 하강법 코드

def gd(x,y,eta=0.01, iter = 1000):
    theta = np.random.randn(x.shape[1], 1)
    
    for i in range(iter):
        gradient = (2/x.shape[0])*x.T.dot(x.dot(theta) - y)
        theta = theta - eta*gradient
    
    return theta

xs = np.c_[X, np.ones((100,1))]

gd(xs, Y, 0.01, 1000)

array([[2.99593207], [2.51286109]])

댓글