首先,如果out.backward()中的out是一个标量的话(相当于一个神经网络有一个样本,这个样本有两个属性,神经网络有一个输出)那么此时我的backward函数是不需要输入任何参数的。

运行结果:

不难看出,我们构建了这样的一个函数:

所以其求导也很容易看出:

这是对其进行标量自动求导的结果


如果out.backward()中的out是一个向量(或者理解成1xN的矩阵)的话,我们对向量进行自动求导,看看会发生什么?

先构建这样的一个模型(相当于一个神经网络有一个样本,这个样本有两个属性,神经网络有两个输出):

模型也很简单,不难看出out求导出来的雅克比应该是:

,因为a1 = 2,a2 = 4,所以上面的矩阵应该是  

运行的结果:

嗯,的确是8和96,但是仔细想一想,和咱们想要的雅克比矩阵的形式也不一样啊。难道是backward自动把0给省略了?

咱们继续试试,这次在上一个模型的基础上进行小修改,如下:

可以看出这个模型的雅克比应该是:

运行一下,看是不是:

等等,什么鬼?正常来说不应该是  [ [ 8 , 2 ] , [ 2 , 96 ] ]么?

我是谁?我再哪?

为什么就给我2个数,而且是  8 + 2 = 10 ,96 + 2 = 98 。难道都是加的 2 ?

想一想,刚才咱们backward中传的参数是 [ [ 1 , 1 ] ],难道安装这个关系对应求和了?

咱们换个参数来试一试,程序中只更改传入的参数为[ [ 1 , 2 ] ]:

运行一下:

嗯,这回可以理解了,我们传入的参数,是对原来模型正常求导出来的雅克比矩阵进行线性操作,可以把我们传进的参数(设为arg)看成一个列向量,那么我们得到的结果就是(注意这里是矩阵乘法,为了好表示我用了*):

( Jacobi * arg )T

在这个题里,我们得到的实际是:

看起来一切完美的解释了,但是就在我刚刚打字的一刻,我意识到官方文档中说k.backward()传入的参数应该和k具有相同的维度,所以如果按上述去解释是解释不通的。

哪里出问题了呢?

仔细看了一下,原来是这样的:在对雅克比矩阵进行线性操作的时候,应该把我们传进的参数(设为arg)看成一个行向量(不是列向量),那么我们得到的结果就是(注意这里是矩阵乘法,为了好表示我用了*):

  ( arg * Jacobi )T

这回我们就解释的通了。

现在我们来输出一下雅克比矩阵吧,为了不引起歧义,我们让雅克比矩阵的每个数值都不一样(一开始分析错了就是因为雅克比矩阵中有相同的数据),所以模型小改动如下:

如果没问题的话咱们的雅克比矩阵应该是 [ [ 8 , 2 ] , [ 4 , 96 ] ]

好了,下面是见证奇迹的时刻了,不要眨眼睛奥,千万不要眨眼睛......

好了,现在总结一下:因为经过了复杂的神经网络之后,out中每个数值都是由很多输入样本的属性(也就是输入数据)线性或者非线性组合而成的,那么out中的每个数值和输入数据的每个数值都有关联,也就是说【out】中的每个数都可以对【a】中每个数求导,那么我们backward()的参数[k1,k2,k3....kn]的含义就是:

   

也可以理解成每个out分量对an求导时的权重。


现在,如果out是一个矩阵呢?

下面的例子也可以理解为:相当于一个神经网络有两个样本,每个样本有两个属性,神经网络有两个输出.

如果前面的例子理解了,那么这个也很好理解,backward输入的参数k是一个2x1的矩阵,2代表的就是样本数量,就是在前面的基础上,再对每个样本进行加权求和。

结果是:

如果有兴趣,也可以拓展一下多个样本的多分类问题,猜一下k的维度应该是【输入样本的个数 X 分类的个数】

好啦,纠结我好久的pytorch自动求导原理算是彻底搞懂啦~~~

pytorch的backward参数相关推荐

  1. Pytorch的backward()相关理解

    Pytorch的backward()相关理解 最近一直在用pytorch做GAN相关的实验,pytorch 框架灵活易用,很适合学术界开展研究工作.  这两天遇到了一些模型参数寻优的问题,才发现自己对 ...

  2. Pytorch的backward()与optim.setp()的理解

    @Xia Pytorch的backward()与optim.setp()的理解 backward()与optim.setp()一直对这两个函数他们之间的调用不是很清楚,花点时间应该是搞明白了. 先看最 ...

  3. Pytorch载入部分参数并冻结

    参考资料 pytorch 模型部分参数的加载 Pytorch中,只导入部分模型参数的做法 Correct way to freeze layers Pytorch自由载入部分模型参数并冻结 pytor ...

  4. Pytorch 查看模型参数

    Pytorch 查看模型参数 查看利用Pytorch搭建模型的参数,直接看程序 import torch # 引入torch.nn并指定别名 import torch.nn as nn import ...

  5. pytorch 获取模型参数_Pytorch获取模型参数情况的方法

    分享人工智能技术干货,专注深度学习与计算机视觉领域! 相较于Tensorflow,Pytorch一开始就是以动态图构建神经网络图的,其获取模型参数的方法也比较容易,既可以根据其内建接口自己写代码获取模 ...

  6. Pytorch统计网络参数计算工具、模型 FLOPs, MACs, MAdds 关系

    Pytorch统计网络参数 #网络参数数量 def get_parameter_number(net):total_num = sum(p.numel() for p in net.parameter ...

  7. Pytorch中backward(retain_graph=True)的 retain_graph参数解释

    每次 backward() 时,默认会把整个计算图free掉.一般情况下是每次迭代,只需一次 forward() 和一次 backward() ,前向运算forward() 和反向传播backward ...

  8. pytorch Tensor.backward

    1.应用 import torch import torch.nn as nn# 1.全部为1 x = torch.tensor([1.0,3.0], requires_grad = True) # ...

  9. Pytorch中backward函数

    backward函数是反向求导数,使用链式法则求导,如果对非标量y求导,函数需要额外指定grad_tensors,grad_tensors的shape必须和y的相同. import torch fro ...

最新文章

  1. [转载]在Eclipse CDT中编译含有多个main函数的项目
  2. 多个div嵌套,获取鼠标所点击的div对象
  3. 巧妙的 排序+去重——C语言
  4. Echarts与Highcharts的比较
  5. 如何给FormPanel表单中的元素赋值以及获取表单元素值
  6. restfull知识点
  7. leetcode104. 二叉树的最大深度(层序遍历09)
  8. ibatis中的xml配置文件
  9. linux5.5救援模式,RHEL5救援模式简介RescueModeinRHEL5.PDF
  10. 无需训练 RNN 或生成模型,如何编写一个快速且通用的 AI “讲故事”项目?
  11. 阿里开发者们的第17个感悟:无细节不设计,无设计不架构
  12. 在知行EDI系统中实施SNIP验证
  13. 静态代理和动态代理的区别
  14. 像素,分辨率,PPI(像素密度),BPP 扫盲
  15. 一文说清:可逆与不可逆加密算法,对称与非对称加密算法-据说BCrypt比MD5要好?
  16. 途胜怎样与android手机互联,现代途胜车载蓝牙怎么连接,途胜手机互联映射教程...
  17. 干货|仿古瓷砖的专业知识总结
  18. token系统讲解及过期处理
  19. Android源码分析工具及方法
  20. 第二课:为什么要教授财务知识

热门文章

  1. 法斗几个月长鼻筋_路医生说丨脚底板早起一下地特别疼?得了足底筋膜炎,该怎么办?...
  2. ps抠头发插件_彻底告别抠图的烦恼!PS自动抠图超级插件Topaz ReMask大放送
  3. Transformer太大了,我要把它微调成RNN
  4. 做一个好的搜索引擎有多难
  5. 从0到1构建美团压测工具
  6. 史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等
  7. 月圆花美 中秋快乐!
  8. 【Java】第一阶段练习题
  9. 空战决策知识构建方法研究
  10. Java面试知识点:集合、Set、泛型、HashSet、HashMap