작성
·
436
0
"파이토치로 딥러닝 구현 패턴 이해하기" 강의 7:56 부분에서,
optimizer.zero_grad()는 기존의 연산을 끊어주는 역할을 하고,
이는 강의에서 전에 작성했던
W.detach_().requires_grad_(True)
b.detach_().requires_grad_(True)
이 코드와 같은 역할을 한다고 설명해 주셨습니다.
설명을 듣고, pytorch 공식 문서 등에서 관련된 내용들을 찾아보니
"detach는 계산된 값과 동일한 저장 공간을 사용하지만, 계산 기록은 없는 tensor를 반환하여 tensor를 과거 계산 기록으로부터 떼어내는 역할을 한다"
라는 설명을 찾을 수 있었습니다.
그렇다면, 모델 파라미터의 미분값을 0으로 초기화하는 optimizer.zero_grad()는
W.detach_().requires_grad_(True)
이 코드와 엄밀히 따지자면 조금 다른 동작을 하는 것으로 이해하였는데요,
'기존의 연산을 끊어준다' 라는 측면에서 조금 동작에 차이가 있다고 보는 것이 맞는지 설명 듣고 싶습니다!
감사합니다
답변 1
2
안녕하세요. 답변도우미입니다.
다음과 같이 zero_grad() source code 에 보시면, 내부적으로 detach_() 동작을 진행하고, gradient 를 0으로 초기화 하였고, 계산은 기존과 같이 계속 기록을 하게 되는 것이라서요. detach_().requires_grad_(True) 도 구현 레벨로 계산 기록은 없는 tensor를 반환하면, 결국 gradient 가 0인 상태로 이후 operation 을 기록하며, gradient 를 계산해주는 것이라서, 결국 동일한 동작을 표현한 것이라고 보시면 어떠실까요? detach를 내부적으로 콜하고 있지만, 이후 코드가 미세하게나마 다를 수는 있지만, 저희가 인지해야할 정도로 의미 있는 차이는 없어보입니다. 또 detach 동작도 구현 레벨로 표현을 한 것이라서, 특별히 달라보이지는 않아서요. 혹시 어떤 부분이 다르다고 생각이 되신다면, dream@fun-coding.org 로 다시 한번 의견을 보내주시면 저희도 다시 고민을 해보겠습니다.
http://pytorch.org/docs/master/_modules/torch/optim/optimizer.html#Optimizer.zero_grad
def zero_grad(self):
"""Clears the gradients of all optimized :class:`Variable` s."""
for group in self.param_groups:
for p in group['params']:
if p.grad is not None:
p.grad.detach_()
p.grad.zero_()
감사합니다.