PyTorch 学习
PyTorch 学习(2) AUTOGRAD
来自 PyTorch 教程 Deep Learning with PyTorch: A 60 Minute Blitz > Autograd: Automatic Differentiation
autograd 是使用 PyTorch 构建神经网络的中心机制,这里我们简要介绍一下
autograd 会记录所有对于张量的操作,这一机制会在每一次代码运行时动态构建,这就允许我们在迭代时更改网络
张量 Tensor
构建张量时如果指定参数 requires_grad 为 True, 那么就将追踪这个张量的每一次操作。当运算完成时,调用方法 backward 便可以自动计算梯度, 每个张量的梯度将被记录在 grad 属性中
调用方法 detach 可以停止对张量的运算追踪
我们还可以通过调用 with torch.no_grad():
来停止对张量的运算追踪,这一般在评估模型时使用,因为在评估模型时我们并不需要计算梯度
还有另外一种类对于 autograd 是非常重要的: Function
各种Tensor
和 Function
相互拼接构成一张用来记录运算过程的非循环图,每一个张量的 grad_fn 属性引用了创建该张量的 Function,如果张量由用户创建,则 grad_fn 为 None
通过在一个张量上调用方法 backward 来计算梯度,如果张量是一个标量,则可以直接调用 backward,相当于调用了 backward(torch.tensor(1.)),否则需要提供一个形状匹配的张量。
x = torch.ones(2, 2, requires_grad=True)
y = x + 2
print(y.grad_fn)
z = 3 * y * y
out = z.mean()
out.backward()
print(x.grad)
这里 x 的梯度相当于 out 对 x 求偏导
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
v = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(v)
print(x.grad)
这里相当于 y 对 x 求偏导然后乘 v,v 一般表示最终结果对 y 的偏导
方法 detach 将返回一个与原张量相同但是 requires_grad 为 False 的张量,而方法 requires_grad_ 将直接改变张量的 requires_grad
y = x.detach()
y.requires_grad(True)