pytorch를 사용할 때 매 mini-batch 학습마다 model.zero_grad()를 해야한다.
pytorch는 한 mini-batch로 모델을 업데이트 한 후 모델 업데이트에 사용한 gradient를 버리는 것이 아니라 다음 mini-batch 계산에 누적해서 사용한다.
학습 시 이전 mini-batch를 이용하여 계산한 gradient를 다음 mini-batch에서 계산한 gradient에 누적하면 안되기 때문에 다음 mini-batch를 이용하여 학습을 수행하기 전 이전 mini-batch를 이용하여 계산된 gradient를 초기화시켜주는 단계를 거쳐야한다. 따라서 매 mini-batch 학습마다 model.zero_grad()를 불러와야한다.
하지만 pytorch 예제들을 보면 어떤 경우에는 model.zero_grad()를 사용하고 어떤 경우에는 optimizer.zero_grad()를 사용한다.
검색해보니 비슷한 질문에
"model.zero_grad() and optimizer.zero_grad() are the same IF all your model parameters are in that optimizer. I found it is safer to call model.zero_grad() to make sure all grads are zero, e.g. if you have two or more optimizers for one model.” |
라는 댓글이 있었다.
model.zero_grad()와 optimizer.zero_grad() 는 같으므로 쓰는 사람에 따라 선호하는 방식을 사용하는 듯 하다.
출처: https://discuss.pytorch.org/t/model-zero-grad-or-optimizer-zero-grad/28426/5
댓글 없음:
댓글 쓰기