← 보드Autograd — 자동으로 기울기 구하기 · 6/8
torch.no_grad() — 기록을 잠깐 끄기 ★★
Autograd는 계산을 계속 기록하느라 메모리와 시간을 써요. 기록이 필요 없는 순간에는 with torch.no_grad():로 감싸서 꺼요. 이 블록 안의 계산만 기록에서 빠지고, 블록 밖으로 나오면 다시 기록해요.
꺼야 하는 대표적인 경우가 두 가지예요.
- 파라미터를 직접 업데이트할 때 —
requires_grad=True인 leaf를-=처럼 제자리(in-place)에서 고치면 오류가 나요. 그래서 no_grad 안에서 해요. - 평가나 예측을 할 때 — 값을 안 고칠 거라서 기울기가 필요 없어요. 끄면 계산이 빨라지고 메모리가 줄어요(9장).
w = torch.tensor(2.0, requires_grad=True)
x = torch.tensor(3.0)
target = torch.tensor(10.0)
loss = (w * x - target) ** 2
loss.backward() # 기울기 계산
print("grad:", w.grad.item())
learning_rate = 0.01
with torch.no_grad(): # 추적을 끄고
w -= learning_rate * w.grad # 제자리에서 업데이트
print("업데이트 후 w:", round(w.item(), 2))
print("requires_grad:", w.requires_grad)
grad: -24.0
업데이트 후 w: 2.24
requires_grad: True
| 코드 줄 | 무슨 뜻 |
|---|---|
loss.backward() | w의 기울기 −24를 계산해 w.grad에 저장해요. |
with torch.no_grad(): | 이 아래 들여쓴 줄에서는 기록을 꺼요. |
w -= learning_rate * w.grad | w = 2 − 0.01 × (−24) = 2.24. -=는 제자리 수정이라 실제 w 값이 바뀌어요. |
w.requires_grad | 그대로 True예요. 블록 안만 잠깐 끈 것이라서 다음 학습에서 다시 기록해요. |
모델이 크면 파라미터마다 이 줄을 쓰기 번거로워서 model.parameters()로 한꺼번에 돌아요. 과제 1의 5번 빈칸이 바로 이 구조예요.
with torch.no_grad():
for parameter in model.parameters():
parameter -= learning_rate * parameter.grad
조심할 점이 있어요. parameter = parameter - ...처럼 쓰면 새 Tensor가 만들어질 뿐 모델 안의 값은 안 바뀌어요. 꼭 -=로 써야 해요. 그리고 나중에 배울 옵티마이저를 쓰면 step()이 이 일을 알아서 처리해서 no_grad로 따로 감쌀 필요가 없어요.
이렇게 고르세요 (풀이 요령)
"torch.no_grad()의 효과"는 블록 안의 연산만 기울기 추적에서 제외한다예요. requires_grad=True 설정 자체가 바뀌는 것은 아니에요. 블록 안에서 만든 결과는 requires_grad=False이고, 기존 w는 True 그대로예요.
잠깐 확인 — no_grad 블록 안에서 w -= lr * w.grad를 하면 w.requires_grad가 False가 될까요?
아니에요. 그대로 True예요. no_grad는 블록 안의 연산 기록만 끄고 설정은 바꾸지 않아요.
다음 카드 → 손으로 기울기 값 구하기와 자주 나는 문제 ★★
자료: 6주차 · Week04_Autograd_Loss_Optimizer · 6주차 녹취(빅데이터06), 7주차 녹취(빅데이터07)