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()方法_第1张图片

 我们将得到

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

Pytorch中的.backward()方法_第2张图片

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

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

Pytorch中的.backward()方法_第3张图片

 得到                                     

 

 

2.backward 的理解

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

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

Pytorch中的.backward()方法_第4张图片

  •  v 为backword函数提供的外梯度。

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

则对于上式 F=a*b 在 a = [10.0, 10.0],b =[20.0, 20.0],v =[1. ,1.],我们得到 ∂F/ ∂a :

Pytorch中的.backward()方法_第5张图片

到目前为止,我们有: 

Pytorch中的.backward()方法_第6张图片

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

Pytorch中的.backward()方法_第7张图片

 我们检查一下F的grad值也就是 F.grad,

 并得到了警告,

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

Pytorch中的.backward()方法_第8张图片

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

Pytorch中的.backward()方法_第9张图片

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

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

Pytorch中的.backward()方法_第10张图片

 

 

你可能感兴趣的:(pytorch,人工智能,python)