operation을 실행하는 과정에서 참여하는 input과 output을 토대로 acyclic graph를 형성하게 되는데 leave는 input tensor로 root는 output tensor 형식을 취한다.
forward pass 연산이 진행될 때 autograd는 요청된 연산을 진행함과 동시에 그 연산을 나타내는 그래프를 build 하게 되며 forward pass에 해당하는 연산이 끝나면 역방향 gradient 전달을 시작한다.
중요한 점은 매 iteration 마다 새로운 그래프가 밑바닥에서 부터 새로 만들어진다는 것이다.
parameter에 대해 'parameter'.requires_grad = False 로 설정하면 parameter는 상수로 취급되어 backward 연산에서 업데이트 되지 않을 것이다.
파라미터 뿐만 아니라 모듈에 대해서도 requires_grad 옵션을 줄 수 있는데 이럴 경우 module에 속한 모든 파라미터에 대해서 그 속성이 적용될 것이다.
default mode - grad mode
gradient가 계산되는 상태를 의미하며 다른 두 경우와 달리 requires_grad 옵션을 적용할 수 있게 된다. (다른 두 모드에서는 자동으로 requires_grad = False 이다.)
no-grad mode
앞서 말한 대로 이 모드에서는 requires_grad = True도 적용되지 않는다
이 모드가 유용한 경우는 autograd에 의해 기록되지 않았으면 좋겠는 operation을 수행하지만 계산결과를 나중에라도 grad mode에서 사용하고 싶은 경우 이 모드를 사용한다.
예를 들어 optimizer의 경우 trainig update 과정에서 parameter를 autograd에 기록되지 않고 in-place 하게 update 하길 바라며 이 parameter들은 다음 forward pass에서 사용될 것이므로 위의 상황설명에 완벽히 들어맞는다.
또한 torch.nn.init의 parameter initalization에서도 parameter를 in-place update 할 때 이 모드가 사용된다.
inference mode
inference mode는 no-grad 모드의 극단적인 버전이며 속도가 빠르다.
그 이유는 이 모드에서는 위와 마찬가지로 operation을 autograd에 저장되게 하지 않지만 계산결과를 나중 grad mode에서 사용할 수 없다는 단점이 있다.
이름 때문에 위의 방식들과 같은 locally gradient 끄는 방식이라 생각할 수 있지만 착각이다.
이 모드가 사용되는 순간은 모델 내부에 torch.nn.Dropout 이나 torch.nn.BatchNorm2d와 같이 trainig에는 켜지고 evaluation에서는 꺼져야하는 동작들을 한번에 다루기 위해서 사용되며 각각은 model.train() , model.eval() 과 같은 방식으로 사용된다.
더욱 자세한 내용은 아래 pytorch 공식 페이지에서 살펴볼 수 있다.
https://pytorch.org/docs/stable/notes/autograd.html#locally-disabling-gradient-computation