๋ฐ์ํ
Gradient (๊ธฐ์ธ๊ธฐ)
๋ง์ฝ์ x0, x1์ ํธ๋ฏธ๋ถ์ ๋์์ ๊ณ์ฐํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํ ๊น์?
- ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ํธ๋ฏธ๋ถ์ ๋ฒกํฐ๋ก ์ ๋ฆฌ๋ฅผ ํด์ผ ํ๋๋ฐ, ๊ทธ ์ ๋ฆฌํ๊ฒ์ Grdient(๊ธฐ์ธ๊ธฐ)๋ผ๊ณ ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด์ ์๋์ ์ฝ๋์ ๊ฐ์ด ๊ตฌํํ ์ ์์ต๋๋ค.
def numerical_gradient(f, x):
h = 1e-4
grad = np.zeros_like(x) # x์ ํ์์ด ๊ฐ์ ๋ฐฐ์ด์ ์์ฑ
for idx in range(x.size):
tmp_val = x[idx]
# f(x+h) ๊ณ์ฐ
x[idx] = tmp_val + h
fxh1 = f(x)
# f(x-h) ๊ณ์ฐ
x[idx] = tmp_val - h
fxh2 = f(x)
grad[idx] = (fxh1 - fxh2) / (2*h)
x[idx] = tmp_val
return grad
- numerical_gradient(f, x) ํจ์์ ๊ตฌํ์ ์ข ๋ณต์กํ๊ฒ ๋ณด์ด์ง๋ง, ๋์ ๋ฐฉ์์ ๋ณ์๊ฐ ํ๋์ผ๋์ ์์น ๋ฏธ๋ถ๊ณผ ๊ฑฐ์ด ๊ฐ์ต๋๋ค.
- ์ฐธ๊ณ ๋ก, np.zeros_like(x)๋ x์ ํ์์ด ๊ฐ๊ณ ๊ทธ ์์๊ฐ ๋ชจ๋ 0์ธ ๋ฐฐ์ด์ ๋ง๋ญ๋๋ค.
- numerical_gradient(f, x) ํจ์์ ์ธ์์ธ f๋ ํจ์์ด๊ณ x๋ Numpy ๋ฐฐ์ด์ด๋ฏ๋ก, Numpy ๋ฐฐ์ด x์ ๊ฐ ์์์ ๋ํด์ ์์น ๋ฏธ๋ถ์ ๊ตฌํฉ๋๋ค.
- ๊ทผ๋ฐ, ๊ทธ๋ฌ๋ฉด Gradient(๊ธฐ์ธ๊ธฐ)๊ฐ ์๋ฏธ ํ๋๊ฒ ๋ฌด์์ผ๊น์? ๊ทธ๋ฆผ์ผ๋ก ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
- ์ด ๊ทธ๋ฆผ์ Gradient(๊ธฐ์ธ๊ธฐ)์ ๊ฒฐ๊ณผ์ ๋ง์ด๋์ค๋ฅผ ๋ถ์ธ ๋ฒกํฐ์ ๋๋ค.
- Gradient(๊ธฐ์ธ๊ธฐ)๊ทธ๋ฆผ์ '๊ฐ์ฅ ๋ฎ์ ์ฅ์(์ต์๊ฐ)'์ ๊ฐ๋ฆฌํค๋๊ฑฐ ๊ฐ์ต๋๋ค. ๋ง์น ๋์นจ๋ฐ์ฒ๋ผ ํ์ดํ๋ค์ ํ์ ์ ํฅํ๊ณ ์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ '๊ฐ์ฅ ๋ฎ์๊ณณ'์์ ๋ฉ์ด์ง์๋ก ํ์ดํ์ ํฌ๊ธฐ๊ฐ ์ปค์ง์ ์ ์ ์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ธฐ์ธ๊ธฐ๋ ๊ฐ ์ง์ ์์ ๋ฎ์์ง๋ ๋ฐฉํฅ์ ๊ฐ๋ฆฌํต๋๋ค.
- ์ ํํ ๋งํ๋ฉด, ๊ธฐ์ธ๊ธฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ชฝ์ ๊ฐ ์ฅ์์์ ํจ์์ ์ถ๋ ฅ ๊ฐ์ ๊ฐ์ฅ ํฌ๊ฒ ์ค์ด๋ ๋ฐฉํฅ์ ๋๋ค. ์ด๊ฑด ์ค์ํ ์ ์ ๋๋ค!
Gradient Descent (๊ฒฝ์ฌ๋ฒ - ๊ฒฝ์ฌํ๊ฐ๋ฒ)
- ์์ค ํจ์๊ฐ ์ต์๊ฐ์ด ๋ ๋์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๊ตฌํด์ผ ํ๋๋ฐ, ๊ธฐ์ธ๊ธฐ๋ฅผ ํ์ฉํด์ ํจ์์ ์ต์๊ฐ์ ์ฐพ์ ์ ์์ต๋๋ค.
- Gradient(๊ธฐ์ธ๊ธฐ)๊ฐ ๊ธฐ์ธ์ด์ง ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๊ฐ๋ ๊ฒ์ ๋ฐ๋ณตํด์ ํจ์์ ๊ฐ์ ์ ์ฐจ ์ค์ด๋ ๊ฒ์ Gradient Method(๊ฒฝ์ฌ๋ฒ)์ด๋ผ๊ณ ํฉ๋๋ค.
- ๊ทผ๋ฐ, Gradient(๊ธฐ์ธ๊ธฐ)๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ์ ๋ง ํจ์์ ์ต์๊ฐ์ด ์๋์ง? ๊ทธ์ชฝ์ด ๋์๊ฐ ๋ฐฉํฅ์ธ์ง๋ ๋ณด์ฅํ ์ ์์ต๋๋ค.
- ์ค์ ๋ก ๋ณต์กํ ํจ์์์๋ ๊ธฐ์ธ๊ธฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐฉํฅ์ ์ต์๊ฐ์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ Gradient Method(๊ฒฝ์ฌ๋ฒ)์ ์ฌ์ฉํฉ๋๋ค.
- ํ๋ฒ Gradient Method(๊ฒฝ์ฌ๋ฒ)์ ์์์ผ๋ก ๋ํ๋ด ๋ณด๊ฒ ์ต๋๋ค.
- ์์ ์์์ n๊ธฐํธ(์ํ)๋ ๊ฐฑ์ ํ๋ ์์ ๋ํ๋ ๋๋ค. ์ด๋ฅผ ์ ๊ฒฝ๋ง์์๋ Learning Rate(ํ์ต๋ฅ )์ด๋ผ๊ณ ํฉ๋๋ค.
- 1๋ฒ์ ํ์ต์ผ๋ก ์ผ๋ง๋งํผ ํ์ตํด์ผ ํ ์ง, ์ฆ, ๋งค๊ฐ๋ณ์ ๊ฐ์ ์ผ๋ง๋ ๊ฐฑ์ ํ๋๋๋ฅผ ์ ํ๋ ๊ฒ์ด Learning Rate(ํ์ต๋ฅ )์ ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์์ ์์์ 1ํ์ ํด๋นํ๋ ๊ฐฑ์ ์ด๊ณ , ์ด ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํด์ ์์์ด ํจ์์ ๊ฐ์ ์ค์ด๋ ๊ฒ์ ๋๋ค.
- ๋ํ Learning Rate(ํ์ต๋ฅ )์ ๊ฐ์ ๋ฏธ๋ฆฌ ํน์ ๊ฐ์ผ๋ก ์ ํด๋์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ด ๋๋ฌด ํฌ๊ฑฐ๋ ์์ผ๋ฉด '์ข์ ์ฅ์' ๋ฅผ ์ฐพ์๊ฐ ์ ์์ต๋๋ค.
- Gradient Descent(๊ฒฝ์ฌํ๊ฐ๋ฒ)์ ์๋์ ์ฝ๋๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
def gradient_descent(f, init_x, lr=0.01, step_num=100):
x = init_x
for i in range(step_num):
grad = numerical_gradient(f, x)
x -= lr * grad
return x
- ์ฝ๋๋ฅผ ํ๋ฒ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค
- ์ธ์ f๋ ์ต์ ํํ๋ ค๋ ํจ์, init_x๋ ์ด๊น๊ฐ, lr์ learning rate๋ฅผ ์๋ฏธํ๋ ํ์ต๋ฅ , step_num์ ๊ฒฝ์ฌ๋ฒ์ ๋ฐ๋ฅธ ๋ฐ๋ณต ํ์์ ๋๋ค.
- numerical_gradient(f, x)๋ก ํจ์์ Gradient(๊ธฐ์ธ๊ธฐ)๋ฅผ ๊ตฌํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ Gradient(๊ธฐ์ธ๊ธฐ)์ ํ์ต๋ฅ ์ ๊ณฑํ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ ์ฒ๋ฆฌ๋ฅผ step_num๋งํผ ๋ฐ๋ณตํฉ๋๋ค.
Neural Network(์ ๊ฒฝ๋ง)์์์ Gradient(๊ธฐ์ธ๊ธฐ)
- ์ ๊ฒฝ๋ง ํ์ต์์๋ Gradient(๊ธฐ์ธ๊ธฐ)๋ฅผ ๊ตฌํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ๋งํ๋ Gradient(๊ธฐ์ธ๊ธฐ)๋ Weight Parameter(๊ฐ์ค์น ๋งค๊ฐ๋ณ์)์ ๋ํ Loss Function(์์คํจ์)์ Gradient(๊ธฐ์ธ๊ธฐ)์ ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ๊ฐ๋จํ ์ ๊ฒธ๋ง์ ์๋ฅผ ๋ค์ด์ ์ค์ ๋ก Gradient(๊ธฐ์ธ๊ธฐ)๋ฅผ ๊ตฌํํ๋ ์ฝ๋๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. (by Python)
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ์ค์
import numpy as np
from common.functions import softmax, cross_entropy_error
from common.gradient import numerical_gradient
class simpleNet:
def __init__(self):
self.W = np.random.randn(2,3) # ์ ๊ท๋ถํฌ๋ก ์ด๊ธฐํ
def predict(self, x):
return np.dot(x, self.W)
def loss(self, x, t):
z = self.predict(x)
y = softmax(z)
loss = cross_entropy_error(y, t)
return loss
x = np.array([0.6, 0.9])
t = np.array([0, 0, 1])
net = simpleNet()
f = lambda w: net.loss(x, t)
dW = numerical_gradient(f, net.W)
print(dW)
- ์ฌ๊ธฐ์ ๋ด์ผํ๋๊ฑด simpleNet ํด๋์ค ์ ๋๋ค.
- simpleNet ํด๋์ค๋ ํ์์ด 2 * 3์ธ Weight(๊ฐ์ค์น) ๋งค๊ฐ๋ณ์๋ฅผ ํ๋์ Instance ๋ณ์๋ก ๊ฐ์ง๋๋ค.
- Method๋ 2๊ฐ์ธ๋ฐ, ํ๋๋ ์์ธก์ ์ํํ๋ predict(x)์ด๊ณ , ๋ค๋ฅธ ํ๋๋ Loss Function์ ๊ฐ์ ๊ตฌํ๋ loss(x, t)์ ๋๋ค.
- ์ฌ๊ธฐ์ ์ธ์๋ x๋ ์ ๋ ฅ ๋ฐ์ดํฐ, t๋ ์ ๋ต ๋ ์ด๋ธ ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด simpleNet์ ์ฌ์ฉํด ๋ช๊ฐ์ง ์ํ์ ํด๋ณด๊ฒ ์ต๋๋ค.
>>> net = simpleNet()
>>> print(net.W) # ๊ฐ์ค์น ๋งค๊ฐ๋ณ์
[[0.47355232, 0.9977393, 0.84668094]
[0.85557411, 0.03563661, 0.69422093]]
>>> x = np.array([0.6, 0.9])
>>> p = net.predict(x)
>>> print(p)
[1.05414809 0.63071653 1.1328074]
>>> np.argmax(p) # ์ต๋๊ฐ์ ์ธ๋ฑ์ค
2
>>> t = np.array([0, 0, 1]) # ์ ๋ต ๋ ์ด๋ธ
>>> net.loss(x, t)
0.9280685366
- ์ด์ด์ Gradient(๊ธฐ์ธ๊ธฐ)๋ฅผ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค. ์ง๊ธ์ฒ๋ผ numerical_gradient(f, x)๋ฅผ ์จ์ ๊ตฌํ๋ฉด ๋ฉ๋๋ค.
- ์ฌ๊ธฐ์ ์ ์ํ f(W) ํจ์์ ์ธ์ W๋ ๋๋ฏธ๋ก ๋ง๋ ๊ฒ์ ๋๋ค.
- numerical_gradient(f, x) ๋ด๋ถ์์ f(x)๋ฅผ ์คํํ๋๋ฐ, ๊ทธ์์ ์ผ๊ด์ฑ์ ์ํด f(W)๋ฅผ ์ ์ํ ๊ฒ์ ๋๋ค.
>>> def f(W):
return net.loss(x, t)
>>> dW = numerical_gradient(f, net.W)
>>> print(dW) # 2x3์ 2์ฐจ์ ๋ฐฐ์ด
[[0.21924763 0.14356247 -0.36281009]
[0.32887144 0.2153437 -0.54421514]]
- numerical_gradient(f, x) ํจ์์ ์ธ์์ธ f๋ ํจ์์ด๊ณ , x๋ ํจ์ f์ ์ธ์์ ๋๋ค.
- ๊ทธ๋์ ์ฌ๊ธฐ์์๋ W๋ฅผ ์ธ์๋ก ๋ฐ์ Loss Function(์์ค ํจ์)๋ฅผ ๊ณ์ฐํ๋ ์๋ก์ด ํจ์ f๋ฅผ ์ ์ํ์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์๋ก ์ ์ํ ํจ์๋ฅผ numerical_gradient(f, x)์ ๋๊น๋๋ค.
- dW๋ numerical_gradient(f. net.W)์ ๊ฒฐ๊ณผ๋ก, ๊ทธ ํ์์ 2 * 3์ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋ค.
- ์ด๋ ๊ฒ Neural Network(์ ๊ฒธ๋ง)์ Gradient(๊ธฐ์ธ๊ธฐ)๋ฅผ ๊ตฌํ ๋ค์์๋ ๊ฒฝ์ฌ๋ฒ์ ๋ฐ๋ผ Weight Parameter(๊ฐ์ค์น ๋งค๊ฐ๋ณ์)๋ฅผ ๊ฐฑ์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
Training Algorithm (ํ์ต ์๊ณ ๋ฆฌ์ฆ)
Nerual Network(์ ๊ฒฝ๋ง) ํ์ต์ ์ ์ฐจ๋ฅผ ํ๋ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
์ ์
- ์ ๊ฒฝ๋ง์๋ ์ ์ ๊ฐ๋ฅํ Weight(๊ฐ์ค์น)์ Bias(ํธํฅ)์ด ์๊ณ , ์ด Weight(๊ฐ์ค์น)์ Bias(ํธํฅ)์ Training Data(ํ๋ จ ๋ฐ์ดํฐ)์ ์ ์ํ๋๋ก ์กฐ์ ํ๋ ๊ณผ์ ์ Training(ํ์ต)์ด๋ผ๊ณ ํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ Neural Network Training(์ ๊ฒฝ๋ง ํ์ต)์ 4๋จ๊ณ๋ก ์ํํ ์ ์์ต๋๋ค.
1๋จ๊ณ - Mini-Batch
- ํ๋ จ ๋ฐ์ดํฐ ์ค ์ผ๋ถ๋ฅผ ๋ฌด์์๋ก ๊ฐ์ ธ์ต๋๋ค. ์ด๋ ๊ฒ ์ ๋ณํ ๋ฐ์ดํฐ๋ฅผ Mini-Batch(๋ฏธ๋๋ฐฐ์น) ๋ผ๊ณ ํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ทธ Mini-Batch(๋ฏธ๋๋ฐฐ์น)์ Loss Function Value(์์ค ํจ์ ๊ฐ)์ ์ค์ด๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค.
2๋จ๊ณ - Gradient(๊ธฐ์ธ๊ธฐ) ์ฐ์ถ
- Mini-Batch์ Loss Function ๊ฐ์ ์ค์ด๊ธฐ ์ํด์ ๊ฐ Weight Paraemter(๊ฐ์ค์น ๋งค๊ฐ๋ณ์)์ Gradient(๊ธฐ์ธ๊ธฐ)๋ฅผ ๊ตฌํฉ๋๋ค.
- Gradient(๊ธฐ์ธ๊ธฐ)๋ Loss Function Value(์์ค ํจ์ ๊ฐ)์ ๊ฐ์ฅ ์๊ฒ ํ๋ ๋ฐฉํฅ์ ์ ์ํฉ๋๋ค.
3๋จ๊ณ - Parameter(๋งค๊ฐ๋ณ์) ๊ฐฑ์
- Weight Paraemter(๊ฐ์ค์น ๋งค๊ฐ๋ณ์)๋ฅผ Gradient(๊ธฐ์ธ๊ธฐ) ๋ฐฉํฅ์ผ๋ก ์์ฃผ ์กฐ๊ธ ๊ฐฑ์ ํฉ๋๋ค.
4๋จ๊ณ - ๋ฐ๋ณต
- 1~3๋จ๊ณ๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
- ์ด๊ฒ์ด Neural Network Training(์ ๊ฒฝ๋ง ํ์ต)์ด ์ด๋ฃจ์ด์ง๋ ์์์ ๋๋ค.
- ์ด๋ Gradient Descent(๊ฒฝ์ฌ ํ๊ฐ๋ฒ)์ผ๋ก Paraemter(๋งค๊ฐ๋ณ์)๋ฅผ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ด๋, Data๋ฅผ Mini-Batch๋ก ๋ฌด์์๋ก ์ ์ ํ๊ธฐ ๋๋ฌธ์ ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ (Stochastic Gradient Descent, SGD)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
2-Layer Nerual Network (2์ธต ์ ๊ฒฝ๋ง) ๊ตฌํํ๊ธฐ
- ์ฒ์์๋ 2์ธต ์ ๊ฒฝ๋ง์ ํ๋์ ํด๋์ค๋ก ๊ตฌํํ๋ ๊ฒ๋ถํฐ ์์ํฉ๋๋ค.
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ์ค์
from common.functions import *
from common.gradient import numerical_gradient
class TwoLayerNet:
def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
# ๊ฐ์ค์น ์ด๊ธฐํ
self.params = {}
self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
self.params['b1'] = np.zeros(hidden_size)
self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)
self.params['b2'] = np.zeros(output_size)
def predict(self, x):
W1, W2 = self.params['W1'], self.params['W2']
b1, b2 = self.params['b1'], self.params['b2']
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
y = softmax(a2)
return y
# x : ์
๋ ฅ ๋ฐ์ดํฐ, t : ์ ๋ต ๋ ์ด๋ธ
def loss(self, x, t):
y = self.predict(x)
return cross_entropy_error(y, t)
def accuracy(self, x, t):
y = self.predict(x)
y = np.argmax(y, axis=1)
t = np.argmax(t, axis=1)
accuracy = np.sum(y == t) / float(x.shape[0])
return accuracy
# x : ์
๋ ฅ ๋ฐ์ดํฐ, t : ์ ๋ต ๋ ์ด๋ธ
def numerical_gradient(self, x, t):
loss_W = lambda W: self.loss(x, t)
grads = {}
grads['W1'] = numerical_gradient(loss_W, self.params['W1'])
grads['b1'] = numerical_gradient(loss_W, self.params['b1'])
grads['W2'] = numerical_gradient(loss_W, self.params['W2'])
grads['b2'] = numerical_gradient(loss_W, self.params['b2'])
return grads
def gradient(self, x, t):
W1, W2 = self.params['W1'], self.params['W2']
b1, b2 = self.params['b1'], self.params['b2']
grads = {}
batch_num = x.shape[0]
# forward
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
y = softmax(a2)
# backward
dy = (y - t) / batch_num
grads['W2'] = np.dot(z1.T, dy)
grads['b2'] = np.sum(dy, axis=0)
da1 = np.dot(dy, W2.T)
dz1 = sigmoid_grad(a1) * da1
grads['W1'] = np.dot(x.T, dz1)
grads['b1'] = np.sum(dz1, axis=0)
return grads
TwoLayerNet ํด๋์ค๊ฐ ์ฌ์ฉํ๋ ๋ณ์
TwoLayerNet ํด๋์ค์ Method
Mini-Batch Training ๊ตฌํํ๊ธฐ
- Mini-Batch ํ์ต์ Training Data์ค ์ผ๋ถ๋ฅผ ๋ฌด์์๋ก ๊บผ๋ด๊ณ (Mini-Batch), ๊ทธ Mini-Batch์ ๋ํด์ Gradient(๊ฒฝ์ฌ๋ฒ)์ผ๋ก Parameter(๋งค๊ฐ๋ณ์)๋ฅผ ๊ฐฑ์ ํฉ๋๋ค.
- ๊ทธ๋ฌ๋ฉด TwoLayerNet ํด๋์ค์ Mnist Dataset์ ์ฌ์ฉํ์ฌ ํ์ต์ ํด๋ณด๊ฒ ์ต๋๋ค.
import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
train_loss_list = []
# ํ์ดํผํ๋ผ๋ฏธํฐ
iters_num = 10000 # ๋ฐ๋ณต ํ์
train_size = x_train.shape[0]
batch_size = 100 # ๋ฏธ๋๋ฐฐ์น ํฌ๊ธฐ
learning_rate = 0.1
network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
for i in range(iters_num):
# ๋ฏธ๋๋ฐฐ์น ํ๋
batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]
# ๊ธฐ์ธ๊ธฐ ๊ณ์ฐ
grad = network.gradient(x_batch, t_batch)
# ๋งค๊ฐ๋ณ์ ๊ฐฑ์
for key in ('W1', 'b1', 'W2', 'b2'):
network.params[key] -= learning_rate * grad[key]
# ํ์ต ๊ฒฝ๊ณผ ๊ธฐ๋ก
loss = network.loss(x_batch, t_batch)
train_loss_list.append(loss)
- Loss Function Value(์์ค ํจ์ ๊ฐ์ ์ถ์ด) ๊ทธ๋ํ ์ ๋๋ค.
- ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ํ์ต ํ์๊ฐ ๋์ด๊ฐ๋ฉด์ Loss Function(์์ค ํจ์)์ ๊ฐ์ด ์ค์ด๋๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
- ์ด๋ ํ์ต์ด ์ ๋๋๊ฒ์ด๋ฉฐ, Nerual Network(์ ๊ฒฝ๋ง)์ Weight Parameter(๊ฐ์ค์น ๋งค๊ฐ๋ณ์)๊ฐ ์์์ด ๋ฐ์ดํฐ์ ์ ์ํ๊ณ ์์์ ์๋ฏธํ๋ฉฐ, ์ ๊ฒฝ๋ง์ด ํ์ตํ๊ณ ์๋ ๊ฒ์ ๋๋ค.
Test Data๋ก ํ๊ฐํ๊ธฐ
- Loss Function(์์คํจ์)์ ๊ฐ์ด๋ ํ๋ จ ๋ฐ์ดํฐ์ ๋ฏธ๋๋ฐฐ์น์ ๋ํ ์์ค ํจ์์ ๊ฐ์ ๋๋ค.
- Nerual Network Training(์ ๊ฒฝ๋ง ํ์ต)์์๋ Overfitting(์ค๋ฒํผํ )์ ์ผ์ผํค์ง ์๋์ง ํ์ธ์ ํด์ผํฉ๋๋ค.
- Training Data(ํ๋ จ ๋ฐ์ดํฐ)์ ํฌํจ๋ Image๋ง ์ ๋๋ก ๊ตฌ๋ถํ๊ณ , ๊ทธ๋ ์ง ์์ ์ด๋ฏธ์ง๋ ์ ๋๋ก ์๋ณ ํ ์ ์์ต๋๋ค.
import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
train_loss_list = []
# ํ์ดํผํ๋ผ๋ฏธํฐ
iters_num = 10000 # ๋ฐ๋ณต ํ์
train_size = x_train.shape[0]
batch_size = 100 # ๋ฏธ๋๋ฐฐ์น ํฌ๊ธฐ
learning_rate = 0.1
train_loss_list = []
train_acc_list = []
test_acc_list = []
# 1์ํญ๋น ๋ฐ๋ณต ์
iter_per_epoch = max(train_size / batch_size, 1)
for i in range(iters_num):
# ๋ฏธ๋๋ฐฐ์น ํ๋
batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]
# ๊ธฐ์ธ๊ธฐ ๊ณ์ฐ
grad = network.gradient(x_batch, t_batch)
# ๋งค๊ฐ๋ณ์ ๊ฐฑ์
for key in ('W1', 'b1', 'W2', 'b2'):
network.params[key] -= learning_rate * grad[key]
# ํ์ต ๊ฒฝ๊ณผ ๊ธฐ๋ก
loss = network.loss(x_batch, t_batch)
train_loss_list.append(loss)
# 1์ํญ ๋น ์ ํ๋ ๊ณ์ฐ
if i % iter_per_epoch == 0:
train_acc = network.accuracy(x_train, t_train)
test_acc = network.accuracy(x_test, t_test)
train_acc_list.append(train_acc)
test_acc_list.append(test_acc)
print("train acc, test acc | "+ str(train_acc) + ", +str(test_acc))
- 1 epoch๋ง๋ค ๋ชจ๋ ํ๋ จ ๋ฐ์ดํฐ์ ์ํ ๋ฐ์ดํฐ์ ๋ํ ์ ํ๋๋ฅผ ๊ณ์ฐ ๋ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
- ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ ์ ์๋๊ฑด, ํ์ต(epoch)์ ์ํ ํ ๋ ๋ง์ ์ ํ๋๊ฐ ์ข์์ง๋๋ค.
- ์ฆ, Overfitting์ด ์ผ์ด๋์ง ์์ต๋๋ค.
Summary(์ ๋ฆฌ)
- ๊ธฐ๊ณํ์ต์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ์ ์ ํ๋ จ ๋ฐ์ดํฐ์ ์ํ ๋ฐ์ดํฐ๋ก ๋๋ ์ฌ์ฉํ๋ค.
- ํ๋ จ ๋ฐ์ดํฐ๋ก ํ์ตํ ๋ชจ๋ธ์ ๋ฒ์ฉ ๋ฅ๋ ฅ์ ์ํ ๋ฐ์ดํฐ๋ก ํ๊ฐํ๋ค.
- ์ ๊ฒฝ๋ง ํ์ต์ ์์ค ํจ์์ ์งํ๋ก, ์์ค ํจ์์ ๊ฐ์ด ์์์ง๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ค์น ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐฑ์ ํ๋ค.
- ๊ฐ์ค์น ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐฑ์ ํ ๋๋ ๊ฐ์ค์น ๋งค๊ฐ๋ณ์์ ๊ธฐ์ธ๊ธฐ๋ฅผ ์ด์ฉํ๊ณ , ๊ธฐ์ธ์ด์ง ๋ฐฉํฅ์ผ๋ก ๊ฐ์ค์น์ ๊ฐ์ ๊ฐฑ์ ํ๋ ์์ ์ ๋ฐ๋ณตํ๋ค.
- ์์ฃผ ์์ ๊ฐ์ ์ฃผ์์ ๋์ ์ฐจ๋ถ์ผ๋ก ๋ฏธ๋ถํ๋ ๊ฒ์ ์์น ๋ฏธ๋ถ์ด๋ผ๊ณ ํ๋ค.
- ์์น ๋ฏธ๋ถ์ ์ด์ฉํด ๊ฐ์ค์น ๋งค๊ฐ๋ณ์์ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ตฌํ ์ ์๋ค.
- ์์น ๋ฏธ๋ถ์ ์ด์ฉํ ๊ณ์ฐ์๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง๋ง, ๊ทธ ๊ตฌํ์ ๊ฐ๋จํ๋ค. ํํธ, ๋ค์ ์ฅ์์ ๊ตฌํํ๋ ์ค์ฐจ์ญ์ ํ๋ฒ์ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ณ ์์ผ๋ก ๊ตฌํ ์ ์๋ค.
๋ฐ์ํ
'๐ฅ๏ธ Deep Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DL] ๋จ์ํ Layer ๊ตฌํํด๋ณด๊ธฐ (0) | 2024.03.31 |
---|---|
[DL] Backpropagation (์ค์ฐจ์ญ์ ํ๋ฒ) (0) | 2024.03.27 |
[DL] Neural Network Training (์ ๊ฒฝ๋ง ํ์ต) (0) | 2024.03.21 |
[DL] Neural Networks (์ ๊ฒฝ๋ง) (0) | 2024.03.17 |
[DL] Perceptron (ํผ์ ํธ๋ก ) (0) | 2024.03.12 |