Autograd:Automatic Differentiation

PyTorch的神经网络的核心就是autograd包,而autograd提供了所有张量函数的自动求导。而且autograd是一个“define-by-run”的架构,它的后向传播是由代码的运行来决定的。还有一个概念是"define-and-run",前者和后者的区别应该类似动态图和静态图的区别。

张量



torch.Tensor是autograd包的核心类。如果你将属性.requires_grad设为True,它将会追踪所有对张量的操作。当你完成了计算(注:应该指前向传播)后,你可以调用.backward()来自动计算所有的梯度。计算结果会累计到.grad属性内。

若想停止追踪一个张量,你可以调用.detach()来将其从计算历史中移除,且其未来的计算也不会被追踪(注:应该就是说计算梯度时跳过这个张量)。

为了防止追踪历史(以及使用内存),你还可以将代码包装在with torch.no_grad():中。这在评估模型时可能会尤为有用,因为模型可能有requires_grad = True的不需要梯度的可训练变量(注:没看懂)。

还有一个对autograd的实现很重要的类:Function。

Tensor和Function相互链接,构成了一个非循环图,这个图编码了整个计算过程。每个张量有一个.grad_fn属性,它指向了创建这个张量的Function(除非这个张量是由用户创建的,它的grad_fn值为None)。

如果你想导数,你可以使用Tensor类调用.backward()。如果Tensor是个标量(也就是说,这个张量只有一个元素),你不必为backward()指定任何参数。但若它有更多元素的话,你就要指定一个形状匹配的张量作为梯度参数。

在这里插入图片描述
创建一个向量,并将它的requires_grad属性设为True来追踪它的计算历史:
在这里插入图片描述
进行张量计算:
在这里插入图片描述
y是由运算的结果创建的,所以它有grad_fn:
在这里插入图片描述
可以对y做更多运算:
在这里插入图片描述
.requires_grad_(…)可以改变张量的requires_grad值。如果未指定,该值则默认为False:
在这里插入图片描述
(注:补充一下,当有requires_grad值为True的张量参与运算时,运算结果的该值也为真:

在这里插入图片描述在这里插入图片描述

梯度



我们现在可以后向传播了。由于out(注:前面得到的计算结果)是个标量,out.backward()和out.backward(torch.tensor(1.0))是等价的。
在这里插入图片描述
结果应当是一个值都是4.5的矩阵。我们将out定义为标量"o"。我们知道:
在这里插入图片描述
因此:
在这里插入图片描述
所以:
在这里插入图片描述
数学上,如果我们有一个向量函数
在这里插入图片描述
那么
在这里插入图片描述
对于
在这里插入图片描述
的导数就是一个雅可比矩阵(Jacobian matrix):
在这里插入图片描述
一般来说,torch.autograd正是计算向量雅可比(vector-Jacobian)积的引擎。即当给与任意向量
在这里插入图片描述
并计算
V
时,若v是标量函数
在这里插入图片描述
的导数,即
在这里插入图片描述
那么根据求导的链式法则,向量雅可比积就变成了 l 对
在这里插入图片描述
的导数:
在这里插入图片描述
(注意
在这里插入图片描述
是一个行向量,它把它转置为
在这里插入图片描述
后就可以被作为一个列向量处理。
)

向量雅可比积的这一特性使得将外部梯度输入没有标量输出的模型变得非常容易。

那么让我们来看一个向量雅可比积的特点:
在这里插入图片描述
在这种情况下y不再是一个标量了。torch.autograd不能直接计算完整的雅可比矩阵,但如果我们只想得到向量雅可比积,只需简单地将向量作为参数传递给backward:
在这里插入图片描述
你也可以通过将代码包装在with torch.no_grad():中来避免autograd追踪requires_grad值为True的张量的历史:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值