AUTOGRAD MECHANICS
Autograd가 어떻게 동작하는 지에 대한 이야기. 꼭 몰라도 되지만 알면 좋다.
EXCLUDING SUBGRAPHS FROM BACKWARD
모든 텐서는 requires_grad
를 가지고 있으며 이를 통해 gradient 계산을 포함할지를 결정할 수 있다. 만약 어떤 입력이 require_grad=True라면 당연히 그 이후 출력도 계산을 해야하기 때문에 True값이다. 반대로 입력이 필요없다면 마찬가지로 출력에서도 필요없다. 그렇다면 입력이 여러 개 일때, 제각각이라면? 하나라도 있다면 그 gradient를 위해 그 이후 출력은 필요하다.
>>> x = torch.randn(5, 5) # requires_grad=False by default
>>> y = torch.randn(5, 5) # requires_grad=False by default
>>> z = torch.randn((5, 5), requires_grad=True)
>>> a = x + y
>>> a.requires_grad
False
>>> b = a + z
>>> b.requires_grad
True
미리 학습된 모델을 가지고 finetuning할 때 유용하다. 모델의 일부 파라미터는 학습이 안되도록 고정시킬 수 있기 때문이다.
model = torchvision.models.resnet18(pretrained=True)
for param in model.parameters():
param.requires_grad = False
# 마지막 fully-connected layer만 대체
# 새롭게 만들어진 모델의 파라미터는 기본적으로 requires_grad=True가 default다.
model.fc = nn.Linear(512, 100)
# classifier(fc) 부분만 최적화
optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)
HOW AUTOGRAD ENCODES THE HISTORY
Autograd는 생성한 모든 operation을 담고있는 graph를 기록(record)하여 입력부터 출력까지의 acyclic graph를 제공하고, 이를 역추적해서 chain rule에 의해 미분이 가능하다. 이 ㄹ Function
객체로 나타내고 apply()
를 통해 evaluate할 수 있다. forward pass를 할 때 gradient를 계산하는 graph 또한 만드는데 이는 .grad_fn
으로 접근 가능하다.
중요한 것은 iteration마다 새롭게 graph가 처음부터 새롭게 만들어지기 때문에 Python의 코딩 스타일대로 짤 수 있고(제어문이나 반복문 등), shape나 size 변경도 중간에 가능하다. Tensorflow처럼 미리 딱 정해놓고 할 필요는 없다는 것. (what you run is whay you differentiate)
IN-PLACE OPERATIONS WITH AUTOGRAD
이를 지원하는 것은 매우 어렵다고 하면서, 잘 돌아가고 있으니 굳이 손대지 말라 한다. (Unless you’re operating under heavy memory pressure, you might never need to use them.) 막 2 가지 이유 드는데 결국 에러를 일으킬 가능성이 있기 때문이라 한다. (원본에서 자세히 확인)
IN-PLACE CORRECTNESS CHECKS
version counter가 있는데 dirty라고 표시될 때마다 증가하는 값으로, backward의 텐서들을 저장하면, version counter도 저장된다. self.saved_tensors에 액세스하면 검사가 수행되고 저장된 값보다 큰 경우 오류가 발생하니, 에러가 보이지 않는다면 gradient는 잘 계산되고 있는 것이다. ( 사실 뭔 소리인지 모르겠지만 에러만 없다면...괜찮다는 뜻이겠지 )
'Programming > Pytorch' 카테고리의 다른 글
Pytorch docs 요약] Cuda semantics (0) | 2019.02.02 |
---|---|
Pytorch docs 요약] Broadcasting Semantics (0) | 2019.01.30 |