Pytorch中的.backward()方法

参考 Pytorch中的.backward()方法_deephub的博客-CSDN博客_.backward

0. requires_grad 的含义

  • requires_gard 是Tensor变量的一个属性,一般默认为False。
  • 如果对于某Variable 变量 x ,其 x.requires_grad == True, 则表示它可以参与求导,也可以从它向后求导。
  • requires_grad == True 具有传递性:若 x.requires_grad == Truey.requires_grad == Falsez=f(x,y)则, z.requires_grad == True
  • 凡是参与运算的变量(包括 输入量,中间输出量,输出量,网络权重参数等),都可以设置 requires_grad。

1.backward 的使用

假设

Pytorch中的.backward()方法

我们将得到

Pytorch中的.backward()方法

但如果a和b是向量,那么下面的代码会报错

Pytorch中的.backward()方法

Pytorch中的.backward()方法

原因是,当我们调用张量的backward函数时,如果对非标量(即它的数据有不止一个元素)的张量求梯度,这个函数需要指定特定梯度。

这里F是非标量张量,所以我们要把梯度参数传递给和张量F维数相同的backward函数,即

Pytorch中的.backward()方法

得到

Pytorch中的.backward()方法

2.backward 的理解

torch.autograd是一个计算向量-雅可比积的引擎。即给定任意向量v,计算其乘积

Pytorch中的.backward()方法
  • @表示矩阵乘法
  • Pytorch中的.backward()方法表示雅可比矩阵,即一个全偏导数的矩阵。考虑函数y,假定它有n维的输入向量x,有m维的输出。则

Pytorch中的.backward()方法
  • Pytorch中的.backward()方法 为backword函数提供的外梯度。

注:当输出张量为标量时,则v_vector的大小为1,即torch.tensor([1.]),可省略。当输出张量是非标量时,我们需要传递外部梯度向量

Pytorch中的.backward()方法

则对于上式

Pytorch中的.backward()方法Pytorch中的.backward()方法 = [10.0, 10.0],Pytorch中的.backward()方法 =[20.0, 20.0],Pytorch中的.backward()方法 =[1. ,1.],我们得到 ∂Pytorch中的.backward()方法/ ∂Pytorch中的.backward()方法

Pytorch中的.backward()方法

到目前为止,我们有:

Pytorch中的.backward()方法

Pytorch中的.backward()方法

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

Pytorch中的.backward()方法

我们检查一下

Pytorch中的.backward()方法的grad值也就是 Pytorch中的.backward()方法grad,

Pytorch中的.backward()方法

并得到了警告,

Pytorch中的.backward()方法

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

Pytorch中的.backward()方法

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

Pytorch中的.backward()方法

Torch backward() 仅在默认情况下累积叶子节点张量的梯度。因此,F grad没有值,因为F张量不是叶子节点张量。

为了积累非叶子节点的梯度,我们可以使用retain_grad方法如下:

Pytorch中的.backward()方法

Original: https://blog.csdn.net/qq_54867493/article/details/126796724
Author: qq_54867493
Title: Pytorch中的.backward()方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/804151/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球