본문 바로가기

오늘의 코딩/머신러닝,Deep Learning

[pytorch] require_grad, zero_grad(), no_grad() 차이

Autograd-자동미분

grad가 붙은 함수는 대부분 gradient 계산에 사용한다고 보면 된다.

pytorch에서는 신경망에서 역전파 단계의 연산을 자동화하는 자동미분 기능을 제공한다. 신경망의 순전파 단계를 지나 역전파 과정에서 autograd 기능을 이용하여 변화도(gradient)를 쉽게 계산할 수 있다.

구현은 다음과 같다.

#loss 는 Tensor 연산을 사용하여 계산한 손실값으로 (1, ) 형태의 Tensor로 정의한다.

loss.backward() 

 

이 함수는 backpropagation을 수행하여 x.grad에 변화도를 저장한다.

require_grad

require_grad = True로 설정하면 역전파 중에 이 Tensor들에 대한 변화도를 계산하라는 의미가 된다. 계산한 변화도는 Tensor 내에 저장된다.

require_grad=False로 설정하여 역전파 중에 이 Tensor들에 대한 변화도를 계산할 필요가 없음을 나타낸다.

(requre_grad의 기본값이 True이다.)

 

 

변화도를 계산한다/하지 않는다는 의미는 무엇인가?

Nueral Network의 학습 과정은 다음과 같다. 순전파 단계를 통해 Tensor 연산을 사용하여 답을 계산하고, 역전파 과정에서 정답과 예측값의 차인 loss를 통해 변화도를 계산하여 파라미터를 최적의 값으로 조정한다.

 

이때, 역전파 과정에서 각 노드의 변화도를 계산하는 것이 loss.backward() 함수이다.

 

이 함수는 backpropagation을 수행하여 x.grad에 변화도를 저장한다.x.grad에 저장된 변화도를 이용하여 파라미터 값을 갱신한다.

변화도를 계산한다는 것은 곧 파라미터 값을 업데이트하겠다는 뜻이고, 변화도를 계산하지 않겠다는 것은 파라미터 값을 업데이트 하지 않겠다는 의미이다. transfer learning에서 사용한다.

.zero_grad()

Neural Network model 인스턴스를 만든 후, 역전파 단계를 실행하기 전에 변화도를 0으로 만든다. autograd의 추적기록을 피하기 위해 학습 가능한 매개변수를 갖는 Tensor를 직접 0으로 조작하여 모델의 가중치를 갱신할 때 사용한다. 왜냐하면 .backward()를 호출할 때마다 변화도가 buffer에 누적되기 때문이라고 한다. 아마도 변화도를 업데이트 하기 전에 초기화 하는 모양이다.

 

 

 

torch.no_grad()

torch.no_grad() 블록을 사용하는 이유는 해당 블록을 history 트래킹 하지 않겠다는 뜻이다.

 

 

refer - https://tutorials.pytorch.kr/beginner/pytorch_with_examples.html#autograd