옵티마이저 — 기울기로 파라미터를 고치는 손 ★★★
6장에서 기울기를 구했어요. 이제 그 기울기로 파라미터를 실제로 바꾸는 담당자가 필요한데, 그게 옵티마이저예요. 6장에서 with torch.no_grad(): W -= lr * W.grad처럼 직접 쓰던 일을 대신해 줘요.
옵티마이저 = 자기에게 전달된 파라미터의 .grad를 이용해서 파라미터 값을 갱신하는 도구예요.
loss는 채점표(몇 점 틀렸는지), 기울기는 선생님의 피드백(어느 방향으로 얼마나 고치라), 옵티마이저는 그 피드백대로 공부 방법을 실제로 바꾸는 학생이에요. 피드백을 받아도 학생이 움직이지 않으면 실력은 그대로예요.
가장 기본적인 방법이 SGD(Stochastic Gradient Descent, 확률적 경사 하강법)예요. 식은 6장에서 본 그대로예요.
| 코드 줄 | 무슨 뜻 |
|---|---|
import torch.optim as optim | 옵티마이저 모음을 불러와요. optim이라는 짧은 이름으로 써요. |
model = nn.Linear(1, 1) | 모델을 먼저 만들어요. 그래야 넘겨줄 파라미터가 생겨요. |
criterion = nn.MSELoss() | 손실 함수 객체예요. |
optim.SGD(model.parameters(), lr=0.02) | "이 파라미터들을 SGD 방식으로, 한 걸음 0.02로 고쳐라." 모델이 가진 모든 학습 대상이 한꺼번에 전달돼요. |
여기서 5장의 등록이 중요해져요. model.parameters()에는 등록된 파라미터만 들어 있어서, nn.Parameter나 nn.Linear로 만들지 않은 일반 Tensor는 옵티마이저에 전달되지 않아 업데이트에서 빠져요.
순서가 헷갈린다고 교수님이 말했어요. 모델 → 손실 함수 → 옵티마이저 순서로 만들어요. 옵티마이저가 모델의 파라미터를 받아야 하기 때문이에요.
SGD 말고도 Adam, AdamW, RMSprop 같은 방법이 있어요. 교수님은 SGD가 현재 weight에서 기울기(에 학습률을 곱한 값)를 빼는 간단한 방식이고, 다른 방식들은 이전 기울기를 기억해서 쓰는 등 더 복잡한 규칙을 쓴다고 설명했어요. 어떤 규칙을 쓰는지에 따라 필요한 설정값이 달라요. 시험에서는 이름과 "갱신 규칙이 다르다"만 알면 돼요.
옵티마이저 설명 보기에서는 "전달된 파라미터의 .grad를 이용해 파라미터를 갱신한다"가 맞아요. optim.SGD(model.parameters(), lr=...)를 만드는 시점에는 아무것도 바뀌지 않는다는 점도 기억하세요.
잠깐 확인 — optimizer = optim.SGD(...)를 실행한 직후 모델의 weight는 바뀔까요?
바뀌지 않아요. 옵티마이저를 만드는 것은 "이 방식으로 고치겠다"는 설정만 하는 거예요. 값이 바뀌려면 backward로 기울기를 구한 다음 step()을 불러야 해요.
자료: 6·7주차 · Week04_Autograd_Loss_Optimizer · 7주차 녹취(빅데이터07)