pytorch的backward参数
首先,如果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参数相关推荐
- Pytorch的backward()相关理解
Pytorch的backward()相关理解 最近一直在用pytorch做GAN相关的实验,pytorch 框架灵活易用,很适合学术界开展研究工作. 这两天遇到了一些模型参数寻优的问题,才发现自己对 ...
- Pytorch的backward()与optim.setp()的理解
@Xia Pytorch的backward()与optim.setp()的理解 backward()与optim.setp()一直对这两个函数他们之间的调用不是很清楚,花点时间应该是搞明白了. 先看最 ...
- Pytorch载入部分参数并冻结
参考资料 pytorch 模型部分参数的加载 Pytorch中,只导入部分模型参数的做法 Correct way to freeze layers Pytorch自由载入部分模型参数并冻结 pytor ...
- Pytorch 查看模型参数
Pytorch 查看模型参数 查看利用Pytorch搭建模型的参数,直接看程序 import torch # 引入torch.nn并指定别名 import torch.nn as nn import ...
- pytorch 获取模型参数_Pytorch获取模型参数情况的方法
分享人工智能技术干货,专注深度学习与计算机视觉领域! 相较于Tensorflow,Pytorch一开始就是以动态图构建神经网络图的,其获取模型参数的方法也比较容易,既可以根据其内建接口自己写代码获取模 ...
- Pytorch统计网络参数计算工具、模型 FLOPs, MACs, MAdds 关系
Pytorch统计网络参数 #网络参数数量 def get_parameter_number(net):total_num = sum(p.numel() for p in net.parameter ...
- Pytorch中backward(retain_graph=True)的 retain_graph参数解释
每次 backward() 时,默认会把整个计算图free掉.一般情况下是每次迭代,只需一次 forward() 和一次 backward() ,前向运算forward() 和反向传播backward ...
- pytorch Tensor.backward
1.应用 import torch import torch.nn as nn# 1.全部为1 x = torch.tensor([1.0,3.0], requires_grad = True) # ...
- Pytorch中backward函数
backward函数是反向求导数,使用链式法则求导,如果对非标量y求导,函数需要额外指定grad_tensors,grad_tensors的shape必须和y的相同. import torch fro ...
最新文章
- [转载]在Eclipse CDT中编译含有多个main函数的项目
- 多个div嵌套,获取鼠标所点击的div对象
- 巧妙的 排序+去重——C语言
- Echarts与Highcharts的比较
- 如何给FormPanel表单中的元素赋值以及获取表单元素值
- restfull知识点
- leetcode104. 二叉树的最大深度(层序遍历09)
- ibatis中的xml配置文件
- linux5.5救援模式,RHEL5救援模式简介RescueModeinRHEL5.PDF
- 无需训练 RNN 或生成模型,如何编写一个快速且通用的 AI “讲故事”项目?
- 阿里开发者们的第17个感悟:无细节不设计,无设计不架构
- 在知行EDI系统中实施SNIP验证
- 静态代理和动态代理的区别
- 像素,分辨率,PPI(像素密度),BPP 扫盲
- 一文说清:可逆与不可逆加密算法,对称与非对称加密算法-据说BCrypt比MD5要好?
- 途胜怎样与android手机互联,现代途胜车载蓝牙怎么连接,途胜手机互联映射教程...
- 干货|仿古瓷砖的专业知识总结
- token系统讲解及过期处理
- Android源码分析工具及方法
- 第二课:为什么要教授财务知识
热门文章
- 法斗几个月长鼻筋_路医生说丨脚底板早起一下地特别疼?得了足底筋膜炎,该怎么办?...
- ps抠头发插件_彻底告别抠图的烦恼!PS自动抠图超级插件Topaz ReMask大放送
- Transformer太大了,我要把它微调成RNN
- 做一个好的搜索引擎有多难
- 从0到1构建美团压测工具
- 史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等
- 月圆花美 中秋快乐!
- 【Java】第一阶段练习题
- 空战决策知识构建方法研究
- Java面试知识点:集合、Set、泛型、HashSet、HashMap