AUTOGRAD: AUTOMATIC DIFFERENTIATION
自动梯度:自动微分
pytorch的神经网络都包含autograd,autograd提供了自动tensor微分,因为是定义在运行框架里的,所以你的反向传播可以任意的定义/
torch.tensor是所有包中最为中心的包,如果设置他的属性,.requires_grad
为True,pytorch就会自动追踪所有的操作,当你完成计算时,通过.backward()
可以自动计算梯度。tensor的梯度将会自动存到.grad
属性。
使用.detach()
来停止追踪。
为了防止跟踪历史(和使用内存),你也可以用 torch.no_grad()
来包裹代码块。这在评估一个模型时特别有用,因为模型可能有一些可训练的参数,其 requires_grad=True
,但我们不需要梯度。
还有一个对于自动识别实现非常重要的类–Function
。
Tensor和Function是相互连接的,并建立了一个无环图,它编码了一个完整的计算历史。每个张量都有一个.grad_fn
属性,它引用了一个创建张量的Function(用户创建的张量除外–它们的grad_fn
是None)。
如果你想计算导数,你可以在一个Tensor上调用.backward()
。如果Tensor是一个标量(即它拥有一个元素数据),你不需要为backward()指定任何参数,但是如果它有更多的元素,你需要指定一个gradient argument
,它是一个形状匹配的张量。
import torch
x=torch.ones(2,2,requires_grad=True) #创建tensor并且追踪计算。
print(x)
y = x + 2
print(y)
print(y.grad_fn)#y是操作的结果,所有有grad_fn属性
Gradients:
z = y * y * 3
out = z.mean()
out.backward()#Let’s backprop now. Because out contains a single scalar, out.backward() is equivalent to out.backward(torch.tensor(1.)).
print(x.grad)# d(out)/dx
把out看成o,则有
再看一个例子:
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
torch.autograd不能直接计算完整的雅各布,但如果我们只是想要矢量与雅各布乘,只需将矢量传给backward作为参数。
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)
更多请参考
https://pytorch.org/docs/stable/autograd.html#function