매개변수의 최적값을 찾는 문제를 푸는 것을 최적화라고 한다.
최적의 매개변수 값을 찾는 단서로 매개변수의 기울기를 이용해, 기울어진 방향으로 매개변수 값을 갱신하는 일을 반복해 최적의 값에 다가가는 방법을 확률적 경사 하강법(SGD)라고 한다.

class SGD:
def __init__(self, lr=0.01):
self.lr = lr
def update(self, params, grads):
for key in params.keys():
params[key] -= self.lr * grads[key]

모멘텀은 운동량을 뜻하는 단어이다.

class Momentum:
def __init__(self, lr=0.01, momentum=0.9):
self.lr = lr
self.momentum = momentum
self.v = None
def update(self, params, grads):
if self.v is None:
self.v = {}
for key, val in params.items():
self.v[key] = np.zeros_like(val)
for key in params.key():
self.v[key] = self.momenturm*self.v[key] - self.lr*grads[key]
params[key] += self.v[key]
인스턴스 변수 v -> 물체의 속도

신경망 학습에서 학습률이 너무 작으면 학습 시간이 너무 길어지고, 너무 크면 발산하여 학습이 제대로 이루어지지 않는다.

class AdaGrad:
def __init__(self, lr=0.01):
self.lr = lr
self.h = None
def update(self, params, grads):
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)

모멘텀과 AdaGrad를 융합한 듯한 방법이다. 하이퍼파라미터의 편향 보정이 진행된다.

문제마다 효율적으로 사용할 수 있는 기법이 있다. 일반적으로 SGD보다 다른 세 기법이 빠르게 학습한다.

