모든 연산은 노드를 만들어
requires_grad=True인 텐서에 연산을 적용하면 PyTorch가 그래프 노드를 만들어. 이 노드는 어떤 연산이 텐서를 만들었는지(grad_fn), 그리고 어떤 입력이 그 연산에 들어갔는지를 기억해. 그래야 역전파할 때 입력 쪽으로 되짚어 갈 수 있어.
텐서를 직접 살펴보면 차이가 보여:
- 리프 텐서:
nn.Parameter나torch.tensor(..., requires_grad=True)처럼 직접 만든 텐서야.grad_fn은None이고is_leaf는 True야. 기울기가 쌓이는 곳이지. - 중간 텐서: 연산이 만든 출력 텐서야.
grad_fn은AddBackward0,MulBackward0같은 역전파 함수를 가리켜. 리프 텐서가 아니므로 기본 설정에서는 자신의.grad를 저장하지 않아.
역전파로 그래프를 거슬러 가기
loss.backward()를 호출하면 autograd가 손실에서 시작해 grad_fn으로 연결된 모든 노드를 거슬러 가. 각 노드는 자신의 국소 야코비안, 더 정확히는 벡터-야코비안 곱을 계산하는 법을 알고 있어. 연쇄 법칙은 이 결과들을 조합해 각 리프 텐서의 최종 기울기를 구해.
한 가지 기억할 점이 있어. 기본 설정에서는 메모리를 아끼려고 역전파 직후 그래프를 해제해. 같은 그래프에서 다시 역전파해야 할 때만 retain_graph=True를 넘겨. 보통은 필요하지 않아.