import torch
autograd는 PyTorch에서 핵심적인 기능을 담당하는 하부 패키지이다.
autograd는 텐서의 연산에 대해 자동으로 미분값을 구해주는 기능을 한다.
텐서 자료를 생성할 때, requires_grad인수를 True로 설정하거나
계산을 멈추고 싶으면 .detach()함수나 with을 이용해 torch.no_grad()를 이용하면 된다.
x = torch.rand(2, 2, requires_grad = True)
x
다음으로 이 x에 연산을 수행한다. 다음 코드의 y는 연산의 결과이므로 미분 함수를 가진다. grad_fn속성을 출력해 미분 함수를 확인 할 수 있다.
y.backward() 함수를 실행하면 x의 미분값이 자동으로 갱신된다. x의 grad속성을 확인하면 미분값이 들어 있는 것을 확인 할 수 있다. y를 구하기 위한 x의 연산을 수식으로 쓰면 다음과 같다.
𝑦=∑𝑖=143×𝑥𝑖
이를 𝑥𝑖
에 대해 미분 하면 미분 함수는 다음과 같다.
∂𝑦∂𝑥𝑖=3
실제 미분값과 같은지 확인해보자.
y = torch.sum(x * 3)
print(y, y.grad_fn)
y.backward(retain_graph=True)
x.grad
backward()함수는 자동으로 미분값을 계산해 requires_grad인수가 True로 설정된 변수의 grad속성의 값을 갱신한다.
retain_graph 미분을 연산하기 위해서 사용했던 임시 그래프를 유지 할 것인가를 설정하는 것이다. 기본값은 False로 설정되어 있지만 동일한 연산에 대해 여러번 미분을 계산하기 위해서는 True로 설정되어 있어야한다.(tf.GradientTape에서 persistent와 같음)
torch.autograd.grad()함수를 사용해 tf.GradientTape처럼 사용할 수도 있다.
torch.autograd.grad(y, x)
상황에 따라 특정 연산에는 미분값을 계산하고 싶지 않은 경우에는
print(x.grad)
x_d = x.detach()
torch.sigmoid(x_d)
x.grad
print(x_d.grad)
print(x.grad)
with torch.no_grad():
x_d2 = torch.sigmoid(x)
print(x_d2.grad)
어렵다...
💻 출처 : 제로베이스 데이터 취업 스쿨