[pytorch快速入门教程]Autograd自动求导

Pytorch中所有神经网络的中心部分是autograd包。我们首先浏览一下它,然后再构建我们的第一个神经网络。
autograd包为Tensor上的所有运算提供了自动求导功能。它是一个由运行定义的框架,即你的反向传播是由你的代码如何运行来决定的,而且每一轮迭代都可能是不同的。
让我们用几个简单的例子来了解几个简单的术语。


Variable 变量


autograd.Variable是这个包的中心类。它包装一个Tensor,并且支持几乎所有定义在这个Tensor上的运算。一旦你完成了你的计算,你可以调用.backward()来自动地计算全部的梯度。
你可以通过.data属性来访问最原始的tensor,而梯度则相应地被累计到了.grad中。
Variable.png

autograd的实现中还有一个非常重要的类-Function。

Variable和Function是相互关联的并且构建了一个非循环图,其中编码了整个的计算历史。每一个变量都有一个.creator属性,它引用一个常见Variable的Function(除了用户创建的Variables-它们的creator是None)。

如果你想计算导数,可以在Variable上调用.backward()。如果Variable是个标量(一个单元素数据),那么你不用为backward()指定任何参数,然而如果它有多个元素,你需要指定一个grad_output参数,它是一个匹配尺寸的tensor。
import torch
from torch.autograd import Variabl

创建一个变量:
x = Variable(torch.ones(2, 2), requires_grad=True)
print(x)
输出:
Variable containing:
1 1
1 1
[torch.FloatTensor of size 2x2]
对变量进行运算:
y = x + 2
print(y)
输出:
Variable containing:
3 3
3 3
[torch.FloatTensor of size 2x2]

y是作为一个运算操作的结果而创建的,因而它有一个
print(y.creator)

输出:
<torch.autograd._functions.basic_ops.AddConstant object at 0x108ada4a8>
在y上做更多的运算:
z = y * y * 3
out = z.mean()

print(z, out)
输出:
Variable containing:
27 27
27 27
[torch.FloatTensor of size 2x2]
Variable containing:
27
[torch.FloatTensor of size 1]


Gradients 梯度



让我们使用反向传播out.backward(),它等同于out.backward(torch.Tensor([1.0]))
out.backward()
打印梯度
print(x.grad)
输出:
Variable containing:
4.5000 4.5000
4.5000 4.5000
[torch.FloatTensor of size 2x2]
你应该会得到一个4.5的矩阵。让我们称out变量为o。我们有o=14∑izio=14∑izi,zi=3(xi+2)2zi=3(xi+2)2 以及 zi∣∣xi=1=27zi|xi=1=27 。因此,∂o∂xi=32(xi+2)∂o∂xi=32(xi+2),从而∂o∂xi∣∣xi=1=92=4.5∂o∂xi|xi=1=92=4.5。

你还可以使用autograd做一些疯狂的事情!
x = torch.randn(3)
x = Variable(x, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
y = y * 2

print(y)

输出:
Variable containing:
596.2775
-807.4459
-550.6819
[torch.FloatTensor of size 3]
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)

print(x.grad)
输出:
Variable containing:
102.4000
1024.0000
0.1024
[torch.FloatTensor of size 3]
延伸阅读:

Variable和Function的文档:http://pytorch.org/docs/autograd

0 个评论

要回复文章请先登录注册