此前写过一篇《BP算法基本原理推导----《机器学习》笔记》,但是感觉满纸公式,而且没有讲到BP算法的精妙之处,所以找了一些资料,加上自己的理解,再来谈一下BP。如有什么疏漏或者错误的地方,还请大家不吝赐教。

1.泛谈BP

说到反向传播,无非四个字——“链式求导”,但实际上BP不止如此,BP是在这个基础上,加入了一点动态规划的机制。一般的BP包含以下几个步骤:

  • 前向传导
  • 反向传播梯度计算

在反向传播进行梯度计算的时候,BP不会进行重复计算,其原因就是在前向传导的时候,进行了中间变量的存储,并且在反向传播的时候,可以进行DP。如果现在对这个过程不是很清楚,那么不急,下一节我将用一个例子来直观地说明BP算法的运行流程。

在讲BP时,再啰嗦一下BP的应用场景:

BP算法适用于简化多变量复合求导的过程

机器学习无非就是目标函数$Objective function $和一个学习算法,其中学习算法最基本的就是SGD(随机梯度下降),BP就可以用来计算其中的批梯度。
比如下面一个公式:
\[f(x,y)=\frac{x+\sigma(y)}{\sigma(x)+(x+y)^2}\ \ \ \ (1)\]
注:\(\sigma(x)=\frac{1}{1+exp(-x)}\)

如果直接求出\(f(x,y)\)导数的解析解,你会发现这是一个很复杂的表达式,而且如果对多变量的每个变量都用解析的方式求解,那么将会浪费更多的存储空间以及无谓的重复计算。而使用BP,你可以看到一个清爽的求解过程,简单的求解步骤。

2.细说BP

我们使用上一节提出的公式(1)来讲解BP具体是怎么工作的。先来回顾一下公式(1):
\[f(x,y)=\frac{x+\sigma(y)}{\sigma(x)+(x+y)^2}\ \ \ \ (1)\]
我们使用计算图的模型来表示这个计算过程。
实际上计算图所做的工作就是将原本的复杂表达式分解成中间步骤的聚合。计算图如下:

其中每个节点分别表示一个中间步骤,等式的左边表示中间变量,右边表示中间变量的解析表达。可以看到这个聚合的最终结果就是我们的公式(1)。

接下来说明BP怎么根据这个计算图进行梯度计算。

前向传播

根据BP算法步骤,第一步就是前向传播。
前向传播很简单,在传播的过程中,我们保存每一个中间变量的值,也就是每个中间节点的输出值

反向传播

从输出开始,反向传播梯度值,计算输出值对于每一个中间变量的梯度,并保存,在上图中就是 f
一层一层来看这个传播过程。

1)第一层
第一层传播图如下(红色箭头表示传播方向):

以上面的路线为例:
这里先计算 \(\frac{d(f)}{d(invden)}\),并保存结果 \(dinvden\):

2)第二层
继续以这条路线“反向传播”计算第二层:

这里要计算 \(\frac{d(f)}{d(den)}\),这里不像第一层一样,可以一次获得结果,因为变量 \(den\) 和 \(f\) 中间隔着一个中间变量 \(invden\),所以需要用到链式法则(这里就是链式求导在BP算法中的运用)。 链式推导如下:
\[\frac{d(f)}{d(den)}=\frac{d(f)}{d(invden)}\frac{d(invden)}{d(den)}\ \ \ \ (2)\]
根据原始计算图以及上一步的中间结果:
\[invden = \frac{1}{den}\ \ \ \ (3)\]
(2)(3)联立,得:
\[dden=dinvden\times \frac{-1}{den^2}\ \ \ \ (4)\]
整个计算过程展示如下:

就这样,BP不断地反向传播梯度,并保存中间梯度,直到计算图的所有中间值以及初始值的梯度被求解完毕。

总结

根据以上过程,总结BP算法具体需要以下几个步骤。

  1. 前向传导
    可以注意到,在梯度回传的过程中需要用到节点的输出值,所以在前向传播的过程中需要保存每个节点的输出值。同时,输出值关于输入值的梯度也可以马上获得,这在反向传播的求解中也需要用到。所以前向传导记录以下两个值:

    • 中间结点的输出值
    • 输出值关于输入值的梯度
  2. 反向传播
    反向传播就是一个计算网络最终输出值关于自己输出的梯度的过程。

参考资料

知乎传送门

再谈反向传播(Back Propagation)的更多相关文章

  1. 神经网络中误差反向传播(back propagation)算法的工作原理

    注意:版权所有,转载需注明出处. 神经网络,从大学时候就知道,后面上课的时候老师也讲过,但是感觉从来没有真正掌握,总是似是而非,比较模糊,好像懂,其实并不懂. 在开始推导之前,需要先做一些准备工作,推 ...

  2. 前馈神经网络-反向传播(Back Propagation)公式推导走读

        构造:输入神经元个数等于输入向量维度,输出神经元个数等于输出向量维度.(x1=(1,2,3),则需要三个输入神经元)   一 前向后传播   隐层:

  3. 神经网络之反向传播算法(BP)公式推导(超详细)

    反向传播算法详细推导 反向传播(英语:Backpropagation,缩写为BP)是"误差反向传播"的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见 ...

  4. 前向传播算法(Forward propagation)与反向传播算法(Back propagation)

    虽然学深度学习有一段时间了,但是对于一些算法的具体实现还是模糊不清,用了很久也不是很了解.因此特意先对深度学习中的相关基础概念做一下总结.先看看前向传播算法(Forward propagation)与 ...

  5. 吴恩达深度学习 反向传播(Back Propagation)公式推导技巧

    由于之前看的深度学习的知识都比较零散,补一下吴老师的课程希望能对这块有一个比较完整的认识.课程分为5个部分(粗体部分为已经看过的): 神经网络和深度学习 改善深层神经网络:超参数调试.正则化以及优化 ...

  6. Deep Learning 学习笔记(7):神经网络的求解 与 反向传播算法(Back Propagation)

    反向传播算法(Back Propagation): 引言: 在逻辑回归中,我们使用梯度下降法求参数方程的最优解. 这种方法在神经网络中并不能直接使用, 因为神经网络有多层参数(最少两层),(?为何不能 ...

  7. 反向传播(Back Propagation)

    反向传播(Back Propagation) 通常在设计好一个神经网络后,参数的数量可能会达到百万级别.而我们利用梯度下降去跟新参数的过程如(1).但是在计算百万级别的参数时,需要一种有效计算梯度的方 ...

  8. BP(back propagation)反向传播

    转自:http://www.zhihu.com/question/27239198/answer/89853077 机器学习可以看做是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定 ...

  9. 深度神经网络(DNN)反向传播算法(BP)

    在深度神经网络(DNN)模型与前向传播算法中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Back Propagation,BP)做一个总结. 1. DNN反向 ...

随机推荐

  1. 使用 Appium 测试微信小程序 Webview

    打开调试功能 通过微信打开debugx5.qq.com,或者直接扫下面二维码   勾选[打开TBS内核Inspector调试功能]   Chrome查看页面元素 手机连接电脑,查看是否连接成功.如下展 ...

  2. mysql记录执行的SQL语句

    show variables like "general_log%"; SET GLOBAL general_log = 'ON';SET GLOBAL general_log = ...

  3. Windows激活最高权限

    两种方法激活最高权限 方法1 用鼠标右键点击要操作的文件或文件夹,依次进入"属性→安全→高级→所有者→编辑",在"将所有者更改为"栏中选择登录系统的管理员用户, ...

  4. 《ServerSuperIO Designer IDE使用教程》- 5.树形结构管理设备驱动,小版本更新。发布:v4.2.3.1版本

    v4.2.3.1 更新内容:1.选择和管理设备驱动,增加树状结构显示.2.优化ide代码,核心代码没有改动.下载地址:官方下载 5. 树形结构管理设备驱动,小版本更新 5.1    概述 此次升级主要 ...

  5. git 相关学习

    1.Git 的一些快捷键 第一次创建本git 本地仓库 :: git  init  //在本地创建一个 Git仓库 :要在该目录下 第一次 要配置GitHub 的 账号和邮箱: git config ...

  6. LCT入门总结

    原文链接https://www.cnblogs.com/zhouzhendong/p/LCT.html 为什么要写这个总结? 因为之前的总结出问题了…… 下载链接: LCT 入门总结 UPD(2019 ...

  7. UOJ#206. 【APIO2016】Gap 构造 交互题

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ206.html 题解 T = 1 的情况直接大力从两边向中间询问即可. T = 2 的情况挺妙的,我没想到. 考虑首先花费 ...

  8. C#代码总结02---使用泛型来获取Asp前台页面全部控件,并进行属性修改

    该方法:主要用于对前台页面的不同类型(TextBox.DropDownList.等)或全部控件进行批量操作,用于批量修改其属性(如,Text.Enable). private void GetCont ...

  9. iOS实现应用更新及强制更新

    调用更新接口返回字段: result =     {             descr = "";             isupdate = 1;//是否更新         ...

  10. JS实现快速排序,冒泡排序

    JS-排序详解-冒泡排序   说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b, ...