[AI 笔记] BP反向传播算法

  • 说明
  • BP算法
    • 链式法则
    • 计算图
    • 简单例子
      • 前向传播
      • 反向传播
    • 聚焦计算节点,深入理解
    • 计算节点的代码实现
    • 例子
    • 各种门的功能
    • 多元链式法则
    • 向量化BP算法

参考资料:
CS231n课程

说明

BP(Back Propagation)算法,也就是反向传播算法,是神经网络训练的核心算法,用来计算各个节点的梯度。我一开始看的是西瓜书里边的推导,比较难懂,而且停留在理论推导,没有讲算法实现原理。CS231n讲的比较清楚。

要理解BP算法,首先要知道链式法则,以及计算图的概念。

另外,反向传播算法在计算梯度的过程中,其实包含了前向传播(前馈)与反向传播(反馈)两个过程,后面会讲到。

在接下来的阅读中,请抱着以下三点来进行,先不用理解:

  • 结合计算图,抽象地去理解BP算法
  • BP算法是对链式法则的递归调用
  • 化繁为简的思想

BP算法

链式法则

学过高数的应该都了解,这里简单提一下。
就是复合函数求导,如下图所示,当然可以写得再长一点。

计算图

计算图,顾名思义,就是用图形来表达一个算法或公式。

如下图所示,圆圈代表计算节点,带箭头实线代表数据流。

在看计算图的时候,请把你的注意力放在那几个圆圈上,也就是计算图中的节点,也可以借用电路中“门”的概念,称之为门。

下图中就包含了乘法门,以及加法门。

显然,这副计算图所要表达的式子是 f = z * ( x + y )。

简单例子

在了解了链式法则和计算图的概念之后,下面用一个简单的例子来演示BP算法的具体过程。

这里,请回忆起”结合计算图,抽象地去理解BP算法“。

我们在说明中提到过,BP算法其实包含前向传播与反向传播两个过程。其中前向传播是将具体的输入值代入到计算图中,计算每一个节点的当前值,而反向传播则利用链式法则以及各节点的当前值来计算梯度。

前向传播


前向传播是将具体的输入值代入到计算图中,一层一层向前推进,计算出每一个节点的当前值。

如上图所示(计算图中绿色数值代表当前值):
x = -2, y = 5, z = -4, 是当前具体的输入值。
q = x + y, 所以 q 当前等于 -2 + 5 = 3。
f = z * q, 所以 f 当前等于 -4 * 3 = -12。

当目标函数的当前值计算完毕之后,前向传播也就结束了。

反向传播

前向传播完成后,我们得到了每一个节点当前的取值。而后反向传播则利用链式法则以及各节点的当前值,从后往前,逐层来得到梯度。

(下面的分析过程中,注意节点处的操作)

此时观察上图用红色和蓝色框框选出来的部分,f 对自身的梯度显然是 1,即 ∂f/∂f = 1;f 对 q 的导数 ∂f/∂q = z , z 的当前值为 -4,所以 f 对 q 的梯度,即 (∂f/∂q)*(∂f/∂f) = -4;f 对 z 的导数 ∂f/∂z = q,q 的当前值为 3,所以 f 对 z 的梯度,即 (∂f/∂z)*(∂f/∂f) = 3。

f 对 x 的梯度,用链式法则可表达为 ∂f/∂x = (∂q/∂x)*(∂f/∂q),因为 q = x + y,所以 ∂q/∂x = 1,所以 ∂f/∂x = 1 * ∂f/∂q = -4。同理,∂f/∂y = -4。

“这里,我们把 ∂f/∂q 称作上游梯度,∂q/∂x 称作本地梯度,将上游梯度与本地梯度相乘,即得到目标函数 f 对 输入 x 的梯度。”这里可以试着理解这句话,后面会继续深入。

聚焦计算节点,深入理解

在上面的讨论中,多次强调了把注意力放在计算节点处,因为这是理解BP算法的关键。

下图把我们的目光聚焦于单个的计算节点。此节点表示 z = f(x,y)。

观察下图,尝试理解节点的输入、输出、本地梯度、以及上游梯度这几个概念。


节点的输入:
即图中的 x , y。由上一层(对于前馈而言)的节点传入,也即上一层节点的输出。
节点的输出:
即图中的 z。传递给下一层的节点,也即下一层节点的输入。
本地梯度:
即图中 ∂z/∂x 与 ∂z/∂y。注意:是关于 x 和 y 的函数。
上游梯度:
即图中的 ∂L/∂z。其中 L 为目标函数,∂L/∂z 由上游(相对反馈而言)的节点传回。

现在只关注这一个节点,来复盘一下BP算法的前向传播与反向传播过程。

前向传播时:x 和 y 的具体值由前面的节点计算得到,输入此节点后,计算得到 z 的具体值,传递给下一个节点。(这里注意:x 和 y 的值需要进行缓存,因为在反向传播时会用到。)

反向传播时:上游节点传回上游梯度 ∂L/∂z,此节点将 x 和 y 的具体值代入本地梯度 ∂z/∂x(是关于 x 和 y 的函数),得到本地梯度的具体值。从而根据链式法则,将本地梯度与上游梯度相乘,得到目标函数对 x 的梯度 ∂L/∂x。计算 ∂L/∂y 的过程同理。

完成上述过程后,继续将 ∂L/∂x 与 ∂L/∂y 作为新的上游梯度,传递给下游的节点,以此类推。

在这里,请回想起”BP算法是对链式法则的递归调用“这句话,并理解。

计算节点的代码实现

在理解了BP算法在计算节点处的操作后,我们先来看一下计算节点的代码实现,以进一步加深理解。

(CS231n的课程把这一部分放在了后面。)

可见,代码将节点处的各种操作封装成了一个模块,因为每一个节点的操作都可以抽象为统一的几个步骤。

可以看到,代码定义了 forward 和 backward 两个函数,分别对应了 BP 算法的前馈和反馈两个过程。

在 forward 函数中,z = x * y 描述了这个计算节点的结构;并利用两个 self 的常量,缓存了 x 和 y 的当前值;并利用 return 返回 z 作为输出。

在 backward 函数中,dz 即为上游梯度,下面两行计算了 dx 和 dy,方括号中列出了链式法则的公式;并利用 return 返回 dx 和 dy 作为新的上游梯度。

代码的实现与我们之前的描述一致。

例子

在上述讨论的基础上,再举一个例子。

这里说明一下化繁为简思想的具体体现,由于上面的例子过于简单,
有人就会提问:直接用求导公式求得目标函数对输入的梯度它不香吗?

利用计算图,我们实现的是将一个复杂的函数式拆分成若干个小的部分来进行计算。当函数式较为复杂时,直接进行求导的方式显然是不行的,比如下图中的函数。

但是利用化繁为简的思想,我们可以将它拆解成如下图所示的计算过程。可以发现,每一个计算节点都只涉及加法、乘法、取倒数、exp等这些简单的计算,回想刚才对于单独计算节点的讨论,那么这个节点设计起来是相当简单的。这就是化繁为简的过程。

上图中部为计算图,下方为一些用到的求导公式,你可以尝试手动地推导一遍,加深对BP算法的理解。记得使用上文节点输入输出、本地梯度以及上游梯度的概念。

另外,值得一提的是,计算图的结构并不是固定的,你可以对其中的一些节点进行组合、封装。如下图所示:

你可以将蓝色框框选出来的部分看作一个整体,即图中的 sigmoid 函数。根据 sigmoid 函数的结构及其解析梯度的结构,来设计代码中的 foward 和 backward 函数。

如何对计算图进行组合,取决于你对计算节点复杂度的要求。

各种门的功能

前面提到,可以借用电路中“门”的概念,将计算节点称作门。
下面我们看看各种门,在计算过程中到底做了什么。

讨论过程中参考下图:

加法门:
观察上图中央的加法节点。上游梯度为 2,由于是加法,所以在两条输入的支路上,本地梯度都为常数 1,因此,在两条支路上向下游传递的梯度都为 2。
由此可见,加法门实现的是梯度分发的功能,将上游梯度原封不动的传递到下游的各条支路。

乘法门:
观察图中左上角的乘法节点,上游梯度为 2,通过计算,x 支路上的本地梯度为 y,y 的当前值为 -4, 所以 x 支路上的梯度为 -8;y 支路上的本地梯度为 x,x 的当前值为 3,所以 y 支路上的梯度为 6。
由此可见,乘法门实现的是梯度缩放的功能,根据本地梯度的值来对上游梯度进行缩放,而后往下游传递。

max门:
上图左下角为一个取最大值的门。在计算对 z 的梯度时,需要把 w 看作常数,反之,在计算对 w 的梯度时,需要把 z 看作常数。

下图中,左上侧为把 z 看作变量时,max 门的输出,左下侧为 z 的本地梯度;右上侧为把 w 看作变量时,max 门的输出,右下侧为 w 的本地梯度。
需要这样理解:当 z 的当前值大于 w 的当前值时,z 的本地梯度为 1,w 的本地梯度为 0;当 z 的当前值小于 w 的当前值时,z 的本地梯度为 0,w 的本地梯度为 1。两者之间必有一者为 1,一者为 0。那么它们传往下游的梯度,必有一者等于上游梯度,一者等于 0。
在上图中,由于 z 的当前值大于 w 的当前值,所以 z 的梯度等于上游梯度为 2,而 w 的梯度等于 0。
由此可见,max门实现的是梯度路由的功能,上游梯度通过当前值较大的支路往下游传递,而在当前值较小的支路中断。

多元链式法则

如下图所示,当一个节点有多个上游支路时,该节点的上游梯度为所有上游支路传回的梯度的累加。

假设目标函数 L = f(u, v),其中 u = g(x),v = h(x),那么根据多元函数求导法则,∂L/∂x = (∂u/∂x)*(∂L/∂u) + (∂v/∂x)*(∂L/∂v),结合此式与上图是不是很容易理解!

向量化BP算法

上述的BP算法都是一维的,即输入都是常数,那么如果输入是向量,即为向量化的BP算法。如下图所示。
这里需要学好矩阵论,但原理是一样的。

[AI 笔记] BP反向传播算法相关推荐

  1. BP反向传播算法的思考和直观理解 -卷积小白的随机世界

    https://www.toutiao.com/a6690831921246634504/ 2019-05-14 18:47:24 本篇文章,本来计划再进一步完善对CNN卷积神经网络的理解,但在对卷积 ...

  2. ​通俗理解神经网络BP反向传播算法

    转载自  ​通俗理解神经网络BP反向传播算法 通俗理解神经网络BP反向传播算法 在学习深度学习相关知识,无疑都是从神经网络开始入手,在神经网络对参数的学习算法bp算法,接触了很多次,每一次查找资料学习 ...

  3. 使用随机梯度下降SGD的BP反向传播算法的PyTorch代码实现

    Index 目录索引 写在前面 PyTorch的 .data() PyTorch的 .item() BP with SGD的PyTorch代码实现 参考文章 写在前面 本文将用一个完整的例子,借助Py ...

  4. BP反向传播算法浅谈(Error Back-propagation)

     最近在打基础,大致都和向量有关,从比较基础的人工智能常用算法开始,以下是对BP算法研究的一个小节. 本文只是自我思路的整理,其中举了个例子,已经对一些难懂的地方做了解释,有兴趣恰好学到人工智能对这块 ...

  5. 手推机器学习公式(一) —— BP 反向传播算法

    方便起见,本文仅以三层的神经网络举例. f(⋅)f(\cdot):表示激励函数 xix_i:表示输入层: yjy_j:表示中间的隐层: yj=f(netj)y_j=f(\text{net}_j) ne ...

  6. 随时间反向传播算法(BPTT)笔记

    随时间反向传播算法(BPTT)笔记 1.反向传播算法(BP) 以表达式f(w,x)=11+e−(w0x0+w1x1+w2)f(w,x)=\frac{1}{1+e^{-(w_0x_0+w_1x_1+w_ ...

  7. 梯度的直观理解_BP反向传播算法的思考和直观理解 -卷积小白的随机世界

    本篇文章,本来计划再进一步完善对CNN卷积神经网络的理解,但在对卷积层反向传播算法的理解中,越发觉得之前对于BP反向传播算法的理解是不到位的.小白近日觉得,对于深度神经网络,"反向传播&qu ...

  8. 反向传播算法的理论基础,反向传播算法应用

    如何理解神经网络里面的反向传播算法 反向传播算法(Backpropagation)是目前用来训练人工神经网络(ArtificialNeuralNetwork,ANN)的最常用且最有效的算法. 其主要思 ...

  9. 神经网络与机器学习 笔记—反向传播算法(BP)

    先看下面信号流图,L=2和M0=M1=M2=M3=3的情况,上面是前向通过,下面部分是反向通过. 1.初始化.假设没有先验知识可用,可以以一个一致分布来随机的挑选突触权值和阈值,这个分布选择为均值等于 ...

最新文章

  1. Java项目:日历万年历(java+swing)
  2. 实战:基于OpenCV的人眼检测
  3. bigdecimal比较是否相等_java基础教程之字符串的介绍,比较重要的一个知识点【四】...
  4. rsync error: some files/attrs were not transferred
  5. python如何为饼图添加标题_python – Matplotlib子图标题,图标题格式
  6. 5G(6 )---5G NR 物理层 索引
  7. xhtml、html与html5的区别
  8. 类c语言实验报告,内蒙古工业大学 C语言实验报告
  9. oracle 简单job
  10. unity 罗技G29开发
  11. Linux怎么恢复已删除的文件,Linux中使用extundelete恢复已删除的文件
  12. recovery输出log+recovery模式关闭selinux
  13. Jetpack Compose入门详解(实时更新)
  14. 傲游 android 2.3,傲游浏览器安卓版-傲游浏览器手机版v5.2.3.3256-3454手机软件
  15. 关于state和status
  16. appinventor HTML5,用APP Inventor纯图形化编程自制APP,通过WIFI物联网控制掌控板
  17. Android开发——如何解决三方库中的类名冲突问题
  18. 关于字体和字体微调(Hinting )的知识
  19. PKCS及PKCS 15个标准, Public-Key Cryptography Standards
  20. linux打开mdb文件怎么打开软件,mdb文件扩展名,mdb文件怎么打开?

热门文章

  1. 2023年消费电子行业研究报告
  2. js格式化日期为各种国际格式
  3. 线性表之顺序存储结构与链式存储结构 及 应用
  4. jenkins下载地址deb包
  5. Java项目中Ehcache的使用
  6. vs2022 系统找不到指定文件
  7. 怎么让网页变成黑白色
  8. 腾讯笔试题--微信红包
  9. 成功集成个推后,点击推送直接跳入app指定页面
  10. 瑞云服务云|天正电气服务云系统项目顺利验收