신경망 학습이란? → 손실 함수의 값을 가능한 한 낮추는 매개변수를 찾는 것(optimization)
매개변수를 어떻게 찾을까? → 각 ****매개변수에 대한 손실함수의 기울기를 구해 기울어진 방향으로 매개변수 값 갱신(확률적 경사 하강법)

<aside> ✅ 기울기에 학습률(η)을 곱한 값만큼 매개변수를 갱신시키므로, 기울기가 클수록 갱신이 많이 된다.
아래의 그림처럼 기울기가 가파른 곳은 빠르게 지나가고, 기울기가 완만한 곳은 느리게 지나간다.
</aside>

class SGD:
def __init__(self, lr=0.01):
self.lr = lr #학습률(기본 값 = 0.01)
def update(self, params, grads): #params = 가중치 매개변수, grads = 기울기
for key in params.keys(): #모든 매개변수에 대하여
params[key] -= self.lr * grads[key] #매개변수의 가중치에 학습률*기울기를 빼줌
network = TwoLayerNet(...)
optimizer = SGD()
for i in range(10000):
...
x_batch, t_batch = get_mini_batch(...) #미니배치
grads = network.gradient(x_batch, t_batch)
params = network.params
optimizer.update(params, grads)
...
<aside>
✅ update()에서 return이 없는 이유는? 참고
optimizer.update(params, grads)를 보면 update함수의 인자로 params를 넘기고 있는데, 이는 내용물을 복사하여 넘기는 call by value 형식이 아닌, 객체 자체를 넘기는 call by object 형식이다.
파이썬에서의 대입은 값을 복사하여 넘기는 것이 아닌 같은 값을 가리키도록 하는 것이다. 즉, 어떤 변수의 값이 변경되면 그 값을 가리키는 다른 변수들의 값도 함께 변하는 것이다.
update의 params도, 미니배치 부분에서의 params도 network.params도 같은 값을 가리키고 있기 때문에, update 함수 안에서 params의 값이 변경되면 network.params도 함께 변한다. 그러므로 굳이 return으로 결과를 반환할 필요가 없어진다.
</aside>

