首页 > 编程知识 正文

loss.backward()函数,pytorch怎么学

时间:2023-05-06 05:44:38 阅读:175224 作者:4451

PyTorch的主要功能和特征之一是backword函数,它知道基本的导数:

让我们通过Let,F=a*bWhere,a=10b=10f/a=b=f/a=20f/b=a=f/b=10py torch实现:

如果a和b是向量,则以下代码似乎指示错误:

runtime error : gradcanbeimplicitlycreatedonlyforscalaroutputs在文件中写道。 调用安静行人反函数时,如果安静行人为非标量且数据中有多个元素,则需要指定梯度。

这里f是非纯量且安静的行人,所以需要向与安静的行人的f维相同的反向传播函数传递梯度参数

上面的代码示例将坡度参数传递给backword函数,并提供所需的坡度值a和b。 但是,为什么必须将坡度参数传递给backword函数呢?

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

torch.autograd是计算矢量雅可比积的引擎。 即给出任意的向量v,计算其积J@v.T

注:@表示矩阵乘法

一般来说,雅可比矩阵是全偏导数的矩阵。 假设函数y中n维的输入向量x有m维的输出。 然后计算包含所有用j表示的偏导数的雅可比矩阵:

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 as:

到目前为止,我们已经有:了

我们引入了依赖于f的新变量g

到目前为止还可以,但是让我们检查一下f的grad值,也就是F.grad

我们得到了None,表示了警告

the.gradattributeofatensorthatisnotaleaftensorisbeingaccessed.its.gradattributewon ' tbepopulatedduringautograd.backwate 非前方传播过程中自动动态生成计算图。 对于上面的代码示例,动态图为以下:

从上面的计算图中可以看出,安静的行人a和b是叶节点。 您可以在is_leaf中验证:

默认情况下,Torch backward ()只累积树叶节点上安静的行人坡度。 因此,F grad没有值。 因为f文井的行人不是叶子节点的文井的行人。 为了存储非叶节点的梯度,可以使用retain_grad方法执行以下:

一般来说,我们的损失值安静的行人是标量,我们的权重参数是计算图表的叶节点,所以得不到以上讨论的误差条件。 但是,了解这些特殊情况有助于我们了解更多关于pytorch功能的信息。 万一那天用了,就好了。

作者:Abishek Bashyal

deephub翻译集团

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。