Search

zero gradient

대분류
프레임워크
소분류
PyTorch
유형
Gradient
기울기 초기화
주요 레퍼런스
https://chasingdreams.tistory.com/174
https://tutorials.pytorch.kr/beginner/basics/autogradqs_tutorial.html#optional-reading-jacobian-product
모듈 분류
Gradient
최종 편집 일시
2024/10/31 01:53
생성 일시
2024/10/23 02:31
13 more properties

pytorch에서 gradient 값을 저장하는 방식

모든 파라미터(모델에서 학습하고자 하는 대상)에 .grad 라는 attribute를 붙여서, 파라미터마다 grad를 보관
어떤 파라미터를 학습할지는 초기에 텐서를 만들 때 requires_grad=True 옵션을 줘서 지정한다.

.grad.zero_() zero_grad() 를 하는 이유

gradient를 계산할 때 pytorch가 자동으로 gradient 값을 누적(accumulate)하기 때문.
한 번 .backward() 를 불렀으면 그 값이 각 파라미터의 .grad에 누적되고, 따라서 나중에 한 번 더 .backward() 를 불렀을 때 영향을 끼침
따라서 .backward()를 부르기 전에, 파라미터의 .grad에 원래 누적된 값을 치워주고 (=0으로 초기화 해주고) gradient를 계산하도록 해야 함.

.grad.zero_() zero_grad() 차이점

.grad.zero_()파라미터에 적용. weight .grad.zero_() 와 같이
zero_()는 inplace로 값을 0으로 만들어주는 함수 '텐서.zero_()' == '텐서 = torch.zeros_like(텐서)'
zero_grad()옵티마이저에 적용.
모든 파라미터에 직접 .grad.zero_()를 적용하는 것이 불편하니, optimizer를 처음에 부를 때 다음과 같이 어떤 파라미터를 최적화하고 싶은지 정의하며 시작함.
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
Python
복사
그리고 나서 optimizer로 최적화를 해야 할 때, 다음과 같이 gradient 값들을 0으로 초기화해 준다
optimizer.zero_grad()
Python
복사
위의 파이토치 튜토리얼에서 "동일한 인자로 backward를 두차례 호출하면 변화도 값이 달라진다.
이는 역방향 전파를 수행할 때, PyTorch가 변화도를 누적(accumulate)해주기 때문
즉, 계산된 변화도의 값이 연산 그래프의 모든 잎(leaf) 노드의 grad 속성에 추가된다.
따라서 제대로 된 변화도를 계산하기 위해서는 grad 속성을 먼저 0으로 만들어야 함.
실제 학습 과정에서는 ”옵티마이저(optimizer)가 이 과정을 도와줍니다."라고 언급되어있는 부분이 여기까지의 내용을 나타냄