기울기를 계산하고 누적하는 법
tensor.backward()는 역전파를 시작하는 호출이야. 기본적으로 스칼라 텐서에서 호출해. 출력이 스칼라가 아니라면 각 출력 원소에 얼마만큼의 가중치를 줄지 나타내는 '들어오는 기울기'를 인자로 넘겨야 해. 일반적인 지도 학습에서는 손실이 스칼라이므로 이 인자를 쓸 일이 거의 없어.
.grad 누산기
역전파가 끝나면 기울기는 leaf_tensor.grad에 저장돼. 여기서 꼭 기억할 점이 있어. 역전파를 여러 번 호출하면 새 기울기가 기존 .grad에 더해지며, 이전 값을 덮어쓰지 않아. 모든 학습 반복문에 optimizer.zero_grad()가 있는 이유가 바로 누산기를 초기화하기 위해서야.
물론 이 누적 동작이 유용할 때도 있어. 여러 미니배치의 기울기를 모아 큰 배치를 흉내 내는 기울기 누적을 간단히 구현할 수 있거든.
스칼라가 아닌 출력
스칼라가 아닌 텐서에서 .backward()를 호출해야 한다면 출력과 같은 모양의 텐서를 '들어오는 기울기'로 넘겨야 해. 이렇게 벡터-야코비안 곱(vJP)을 계산해. 일반적인 학습보다는 샘플별 기울기나 사용자 정의 손실을 다루는 연구 코드에서 더 자주 만나.