使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

AUTOGRAD:自动分化

autograd包是PyTorch中所有神经网络的核心。首先让我们简要地介绍它,然后我们将会去训练我们的第一个神经网络。该autograd软件包为Tensors上的所有操作提供自动拆分运行。它是一个逐个运行的框架,这意味着代码运行方式定义你的backprop,并且每次迭代都可以不同。我们从tensor和gradients来举一些例子。

1、TENSOR

torch.Tensor是包的核心类。如果将其属性 .requires_grad设置为True,则会开始跟踪tensor的梯度变换。完成计算后,您可以调用.backward()来自动计算所有渐变。该张量的梯度将累积到.grad属性中。

要停止tensor历史记录的跟踪,您可以调用.detach(),它将其与计算历史记录分离,并防止将来的计算被跟踪。

要停止跟踪历史记录(和使用内存),您还可以将代码块使用with torch.no_grad():包装起来。在评估模型时,这是特别有用,因为模型在训练阶段具有requires_grad = True的可训练参数有利于调参,但在评估阶段我们不需要这些信息。

还有一个Function类对于autograd实现非常重要。Tensor和Function互相连接并构建一个非循环图,它保存整个完整的计算过程的历史信息。每个张量都有一个.grad_fn属性保存着Function的引用,该应用创建了张量(如果用户自己创建张量,则grad_fn is None )。

如果你想计算导数,你可以调用Tensor.backward()。如果Tensor是标量(即它包含一个元素数据),则不需要指定任何参数backward(),但是如果它有更多元素,则需要指定一个gradient 参数来指定张量的形状。

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

创建一个张量并设置requires_grad = True以跟踪它的计算

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

输出:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

对张量进行操作:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

输出:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

y是作为一个操作的结果创建的,所以它有一个grad_fn属性。

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

输出:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

在y上做更多的操作

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

输出:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

requires_grad_改变Tensor的 requires_grad 。默认输入参数为False。

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

输出:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

2、GRADIENTS

现在来backprop,因为out包含单个标量,out.backward()相当于out.backward(torch.tensor(1.))。

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

打印梯度

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

输出:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

上述过程我们得到一个2x2的矩阵o,元素值都为4.5。

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

在数学上,如果你有一个向量值函数 y⃗ =f(x⃗ ),然后是渐向量y⃗关于 x⃗ 是一个Jacobian matrix::

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

torch.autograd是用于计算雅可比矢量积的,也就是说,给定任何矢量

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

计算乘积

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

如果v 恰好是标量函数的梯度

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

那么

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

然后通过链式规则,则有:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

Jacobian-vector product 的这种特性使得将外部梯度馈送到具有非标量输出的模型中非常方便。

现在让我们来看一个Jacobian-vector product的例子:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

输出:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

现在在这种情况下y不再是标量。torch.autograd 无法直接计算完整的Jacobian行列式,但如果我们只想要Jacobian-vector product,只需将矢量传递给 backward参数:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD

输出:

使用PyTorch进行深度学习:60分钟闪电战-AUTOGRAD


分享到:


相關文章: