๐ก 'Deep Learning from Scratch'์ 'CS231N'์ ์ฐธ๊ณ ํ์ฌ ์์ฑ
(๊ฐ ์ ์ ๋๋ฒ๋ง์ ์ง๋ ๊ฒ์๋ฌผ์์ ์ด์ด์ง๋๋ค)
2. ์ตํฐ๋ง์ด์
์ง๋ ๊ฒ์๋ฌผ์์๋ SGD์ ๋ฌธ์ ์ ์ผ๋ก ์ง์ ๋์๋ ์ฌ๋ฌ ๊ฐ์ง ๊ฐ์ด๋ฐ ์คํ ๋ฐฉํฅ์ ๊ฐ์ ํ ์ตํฐ๋ง์ด์ ์ ๋ํ์ฌ ์์๋ดค์ต๋๋ค. ์ค๋ฒ์ํ (overshooting)์ผ๋ก ์์ฅ์ (saddle point)๊ณผ ์ง์ญ ์ต์๊ฐ(local minima)์ ํต๊ณผํ๋ฉฐ ์ ์ญ ์ต์๊ฐ(global minimum)์ ์ฐพ๋ SGD+Momentum, NAG๋ฅผ ์ง์ ๊ตฌํํด๋ณด์์ต๋๋ค. ์ด๋ฒ ๊ฒ์๋ฌผ์์๋ ํ๋ผ๋ฏธํฐ๊ฐ ๊ฐฑ์ ๋ ์ ๋์ ๋ฐ๋ผ ์คํ ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํ๋ฉฐ ํ์ต์ ์งํํ๋ AdaGrad๋ฅ์ ์ตํฐ๋ง์ด์ ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
2.5 Adaptive Gradient (AdaGrad)
AdaGrad๋ ๋ชจ๋ ํ๋ผ๋ฏธํฐ์์ ํ์ต ๋ณดํญ์ด ๋์ผํ๋ค๋ SGD์ ๋ฌธ์ ์ ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฑ์ฅํ์ต๋๋ค. ์ ๊ฒฝ๋ง ํ์ต์์ ํ์ต๋ฅ (learning rate)๋ ๋งค์ฐ ์ค์ํ ์์์ ๋๋ค. ํ์ต๋ฅ ์ ํจ๊ณผ์ ์ผ๋ก ์ ํ๊ธฐ ์ํด 'ํ์ต๋ฅ ๊ฐ์(learning rate decay)'๊ฐ ์ฌ์ฉ๋๊ธฐ๋ ํฉ๋๋ค.
ํ์ต๋ฅ ๊ฐ์
ํ์ต์ ์งํํ๋ฉด์ ํ์ต๋ฅ ์ ์ ์ฐจ ์ค์ด๋ ๋ฐฉ๋ฒ. ์ฒ์์๋ ํฐ ๋ณดํญ์ผ๋ก ํ์ตํ์๋ค๊ฐ ์กฐ๊ธ์ฉ ์๊ฒ ํ์ตํจ์ผ๋ก์จ ํจ๊ณผ์ ์ธ ํ์ต์ ์ ๋ํจ.
ํ์ต๋ฅ ์ ์กฐ์ ํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋งค๊ฐ๋ณ์ '์ ์ฒด'์ ํ์ต๋ฅ ์ ์ผ๊ด์ ์ผ๋ก ๋ฎ์ถ๋ ๊ฒ์ ๋๋ค. ์ด ๊ฐ๋ ์ ๋ฐ์ ์ํจ ๊ฒ์ด ๋ฐ๋ก AdaGrad์ ๋๋ค. AdaGrad๋ '๊ฐ๊ฐ์' ๋งค๊ฐ๋ณ์์ ์ ํฉํ ํ์ต๋ฅ ์ ์ค์ ํฉ๋๋ค. ์ฆ, AdaGrad๋ ๊ฐ๋ณ ๋งค๊ฐ๋ณ์์ ๋ํด ์ ์์ (adaptive)์ผ๋ก ํ์ต๋ฅ ์ ์กฐ์ ํ๋ฉฐ ํ์ตํฉ๋๋ค. AdaGrad์ ์์์ ์๋์ ๊ฐ์ต๋๋ค.
$$ \theta_{t+1}=\theta_{t} - \frac{\eta}{\sqrt{G_{t}+\epsilon}} \odot \triangledown J(\theta_{t}) $$
$$ G_{t}=G_{t-1}+(\triangledown J(\theta_t))^2 $$
- $ G_t $ : ์์ค ํจ์ ๊ธฐ์ธ๊ธฐ์ ์ ๊ณฑํฉ
- $ \odot $ : ํ๋ ฌ์ ์์๋ณ ๊ณฑ์
์ด๋ฅผ ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
class AdaGrad:
def __init__(self, lr: float=0.01):
self.lr = lr
self.h = None
def update(self, params: Dict[str, float],
grads: Dict[str, float]) -> None:
if self.h is None:
self.h = {}
for key, val in params.items():
self.h[key] = np.zeros_like(val)
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)
ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐฑ์ ํ๋ ๋ถ๋ถ์์ ๋งค์ฐ ์์ ๊ฐ์ธ 1e-7์ ๋ํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ h[key] ์์ 0์ด ๋ด๊ฒจ ์๋๋ผ๋ 0์ผ๋ก ๋๋๋ ๊ฒ์ ๋ง์์ค๋๋ค. ์ด๋ฅผ ์๊ฐํํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ทธ๋ฆผ 2์ ๋๋ค.
์ ์ญ ์ต์๊ฐ์ ํฅํด ํจ์จ์ ์ผ๋ก ์์ง์ด๋ ๊ฒ์ ๊ทธ๋ฆผ์์ ํ์ธํ ์ ์์ต๋๋ค. ๋ํ, ๊ธฐ์ธ๊ธฐ์ ๋น๋กํ์ฌ ์์ง์๋ ์ ์ ์์์ง๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ AdaGrad์ ์ฅ์ ์ด์ ๋จ์ ์ ๋๋ค. AdaGrad๋ ๊ณผ๊ฑฐ์ ๊ธฐ์ธ๊ธฐ๋ฅผ ์ ๊ณฑํ์ฌ ๊ณ์ ๋ํด๊ฐ๋ ์ฑ์ง ๋๋ฌธ์ ํ์ต์ ์งํํ ์๋ก ๊ทธ ์์ง์์ด ์ฝํด์ง๋๋ค. AdaGrad๋ฅผ ์ด์ฉํ์ฌ ๋ฌดํํ ํ์ตํ๋ฉด, ์ด๋ ์๊ฐ์๋ ๊ฐฑ์ ๋์ด 0์ด ๋์ด ์ ํ ๊ฐฑ์ ํ์ง ์๋ ํ์์ด ๋ฐ์ํฉ๋๋ค.
2.6 RMSProp
RMSProp์ AdaGrad๋ฅผ ๊ฐ์ ํ ๊ธฐ๋ฒ์ ๋๋ค. RMSProp์ ๊ณผ๊ฑฐ์ ๋ชจ๋ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ท ์ผํ๊ฒ ๋ํ๋ ๊ฒ์ด ์๋, ๋จผ ๊ณผ๊ฑฐ์ ๊ธฐ์ธ๊ธฐ๋ ์์ํ ์๊ณ ์๋ก์ด ๊ธฐ์ธ๊ธฐ ์ ๋ณด๋ฅผ ํฌ๊ฒ ๋ฐ์ํ๋ ํํ์ ๋๋ค. ์ด๋ฅผ ์ง์์ด๋ํ๊ท (Exponential Moving Average)๋ผ๊ณ ํฉ๋๋ค. ์ง์์ด๋ํ๊ท ์ ํตํด ์์ค ํจ์์ ๊ธฐ์ธ๊ธฐ ์ ๊ณฑํฉ์ด ๋จ์ ๋์ ๋์ด ๋ฌดํ๋๋ก ๋ฐ์ฐํ๋ ๊ฒ์ ๋ง์์ค๋๋ค. RMSProp์ ๊ณต์์ ์๋์ ๊ฐ์ต๋๋ค.
$$ \theta_{t+1}=\theta_{t} - \frac{\eta}{\sqrt{G_{t}+\epsilon}} \odot \triangledown J(\theta_{t}) $$
$$ G_{t}=\gamma G_{t-1}+(1-\gamma)(\triangledown J(\theta_t))^2 $$
- $ \gamma $ : ๊ฐ์์จ(decaying factor)
์ฌ๊ธฐ์ ๊ฐ์์จ์ ์ผ๋ฐ์ ์ผ๋ก 0.9 ํน์ 0.99์ ๋์ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. ์ด์ธ์ ๊ฐ๋ ๋ค์ AdaGrad์ ๋์ผํฉ๋๋ค. ์ด๋ฅผ ๊ตฌํํ ๋ด์ฉ์ ์๋์ ๊ฐ์ต๋๋ค.
class RMSProp:
def __init__(self, lr: float=0.01, decay_rate: float=0.99):
self.lr = lr
self.dr = decay_rate
self.h = None
def update(self, params: Dict[str, float],
grads: Dict[str, float]) -> None:
if self.h is None:
self.h = {}
for key, val in params.items():
self.h[key] = np.zeros_like(val)
for key in params.keys():
self.h[key] *= self.dr
self.h[key] += (1- self.dr) * grads[key] * grads[key]
params[key] -= \
self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)
2.7 Adaptive moment estimation (Adam)
๋ชจ๋ฉํ ๊ณผ RMSProp์ ๋ฐฉ์์ ํฉ์น ๊ธฐ๋ฒ์ด ๋ฐ๋ก Adam์ ๋๋ค. Adam์ ๋ถํธ ์ถ์ ์น(unbiased estimate)๋ฅผ ํตํด ์ด๊ธฐ์ $ m_t $์์ ์ด๋ํ์ง ๋ชปํ๋ ๊ฒ๊ณผ $ v_t $์์ ๋๋ฌด ํฐ ํ์ต ๋ณดํญ์ ๋ฐ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ฅผ ์ ์ฉํ Adam์ ์์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$$ m_t = \beta_1 m_{t-1}+(1-\beta_1)\triangledown J(\theta_{t}) $$
$$ v_t = \beta_2 v_{t-1}+(1-\beta_2)(\triangledown J(\theta_{t}))^2 $$
$$ \theta_{t+1}=\theta_t - \frac{\eta}{\sqrt{\hat{v}_t+\epsilon}}\hat{m}_t $$
$$ (\hat{m}_t=\frac{m_t}{1-\beta^t_1},\ \ \hat{v}_t=\frac{m_t}{1-\beta^t_2}) $$
- $ m_t $ : ๋ชจ๋ฉํ ๊ธฐ๋ฒ
- $ v_t $ : RMSProp ๊ธฐ๋ฒ
- $ \beta $ : ๊ฐ์ ์์(decay constant)
- $ \hat{m_t}, \hat{v_t} $ : ๋ถํธ ์ถ์ ์น ์ ์ฉ
์ผ๋ฐ์ ์ผ๋ก $ \beta_1 $์ 0.9๋ฅผ, $ \beta_2 $๋ 0.999๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ๊ตฌํํ ๋ด์ฉ์ ์๋์ ๊ฐ์ต๋๋ค.
class Adam:
def __init__(self, lr: float=0.001, beta1: float=0.9,
beta2: float=0.999):
self.lr = lr
self.b1 = beta1
self.b2 = beta2
self.iter = 0
self.m = None
self.v = None
def update(self, params: Dict[str, float],
grads: Dict[str, float]) -> None:
if self.m is None:
self.m, self.v = {}, {}
for key, val in params.items():
self.m[key] = np.zeros_like(val)
self.v[key] = np.zeros_like(val)
self.iter += 1
for key in params.keys():
# Momentum
self.m[key] = \
self.b1 * self.m[key] + (1 - self.b1) * grads[key]
m_hat = \
self.m[key] / (1 - self.b1 ** self.iter) # bias correcton
# RMSProp
self.v[key] = \
self.b2 * self.v[key] + (1 - self.b2) * (grads[key] ** 2)
v_hat = \
self.v[key] / (1 - self.b2 ** self.iter) # bias correcton
# Update
params[key] -= self.lr * m_hat / (np.sqrt(v_hat) + 1e-7)
Adam์ ์๊ฐํํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ทธ๋ฆผ 3๊ณผ ๊ฐ์ต๋๋ค.
Adam์ ์ต์ ํ ๊ฐฑ์ ๊ฒฝ๋ก๋ฅผ ์ดํด ๋ณด๋ฉด, ๊ธฐ์กด์ ๋ชจ๋ฉํ ๊ณผ ๊ฐ์ด ์ค๋ฒ์ํ ์ ํ๋ฉด์๋ ์ ์ญ ์ต์๊ฐ์ ํฅํด ํจ์จ์ ์ผ๋ก ์์ง์ด๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฆ, ์ด๋ ์์ ์ธ๊ธํ ๋ชจ๋ฉํ ์ ํน์ง๊ณผ RMSProp์ ํน์ง ๋ชจ๋๋ฅผ ์ ์ฉํ๋ค๋ ๊ฒ์ ๋งํฉ๋๋ค.
2.8 Nesterov-accelerated Adaptive Moment Estimation (Nadam)
Nadam์ Adam์์ ์ ์ฉํ ๋ชจ๋ฉํ ๊ธฐ๋ฒ์ NAG๋ก ๋ณ๊ฒฝํ์์ต๋๋ค. Nadam์ Adam๊ณผ NAG์ ์ฅ์ ์ ํฉ์ณค๊ธฐ ๋๋ฌธ์, Adam๋ณด๋ค ๋ ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ์ ์ญ ์ต์๊ฐ์ ์ฐพ์ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. Nadam์ ๊ตฌํํ๊ธฐ ์ํด์๋ ๊ธฐ์กด์ NAG์ ๊ณต์์ ์กฐ๊ธ ์์ ํ ํ์๊ฐ ์์ต๋๋ค. NAG์์ ๋ชจ๋ฉํ ์ ์กฐ์ ํ๋ ์์์ ์๋์ ๊ฐ์์ต๋๋ค.
$$ g_t =\triangledown J(\theta_t - \gamma m_{t-1}) $$
$$ m_t = \gamma m_{t-1} + \eta g_t $$
$$ \theta_{t+1} = \theta - m_t $$
NAG๋ ํ์ฌ์ ์์น($ \theta_t $)์์ ํ์ฌ์ ๋ชจ๋ฉํ ($ \ m_t $)๋งํผ ์ด๋ํ ์๋ฆฌ์์ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ตฌํ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ด์ ๋จ๊ณ์ ๋ชจ๋ฉํ ์ ๋ํด์ค์ผ๋ก์จ ํ์ฌ์ ๋ชจ๋ฉํ ($ \ m_t $)๋ฅผ ๊ฐฑ์ ํ ์ ์์์ต๋๋ค.
์์ NAG ๊ณต์์์ ํ๋ผ๋ฏธํฐ ๊ฐฑ์ ์ ์ํ์ฌ ์ด์ ๋จ๊ณ์ ๋ชจ๋ฉํ ($ m_{t-1} $)์ 2๋ฒ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. Nadam์ ์ด๋ฅผ ์กฐ๊ธ ๋ณํํฉ๋๋ค. ์ด์ ๋จ๊ณ์ ๋ชจ๋ฉํ ($ m_{t-1} $)์ ๋์ ํ์ฌ ํ์ฌ์ ๋ชจ๋ฉํ ($ m_t $)์ ์ฌ์ฉํจ์ผ๋ก์จ ๋ฏธ๋์ ๋ชจ๋ฉํ ์ ์ฌ์ฉํ๋ ํจ๊ณผ๋ฅผ ์ป์์ต๋๋ค. ์ด๋ฅผ NAG์ ํ๋ผ๋ฏธํฐ ์กฐ์ ์ ๋ฐ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$$ g_t=\triangledown J(\theta) $$
$$ \theta_{t+1} = \theta - (\gamma m_t + \eta g_t) $$
์์ ํจ๊ณผ๋ฅผ Adam์ ์ ์ฉํ๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ ๊ธฐ์กด์ Adam์ด ํ๋ผ๋ฏธํฐ๋ฅผ ์์ ํ๋ ๋ถ๋ถ์ ์กฐ๊ธ ๋ ํ์ด์ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค.
$$ \theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{\hat{v_t}+\epsilon}}\hat{m_t} $$
$$ \theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{\hat{v_t}+\epsilon}}\left(\frac{\beta_1m_{t-1}}{1-\beta_{1}^{t}}+\frac{(1-\beta_1)g_t}{1-\beta_{1}^{t}}\right) $$
$$ \theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{\hat{v_t}+\epsilon}}\left(\beta_1 \hat{m_{t-1}}+\frac{(1-\beta_1)g_t}{1-\beta_{1}^{t}}\right) $$
์์์ ์ธ๊ธํ ๋ฏธ๋์ ๋ชจ๋ฉํ ์ ์ฌ์ฉํ๋ ํจ๊ณผ๋ฅผ Adam์ ์ ์ฉํ๋ฉด, ์๋์ ๊ฐ์ด ๊ณต์์ ์์ ํ ์ ์์ต๋๋ค.
$$ \theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{\hat{v_t}+\epsilon}}\left(\beta_1 \hat{m_{t}}+\frac{(1-\beta_1)g_t}{1-\beta_{1}^{t}}\right) $$
์์ ๊ณต์์ ์ ์ฉํ์ฌ Nadam์ ๊ตฌํํ ๋ด์ฉ์ ์๋์ ๊ฐ์ต๋๋ค.
class Nadam:
def __init__(self, lr: float=0.001, beta1: float=0.9,
beta2: float=0.999):
self.lr = lr
self.b1 = beta1
self.b2 = beta2
self.iter = 0
self.m = None
self.v = None
def update(self, params: Dict[str, float],
grads: Dict[str, float]) -> None:
if self.m is None:
self.m, self.v = {}, {}
for key, val in params.items():
self.m[key] = np.zeros_like(val)
self.v[key] = np.zeros_like(val)
self.iter += 1
for key in params.keys():
# Momentum
self.m[key] = \
self.b1 * self.m[key] + (1 - self.b1) * grads[key]
m_hat = \
self.m[key] / (1 - self.b1 ** self.iter) # bias correcton
# RMSProp
self.v[key] = \
self.b2 * self.v[key] + (1 - self.b2) * (grads[key] ** 2)
v_hat = \
self.v[key] / (1 - self.b2 ** self.iter) # bias correcton
# Update
params[key] -= \
self.lr / (np.sqrt(v_hat) + 1e-7) * \
(self.b1 * m_hat + (1 - self.b1) * \
grads[key] / (1 - (self.b1 ** self.iter)))
Nadam์ ์๊ฐํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Adam๊ณผ Nadam์ ์๊ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํด๋ณด๋ฉด, Nadam์ด ๋ ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ์ ์ญ ์ต์๊ฐ์ ์ฐพ์๋ธ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
3. ์ตํฐ๋ง์ด์ ๋น๊ต
SGD๋ฅผ ํฌํจํ์ฌ ์ด 7๊ฐ์ ์ตํฐ๋ง์ด์ ๋ฅผ ์์๋ณด์์ต๋๋ค. SGD๋ฅผ ์ ์ธํ 6๊ฐ์ ์ตํฐ๋ง์ด์ ๋ฅผ ์๊ฐํํ๊ฒ ์ต๋๋ค. 6๊ฐ์ ์ตํฐ๋ง์ด์ ๋ชจ๋ ๋์ผํ ์ํญ์ ํ์ต์ ์งํํ์์ต๋๋ค.
๊ทธ๋ฆผ 5์์ ์ฌ์ฉํ ๊ธฐ๋ฒ์ ๋ฐ๋ผ ๊ฐฑ์ ๊ฒฝ๋ก๊ฐ ๋ฌ๋ผ์ง์ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฆผ 5๋ง ๋ณด๋ฉด, AdaGrad์ RMSPorp์ด ๊ฐ์ฅ ๋์๋ณด์ ๋๋ค. ํ์ง๋ง ํ์ด์ผ ํ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง์ ๋ฐ๋ผ ์ด๋ค ์ตํฐ๋ง์ด์ ๋ฅผ ์ฌ์ฉํด์ผํ ์ง ๊ฒฐ์ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ํ, ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ ์ด๋ป๊ฒ ์ค์ ํ๋๋์ ๋ฐ๋ผ์๋ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
์ตํฐ๋ง์ด์ ์ ๋ํ ์ต๊ทผ ์ฐ๊ตฌ์์๋ SGD๊ฐ Adam์ ๋นํ์ฌ ์ผ๋ฐํ(generalization)๋ฅผ ์ํ์ง๋ง, Adam์ ์๋๊ฐ SGD์ ๋นํด ํจ์ฌ ๋น ๋ฅด๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ ธ์ต๋๋ค. ์ด ์ฐ๊ตฌ๋ฅผ ๋ฐํ์ผ๋ก ์ต๊ทผ์๋ Adam๊ณผ SGD์ ์ฅ์ ์ ๊ฒฐํฉํ๋ ค๋ ์๋๊ฐ ์์์ต๋๋ค. ๊ทธ์ค ๋ํ์ ์ธ ๊ฒ์ด ๋ฐ๋ก Adam์ SGD๋ก ์ ํํ SWATS์ ๋๋ค. ๋ ์ด์ธ์๋ AMSBound์ AdaBound ๋ฑ์ด ๋ฑ์ฅํ๋ฉฐ, Adam์ ๊ฐ์ ํ๊ธฐ ์ํ ์๋๋ ์ด์ด์ง๊ณ ์์ต๋๋ค. ์ด๋ฐ ์ต์ ์ตํฐ๋ง์ด์ ๋ ์ถํ์ ๊ฒ์๋ฌผ์์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ ์ถ์ฒ
- ํ์ฉํธ, "์์ตํด๋ ๋ชจ๋ฅด๊ฒ ๋ ๋ฅ๋ฌ๋, ๋จธ๋ฆฟ์์ ์ธ์คํจ์์ผ๋๋ฆฝ๋๋ค", https://www.slideshare.net/yongho/ss-79607172, 2017
- S. Ruder, "An overview of gradient descent optimization algorithms", https://ruder.io/optimizing-gradient-descent, 2016
'๊ธฐ์ด > ์ธ๊ณต์ง๋ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ต๊ณผ ๊ด๋ จ๋ ๊ธฐ์ ๋ค (0) | 2021.09.10 |
---|---|
์ตํฐ๋ง์ด์ (Optimizer) (1/2) (1) | 2021.08.31 |
์ค์ฐจ์ญ์ ํ(Back-Propagation) (0) | 2021.08.29 |
์์ค ํจ์(Loss function) (0) | 2021.08.28 |
ํ์ฑํ ํจ์(Activation function) (0) | 2021.08.26 |