Autograd:自动分化

  1. 变量
  2. 梯度

autograd包是PyTorch所有神经网络的核心。我们先来简要的介绍一下,然后我们去训练我们的第一个神经网络。

autograd包为Tensors上的所有操作提供了自动区分。它是一个逐个运行的框架,这意味着您的backprop由您的代码运行定义,每一次迭代都可以不同。

让我们用更简单的术语来看这个例子。

变量

autograd.Variable是包的中央类。它包含一个Tensor,并支持几乎所有定义的操作。完成计算后,您可以调用.backward()并自动计算所有梯度。

您可以通过.data属性访问原始张量,而将此变量的梯度累加到.grad

Variable

还有一个类对于autograd实现非常重要 - a Function

Variable并被Function互连并建立一个非循环图,编码完整的计算历史。每个变量都有一个.creator引用Function已创建的属性的属性Variable(除了用户创建的变量代替creator is None

如果你想计算导数,你可以在一个Variable中使用.backward()。如果Variable是标量(即它保存一个元素数据),则不需要指定任何参数backward(),但是如果它具有更多元素,则需要指定一个grad_output 作为匹配形状的张量的参数。

import torch
from torch.autograd import Variable

创建一个变量:

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 0x1005eaed0>

对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]

梯度

现在我们的backprop out.backward()就等于做了out.backward(torch.Tensor([1.0]))

out.backward()

打印梯度d(out)/dx

print(x.grad)

输出:

Variable containing:
 4.5000  4.5000
 4.5000  4.5000
[torch.FloatTensor of size 2x2]

你应该有一个矩阵4.5。我们来调用out 变量 “(o)”.我们得到\(o = \frac{1}{4}\sum_i z_i\), \(z_i = 3(x_i+2)^2\)\(z_i\bigr\rvert_{x_i=1} = 27\),因此,\(\frac{\partial o}{\partial x_i} = \frac{3}{2}(x_i+2)\),因此\(\frac{\partial o}{\partial x_i}\bigr\rvert_{x_i=1} = \frac{9}{2} = 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:
-336.2719
-714.8715
-710.7238
[torch.FloatTensor of size 3]
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)

print(x.grad)

输出:

Variable containing:
  51.2000
 512.0000
   0.0512
[torch.FloatTensor of size 3]

稍后阅读: Variable 和 Function 的文档可以参考 http://pytorch.org/docs/autograd

脚本总运行时间:(0分0.074秒)

下载Python源代码:autograd_tutorial.py

下载jupyter笔记:autograd_tutorial.ipynb