본문 바로가기
Language&Framework&Etc/Pytorch

AUTOGRAD : 자동 미분 (Pytorch tutorial)

by 머리올리자 2021. 4. 30.

autograd

 

autograd 패키지

 - Tensor의 모든 연산에 대해 자동 미분 제공 (define-by-run)

 - 코드를 어떻게 작성하여 실행하느냐에 따라 역전파가 정의

 

Tensor

 - torch.Tensor → requires_grad true하면, 그 tensor에서 이뤄진 모든 연산들을 추적(track)하기 시작

 - 계산 완료후 .backward()를 호출하여 모든 변화도(gradient 기울기)를 자동으로 계산 가능

 - 이 tensor의 gradient는 .grad에 누적

 

 - 기록 추적 중단 : .detach

 - 기록 추적 방지 코드 블럭 : with torch.no_grad():

    → requires_grad=True가 설정되어 학습 가능한 매개변수를 갖는 모델을 평가할 때 유리

 

 

Function Class

 - Tensor와 Function은 서로 연결

 - 모든 연산 과정을 부호화(encode)하여 순환하지 않는 그래프 생성

 - 각 tensor는 .grad_fn 속성을 가지고 있음

 - 이는 Tensor를 생성한 Function을 참조하고 있음.

 

도함수 계산을 위해서는 Tensor의 .backward()를 호출하면 된다.

 

 - Tensor가 scalar인 경우는 backward에 인자를 정해줄 필요가 없다.

 - 그러나 여러 개의 요소를 갖고 있을 때는 tensor의 모든 양을 gradient의 인자로 지정할 필요가 있다.

 

 

import torch

print("NO GRAD")
x1 = torch.ones(2, 2) # 연산을 기록
print(x1)

y1 = x1 + 2
print(y1)

print("REQUIRES_GRAD")

x2 = torch.ones(2, 2, requires_grad=True) # 연산을 기록
print(x2)

y2 = x2 + 2
print(y2)

 

 

NO GRAD
tensor([[1., 1.],
        [1., 1.]])
tensor([[3., 3.],
        [3., 3.]])
REQUIRES_GRAD
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)

 

y2의 경우 연산의 결과로 생성된 것이므로 grad_fn을 갖는다.

(y1 X)

print(y1.grad_fn)
print(y2.grad_fn)
None
<AddBackward0 object at 0x000001EF47BF9A90>

 

추가 연산 수행

z2 = y2 * y2 * 3
out = z2.mean()

print(z2, out)

 

tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)