Autograd 관련 정리

이두현·2022년 3월 13일
0

Autograd 가 history를 encode 하는 방법

  • operation을 실행하는 과정에서 참여하는 input과 output을 토대로 acyclic graph를 형성하게 되는데 leave는 input tensor로 root는 output tensor 형식을 취한다.

  • forward pass 연산이 진행될 때 autograd는 요청된 연산을 진행함과 동시에 그 연산을 나타내는 그래프를 build 하게 되며 forward pass에 해당하는 연산이 끝나면 역방향 gradient 전달을 시작한다.

  • 중요한 점은 매 iteration 마다 새로운 그래프가 밑바닥에서 부터 새로 만들어진다는 것이다.

부분적으로 gradient computation을 금지하는 방법

requires_grad 에 대한 이해

  • parameter에 대해 'parameter'.requires_grad = False 로 설정하면 parameter는 상수로 취급되어 backward 연산에서 업데이트 되지 않을 것이다.

  • 파라미터 뿐만 아니라 모듈에 대해서도 requires_grad 옵션을 줄 수 있는데 이럴 경우 module에 속한 모든 파라미터에 대해서 그 속성이 적용될 것이다.

requires_grad를 제외한 gradient 관련 세가지 모드 소개

  1. default mode - grad mode
    gradient가 계산되는 상태를 의미하며 다른 두 경우와 달리 requires_grad 옵션을 적용할 수 있게 된다. (다른 두 모드에서는 자동으로 requires_grad = False 이다.)

  2. 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 할 때 이 모드가 사용된다.

  3. inference mode
    inference mode는 no-grad 모드의 극단적인 버전이며 속도가 빠르다.
    그 이유는 이 모드에서는 위와 마찬가지로 operation을 autograd에 저장되게 하지 않지만 계산결과를 나중 grad mode에서 사용할 수 없다는 단점이 있다.

Evaluation 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

profile
0100101

0개의 댓글