๋ฐ์ํ
Parameter(๋งค๊ฐ๋ณ์) ๊ฐฑ์
์ ๊ฒฝ๋ง ํ์ต์ ๋ชฉ์ ์ Loss Function (์์ค ํจ์)์ ๊ฐ์ ๊ฐ๋ฅํ ๋ฎ์ถ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐพ๋๊ฒ์ ๋๋ค. ์ด๋ ๊ณง ๋งค๊ฐ๋ณ์์ ์ต์ ๊ฐ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ฉฐ, ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํธ๋๊ฒ์ Optimization(์ต์ ํ) ๋ผ๊ณ ํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ต์ ์ Parameter(๋งค๊ฐ๋ณ์) ๊ฐ์ ์ฐพ๋ ๋จ์๋ก Parameter(๋งค๊ฐ๋ณ์)์ Gradient(๊ธฐ์ธ๊ธฐ-๋ฏธ๋ถ)์ ์ด์ฉํ์ต๋๋ค.
- Parameter(๋งค๊ฐ๋ณ์)์ Gradient๋ฅผ ๊ตฌํด, ๊ธฐ์ธ์ด์ง ๋ฐฉํฅ์ผ๋ก Parameter(๋งค๊ฐ๋ณ์) ๊ฐ์ ๊ฐฑ์ ํ๋ ์ผ์ ๋ช ๋ฒ์ด๊ณ ๋ฐ๋ณตํด์ ์ ์ ์ต์ ์ ๊ฐ์ ๋ค๊ฐ๊ฐ์ต๋๋ค. ์ด๊ฒ์ด ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ - Stochastic Gradient Descent(SGD)๋ผ๊ณ ํฉ๋๋ค.
- ๋ํ ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ - Stochastic Gradient Descent(SGD) ์ ๊ฐ์ฅ ํฌ๊ฒ ๊ธฐ์ธ์ด์ง ๋ฐฉํฅ์ผ๋ก ๊ฐ๋๊ฒ์ด Stochastic Gradient Descent(SGD)์ ์ ๋ต์ ๋๋ค.
Stochastic Gradient Descent (SGD) - ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ
Stochastic Gradient Descent(SGD)๋ ์์์ผ๋ก ์๋์ ๊ฐ์ด ์ธ ์ ์์ต๋๋ค.
- W ← W − η ∗ ∂L / ∂W
- ์ฌ๊ธฐ์ 'W'๋ ๊ฐฑ์ ํ 'Weight Parameter' (๊ฐ์ค์น ๋งค๊ฐ๋ณ์)
- '∂L / ∂W' ๋ 'W'์ ๋ํ Loss Function(์์ค ํจ์)์ Gradient(๊ธฐ์ธ๊ธฐ)์ ๋๋ค.
- 'η': ํ์ต๋ฅ ์ ์๋ฏธํ๋๋ฐ ์ ํด์ง ์์๊ฐ(๋ณดํต 0.01์ด๋, 0.001๊ณผ ๊ฐ์ ๊ฐ์ ๋ฏธ๋ฆฌ ์ ํจ)์ ์ฌ์ฉํฉ๋๋ค.
- ๋ํ '←' ๋ ์ฐ๋ณ์ ๊ฐ์ผ๋ก ์ข๋ณ์ ๊ฐ์ ๊ฐฑ์ ํ๋ค๋ ๋ป์ ๋๋ค. ์ฆ, SGD๋ ๊ธฐ์ธ์ด์ง ๋ฐฉํฅ์ผ๋ก ์ผ์ ๊ฑฐ๋ฆฌ๋ง ๊ฐ๊ฒ ๋ค๋ ๋จ์ํ ๋ฐฉ๋ฒ์ ๋๋ค.
class SGD:
def __init__(self):
self.lr = lr # lr์ ํ์ต๋ฅ (learning rate)
# update()๋ SGD ๊ณผ์ ์์ ๋ฐ๋ณตํด์ ํธ์ถ๋จ
def update(self, params, grads):
for key in params.keys():
params[key] -= self.lr * grads[key]
- ์ฌ๊ธฐ์ ์ด๊ธฐํ๋ ๋ฐ๋ ์ธ์์ธ lr์ Learning Rate(ํ์ต๋ฅ )์ ๋ปํฉ๋๋ค.
- ์ด Learning Rate(ํ์ต๋ฅ )์ ์ธ์คํด์ค ๋ณ์๋ก ์ ์งํฉ๋๋ค.
- update(params, grads)Method๋ SGD๊ณผ์ ์์ ๋ฐ๋ณตํด์ ๋ถ๋ฆฌ๋ Dictionary ๋ณ์ ์
๋๋ค.
- params['W1'], grads['W1']๋ฑ๊ณผ ๊ฐ์ด ๊ฐ๊ฐ Weight Parameter (๊ฐ์ค์น ๋งค๊ฐ๋ณ์) & Gradient (๊ธฐ์ธ๊ธฐ)๋ฅผ ์ ์ฅํฉ๋๋ค.
SGD(ํ๋ฅ ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ)์ ๋จ์
Stochastic Gradient Descent(SGD)๋ ๋จ์ํ๊ณ ๊ตฌํ๋ ์ฝ์ง๋ง, ๋ฌธ์ ์ ๋ฐ๋ผ์ ๋นํจ์จ์ ์ผ๋๊ฐ ์์ต๋๋ค.
ํ๋ฒ SGD์ ๋จ์ ์ ํ๋ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
- ์ด ํจ์์ ํ๋ฒ Gradient๋ฅผ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค. ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ตฌํ ๋์๋ ํธ๋ฏธ๋ถ์ ์ฌ์ฉํฉ๋๋ค.
- f์ ๋ํ x์ ํธ๋ฏธ๋ถ์ x์ ๋ํด์ ๋ฏธ๋ถํ๊ณ , y๋ ์์๋ก ์ทจ๊ธํฉ๋๋ค. ๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ํญ๋ง ์ด์๋จ์ต๋๋ค.
- f์ ๋ํ y์ ํธ๋ฏธ๋ถ์ y์ ๋ํด์ ๋ฏธ๋ถํ๊ณ , x๋ ์์๋ก ์ทจ๊ธํฉ๋๋ค. ๋ฐ๋ผ์ ๋ ๋ฒ์งธ ํญ๋ง ์ด์๋จ์ต๋๋ค.
- ๋ฐ๋ผ์ Gradient(๊ธฐ์ธ๊ธฐ)๋ (x์ ๋ํ ํธ๋ฏธ๋ถ ๊ฐ, y์ ๋ํ ํธ๋ฏธ๋ถ ๊ฐ)์ผ๋ก ๋ํ๋ฉ๋๋ค. ํ๋ฒ ํธ๋ฏธ๋ถ์ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
f(x, y)๋ฅผ x์ ๋ํด ํธ๋ฏธ๋ถ: ∂f/∂x = (1/20) * 2x = x/10
f(x, y)๋ฅผ y์ ๋ํด ํธ๋ฏธ๋ถํ๋ฉด: ∂f/∂y = 2y
- ๋ฐ๋ผ์ ํจ์ f(x,y) = (x/10, 2y)๊ฐ Graident Vector (๊ธฐ์ธ๊ธฐ ๋ฒกํฐ)๊ฐ ๋ฉ๋๋ค.
- Gradient(๊ธฐ์ธ๊ธฐ)๋ฅผ ๋ณด๋ฉด y์ถ ๋ฐฉํฅ์ ๊ฐํ๋ฅด๊ณ (ํฌ๊ณ ) x์ถ ๋ฐฉํฅ์ ์๋ค๋๊ฒ(์๋ง) ํ๋ค๋๊ฒ์ด ํน์ง์ ๋๋ค.
- ๋ํ ์ต์๊ฐ์ด ๋๋ ์ ๋ณด๋ (x, y) = (0, 0)์ด์ง๋ง, ๋ณด์ฌ์ฃผ๋ Gradient(๊ธฐ์ธ๊ธฐ) ๋๋ถ๋ถ์ (0, 0)๋ฐฉํฅ์ ๊ฐ๋ฆฌํค์ง ์์ต๋๋ค.
- ํ๋ฒ ์๋ก ๋ค์ด์ ํจ์์ SGD๋ฅผ ์ด๊ธฐ๊ฐ์ (-7.0, 2.0)์ผ๋ก ์ ์ฉํด์ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
- ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ - Stochastic Gradient Descent(SGD)๊ณผ ๊ฐ์ด ์ฌํ๊ฒ ๊ตฝ์ด์ง ์์ง์๋ค ๋ณด์ฌ์ค๋๋ค. ๋นํจ์จ์ ์ธ ์์ง์์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
- ์ฆ ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ - Stochastic Gradient Descent(SGD)์ ๋จ์ ์ Anisotropy Function(๋น๋ฑ๋ฐฉ์ฑ ํจ์ - ๋ฐฉํฅ์ ๋ฐ๋ผ ์ฑ์ง, Gradient๊ฐ ๋ฌ๋ผ์ง๋ ํจ์)์์ ํ์ ๊ฒฝ๋ก๊ฐ ๋นํจ์จ์ ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
- ์ด๋ด๋ SGD ๊ฐ์ด ๋ฌด์์ ๊ธฐ์ธ์ด์ง ๋ฐฉํฅ์ผ๋ก ์งํํ๋ ๊ฒ์ด ๋ณธ๋์ ์ต์๊ฐ๊ณผ ๋ค๋ฅธ ๋ฐฉํฅ์ ๊ฐ๋ฆฌ์ผ์๋ผ๋ ์ ๋ ์๊ฐํด๋ณผ ํ์๊ฐ ์์ต๋๋ค.
- ์ด๋ ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ - Stochastic Gradient Descent(SGD)์ ๋จ์ ๋ค์ ๊ฐ์ ํด์ฃผ๋ Momentum(๋ชจ๋ฉํ ), AdaGrad, Adam์ด๋ผ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
Stochastic Gradient Descent(SGD) ๋์ฒด ๊ธฐ๋ฒ
Momentum (๋ชจ๋ฉํ )
Momentum(๋ชจ๋ฉํ )์ ๋ฌผ๋ฆฌ์์ '์ด๋๋'์ ๋ปํ๋ ๋จ์ด์ ๋๋ค. ์์์ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
v ← αv − η ∗ ∂L/∂W
W ← W + v
- ์ฌ๊ธฐ์ 'W'๋ ๊ฐฑ์ ํ 'Weight Parameter' (๊ฐ์ค์น ๋งค๊ฐ๋ณ์)
- '∂L / ∂W' ๋ 'W'์ ๋ํ Loss Function(์์ค ํจ์)์ Gradient(๊ธฐ์ธ๊ธฐ)์ ๋๋ค.
- 'η': ํ์ต๋ฅ ์ ์๋ฏธํ๋๋ฐ ์ ํด์ง ์์๊ฐ(๋ณดํต 0.01์ด๋, 0.001๊ณผ ๊ฐ์ ๊ฐ์ ๋ฏธ๋ฆฌ ์ ํจ)์ ์ฌ์ฉํฉ๋๋ค.
- 'v': ์๋๋ฅผ ์๋ฏธํ๋๋ฐ Gradient(๊ธฐ์ธ๊ธฐ) ๋ฐฉํฅ์ผ๋ก ํ์ ๋ฐ์ ๋ฌผ์ฒด๊ฐ ๊ฐ์๋๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
- 'α': ๋ฌผ๋ฆฌ์์์ ์ง๋ฉด ๋ง์ฐฐ & ๊ณต๊ธฐ ์ ํญ์ ํด๋นํฉ๋๋ค. (0.9 ๋ฑ์ ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค)
- ์๋ ์ฝ๋๋ Momentum์ ๊ตฌํํ ์ฝ๋ ์ ๋๋ค.
import numpy as np
class Momentum:
def __init__(self, lr=0.01, momentum=0.9):
self.lr = lr # ํ์ต๋ฅ (learning rate)
self.momentum = momentum # ๋ชจ๋ฉํ
(momentum) ํ๋ผ๋ฏธํฐ
self.v = None # ๋ชจ๋ฉํ
์ ์ ์ฅํ๊ธฐ ์ํ ๋์
๋๋ฆฌ
def update(self, params, grads):
if self.v is None:
self.v = {} # v๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
for key, val in params.items():
self.v[key] = np.zeros_like(val) # ๊ฐ ํ๋ผ๋ฏธํฐ์ ๋ํด ๋ชจ๋ฉํ
์ 0์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
for key in params.keys():
# ๋ชจ๋ ํ๋ผ๋ฏธํฐ์ ๋ํด ๋ฐ๋ณตํ์ฌ ์
๋ฐ์ดํธ ์ํ
# ๋ชจ๋ฉํ
์ ์ด์ฉํ์ฌ ํ๋ผ๋ฏธํฐ ์
๋ฐ์ดํธ
self.v[key] = self.momentum * self.v[key] - self.lr * grads[key]
params[key] += self.v[key] # ์๋ก์ด ํ๋ผ๋ฏธํฐ ๊ฐ ์ ์ฉ
- Momentum(๋ชจ๋ฉํ )์ ์ฌ์ฉํด์ ์๋์ ์์์ ์ต์ ํ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ฒ ์ต๋๋ค.
- ๊ทธ๋ฆผ์์ ๋ณด๋ฏ, Momentum(๋ชจ๋ฉํ )์ ๊ฐฑ์ ๊ฒฝ๋ก๋ ๊ณต์ด ๋ฐ๋ฝ์ ๊ตฌ๋ฅด๋ฏ ์์ง์ ๋๋ค. '์ง๊ทธ์ฌ๊ทธ ์ ๋'๊ฐ ๋ํ ๊ฒ์ ์ ์ ์์ต๋๋ค.
- ์ด๋ x์ถ์ ํ์ ์์ฃผ ์์ง๋ง ๋ฐฉํฅ์ ๋ณํ์ง ์์์ ํ ๋ฐฉํฅ์ผ๋ก ์ผ์ ํ๊ฒ ๊ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๊ฑฐ๊พธ๋ก y์ถ์ ํ์ ํฌ์ง๋ง ์์๋๋ก ๋ฒ๊ฐ์ ๋ฐ์์ ์์ธตํ์ฌ y์ถ ๋ฐฉํฅ์ ์๋๋ ์์ ์ ์ด์ง ์์ต๋๋ค.
- ์ ์ฒด์ ์ผ๋ก ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ - Stochastic Gradient Descent(SGD)๋ณด๋ค x์ถ ๋ฐฉํฅ์ผ๋ก ๋น ๋ฅด๊ฒ ๋ค๊ฐ๊ฐ ์ง๊ทธ์ฌ๊ทธ ์์ง์์ด ์ค์ด๋ญ๋๋ค.
AdaGrad
- Learning Rate(ํ์ต๋ฅ - η)์ด ๋๋ฌด ์์ผ๋ฉด ํ์ต ์๊ฐ์ด ๊ธธ์ด์ง๊ณ , ๋๋ฌด ํฌ๋ฉด ๋ฐ์ฐํ์ฌ ํ์ต์ด ์ ๋๋ก ์ด๋ค์ง์ง ์์ต๋๋ค.
- ์ด Learning Rate(ํ์ต๋ฅ ) ํ๋ฅ ์ ๊ฐ์(learning rate decay)๋ Learning Rate(ํ์ต๋ฅ )์ ์ ์ฐจ ์ค์ด๋ ๋ฐฉ์์ ๋๋ค.
- Learning Rate(ํ์ต๋ฅ )์ ์์ํ ๋ฎ์ถ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ Parameter(๋งค๊ฐ๋ณ์) ์ ์ฒด์ Learning Rate(ํ์ต๋ฅ )๊ฐ์ ์ผ๊ด์ ์ผ๋ก ๋ฎ์ถ๋ ๊ฒ์ ๋ฐ์ ์ํจ๊ฒ์ด AdaGrad์ ๋๋ค.
- AdaGrad ๋ฐฉ์์ '๊ฐ๊ฐ์' Parameter(๋งค๊ฐ๋ณ์)์ ๋ง๊ฒ '๋ง์ถคํ' ๊ฐ์ ๋ง๋ค๊ณ Adaptive(์ ์์ )์ผ๋ก Learning Rate(ํ์ต๋ฅ )์ ์กฐ์ ํ๋ฉด์ ํ์ต์ ์งํํฉ๋๋ค. ์์์ ์๋์ ๊ฐ์ต๋๋ค.
h ← h + ∂L/∂W โ ∂L/∂W
W← W − η ∗ 1/√h ∗ ∂L/∂W
- ์ฌ๊ธฐ์ 'W'๋ ๊ฐฑ์ ํ 'Weight Parameter' (๊ฐ์ค์น ๋งค๊ฐ๋ณ์)
- '∂L / ∂W' ๋ 'W'์ ๋ํ Loss Function(์์ค ํจ์)์ Gradient(๊ธฐ์ธ๊ธฐ)์ ๋๋ค.
- 'η': ํ์ต๋ฅ ์ ์๋ฏธํ๋๋ฐ ์ ํด์ง ์์๊ฐ(๋ณดํต 0.01์ด๋, 0.001๊ณผ ๊ฐ์ ๊ฐ์ ๋ฏธ๋ฆฌ ์ ํจ)์ ์ฌ์ฉํฉ๋๋ค.
- 'h'๋ ๊ธฐ์กด ๊ธฐ์ธ๊ธฐ ๊ฐ์ ์ ๊ณฑํ์ฌ ๊ณ์ ๋ํด์ค๋๋ค. 'โ'๋ ํ๋ ฌ๋ณ ์์์ ๊ณฑ์ ์ ์๋ฏธํฉ๋๋ค.
- ๋ํ Parameter(๋งค๊ฐ๋ณ์)๋ฅผ ๊ฐฑ์ ํ ๋ 1/√h๋ฅผ ๊ณฑํด Learning Rate(ํ์ต๋ฅ )์ ์กฐ์ ํฉ๋๋ค.
- Parameter(๋งค๊ฐ๋ณ์)์ ์์ ์ค์์ ๋ง์ด ์์ง์ธ(ํฌ๊ฒ ๊ฐฑ์ ๋) ์ผ์๋ Learning Rate(ํ์ต๋ฅ )์ด ๋ฎ์์ง๋๋ฐ, Learning Rate(ํ์ต๋ฅ ) ๊ฐ์๊ฐ Parameter(๋งค๊ฐ๋ณ์)์ ์์๋ง๋ค ๋ค๋ฅด๊ฒ ์ ์ฉ๋ฉ๋๋ค. ์ด์ ๋ ๋ฌด์์ผ๊น์?
AdaGrad๋ ๊ณผ๊ฑฐ์ ๊ธฐ์ธ๊ธฐ๋ฅผ ์ ๊ณฑํ์ฌ ๊ณ์ ๋ํ๊ธฐ ๋๋ฌธ์ ํ์ต์ ์งํํ ์๋ก ๊ฐฑ์ ๊ฐ๋๊ฐ ์ฝํด์ง๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ ๊ธฐ๋ฒ์ผ๋ก RMSProp์ด ์๋ค. RMSProp์์๋ ๋จผ ๊ณผ๊ฑฐ์ ๊ธฐ์ธ๊ธฐ๋ ์์ํ ์๊ณ ์๋ก์ด ๊ธฐ์ธ๊ธฐ ์ ๋ณด๋ฅผ ํฌ๊ฒ ๋ฐ์ํฉ๋๋ค.
์ด๋ฅผ ์ง์์ด๋ํ๊ท (Exponential Moving Average)์ด๋ผ ํ๋ฉฐ ๊ณผ๊ฑฐ ๊ธฐ์ธ๊ธฐ์ ๋ฐ์ ๊ท๋ชจ๋ฅผ ๊ธฐํ๊ธ์์ ์ผ๋ก ๊ฐ์์ํต๋๋ค.
- ๊ทธ๋ฌ๋ฉด ํ๋ฒ AdaGrad์ ๊ตฌํ์ ํ๋ฒ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
import numpy as np
class AdaGrad:
def __init__(self, lr=0.01):
self.lr = lr # ํ์ต๋ฅ (learning rate)
self.h = None # ๋งค๊ฐ๋ณ์์ ๋ํ ์ ๊ณฑ ๊ทธ๋๋์ธํธ๋ฅผ ๋์ ํ๊ธฐ ์ํ ๋์
๋๋ฆฌ
def update(self, params, grads):
if self.h is None:
self.h = {} # h๋ฅผ ์ด๊ธฐํ
for key, val in params.items():
self.h[key] = np.zeros_like(val) # ๊ฐ ๋งค๊ฐ๋ณ์์ ๋ํ h๋ฅผ 0์ผ๋ก ์ด๊ธฐํ
for key in params.keys():
# ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ๋ํด ๋ฐ๋ณตํ์ฌ ์
๋ฐ์ดํธ ์ํ
self.h[key] += grads[key] * grads[key] # ๊ทธ๋๋์ธํธ ์ ๊ณฑ์ ๋์
params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)
# ๋งค๊ฐ๋ณ์ ์
๋ฐ์ดํธ: ํ์ต๋ฅ ์ ์ ์์ ์ผ๋ก ์กฐ์ ํ์ฌ ์
๋ฐ์ดํธ
# np.sqrt(self.h[key]) + 1e-7๋ 0์ผ๋ก ๋๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์์ ๊ฐ
- ์ฃผ์ํด์ ๋ด์ผํ๋ ๊ฒ์ ๋ง์ง๋ง์ค์ 1e-7์ด๋ผ๋ ์์ ๊ฐ์ ๋ํ๋ ๋ถ๋ถ์ ๋๋ค. ์ด ์์ ๊ฐ์ 0์ผ๋ก ๋๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์์ ๊ฐ์ ๋๋ค.
- self.h[key]์ 0์ด ๋ด๊ฒจ์๋ค ํด๋, 0์ผ๋ก ๋๋๋ ์ฌํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
Adam
Adam์ Momentum(๋ชจ๋ฉํ )๊ณผ AdaGrad๋ฅผ ์ตํฉํ ๋ฏํ ๋ฐฉ๋ฒ์ ๋๋ค.
- ํน์ง์ ํ์ดํผํ๋ผ๋ฏธํฐ์ 'ํธํฅ ๋ณด์ '์ด ์งํ์ด ๋๋ค๋๊ฒ์ด Adam์ ํน์ง์ ๋๋ค.
- ํ๋ฒ Adam ํด๋์ค ์ฝ๋๋ฅผ ํ๋ฒ ๋ณด๊ณ ์ต์ ํ ๋ฌธ์ ๋ฅผ ํ์ด๋ณธ ๊ฒฐ๊ณผ๋ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
class Adam:
def __init__(self, lr=0.001, beta1=0.9, beta2=0.999):
self.lr = lr # ํ์ต๋ฅ (learning rate)
self.beta1 = beta1 # ๋ชจ๋ฉํ
(momentum)์ ์ง์ ๊ฐ์ค ํ๊ท ํ๋ผ๋ฏธํฐ
self.beta2 = beta2 # RMSProp์ ์ง์ ๊ฐ์ค ํ๊ท ํ๋ผ๋ฏธํฐ
self.iter = 0 # ๋ฐ๋ณต ํ์
self.m = None # 1์ฐจ ๋ชจ๋ฉํ
self.v = None # 2์ฐจ ๋ชจ๋ฉํ
def update(self, params, grads):
if self.m is None:
self.m, self.v = {}, {}
for key, val in params.items():
self.m[key] = np.zeros_like(val) # ๊ฐ ๋งค๊ฐ๋ณ์์ ๋ํ 1์ฐจ ๋ชจ๋ฉํ
์ 0์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
self.v[key] = np.zeros_like(val) # ๊ฐ ๋งค๊ฐ๋ณ์์ ๋ํ 2์ฐจ ๋ชจ๋ฉํ
์ 0์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
self.iter += 1
lr_t = self.lr * np.sqrt(1.0 - self.beta2**self.iter) / (1.0 - self.beta1**self.iter)
# ํธํฅ ๋ณด์ ๋ ํ์ต๋ฅ ๊ณ์ฐ
for key in params.keys():
self.m[key] += (1 - self.beta1) * (grads[key] - self.m[key]) # 1์ฐจ ๋ชจ๋ฉํ
์
๋ฐ์ดํธ
self.v[key] += (1 - self.beta2) * (grads[key]**2 - self.v[key]) # 2์ฐจ ๋ชจ๋ฉํ
์
๋ฐ์ดํธ
params[key] -= lr_t * self.m[key] / (np.sqrt(self.v[key]) + 1e-7) # ๋งค๊ฐ๋ณ์ ์
๋ฐ์ดํธ
- Adam ๊ฐฑ์ ๊ณผ์ ๋ ๊ทธ๋ฆ ๋ฐ๋ฅ์ ๊ตฌ๋ฅด๋ฏ ์์ง์ ๋๋ค. ์ด ํจํด์ Momentum(๋ชจ๋ฉํ )๊ณผ ๋น์ทํ์ง๋ง, Momentum(๋ชจ๋ฉํ )๋ณด๋ค ๊ณต์ ์ข์ฐ ํ๋ค๋ฆผ์ด ์ ์ต๋๋ค. ์ด๋ ํ์ต์ ๊ฐฑ์ ๊ฐ๋๋ฅผ Adaptive(์ ์์ )์ผ๋ก ์กฐ์ ํด์ ์ป๋ ํํ์ ๋๋ค.
์ด๋ ํ ๊ฐฑ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊น์?
์ง๊ธ๊น์ง 4๊ฐ์ ์ต์ ํ ๊ธฐ๋ฒ. SGD, Momentum, AdaGrad, Adam์ ์์๋ณด์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ฌธ์ ์ ๋ฐ๋ผ ๋ฌ๋ฆฌ์ง์๋ ์์ผ๋๊น ์ฃผ์ํด์ผํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Hyperparameter(Learning Rate๋ฑ..)์ ์ด๋ป๊ฒ ์ค์ ํ๋๋์ ๋ฐ๋ผ์ ๊ฒฐ๊ณผ๋ ๋ด๋๋๋ค.
- ์ฆ, ๊ฒฐ๋ก ์ ๋ชจ๋ ๋ฌธ์ ์์ ํญ์ ๋ฐ์ด๋ ๊ธฐ๋ฒ์ ์์ต๋๋ค. ์ํฉ์ ๊ณ ๋ คํด์ ์ฌ๋ฌ๊ฐ์ง๋ก ์๋ํด๋ด์ผ ํฉ๋๋ค.
Weight(๊ฐ์ค์น)์ ์ด๊น๊ฐ
๋ง์ฝ ์ด๊น๊ฐ์ 0์ ํ๋ฉด?
Overfitting(์ค๋ฒํผํ )์ ์ต์ ํด ๋ฒ์ฉ ์ฑ๋ฅ์ ๋์ด๋ Weight Decay(๊ฐ์ค์น ๊ฐ์) ๊ธฐ๋ฒ์ Parameter(๋งค๊ฐ๋ณ์)์ ๊ฐ์ด ์์์ง๋๋ก ํ์ตํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. Weight(๊ฐ์ค์น)๊ฐ์ ์๊ฒํ์ฌ Overfitting(์ค๋ฒํผํ )์ด ์ผ์ด๋๊ฒ ํ์ง ์๋ ๊ฒ์ ๋๋ค.
- ๋ง์ฝ Weight(๊ฐ์ค์น) ์ด๊ธฐ๊ฐ์ 0์ผ๋ก ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
- ํ์ต์ด ์ ๋๋ก ์ผ์ด๋์ง ์์ต๋๋ค. ์ด์ ๋ ๋ฐ๋ก Backpropagation(์ค์ฐจ์ญ์ ํ๋ฒ)์์ ๋ชจ๋ Weight(๊ฐ์ค์น)์ ๊ฐ์ด ๋๊ฐ์ด ๊ฐฑ์ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์๋ฅผ ๋ค์ด์ 2-Layer Neural Network(2์ธต ์ ๊ฒฝ๋ง)์์ ์ฒซ๋ฒ์งธ, ๋๋ฒ์งธ Layer์ Weight(๊ฐ์ค์น)๊ฐ 0์ด๋ฉด, Forward Propagation(์์ ํ)๋์ Input Layer(์
๋ ฅ์ธต)์ Weight(๊ฐ์ค์น)๊ฐ 0์ด๊ธฐ ๋๋ฌธ์ ๋๋ฒ์งธ Layer์ Neuron์ ๋ชจ๋ ๊ฐ์ ๊ฐ์ด ์ ๋ฌ๋ฉ๋๋ค.
- ์ฆ, Backpropagation(์ญ์ ํ)๋์ ๋๋ฒ์งธ Layer์ Weight(๊ฐ์ค์น)๊ฐ ๋ชจ๋ ๋๊ฐ์ด ๊ฐฑ์ ๋๋ค๋ ๋ง์ด ๋ฉ๋๋ค.
- ์ด ์ํฉ์ ๋ง์ผ๋ฌ๋ฉด ์ด๊น๊ฐ์ ๋ฌด์์๋ก ์ค์ ์ ํด์ผ ํ๋ค๋ ์ ์ด ์์ต๋๋ค.
Hidden Layer(์๋์ธต)์ ํ์ฑํ๊ฐ ๋ถํฌ
Hidden Layer(์๋์ธต)์ ํ์ฑํ๊ฐ์ ๋ถํฌ๋ฅผ ๊ด์ฐฐํ๋ฉด ์ค์ํ ์ ๋ณด๋ฅผ ์ป์์ ์์ต๋๋ค.
- Activation Function(ํ์ฑํ ํจ์)๋ก Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์)๋ก ์ฌ์ฉํ๋ 5-Layer Neural Network(5์ธต ์ ๊ฒฝ๋ง)์ ๋ฌด์์๋ก ์์ฑํ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ํ๋ ค๋ณด๊ฒ ์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ฐ Layer์ Activation Value(ํ์ฑํ๊ฐ) ๋ถํฌ๋ฅผ ํ๋ฒ Histogram(ํ์คํ ๊ทธ๋จ)์ผ๋ก ๋ณด๋ฉด์ Weight(๊ฐ์ค์น)์ ์ด๊น๊ฐ์ ๋ฐ๋ผ Hidden Layer(์๋์ธต)์ Activation Value(ํ์ฑํ๊ฐ)์ด ์ด๋ป๊ฒ ๋ณํํ๋์ง ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt
# ์๊ทธ๋ชจ์ด๋ ํจ์ ์ ์
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# ์
๋ ฅ ๋ฐ์ดํฐ ์์ฑ (1000๊ฐ์ ๋ฐ์ดํฐ, ๊ฐ ๋ฐ์ดํฐ๋ 100๊ฐ์ ํน์ฑ์ ๊ฐ์ง)
input_data = np.random.randn(1000, 100)
# ๊ฐ ์๋์ธต์ ๋
ธ๋(๋ด๋ฐ) ์
node_num = 100
# ์๋์ธต ๊ฐ์
hidden_layer_size = 5
# ์๋์ธต์ ํ์ฑํ ๊ฐ์ ์ ์ฅํ ๋์
๋๋ฆฌ
activations = {}
# ์
๋ ฅ ๋ฐ์ดํฐ๋ก๋ถํฐ ์์ ํ ์์
x = input_data
# ๊ฐ ์๋์ธต์ ๋ํด ์์ ํ ์ํ
for i in range(hidden_layer_size):
# ์ฒซ ๋ฒ์งธ ์๋์ธต์ผ ๊ฒฝ์ฐ ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ ,
# ๊ทธ ์ดํ์ ์๋์ธต๋ถํฐ๋ ์ด์ ์๋์ธต์ ํ์ฑํ ๊ฐ์ ์ฌ์ฉ
if i != 0:
x = activations[i-1]
# ๊ฐ์ค์น ์ด๊ธฐํ (ํ๊ท ์ด 0, ํ์คํธ์ฐจ๊ฐ 1์ธ ์ ๊ท๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ๋์)
w = np.random.randn(node_num, node_num) * 1
# ๊ฐ์คํฉ ๊ณ์ฐ
a = np.dot(x, w)
# ํ์ฑํ ํจ์ ์ ์ฉ (์๊ทธ๋ชจ์ด๋ ํจ์)
z = sigmoid(a)
# ํ์ฑํ ๊ฒฐ๊ณผ๋ฅผ ๋์
๋๋ฆฌ์ ์ ์ฅ
activations[i] = z
- Layer๊ฐ 5๊ฐ๊ฐ ์์ผ๋ฉฐ, ๊ฐ ์ธต์ Neuron์ 100๊ฐ ์ฉ์ ๋๋ค.
- Input Data๋ก์ 1,000๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ท๋ถํฌ๋ก ๋ฌด์์๋ก ์์ฑํ์ฌ ์ด 5-Layer Neural Network์ ํ๋ฆฝ๋๋ค.
- Activation ๊ฒฐ๊ณผ๋ฅผ activation ๋ณ์์ ์ ์ฅํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ณต๋ฌธ์ ํตํด์ ์๋์ ๊ณผ์ ์ ๊ณ์ ๋ฐ๋ณตํฉ๋๋ค.
- ์ฒซ ๋ฒ์งธ ์๋์ธต์ผ ๊ฒฝ์ฐ, ์ ๋ ฅ ๋ฐ์ดํฐ x๋ input_data๋ก ์ด๊ธฐํํฉ๋๋ค. ๊ทธ ์ดํ์ ์๋์ธต์ ์ด์ ์๋์ธต์ ํ์ฑํ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
- ๊ฐ์ค์น w๋ ํ๊ท ์ด 0์ด๊ณ ํ์ค ํธ์ฐจ๊ฐ 1์ธ ์ ๊ท๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ๋์๋ก ์ด๊ธฐํํฉ๋๋ค.
- ํ๋ ฌ ๊ณฑ ์ฐ์ฐ์ ํตํด ์ ๋ ฅ ๋ฐ์ดํฐ์ ๊ฐ์ค์น๋ฅผ ๊ณฑํ ํ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์๊ทธ๋ชจ์ด๋ ํจ์์ ์ ์ฉํ์ฌ ํ์ฑํ ๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
- ์ด๋ฅผ activations ๋์ ๋๋ฆฌ์ ์ ์ฅํฉ๋๋ค.
# ํ์คํ ๊ทธ๋จ ๊ทธ๋ฆฌ๊ธฐ
for i, a in activations.items():
plt.subplot(1, len(activations), i+1)
plt.title(str(i+1) + "-layer")
plt.hist(a.flatten(), 30, range=(0,1))
plt.show()
- ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๊ฐ Layer์ Activaiton ๊ฐ์ด 0, 1์ ๋ค ์น์ฐ์ณ ๋ถํฌ๋์ด ์์ต๋๋ค.
- Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์)๋ Output์ด 0,1์ ๊ฐ๊น์์ง๋ฉด ๋ฏธ๋ถ์ 0์ ๋ค๊ฐ๊ฐ๋๋ค.
- ๊ทธ๋์ ๋ฐ์ดํฐ๊ฐ 0, 1์ ์น์ฐ์ณ ๋ถํฌํ๊ฒ ๋๋ฉด Backpropagation(์ญ์ ํ)์ Gradient(๊ธฐ์ธ๊ธฐ)๊ฐ์ด ์ ์ ์์์ง๋ค๊ฐ ์ฌ๋ผ์ง๋๋ค.
- ์ด ํ์์ Gradient Vanishing(๊ธฐ์ธ๊ธฐ ์์ค)์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋ฒ์๋ Weight(๊ฐ์ค์น)์ ํ์คํธ์ฐจ๋ฅผ 0.01๋ก ๋ด๊ฟ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๊ฐ์ค์น ์ด๊น๊ฐ ์ค์ ๋ถ๋ถ์ ๋ด๊พธ๋ฉด ๋ฉ๋๋ค.
# ๊ฐ์ค์น ์ด๊ธฐํ (ํ๊ท ์ด 0, ํ์คํธ์ฐจ๊ฐ 1์ธ ์ ๊ท๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ๋์)
w = np.random.randn(node_num, node_num) * 0.01
- ๊ทธ๋ฆผ์ ๋ณด๋ฉด 0.5 ๋ถ๊ทผ์ ์ง์ค๋์์ต๋๋ค. 0๊ณผ 1 ์ฌ์ด์ ์น์ฐ์น์ง ์์์ผ๋ Gradient Vanishing ๋ฌธ์ ๋ ์ผ์ด๋์ง ์์ต๋๋ค.
- ๊ทผ๋ฐ Activation Value(ํ์ฑํ ๊ฐ)๋ค์ด ์น์ฐ์ณค๋ค๋ ๊ฒ์ ํํ๋ ฅ ๊ด์ ๋ถ๋ถ์์๋ ํฐ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
- ๋ค์์ Neuron๋ค์ด ๊ฐ์ ๊ฐ์ด ์ถ๋ ฅํ๊ณ ์๋๊ฑด Neuron์ด ์ฌ๋ฌ๊ฐ ๋ ์๋ฏธ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค.
- ๊ทธ๋์ Activation Value(ํ์ฑํ ๊ฐ)๋ค์ด ์น์ฐ์น๋ฉด ํํ๋ ฅ์ ์ ํํ๋ค๋ ๊ด์ ์์๋ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
Xavier ์ด๊ธฐ๊ฐ
Xavier ์ด๊น๊ฐ์ ์ผ๋ฐ์ ์ธ ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ๋ค์ด ํ์ค์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
- Xavier ์ด๊น๊ฐ : ์ด๊น๊ฐ์ ํ์คํธ์ฐจ๊ฐ 1/√n์ด ๋๋๋ก ์ค์ ํฉ๋๋ค.
- n : ์ ์ธต์ ๋ ธ๋ ์์ ๋๋ค.
- Xavier ์ด๊น๊ฐ์ ์ฌ์ฉํ๋ฉด ์ ์ธต์ ๋ ธ๋๊ฐ ๋ง์์๋ก ๋์ ๋ ธ๋์ ์ด๊น๊ฐ์ผ๋ก ์ค์ ํ๋ ๊ฐ์ค์น๊ฐ ์ข๊ฒ ํผ์ง๋๋ค.
- ํ๋ฒ Xavier ์ด๊น๊ฐ์ ์ฌ์ฉํด์ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
node_num = 100 # ์์ธต์ ๋
ธ๋ ์
w = np.random.randn(node_num, node_num) / np.sqrt(node_num)
- Xavier ์ด๊น๊ฐ์ ์ฌ์ฉํ ๊ฒฐ๊ณผ๋ ์์ ๊ฒฐ๊ณผ์ฒ๋ผ ๋ฉ๋๋ค. ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ธต์ด ๊น์ด์ง๋ฉด์ ํํ๊ฐ ์ผ๊ทธ๋ฌ์ง๋๋ค.
- ๋ค๋ง ์์ ๋ฐฉ์๋ค ๋ณด๋ค๋ ํ์คํ ๋๊ฒ ๋ถํฌ๋จ์ ์ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ ์ ๋นํ ํผ์ ธ์๊ณ , Sigmoid ํจ์์ ํํ๋ ฅ๋ ์ ํ๋ฐ์ง ์์ผ๋ฉด์ ํ์ต์ด ํจ์จ์ ์ผ๋ก ์ด๋ค์ง ๊ฒ์ผ๋ก ๊ธฐ๋๋ฉ๋๋ค.
์ธต์ด ๊น์ด์ง๋ฉด ์ผ๊ทธ๋ฌ์ง๋ ํ์์ sigmoid ํจ์ ๋์ tanh(์๊ณก์ ํจ์)๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ์ ๋ฉ๋๋ค.
tanh ํจ์๋ S์ ๊ณก์ ์ด์ง๋ง (0, 0.5)์์ ๋์นญ์ธ ์๊ทธ๋ชจ์ด๋์๋ ๋ค๋ฅด๊ฒ ์์ ๋์นญ์ ๋๋ค.
ํ์ฑํ ํจ์์ฉ์ผ๋ก๋ ์์ ์์ ๋์นญ์ธ ํจ์๊ฐ ๋ฐ๋์งํ๋ค๊ณ ์๋ ค์ ธ ์์ต๋๋ค.
ReLU๋ฅผ ์ฌ์ฉํ ๋์ Weight(๊ฐ์ค์น) ์ด๊น๊ฐ - He ์ด๊น๊ฐ
- ReLU๋ก Activation Function(ํ์ฑํ ํจ์)๋ฅผ ์ฌ์ฉํ ๋์๋ ReLU์ ํนํ๋ ์ด๊น๊ฐ์ ์ด์ฉํ๋ผ๊ณ ๋ณดํต์ ๊ถ์ฅํฉ๋๋ค.
- ์ด ํนํ๋ ์ด๊น๊ฐ์ He ์ด๊น๊ฐ ์ด๋ผ๊ณ ํฉ๋๋ค.
- He ์ด๊น๊ฐ์ ์ ์ธต์ ๋ ธ๋๊ฐ n๊ฐ์ผ ๋, ํ์คํธ์ฐจ๊ฐ √(2/n)์ธ ์ ๊ท๋ถํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด์ ๋ ๋ฌด์์ผ๊น์? (Xavier ์ด๊น๊ฐ์ √(1/n))
- ReLU๋ ์์ ์์ญ์ด 0์ด๋ผ์ ๋ ๋๊ฒ ๋ถํฌ์ํค๊ธฐ ์ํด 2๋ฐฐ์ ๊ณ์๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ํ๋ฒ ํ์ฑํ๊ฐ ๋ถํฌ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
- ํ์คํธ์ฐจ๊ฐ 0.01์ธ ์ ๊ท๋ถํฌ๋ฅผ ๊ฐ์ค์น ์ด๊น๊ฐ์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ? ๊ฐ ์ธต์ ํ์ฑํ๊ฐ๋ค์ ์์ฃผ ์์ ๊ฐ์
๋๋ค.
- ์์ ๊ฐ๋ค์ด ํ๋ฅด๋ฉด Backpropagation(์ญ์ ํ)๋ Weight(๊ฐ์ค์น)์ Gradient(๊ธฐ์ธ๊ธฐ)์ญ์ ์์์ง๋ค๋ ์๋ฏธ์ ๋๋ค.
- Xavier ์ด๊น๊ฐ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋ ์ธต์ด ๊น์ด์ง๋ฉด์ ์น์ฐ์นจ์ด ์กฐ๊ธ์ฉ ์ปค์ง๋๋ค. ์ด ๋ฌธ์ ๋ Gradient Loss(๊ธฐ์ธ๊ธฐ ์์ค)๋ฌธ์ ๊ฐ ๋ฐ์ ํ ์ ์์ต๋๋ค.
- He ์ด๊น๊ฐ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ชจ๋ ์ธต์์ ๊ท ์ผํ๊ฒ ๋ถํฌ๋์์ต๋๋ค. Backpropagation(์ญ์ ํ) ๋๋ ์ ์ ํ ๊ฐ์ด ๋์ต๋๋ค.
Summary: ํ์ฑํ ํจ์๋ก ReLU๋ฅผ ์ฌ์ฉํ ๋๋ He ์ด๊น๊ฐ์, S์ ๋ชจ์ ๊ณก์ (sigmoid, tanh)์ผ ๋๋ Xavier ์ด๊น๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
Ex. Mnist Dataset์ผ๋ก ๋ณธ Weight(๊ฐ์ค์น) ์ด๊น๊ฐ ๋น๊ต
ํ๋ฒ Mnist Dataset์ผ๋ก ๊ฐ์ง๊ณ ํ๋ฒ Weight(๊ฐ์ค์น)์ ์ด๊น๊ฐ์ ์ฃผ๋ ๋ฐฉ์์ด ์ ๊ฒฝ๋ง ํ์ต์ ์ผ๋ง๋ ์ํฅ์ ์ฃผ๋์ง ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
# coding: utf-8
import os
import sys
sys.path.append(os.pardir) # ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ์ค์
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.util import smooth_curve
from common.multi_layer_net import MultiLayerNet
from common.optimizer import SGD
# 0. MNIST ๋ฐ์ดํฐ ์ฝ๊ธฐ==========
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)
train_size = x_train.shape[0]
batch_size = 128
max_iterations = 2000
# 1. ์คํ์ฉ ์ค์ ==========
weight_init_types = {'std=0.01': 0.01, 'Xavier': 'sigmoid', 'He': 'relu'}
optimizer = SGD(lr=0.01)
networks = {}
train_loss = {}
for key, weight_type in weight_init_types.items():
networks[key] = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100],
output_size=10, weight_init_std=weight_type)
train_loss[key] = []
# 2. ํ๋ จ ์์==========
for i in range(max_iterations):
batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]
for key in weight_init_types.keys():
grads = networks[key].gradient(x_batch, t_batch)
optimizer.update(networks[key].params, grads)
loss = networks[key].loss(x_batch, t_batch)
train_loss[key].append(loss)
if i % 100 == 0:
print("===========" + "iteration:" + str(i) + "===========")
for key in weight_init_types.keys():
loss = networks[key].loss(x_batch, t_batch)
print(key + ":" + str(loss))
# 3. ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ==========
markers = {'std=0.01': 'o', 'Xavier': 's', 'He': 'D'}
x = np.arange(max_iterations)
for key in weight_init_types.keys():
plt.plot(x, smooth_curve(train_loss[key]), marker=markers[key], markevery=100, label=key)
plt.xlabel("iterations")
plt.ylabel("loss")
plt.ylim(0, 2.5)
plt.legend()
plt.show()
- ๋ด๋ฐ ์๊ฐ 100๊ฐ์ธ 5์ธต ์ ๊ฒฝ๋ง์์ ํ์ฑํ ํจ์๋ก ReLU๋ฅผ ์ฌ์ฉ์ ํ์ต๋๋ค
- std=0.01์ผ ๋๋ ํ์ต์ด ์ ํ ์ด๋ค์ง์ง ์์๊ณ , Xavier์ He ์ด๊น๊ฐ์ ๊ฒฝ์ฐ๋ ํ์ต์ด ์์กฐ๋กญ๊ฒ ์ด๋ค์ง ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ํ์ต ์ง๋๋ He ์ด๊น๊ฐ ์ชฝ์ด ๋ ๋น ๋ฅด๋ค๊ณ ์ ์ ์์ต๋๋ค.
- ๋ํ Weight(๊ฐ์ค์น) ์ด๊น๊ฐ์ด ์ค์ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ฐ์ํ
'๐ฅ๏ธ Deep Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DL] ์ฌ๋ฐ๋ฅธ ํ์ต์ ์ํด - Overfitting, Dropout, Hyperparameter (0) | 2024.05.07 |
---|---|
[DL] Batch Normalization - ๋ฐฐ์น ์ ๊ทํ (0) | 2024.05.01 |
[DL] Activation Function - ํ์ฑํ ํจ์ (0) | 2024.04.29 |
[DL] Feed-forward Network (ํผ๋-ํฌ์๋ ๋คํธ์ํฌ) (0) | 2024.04.18 |
[DL] ๋จ์ํ Layer ๊ตฌํํด๋ณด๊ธฐ (0) | 2024.03.31 |