본문 바로가기

취업준비/인공지능

[AI Tech] 3주차 15-1차시 경사하강법(순한맛)

15차시: 경사하강법

15-1. 경사하강법(순한 맛)

1. 미분이 뭔가요?

미분(Differentiation)은 변수의 움직임에 따른 함숫값이 변화를 측정하기 위한 도구로 최적화에서 제일 많이 사용하는 기법이다.

최근에는 미분을 손으로 직접 계산하는 대신 컴퓨터가 계산해 줄 수 있다.

 

2. 미분을 그림으로 이해해 보자

미분은 함수 f의 주어진 점 (x, f(x))에서의 접선의 기울기를 구한다.

 

3. 미분을 어디에 쓸까?

한 점에서 접선의 기울기를 알면 어느 방향으로 점을 움직여야 함숫값이 증가/감소하는지 알 수 있다.

미분값을 더하면 경사상승법(Gradient Ascent)이라 하며 함수의 극대값의 위치를 구할 때 사용한다.

미분값을 빼면 경사하강법(Gradient Descent)이라 하며 함수의 극소값의 위치를 구할 때 사용한다.

경사상승/경사하강 방법은 극값에 도달하면 움직임을 멈춘다.

 

4. 경사하강법: 알고리즘

var = var - lr * grad

lr은 학습률(learning rate)로서 미분을 통해 업데이트하는 속도를 조절한다.

grad = gradient(var)

종료조건이 성립하기 전까지 미분값을 계속 업데이트한다.

def func(val):
	fun = sym.poly(x**2 + 2*x + 3)
    return fun.subs(x, val), fun
   
def func_gradient(fun, val):
	_, function = fun(val)
    diff = sym.diff(function, x)
    return diff.subs(x, val), diff

def gradient_descent(fun, init_point,lr_rate=1e-2, epsilon=1e-5):
	cnt = 0
    val = init_point
    diff, _ = func_gradient(fun, init_point)
    while np.abs(diff) > epsilon:
    	val = val - lr_rate*diff
        diff, _ = func_gradient(fun, val)
        cnt+=1
        
    print("함수: {}, 연산횟수: {}, 최소점: ({}, {})".format(fun(val)[1], cnt, val, fun(val)[0]))
    
gradient_descent(fun=func, init_point = np.random.uniform(-2,2))

5. 변수가 벡터이면요?

미분(Differentiation)은 변수의 움직임에 따른 함숫값의 변화를 측정하기 위한 도구로 최적화에서 제일 많이 사용하는 기법입니다.

벡터가 입력인 다변수 함수의 경우 편미분(Partial Differentiation)을 사용한다.

Partial Differentiation

각 변수 별로 편미분을 계산한 그레디언트(Gradient) 벡터를 이용하여 경사하강/경사상승법에 사용할 수 있다.

 

6. 그레디언트 벡터가 뭐예요?

 

그레디언트 벡터를 이용하여 극대, 극소로 향하는 방향을 알 수 있다.

 

7. 경사하강법: 알고리즘 2

 

 

 

 

 

© NAVER Connect Foundation. All Rights Reserved