본 포스팅은 파이토치(PYTORCH) 한국어 튜토리얼을 참고하여 공부하고 정리한 글임을 밝힙니다.
torch.autograd
: 자동 미분 엔진 ➡️ 모든 계산 그래프에 대한 변화도의 자동 계산 지원입력 x와 매개변수 w와 b, 일부 손실 함수가 있는 가장 간단한 단일 계층 신경망(single layer)을 가정
import torch
x = torch.ones(5) # input tensor
y = torch.zeros(3) # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w) + b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)
requires_grad
속성 설정grad_fn
속성에 저장print(f"Gradient function for z = {z.grad_fn}")
print(f"Gradient function for loss = {loss.grad_fn}")
loss.backward()
를 호출한 다음 w.grad
와 b.grad
에서 값을 가져옴loss.backward()
print(w.grad)
print(b.grad)
Out:
tensor([[0.0970, 0.2870, 0.2443],
[0.0970, 0.2870, 0.2443],
[0.0970, 0.2870, 0.2443],
[0.0970, 0.2870, 0.2443],
[0.0970, 0.2870, 0.2443]])
tensor([0.0970, 0.2870, 0.2443])
requires_grad
속성이 True로 설정된 노드들의 grad 속성만 구할 수 있음- 성능 상의 이유로, 주어진 그래프에서의
backward
를 사용한 변화도 계산은 한 번만 수행 가능- 만약 동일한 그래프에서 여러번의
backward
호출이 필요하면,backward
호출 시에retrain_graph=True
를 전달
requires_grad=True
인 모든 텐서들은 연산 기록을 추적하고 변화도 계산을 지원torch.no_grad()
블록으로 둘러싸서 연산 추적 멈추기 가능z = torch.matmul(x, w) + b
print(z.requires_grad)
with torch.no_grad():
z = torch.matmul(x, w) + b
print(z.requires_grad)
동일한 결과를 얻는 다른 방법: 텐서에 detach()
메소드를 사용
z = torch.matmul(x, w) + b
z_det = z.detach()
print(z_det.requires_grad)
동일한 인자로 backward
를 두차례 호출하면 변화도 값이 달라짐