일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준
- 역전파
- Apache2
- HTML
- PICO CTF
- 기울기
- C언어
- 신경망
- 신경망 학습
- AdaGrad
- PostgreSQL
- picoCTF
- 아파치
- PHP
- Python
- Python Challenge
- 딥러닝
- 파이썬
- 우분투
- FastAPI
- 오차역전파법
- 코딩
- 소프트맥스 함수
- CTF
- flag
- sgd
- 설치
- 책
- 순전파
- 리뷰
- Today
- Total
Story of CowHacker
딥러닝 3.3 신경망 학습 본문
이번 글에서는 경사 법에 대해 알아보겠다.
머신러닝 문제 대부분은 학습 단계에서 최적의 매개변수를 찾아낸다.
딥러닝 즉, 신경망 역시 최적의 매개변수를 학습 시에 찾아야 한다.
여기서 최적이란 손실 함수가 최솟값이 될 때의 매개변수 값이다.
경사 법이란 기울기를 이용해 함수의 최솟값을 찾으려는 것이다.
경사 법을 수식으로 나타내 보겠다.
그림 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 함수 코드
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.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 |