Pytorch中的.backward()方法

简介: Pytorch中的.backward()方法

PyTorch的主要功能和特点之一就是backword函数,我知道一些基本的导数:

Let, F=a*bWhere,
a=10b=10∂F/∂a=b=>∂F/∂a=20∂F/∂b=a=>∂F/∂b=10

让我们在PyTorch中实现:

640.png

如果a和b是向量,那么下面的代码似乎给出了一个错误:

640.png

RuntimeError: gradcanbeimplicitlycreatedonlyforscalaroutputs

在文档中写道:当我们调用张量的反向函数时,如果张量是非标量(即它的数据有不止一个元素)并且要求梯度,那么这个函数还需要指定特定梯度。

这里F是非标量张量所以我们需要把梯度参数传递给和张量F维数相同的反向传播函数

640.png

在上面的代码示例中,将梯度参数传递给backword函数并给出了所需的梯度值a和b。但是,为什么我们必须将梯度参数传递给backword函数?

要理解这一点,我们需要了解.backward()函数是如何工作的。再次提到这些文档:

torch.autograd是一个计算向量-雅可比积的引擎。即给定任意向量v,计算其乘积J@v.T注:@表示矩阵乘法

一般来说,雅可比矩阵是一个全偏导数的矩阵。如果我们考虑函数y它有n维的输入向量x它有m维的输出。然后计算包含以J表示的所有偏导数的雅可比矩阵:

640.png

v为backword函数提供的外梯度。另外,需要注意的另一件重要的事情是,默认情况下F.backward()与F.backward(gradient=torch.tensor([1.])相同,所以默认情况下,当输出张量是标量时,我们不需要传递梯度参数,就像我们在第一个例子中所做的那样。

当输出张量为标量时,则v_vector的大小为1,即torch.tensor([1.]),可以用值1代替。这样就得到了完整的雅可比矩阵,也就是J@v。T = J

但是,当输出张量是非标量时,我们需要传递外部梯度向量v,得到的梯度计算雅可比向量积,即J@v.T

在这里,对于F = a*b在a = [10.0, 10.0] b =[20.0, 20.0]和v =[1]。1。我们得到∂F/∂a :

640.png

到目前为止,我们有:

640.png

我们引入一个新的变量G,它依赖于F

640.png

到目前为止都很好,但是让我们检查一下F的grad值也就是F.grad

640.png

我们得到None,并显示了一个警告

The .gradattributeofaTensorthatisnotaleafTensorisbeingaccessed. Its .gradattributewon't be populated during autograd.backward(). If you indeed want the gradient for a non-leaf Tensor, use .retain_grad() on the non-leaf Tensor......

在前向传播过程中,自动动态生成计算图。对于上面的代码示例,动态图如下:

640.png

从上面的计算图中,我们发现张量A和B是叶节点。我们可以用is_leaf来验证:

640.png

Torch backward()仅在默认情况下累积叶子节点张量的梯度。因此,F grad没有值,因为F张量不是叶子节点张量。为了积累非叶子节点的梯度,我们可以使用retain_grad方法如下:

640.png

在一般的情况下,我们的损失值张量是一个标量值,我们的权值参数是计算图的叶子节点,所以我们不会得出上面讨论的误差条件。但是了解这些特殊的情况,这有助于了解更多关于pytorch的功能,万一那天用上了呢,对吧。


目录
相关文章
|
7月前
|
机器学习/深度学习 存储 PyTorch
Pytorch中in-place操作相关错误解析及detach()方法说明
Pytorch中in-place操作相关错误解析及detach()方法说明
372 0
|
9天前
|
机器学习/深度学习 人工智能 PyTorch
使用PyTorch实现GPT-2直接偏好优化训练:DPO方法改进及其与监督微调的效果对比
本文将系统阐述DPO的工作原理、实现机制,以及其与传统RLHF和SFT方法的本质区别。
61 22
使用PyTorch实现GPT-2直接偏好优化训练:DPO方法改进及其与监督微调的效果对比
|
2月前
|
存储 并行计算 PyTorch
探索PyTorch:模型的定义和保存方法
探索PyTorch:模型的定义和保存方法
|
PyTorch 算法框架/工具
Pytorch中Trying to backward through the graph和one of the variables needed for gradient错误解决方案
Pytorch中Trying to backward through the graph和one of the variables needed for gradient错误解决方案
2255 0
Pytorch中Trying to backward through the graph和one of the variables needed for gradient错误解决方案
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】18. Pytorch中自定义层的几种方法:nn.Module、ParameterList和ParameterDict
【从零开始学习深度学习】18. Pytorch中自定义层的几种方法:nn.Module、ParameterList和ParameterDict
|
6月前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】45. Pytorch迁移学习微调方法实战:使用微调技术进行2分类图片热狗识别模型训练【含源码与数据集】
【从零开始学习深度学习】45. Pytorch迁移学习微调方法实战:使用微调技术进行2分类图片热狗识别模型训练【含源码与数据集】
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】17. Pytorch中模型参数的访问、初始化和共享方法
【从零开始学习深度学习】17. Pytorch中模型参数的访问、初始化和共享方法
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
使用FP8加速PyTorch训练的两种方法总结
在PyTorch中,FP8数据类型用于高效训练和推理,旨在减少内存占用和加快计算速度。虽然官方尚未全面支持,但在2.2版本中引入了`torch.float8_e4m3fn`和`torch.float8_e5m2`。文章通过示例展示了如何利用FP8优化Vision Transformer模型,使用Transformer Engine库提升性能,并探讨了PyTorch原生FP8支持的初步使用方法。实验表明,结合TE和FP8,训练速度可提升3倍,性能有显著增强,特别是在NVIDIA GPU上。然而,PyTorch的FP8支持仍处于试验阶段,可能带来不稳定性。
222 0
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
基于PyTorch实战权重衰减——L2范数正则化方法(附代码)
基于PyTorch实战权重衰减——L2范数正则化方法(附代码)
475 0
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch中非标量调用backward()的时候为什么要先进行sum操作
在《动手学深度学习》第二版教程中,当y为非标量的时候,调用backward()函数时,为什么先要求和呢(即y.sum().backward()),估计很多读者有点懵,今天小编给大家说说我的理解。
434 3