내장 연산만으로는 부족할 때
모델 코드의 99%는 미분 가능한 내장 연산만으로 충분해. Autograd가 연쇄 법칙에 따라 도함수를 조합하므로 역전파를 직접 작성할 필요가 없지. 나머지 1%에서 torch.autograd.Function이 필요해:
- 사용자 정의 CUDA 커널처럼 기존의 미분 가능한 연산으로 표현할 수 없는 순전파를 구현할 때.
- 양자화 인식 학습이나 이산 출력을 내는 모델의 직선 통과 추정기(straight-through estimator)처럼 기울기를 직접 정의해야 할 때.
- 값을 저장하는 대신 다시 계산해 메모리를 아끼고 싶을 때. 다만 이 용도라면 보통
torch.utils.checkpoint가 더 나아.
계약
사용자 정의 함수에는 두 정적 메서드가 필요해:
forward(ctx, *inputs): 순전파를 계산해.ctx.save_for_backward(...)로 역전파에 필요한 값을 보관해.backward(ctx, *grad_outputs): 역전파를 계산해. 순전파의 입력마다 기울기 하나를 반환하고, 기울기가 필요 없는 입력에는 None을 반환해.
forward나 backward를 직접 호출하지는 않아. MyFunction.apply(...)를 호출하면 PyTorch가 그래프 노드를 알맞게 구성해.