기본 설정에서는 리프 텐서만 .grad를 받아
Autograd는 텐서를 두 종류로 뚜렷하게 구분해:
- 리프 텐서: 직접 만들었거나
nn.Parameter로 등록한 텐서야. 그래프의 입력이지 연산의 출력은 아니야..grad에는 손실을 이 텐서로 미분한 값이 쌓여. - 중간 텐서: 연산의 출력이야. PyTorch는 기본적으로 여기에 기울기를 저장하지 않아. 모든 중간 텐서의 기울기를 보관하면 메모리가 감당하지 못할 만큼 커질 수 있거든.
디버깅할 때 세 번째 계층의 출력처럼 중간 텐서의 기울기를 보고 싶다면 두 가지 방법이 있어:
x.retain_grad(): 역전파 전에 중간 텐서에서 호출하면 PyTorch가 그 텐서의 기울기도 저장해.x.register_hook(callback): 기울기가 흐를 때 실행할 함수를 등록해. 기울기를 따로 저장하지 않고도 기록하거나 수정할 수 있어.
일반적인 학습 반복문에서는 둘 다 필요하지 않아. '왜 이 계층은 학습되지 않지?'라는 문제가 생겼을 때 진단용으로 꺼내는 도구야.