이름 끝의 밑줄은 제자리 변경을 뜻해
이름 끝에 밑줄이 붙은 PyTorch 연산은 원래 텐서를 제자리에서 바꿔. add_, mul_, zero_, fill_, uniform_, normal_, clamp_가 모두 같은 관례를 따라. 밑줄이 없는 버전은 입력을 그대로 두고 새 텐서를 반환해.
이 차이가 중요한 이유는 두 가지야:
- 메모리. 제자리 연산은 새 텐서 할당을 피할 수 있어. 매개변수가 10억 개인 모델에서는 의미 있는 차이가 나.
- Autograd 안전성. 제자리 연산은 autograd가 역전파에 쓰려고 보관한 값을 훼손할 수 있어. PyTorch가 이를 감지하면 명확한 오류를 내지만 원칙은 간단해. 역전파에 필요한 텐서는 바꾸지 마.
제자리 연산을 일상적으로 쓰는 곳
optimizer.zero_grad()는 각 매개변수에서p.grad.zero_()를 호출해.set_to_none=True를 넘기면 대신p.grad = None으로 설정하며, 이 방식이 현대적인 PyTorch의 기본값이고 조금 더 빨라.- 사용자 정의 가중치 초기화에서는 보통
torch.no_grad()블록 안에서.uniform_()이나.normal_()을 써. - 교사 모델이나 모멘텀 신경망의 EMA(지수 이동 평균) 갱신도 제자리 연산이 잘 맞는 대표 사례야.
이런 경우가 아니라면 제자리 연산이 아닌 버전을 우선해. 일반적인 모델 코드에서 얻는 작은 메모리 절약은 autograd를 망가뜨릴 위험에 비해 거의 가치가 없어.