Neural Network 의 목적 : Loss function의 값을 최소화 시키는 파라미터 찾기 == 최적의 파라미터 찾기
최적의 파라미터를 찾는 문제를 푸는 것 == 최적화 ( Optimization )
깊은 네트워크 → 파라미터 매우 많음 → 파라미터 공간 매우 넓고 복잡 → 풀기 어려운 문제
최적의 파라미터 찾는 단서 → 미분값 → 파라미터에 대한 기울기를 구해 기울어진 방향으로 파라미터 값을 갱신하는 것을 반복하며 최적의 파라미터로 다가감 → 확률적 경사 하강법 ( SGD - Stochastic Gradient Descent )
https://hiddenbeginner.github.io/deeplearning/2019/09/22/optimization_algorithms_in_deep_learning.html
SGD 수식
$$ \bold{W} \leftarrow \bold{W}-\eta \frac{\partial L}{\partial \bold{W}} $$
$\bold{W}$ : 갱신할 파라미터
$\frac{\partial L}{\partial \bold{W}}$ : $\bold{W}$에 대한 Loss function의 기울기
$\eta$ : learning rate ( 학습률 ) 로, 보통 0.01이나 0.001같은 값을 미리 정해 사용한다
$\leftarrow$ : 우변의 값으로 좌변의 값을 갱신한다는 뜻
기울어진 방향으로 일정거리만 가겠다는 단순한 방법
[파이썬 수도 코드]
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]
model = ResNet50()
optimizer = SGD()
for epoch in range(num_epochs):
for x, y in dataloader:
grads = model.gradient(x, y)
params = model.params
optimizer.update(params, grads)
optimizer가 기울기와 파라미터 정보를 가지고 최적화를 수행하기 때문에 pytorch 같은 경우
import torch
model = ResNet50()
optimizer = torch.optim.SGD(model.parameters(), lr=initial_lr, momentum= ... )
tensor에 기울기가 저장되기 때문에 optimizer에 모델의 파라미터와 learning rate 등의 정보를 넘겨주면 optimizer.step()에서 업데이트를 해준다