신경망 학습의 목적은 손실 함수의 값을 낮추는 매개변수를 찾는 것이다. 즉, 매개변수의 최적값을 찾는 문제이며, 이러한 문제를 푸는 것을 **최적화(Optimization)**라고 한다.
매개변수의 기울기를 구해, 기울어진 방향으로 매개변수 값을 갱신하는 방법이다.

W: 갱신할 가중치 매개변수
δL/δW: W에 대한 손실 함수의 기울기
η: 학습률(learning rate)
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]
update(params, grads) 메서드가 호출되면서 가중치가 갱신된다.
SGD는 단순하고 구현이 쉽지만, 문제에 따라서는 비효율적일 때가 있다.
아래 함수의 최솟값을 구하는 문제를 예로 들어보겠다.
$$ f(x,y) = \frac{1}{20}x^2 + y^2 $$
이 함수를 그래프와 등고선으로 나타내면 다음과 같다.

이 둘 모두 x축 방향으로 축 늘인 듯한 모습을 보인다.