zero_grad()
보통 딥러닝에서는 미니배치+루프 조합을 사용해서 parameter들을 업데이트하는데,
한 루프에서 업데이트를 위해 loss.backward()를 호출하면 각 파라미터들의 .grad 값에 변화도가 저장이 된다.
이후 다음 루프에서 zero_grad()를 하지않고 역전파를 시키면 이전 루프에서 .grad에 저장된 값이 다음 루프의 업데이트에도 간섭을 해서 원하는 방향으로 학습이 안된다고 한다.
자세히 풀어 말하자면, Pytorch에서는 gradients값들을 추후에 backward를 해줄때 계속 더해주기 때문에 우리는 항상 backpropagation을 하기전에 gradients를 zero로 만들어주고 시작을 해야한다.
따라서 루프가 한번 돌고나서 역전파를 하기전에 반드시 zero_grad()로 .grad 값들을 0으로 초기화시킨 후 학습을 진행해야 한다.
import torch as T
import torch,optimizer as optim
optimizer = optim.Adam(lr=lr, params=self.parameters())
...
optimizer.zero_grad()
loss.backward()
optimizer.step()
따라서 매번 loss.backward()를 호출할때 초기설정은 매번 gradient를 더해주는 것으로 설정되어 있다.
그렇기 때문에 학습 loop를 돌때 이상적으로 학습이 이루어지기 위해선 Iteration이 한번 끝나면 gradients를 항상 0으로 만들어 주어야 한다. 만약 gradients를 0으로 초기화해주지 않으면 gradient가 의도한 방향이랑 다른 방향을 가르켜 학습이 원하는 방향으로 이루어 지지 않는다.
model.zero_grad()와 optimizer.zero_grad() 차이
1. optimizer.zero_grad() : optimizer에 내가 학습하고자 하는 가중치(즉, optimizer에 register된 모든 파라미터)만 zero_grad()해줄 때 수행하는 코드
2. model.zero_grad() : 모델의 모~든 가중치를 학습하고자 할 때 수행하는 코드
참고 링크
https://algopoolja.tistory.com/55
Pytorch에서는 왜 항상 optimizer.zero_grad()를 해줄까?
바로 질문에 대한 답을 말씀드리자면 "Pytorch에서는 gradients값들을 추후에 backward를 해줄때 계속 더해주기 때문"에 우리는 항상 backpropagation을 하기전에 gradients를 zero로 만들어주고 시작을 해야합
algopoolja.tistory.com
https://velog.io/@kjb0531/zerograd%EC%9D%98-%EC%9D%B4%ED%95%B4
zero_grad()의 이해
Neural Network에서 parameter들을 업데이트 할때 우리는 zero_grad()를 습관적으로 사용한다.zero_grad()의 의미가 뭔지, 왜 사용하는지 알아보장Optimizer.zero_grad(set_to_none=False)\[source]Sets
velog.io
https://minsuksung-ai.tistory.com/24
[PyTorch] model.zero_grad() 와 optimizer.zero_grad() 차이
코드를 짜다가 model.zero_grad()와 optimizer.zero_grad()의 차이를 정확히 몰라서 혼용하고 있었습니다. 그래서 헉!하는 마음으로 혹시나 지금까지 했던 학습이 물거품이 될까봐 찾아봤습니다. https://discu
minsuksung-ai.tistory.com
'TIL저장소' 카테고리의 다른 글
[백준/파이썬] 2579번 계단 오르기 (0) | 2022.03.23 |
---|---|
[백준/파이썬] 11650번 좌표 정렬하기 (0) | 2022.03.23 |
[백준] 7562번 나이트의 이동 (python/파이썬) (0) | 2022.02.04 |
[리눅스] 상대경로, 절대경로, 리눅스 기본 명령어 (0) | 2022.01.02 |
[REST API] 참고할 만한 포스트 정리 (0) | 2022.01.02 |