关闭

三十分钟理解计算图上的微积分:Backpropagation,反向微分

标签: 神经网络算法BP反向微分反向传播
3889人阅读 评论(1) 收藏 举报
分类:

神经网络的训练算法,目前基本上是以Backpropagation (BP) 反向传播为主(加上一些变化),NN的训练是在1986年被提出,但实际上,BP 已经在不同领域中被重复发明了数十次了(参见 Griewank (2010)[1])。更加一般性且与应用场景独立的名称叫做:反向微分 (reverse-mode differentiation)。本文是看了资料[2]中的介绍,写的蛮好,自己记录一下,方便理解。

从本质上看,BP 是一种快速求导的技术,可以作为一种不单单用在深度学习中并且可以胜任大量数值计算场景的基本的工具。

计算图

必须先来讲一讲计算图的概念,计算图出现在Bengio 09年的《Learning Deep Architectures for AI》,
Bengio使用了有向图结构来描述神经网络的计算:

这里写图片描述

整张图可看成三部分:输入结点、输出结点、从输入到输出的计算函数。上图很容易理解,就是output=sin(a*x+b) * x

计算图上的导数

有向无环图在计算机科学领域到处可见,特别是在函数式程序中。他们与依赖图(dependency graph)或者调用图(call graph)紧密相关。同样他们也是大部分非常流行的深度学习框架背后的核心抽象。

下文以下面简单的例子来描述:

这里写图片描述

假设 a = 2, b = 1,最终表达式的值就是 6。
为了计算在这幅图中的偏导数,我们需要 和式法则(sum rule )和 乘式法则(product rule):

这里写图片描述

下面,在图中每条边上都有对应的导数了:
这里写图片描述

那如果我们想知道哪些没有直接相连的节点之间的影响关系呢?假设就看看 e 如何被 a 影响的。如果我们以 1 的速度改变 a,那么 c 也是以 1 的速度在改变,导致 e 发生了 2 的速度在改变。因此 e 是以 1 * 2 的关于 a 变化的速度在变化。
而一般的规则就是对一个点到另一个点的所有的可能的路径进行求和,每条路径对应于该路径中的所有边的导数之积。因此,为了获得 e 关于 b 的导数,就采用路径求和:

这里写图片描述

这个值就代表着 b 改变的速度通过 c 和 d 影响到 e 的速度。聪明的你应该可以想到,事情没有那么简单吧?是的,上面例子比较简单,在稍微复杂例子中,路径求和法很容易产生路径爆炸:

这里写图片描述

在上面的图中,从 X 到 Y 有三条路径,从 Y 到 Z 也有三条。如果我们希望计算 dZ/dX,那么就要对 3 * 3 = 9 条路径进行求和了:

这里写图片描述

该图有 9 条路径,但是在图更加复杂的时候,路径数量会指数级地增长。相比于粗暴地对所有的路径进行求和,更好的方式是进行因式分解:

这里写图片描述

有了这个因式分解,就出现了高效计算导数的可能——通过在每个节点上反向合并路径而非显式地对所有的路径求和来大幅提升计算的速度。实际上,两个算法对每条边的访问都只有一次!

前向微分和反向微分

前向微分从图的输入开始,一步一步到达终点。在每个节点处,对输入的路径进行求和。每个这样的路径都表示输入影响该节点的一个部分。通过将这些影响加起来,我们就得到了输入影响该节点的全部,也就是关于输入的导数。

这里写图片描述

相对的,反向微分是从图的输出开始,反向一步一步抵达最开始输入处。在每个节点处,会合了所有源于该节点的路径。

这里写图片描述

前向微分 跟踪了输入如何改变每个节点的情况。反向微分 则跟踪了每个节点如何影响输出的情况。也就是说,前向微分应用操作 d/dX 到每个节点,而反向微分应用操作 dZ/d 到每个节点。

让我们重新看看刚开始的例子:
这里写图片描述

我们可以从 b 往上使用前向微分。这样获得了每个节点关于 b 的导数。(写在边上的导数我们已经提前算高了,这些相对比较容易,只和一条边的输入输出关系有关)

这里写图片描述

我们已经计算得到了 de/db,输出关于一个输入 b 的导数。但是如果我们从 e 往回计算反向微分呢?这会得到 e 关于每个节点的导数:

这里写图片描述

反向微分给出了 e 关于每个节点的导数,这里的确是每一个节点。我们得到了 de/da 和 de/db,e 关于输入 a 和 b 的导数。(当然中间节点都是包括的),前向微分给了我们输出关于某一个输入的导数,而反向微分则给出了所有的导数。

想象一个拥有百万个输入和一个输出的函数。前向微分需要百万次遍历计算图才能得到最终的导数,而反向微分仅仅需要遍历一次就能得到所有的导数!速度极快!

训练神经网络时,我们将衡量神经网络表现的代价函数看做是神经网络参数的函数。我们希望计算出代价函数关于所有参数的偏导数,从而进行梯度下降(gradient descent)。现在,常常会遇到百万甚至千万级的参数的神经网络。所以,反向微分,也就是 BP,在神经网络中发挥了关键作用!所以,其实BP的本质就是链式法则。

(有使用前向微分更加合理的场景么?当然!因为反向微分得到一个输出关于所有输入的导数,前向微分得到了所有输出关于一个输入的导数。如果遇到了一个有多个输出的函数,前向微分肯定更加快速)

BP 也是一种理解导数在模型中如何流动的工具。在推断为何某些模型优化非常困难的过程中,BP 也是特别重要的。典型的例子就是在 Recurrent Neural Network 中理解 vanishing gradient 的原因。


有的时候,越是有效的算法,原理往往越是简单。


参考资料

[1] Who Invented the Reverse Mode of Differentiation?
[2] http://www.jianshu.com/p/0e9eea729476

1
0
查看评论
1楼 最小森林 2017-11-29 09:39发表 [回复]
不错 感谢分享

计算图上的微积分:反向传播算法

  • neilol
  • neilol
  • 2015-09-07 20:46
  • 1103
引言 Backpropagation (BP) 是使得训练深度模型在计算上可行的关键算法。对现代神经网络,这个算法相较于无脑的实现可以使梯度下降的训练速度提升千万倍。而对于模型的训练来说,这其实是 7 天和 20 万年的天壤之别。 除了在深度学习中的使用,BP 本身在其他的领域中也是一种强大的计算...

三十分钟理解计算图上的微积分:Backpropagation,反向微分

  • xbinworld
  • xbinworld
  • 2017-03-04 22:33
  • 3889
神经网络的训练算法,目前基本上是以Backpropagation (BP) 反向传播为主(加上一些变化),NN的训练是在1986年被提出,但实际上,BP 已经在不同领域中被重复发明了数十次了(参见 Griewank (2010)[1])。更加一般性且与应用场景独立的名称叫做:反向微分 (revers...

我的Blog文章索引::机器学习方法系列,深度学习方法系列,三十分钟理解系列等

  • xbinworld
  • xbinworld
  • 2018-01-21 21:59
  • 273
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld。 技术交流QQ群:433250724,欢迎对算法、机器学习技术感兴趣的同学加入。 以下是我利用业余时间在自己博客中写的文章,主要是一些基础、经典算法的整理,目的一方面是为了科普机器学习技术,让更多同学可以...

计算图上的微积分:Backpropagation

  • u013007900
  • u013007900
  • 2017-07-03 10:33
  • 254
计算图上的微积分:Backpropagation引言Backpropagation (BP) 是使得训练深度模型在计算上可行的关键算法。对现代神经网络,这个算法相较于无脑的实现可以使梯度下降的训练速度提升千万倍。而对于模型的训练来说,这其实是 7 天和 20 万年的天壤之别。 除了在深度学习中的使...

简述微积分的现实意义是什么

  • scholinktech
  • scholinktech
  • 2009-11-27 15:25
  • 549
 小时候学过微积分,但只是形而上学的应付考试,一直不明白微积分的意义何在。 牛顿和莱布尼茨发明微积分到底是为了什么?他们想揭示什么问题?以及微积分都解决了人类生活中的什么难题? 微积分是为了解决变量的瞬时变化率而存在的。从数学的角度讲,是研究变量在函数中的作用。从物理的角度讲,是...

python 微积分计算

  • qq_37383691
  • qq_37383691
  • 2017-07-18 14:55
  • 3082
from sympy import * t = Symbol('t') x = Symbol('x') m = integrate(sin(t)/(pi-t),(t,0,x)) n = integrate(m,(x,0,pi)) print n

[译] 计算图上的微积分:Backpropagation

  • Linjingke32
  • Linjingke32
  • 2017-05-09 16:09
  • 265
原文: http://www.jianshu.com/p/0e9eea729476 原文 引言 Backpropagation (BP) 是使得训练深度模型在计算上可行的关键算法。对现代神经网络,这个算法相较于无脑的实现可以使梯度下降的训练速度提升千万倍。而对于模型的...

通俗解释反向传播(Backpropagation)的计算

  • shijing_0214
  • shijing_0214
  • 2016-07-16 15:26
  • 8594
Backpropagation算法是目前绝大多数神经网络在优化参数时用到的算法,具有快速方便容易实现的优点。那么它是如何实现的呢?首先看一张典型神经网络结构图: 上图是一个包含了输入层L1、一个 隐含层L2和输出层L3的简单神经网络,它的处理流程为根据输入层的input以及相应的权重和...

计算图上的微积分:Backpropagation 微积分 SOTON数据分析 · 2015-09-06 08:52 [译] 计算图上的微积分:Backpropagation 引言 Backprop

计算图上的微积分:Backpropagation 微积分 SOTON数据分析 · 2015-09-06 08:52 引言 Backpropagation (BP) 是使得训练深度模型在计算上可行的关键算法。对现代神经网络,这个算法相较于无脑...
  • starzhou
  • starzhou
  • 2016-05-08 14:34
  • 263

白话AI:看懂深度学习真的那么难吗?初中数学,就用10分钟

  • sfM06sqVW55DFt1
  • sfM06sqVW55DFt1
  • 2018-01-24 00:00
  • 178
如果在这个人工智能的时代,作为一个有理想抱负的程序员,或者学生、爱好者,不懂深度学习这个超热的话题,似乎已经跟时代脱节了。但是,深度学习对数学的要求,包括微积分、线性代数和概率论与数理统计等,让大部分的有理想抱负青年踟蹰前行。那么问题来了,理解深度学习,到底需不需要这些知识?关于深度学习,网上的资料...

白话AI:看懂深度学习真的那么难吗?初中数学,就用10分钟

  • tkkzc3E6s4Ou4
  • tkkzc3E6s4Ou4
  • 2018-01-29 00:00
  • 31
来源:数据与算法之美如果在这个人工智能的时代,作为一个有理想抱负的程序员,或者学生、爱好者,不懂深度学习这个超热的话题,似乎已经跟时代脱节了。但是,深度学习对数学的要求,包括微积分、线性代数和概率论与数理统计等,让大部分的有理想抱负青年踟蹰前行。那么问题来了,理解深度学习,到底需不需要这些知识?关于...

漫步微积分二十——微分和切线逼近

  • u010182633
  • u010182633
  • 2016-08-15 14:50
  • 682
前面的文章主要关注切线问题,即给定一条曲线,找出它切线的斜率;或者等价地,给定一个函数,求它的导数。除了全面研究导数外,牛顿和莱布尼兹还发现,几何和物理中许多问题需要求导的逆过程。有时叫做切线问题的逆问题:给定函数的导数,找出函数本身。之后的文章,我们会用到许多之前学到的求导规则。但是,这些规则都反...

微积分:常用公式、微分方程、级数

  • pipisorry
  • pipisorry
  • 2016-08-13 17:03
  • 5167
http://blog.csdn.net/pipisorry/article/details/52200140微积分 一.基本初等函数求导公式函数的和、差、积、商的求导法则反函数求导法则复合函数求导法则皮皮blog二、基本积分表   皮皮blog常用凑微分公式[常用的求导和定积分...

白话AI:看懂深度学习真的那么难吗?初中数学,就用10分钟

  • u010164190
  • u010164190
  • 2017-05-22 23:40
  • 930
今天,面对AI如此重要的江湖地位,深度学习作为重要的一个研究分支,几乎出现在当下所有热门的AI应用领域,其中包含语义理解、图像识别、语音识别,自然语言处理等等,更有人认为当前的人工智能等同于深度学习领域。如果在这个人工智能的时代,作为一个有理想抱负的程序员,或者学生、爱好者,不懂深度学习这个超热的话...

白话AI:看懂深度学习真的那么难吗?初中数学,就用10分钟

  • lzwsdu
  • lzwsdu
  • 2017-05-27 16:39
  • 608
今天,面对AI如此重要的江湖地位,深度学习作为重要的一个研究分支,几乎出现在当下所有热门的AI应用领域,其中包含语义理解、图像识别、语音识别,自然语言处理等等,更有人认为当前的人工智能等同于深度学习领域。如果在这个人工智能的时代,作为一个有理想抱负的程序员,或者学生、爱好者,不懂深度学习这个超热的话...

矩阵、向量微分计算

  • yc461515457
  • yc461515457
  • 2015-11-06 14:19
  • 7292
定义1. 梯度(Gradient)[标量对列向量微分] 设f(x)f(x)是一个变量为xx的标量函数,其中x=(x1...xN)Tx=(x_1...x_N)^T。那么定义f(x)f(x)对xx的梯度为df(x)dx\frac{d f(x)}{d x}: 梯度的转置是一个行向量: 定义2. ...
    个人资料
    • 访问:558755次
    • 积分:4864
    • 等级:
    • 排名:第6958名
    • 原创:67篇
    • 转载:19篇
    • 译文:0篇
    • 评论:108条
    about me
    关注机器学习、深度学习算法、AI专用芯片设计;本博客用于记录业余时间的自学习笔记,欢迎交流讨论。
    email:188997452(at)qq.com
    weibo
    博客专栏
    最新评论

提问

您的问题将会被发布在“技术问答”频道×
该问题已存在,请勿重复提问
||||||
  
000:0
推荐标签:
我要悬赏
取消发布
可能存在类似的问题:
我想提一个新问题