2. Pytorch - Autograd
저번시간에는 Tensor에 대해 알아봤다 궁금하다면? 클릭
이번시간에는 딥러닝 라이브러리를 사용하는 이유이자, 딥러닝의 꽃? 이라고 불릴 수 있는(backpropagation?)을 자동으로 해주는 autograd에 대해 알아보자.
Autograd ?
- Tensor의 모든 연산에 대해 자동 미분을 제공하는 패키지이다.
- 실행-기반-정의 (define-by-run) 프레임워크로, 코드를 어떻게 작성하여 실행하느냐에 따라 역전파(backpropagation)가 정의된다는 것. 만약 backpropagation을 알고싶다면 클릭
- 자동 미분 계산을 위해서 torch.autograd 패키지 안에 있는 Variable을 이용해야 동작이 가능해진다.
Variable ?
- autograd.Variable 클래스가 있는데, 이는 Tensor를 wrap 있으며 ,Tensor 기반으로 정의된 거의 대부분의 연산을 지원
- 계산이 완료된 후, .backward() 함수를 호출하여 gradient를 자동으로 계산할 수 있다.
- autograd.Variable이 넓은 범위로 안에 data, grad, grad_fun로 Variable이 구성되어있는데,
data 는 Tensor형태의 데이터가 담기고, grad는 data가 거쳐온 layer에 대한 미분값이 축적되며, grad_fn는 미분 값을 계산한 함수에 대한 정보를 담고있다.
ex)
----------------------------------------------------------------------------------
import torch
from torch.autograd import Variable
a = torch.ones(2,2)
a = Variable(a, requires_grad=True) # a에 gradient값이 필요하다라는 의미
print(a) # torch.FloatTensor of size 2x2
b = a + 2
c = b**2
out = c.sum()
out.backward() # ∂out/∂a이다. 즉,out을 a로 미분해라 라는 의미.
print(a.data) # 1 1
# 1 1
print(a.grad) # 6 6
# 6 6
print(a.grad_fn) # None a가 직접적으로 수행한 연산은 없기에..
print(c.grad_fn) # pow backward object
print(out.grad_fn) # sum backward object
-------------------------------------------------------------------------------------
ex2)
import torch
from torch.autograd import Variable
x = torch.ones(3)
x = Variable(x, requires_grad=True)
y=x**2
z=y+3
grad=torch.Tensor([0.1, 1, 10])
z.backward(grad) # backward안에 값을 넣게되면 크기를 맞춰준다
print(x.grad) # 그래서 0.600, 6.000, 60.000 이 나오게 된다.
reference
https://evan-moon.github.io/2018/07/19/deep-learning-backpropagation/
https://www.youtube.com/watch?v=E0R9Xf_GyUc