딥러닝에서 인공 신경망을 최적화하는 과정에서 미분은 필수적인 요소. Pytorch를 사용하면 역전파 과정을 매우 쉽게 할 수 있는 자동 미분 계산을 제공함.
import torch
# requires_grad=True는 해당 텐서를 기준으로 모든 연산들을 추적할 수 있게 하는 옵션
# 즉, x에 대해서 연쇄 법칙을 이용한 미분이 가능하다는 것
x = torch.ones(2,2, requires_grad=True)
# y는 x에 대한 식, z는 y에 대한 식, res는 z에 대한 식 (미분가능)
y = x+1
z = 2*y**2
res = z.mean()
print("y: ", y)
print("z: ", z)
print("Result: ", res)
# grad_fn=..은 추적이 잘 되고 있다는 의미
#result
y: tensor([[2., 2.],
[2., 2.]], grad_fn=<AddBackward0>)
z: tensor([[8., 8.],
[8., 8.]], grad_fn=<MulBackward0>)
Result: tensor(8., grad_fn=<MeanBackward0>) # 추적 잘 되는 중
# 역전파
res.backward() # res를 기준으로 역전파를 진행
# res = (z_1 + .. +z_4)/4
# z_i = 2 y_i **2
# z_i = 2(x_i+1)**2
# d(res)/dx_i = x_i + 1
print(x)
print(x.grad) # x.grad는 backward()가 선언 된 변수를 기준으로 미분.
# 즉 d(res)/dx를 계산
#result
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
tensor([[2., 2.],
[2., 2.]])