optimizer.zero_grad()
loss.backward()
optimizer.step()
위 코드처럼 일반적으로 Pytorch 플랫폼에서 학습을 할 때, optimizer에 대해서 미분 값을 0으로 초기화하는 작업을 수행한다.
Sets the gradients of all optimized torch.Tensor s to zero.
라이브러리 docstring으로는 이정도로 짧게 설명이 되어있는데 이 작업이 의미하는 것에 대해서는 따로 설명이 되어있지 않다.
하지만 Pytorch에서는 이전 grad 값을 다음 step에 그대로 사용한다는 것을 알 수 있었고 아래와 같이 step을 거치면 grad 값이 저장되는 것을 확인할 수 있다. 이때 0으로 초기화하지 않으면 이 값이 다음 step에 그대로 사용되어 마치 시계열 데이터처럼 연속되게 학습하게 된다는 것이다.
grad: tensor([[-2.2846e+11, -2.9944e+08]], device='cuda:0')
아래는 zero_grad를 수행한 직후에 디버깅을 통해 값을 캡쳐한 것이다. 이렇게 0으로 초기화되어야 다음 step에 대해 이전 step과는 무관하게 학습을 할 수 있는 것이다.
grad: tensor([[0., 0.]], device='cuda:0')
Referenced: https://velog.io/@kjb0531/zerograd%EC%9D%98-%EC%9D%B4%ED%95%B4, https://algopoolja.tistory.com/55