今天来学习pytorch中有关自动求导模块中的**torch.autograd.backward()**函数的用法和其涉及到的数学原理

函数的作用

官方解释

原话:Computes the sum of gradients of given tensors w.r.t. graph leaves.
个人翻译:计算那些有关图中叶子节点的tensors的梯度的和
这里的叶子节点指的是那些requir_gard=true的叶子节点

这个函数的运行结果就是返回各个叶子节点的梯度。说到现在还是有点太笼统了,我们结合一下函数的参数列表来继续研究一下。

参数列表

这个函数一共有4个参数,并不多,我们一一来看,他们分别是:tensors,grad_tensors,retain_graph,create_graph

1.tensors:

首先看看官方给出的解释:Tensors of which the derivative will be computed
个人翻译:那些将要被计算导数的tensors
所以这个参数的作用已经很明显了,就是我们要对其求导的那个tensor,但要注意这个参数必须要有,不能空着,其他三个参数都是可以空着的。ok,下一个

2.grad_tensors:

这个参数的官方解释较长,也是这个函数复杂的一个地方,我现将官方解释贴上来,然后贴上自己的理解。
官方解释:
The “vector” in the Jacobian-vector product, usually gradients w.r.t. each element of corresponding tensors.

想要理解这个参数的意思,我们必须得先知道一个专有名词的背景,那就是
Jacobian-vector product,翻译过来就是雅可比向量积
雅可比向量积
什么是雅可比向量积呢,首先我们要知道什么是雅可比矩阵,雅可比矩阵出现在多元微分学,可以理解为是高维的导数,举个例子,当有一个n个自变量的m元函数函数f,他的雅可比矩阵(导数)就是下面那个样子。
定义1:

ok,我们搞懂了雅可比矩阵是什么了,那么上面官方文档中提到的Jacobian-vector product又是什么呢?我们都知道正常的一元函数,它对某个自变量求导是一个数,就是我们熟知的
一元函数偏导数: d y d x 1 \frac{dy}{dx_{1}} dx1​dy​
而在多元函数中则是一个向量,例如对 x 1 x_1 x1​进行求导:
多元函数偏导数: ( d y 1 d x 1 , d y 2 d x 1 , . . . d y n d x 1 ) (\frac{dy_1}{dx_1},\frac{dy_2}{dx_1},...\frac{dy_n}{dx_1}) (dx1​dy1​​,dx1​dy2​​,...dx1​dyn​​)

我们都知道在训练的时候,梯度是用来更新权重的,最简单的更新公式就是 x n e w = x o l d + W ∗ g r a d x_{new}=x_{old}+W*grad xnew​=xold​+W∗grad,而往往这个梯度只能是一个标量,但在多元函数的情况下,对一个自变量 x 1 x_1 x1​求导却出现了一个向量,这该如何更新权重呢,这个时候我们的Jacobian-vector product就出现了,我们想要将这个向量转化为一个标量只需要再来一个同杨长度的向量进行点乘就可以得到。这个同样长度的向量就是Jacobian-vector中的vector,也就是这个参数所代表的tensor。
举个例子,如果这个参数你不设置的话,默认是单位向量。
我们继续拿上面的多元函数举例子:此时对 x 1 x_1 x1​求导,他的值就不是一个向量,而是 ( d y 1 d x 1 , d y 2 d x 1 , . . . d y n d x 1 ) ⋅ ( 1 , 1...1 ) = d y 1 d x 1 + d y 2 d x 1 + . . . d y n d x 1 (\frac{dy_1}{dx_1},\frac{dy_2}{dx_1},...\frac{dy_n}{dx_1})·(1,1...1)=\frac{dy_1}{dx_1}+\frac{dy_2}{dx_1}+...\frac{dy_n}{dx_1} (dx1​dy1​​,dx1​dy2​​,...dx1​dyn​​)⋅(1,1...1)=dx1​dy1​​+dx1​dy2​​+...dx1​dyn​​
看,已经出现了,这就是Jacobian-vector product.
如果你设置这个向量,上面的单位向量就会替换成你输入的tensor,你也可以理解为你设置了一个权重,用来调整各个因变量y对最终那个“标量梯度”的影响大小。

到现在我们基本读懂了这个参数的意思,但官方文档后面还有一段话,我们继续来分析一下:
原文:None values can be specified for scalar Tensors or ones that don’t require grad. If a None value would be acceptable for all grad_tensors, then this argument is optional.
第一句:当待求导的tensors是标量或者是一个不需要梯度的tensors,那么我们这个参数将设置为None类型。意思是如果待求导的tensor是一个标量,那么这就属于一元函数,就不需要雅可比向量乘积了,所以这个时候设置成None就可以了。
第二句:如果None适用于所有需要梯度的tensor,那么这个时候此参数可以不填。

ok第二个参数解决了 我们来看下一个

3.retain_graph

还是先看看官方文档:
If False, the graph used to compute the grad will be freed. Note that in nearly all cases setting this option to True is not needed and often can be worked around in a much more efficient way. Defaults to the value of create_graph.
个人理解:首先我们看到这是一个布尔类型变量,通过名字可以感觉到这是跟保存记录有关的
如果为False:过去计算过的图将被释放
如果为True:则会保留
就是如果在retain_graph=False的情况下调用了backward(),调用之后,forward过程中创建的所有计算图将全部销毁。如果要再次调用backward,要重新进行forward过程。但如果retain_graph=True的话,调用完backward(),计算图仍然保存。
注意:在几乎所有情况下都不需要将这里设置为True,并且有更有效的方式解决这个问题。默认值为create_graph的值,就是我们要了解的最后一个变量

4.create_graph

官方文档:
If True, graph of the derivative will be constructed, allowing to compute higher order derivative products. Defaults to False.
个人翻译:
如果为True,则导数的计算图将会被创建,这将允许计算更高阶导数,默认值为False

至此所有的参数我们都已经学习完毕了,我们来总结一下:

总结

torch.autograd.backward()是一个用来计算导数的函数,计算第一个参数的tensors对所有计算图中require_grad=True的tensor的导数,如果第一个参数不是标量tensor,则需要第二个参数设置vector,进行Jacobian-vector product,将梯度向量转换为一个梯度标量值,如果需要保留计算图,则设置retain_graph=True,如果要计算高阶导数或利用梯度值请设置create_graph=True。

至此torch.autograd.backward()函数学习就完事啦。以上均为学习笔记,如有错误指出。

官方文档地址:https://pytorch.org/docs/stable/autograd.html

一文读懂torch.autograd.backward()作用及原理相关推荐

  1. 一文读懂 .bss段 的作用

    网上诸多博主关于.bss段的解释,看了一圈下来,神乎其神,完全脱离实际,只会用"古文"来喝退小白.然而,问题并未解决···因此,想综合自己的理解,用白话文将 .bss段 的作用给大 ...

  2. NLP重大突破?一文读懂XLNet“屠榜”背后的原理

    作者 | 李理 原文链接:https://fancyerii.github.io/2019/06/30/xlnet-theory/ 本文介绍XLNet的基本原理,读者阅读前需要了解BERT等相关模型, ...

  3. 「Java基本功」一文读懂Java内部类的用法和原理

    内部类初探 一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能 ...

  4. 【Java基本功】一文读懂String及其包装类的实现原理

    String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. S ...

  5. 一文读懂 快速掌握示波器使用及原理

    示波器是一种用途十分广泛的电子测量仪器.它能把肉眼看不见的电信号变换成看得见的图像,便于人们研究各种电现象的变化过程.示波器利用狭窄的.由高速电子组成的电子束,打在涂有荧光物质的屏面上,就可产生细小的 ...

  6. 一文读懂什么是POE交换机,原理、标准、功率、应用

    随着物联网的不断发展,越来越多的设备需要联网,而这些设备通常需要供电才能工作.传统的交换机无法提供电力供应,因此诞生了PoE交换机.本文将详细介绍PoE交换机和普通交换机的区别,并从各个角度全面介绍P ...

  7. 一文读懂苹果的差分隐私技术原理

    在 2016 年 6 月份的苹果 WWDC 大会上提到了一项差分隐私技术(Differential Privacy),其作用是对用户的数据进行扰动,然后上传到苹果服务器.苹果能通过这些扰动过的数据计算 ...

  8. tcp当主动发出syn_一文读懂TCP四次挥手工作原理及面试常见问题汇总

    简述 本文主要介绍TCP四次挥手的工作原理,以及在面试中常见的问题. 字段含义 seq序号:Sequence Number,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行 ...

  9. 一文读懂循环冗余校验(CRC)原理

    校验原理 baidu 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输 ...

最新文章

  1. [Offer收割]编程练习赛50
  2. python字符串find函数-python字符串查找函数的用法详解
  3. Meson,用于协调和调度Netflix推荐工作流的架构
  4. ABP官方文档翻译 0.0 ABP官方文档翻译目录
  5. css样式之 direction
  6. Oracle11g服务详细介绍及哪些服务是必须开启的?
  7. Unity3D 动态加载 图片序列正反播放
  8. (组合数学笔记)Pólya计数理论_Part.3_置换群及其性质
  9. 外媒:ATT宣布加入SD-WAN阵营
  10. 大型网站技术架构(三)架构核心要素
  11. 【毕业答辩】如何做出90分的毕业答辩PPT?
  12. 【Luyten反编译工具】
  13. 系统同传软件_国外科研大牛的讲座,英语不好别抓瞎,免费同传神器来帮忙
  14. c语言求解一元二次方程的复根,c语言 求一元二次方程的根(含复根)
  15. omf多路径 oracle_Oracle数据库使用OMF来简化数据文件的管理
  16. oracle语句查询时间范围
  17. 树莓派3b 重装系统后 启动ssh 和 设定自动连接wifi
  18. 你的声音价值百万,教你六个利用声音赚钱的方法
  19. mysql之order by自定义排序规则进行排序(转载)
  20. 基于树莓派的python GPIO编程-常用函数综合整理

热门文章

  1. 数据结构——队列 c++详解
  2. 名帖248 文徵明 行书《梅花诗卷》
  3. 游戏计算机械设备吗,大型机械设备进出场及安拆工程量按使用机械设备的数量以台班计算。...
  4. 精确度/召回率/F1值/Micro-F1和Macro-F1的理解
  5. 【实验】实验七 MATLAB 并行计算20211125
  6. 虚拟网卡是什么?教教大家添加虚拟网卡的方法
  7. 物理引擎系统-ode
  8. Java生成当日日期 时间
  9. TEXT、TINYTEXT、MEDIUMTEXT、LONGTEXT选择 和 char varchar varchar2 的区别
  10. 阻塞队列——生产者消费者模型