Story of CowHacker

딥러닝 3.3 신경망 학습 본문

공부/딥러닝

딥러닝 3.3 신경망 학습

Cow_Hacker 2020. 8. 13. 12:47
728x90

이번 글에서는 경사 법에 대해 알아보겠다.

 

머신러닝 문제 대부분은 학습 단계에서 최적의 매개변수를 찾아낸다.

딥러닝 즉, 신경망 역시 최적의 매개변수를 학습 시에 찾아야 한다.

 

여기서 최적이란 손실 함수가 최솟값이 될 때의 매개변수 값이다.

 

 

 

경사 법이란 기울기를 이용해 함수의 최솟값을 찾으려는 것이다.

 

경사 법을 수식으로 나타내 보겠다.

 

 

그림1

그림 1이 바로 경사 법을 수식으로 나타낸 것이다.

 

수식에서 η ( 에타 )는 갱신하는 양을 나타낸다.

이를 신경망 학습에서는 학습률이라 한다.

 

학습률이란 한 번의 학습으로 얼마만큼 학습해야 할지, 즉 매개변수 값을 얼마나 경신하냐를 결정하는 것이다.

 

이제 경사 법을 파이썬으로 구현해보겠다.

 

 

경사 법 코드

 

def gradient_descent ( f, init_x, lr = 0.01, step_num = 100 ) :

    x = init_x

    

    for _ in range ( step_num ) :

        grad = numerical_gradient ( f, x ) #<- 기울기 함수다.

        x -= lr * grad

    return x

 

인수 f는 최적화하려는 함수, init_x는 초깃값, lr은 learning rate를 의미하는 학습률, step_num은 경사 법에 따른 반복 횟수를 뜻한다.

기울기는 numerical_gradient함수로 구하고 그 값을 학습률 lr과 곱한다.

곱한 후 나온 값을 step_num번 반복한다.

 

이 함수를 사용해 함수의 최솟값을 구해보자.

 

그림2

그림 2에 있는 함수의 최솟값을 구해보자.

 

먼저 위 함수를 파이썬으로 구현해보겠다.

 

 

 

 

그림 2 함수 코드

 

def function_2 ( x ):

    return x [ 0 ] ** 2 + x [ 1 ] ** 2

 

 

이제 한번 경사 법으로 최솟값을 구하는 코드를 짜 보겠다.

 

 

init_x = num.array ( [ -3.0, 4.0 ] )

 

print ( gradient_descent ( function_2, init_x = init_x, lr = 0.1, step_num = 100 ) )

 

일단 초깃값은 ( -3.0, 4.0 )으로 설정한 후 경사 법을 사용해 최솟값을 구했다.

 

결괏값은

[-6.11110793 e-10  8.14814391 e-10]

이다. 거의 ( 0, 0 )에 가까운 값이 나왔다.

 

이것을 그림으로 나타 내보겠다.

 

 

import numpy as num

import matplotlib.pylab as plt

from gradient_2d import numerical_gradient



def gradient_descent ( f, init_x, lr=0.01, step_num=100 ) :

    x = init_x

    x_history = []

 

    for i in range ( step_num ):

        x_history.append ( x.copy() )

 

        grad = numerical_gradient ( f, x )

        x -= lr * grad

 

    return x, num.array ( x_history )



def function_2(x):

    return x [ 0 ] ** 2 + x [ 1 ] ** 2

 

init_x = num.array ( [ -3.0, 4.0 ] )    

 

lr = 0.1

step_num = 20

x, x_history = gradient_descent ( function_2, init_x, lr=lr, step_num=step_num )

 

plt.plot ( [ -5, 5 ], [ 0,0 ], '--b' )

plt.plot ( [ 0,0 ], [ -5, 5 ], '--b' )

plt.plot ( x_history [ :,0 ], x_history [ :,1 ], 'o' )

 

plt.xlim ( -3.5, 3.5 )

plt.ylim ( -4.5, 4.5 )

plt.xlabel ( "X0" )

plt.ylabel ( "X1" )

plt.show()

 

def function_2 ( x ):

    return x [ 0 ] ** 2 + x [ 1 ] ** 2

 

 

위 코드를 실행시키면

 

그림3

그림 3처럼 원점에 점차 가까워지고 있는 모습을 볼 수 있다.

 

 

여기 까지 경사법에 대해 알아보았다.

 

728x90

'공부 > 딥러닝' 카테고리의 다른 글

딥러닝 3.5 신경망 학습  (0) 2020.08.14
딥러닝 3.4 신경망 학습  (0) 2020.08.13
딥러닝 3.2 신경망 학습  (0) 2020.08.13
딥러닝 3.1 신경망 학습  (0) 2020.08.12
딥러닝 3.0 신경망 학습  (0) 2020.08.11
Comments