再谈反向传播(Back Propagation)
此前写过一篇《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算法具体需要以下几个步骤。
- 前向传导
可以注意到,在梯度回传的过程中需要用到节点的输出值,所以在前向传播的过程中需要保存每个节点的输出值。同时,输出值关于输入值的梯度也可以马上获得,这在反向传播的求解中也需要用到。所以前向传导记录以下两个值:- 中间结点的输出值
- 输出值关于输入值的梯度
- 反向传播
反向传播就是一个计算网络最终输出值关于自己输出的梯度的过程。
参考资料
再谈反向传播(Back Propagation)的更多相关文章
- 神经网络中误差反向传播(back propagation)算法的工作原理
注意:版权所有,转载需注明出处. 神经网络,从大学时候就知道,后面上课的时候老师也讲过,但是感觉从来没有真正掌握,总是似是而非,比较模糊,好像懂,其实并不懂. 在开始推导之前,需要先做一些准备工作,推 ...
- 前馈神经网络-反向传播(Back Propagation)公式推导走读
构造:输入神经元个数等于输入向量维度,输出神经元个数等于输出向量维度.(x1=(1,2,3),则需要三个输入神经元) 一 前向后传播 隐层:
- 神经网络之反向传播算法(BP)公式推导(超详细)
反向传播算法详细推导 反向传播(英语:Backpropagation,缩写为BP)是"误差反向传播"的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见 ...
- 前向传播算法(Forward propagation)与反向传播算法(Back propagation)
虽然学深度学习有一段时间了,但是对于一些算法的具体实现还是模糊不清,用了很久也不是很了解.因此特意先对深度学习中的相关基础概念做一下总结.先看看前向传播算法(Forward propagation)与 ...
- 吴恩达深度学习 反向传播(Back Propagation)公式推导技巧
由于之前看的深度学习的知识都比较零散,补一下吴老师的课程希望能对这块有一个比较完整的认识.课程分为5个部分(粗体部分为已经看过的): 神经网络和深度学习 改善深层神经网络:超参数调试.正则化以及优化 ...
- Deep Learning 学习笔记(7):神经网络的求解 与 反向传播算法(Back Propagation)
反向传播算法(Back Propagation): 引言: 在逻辑回归中,我们使用梯度下降法求参数方程的最优解. 这种方法在神经网络中并不能直接使用, 因为神经网络有多层参数(最少两层),(?为何不能 ...
- 反向传播(Back Propagation)
反向传播(Back Propagation) 通常在设计好一个神经网络后,参数的数量可能会达到百万级别.而我们利用梯度下降去跟新参数的过程如(1).但是在计算百万级别的参数时,需要一种有效计算梯度的方 ...
- BP(back propagation)反向传播
转自:http://www.zhihu.com/question/27239198/answer/89853077 机器学习可以看做是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定 ...
- 深度神经网络(DNN)反向传播算法(BP)
在深度神经网络(DNN)模型与前向传播算法中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Back Propagation,BP)做一个总结. 1. DNN反向 ...
随机推荐
- walle2.0 nginx.conf配置文件参数
vim /usr/local/nginx/conf #user nobody; worker_processes ; events { worker_connections ; } http{ inc ...
- !!!css如何让img图片居中?css的display属性实现图片居中(代码实例)
在我们开发前端页面的时候,为了让页面效果美观,会让图片呈现居中效果.那么css怎么让img图片居中显示呢?本篇文章给大家带来css如何让img图片居中?css的display属性实现图片居中(代码实例 ...
- 获取Ajax通信对象方法
function getXHR() { // 该方法用于获取Ajax通信对象 var xhr = null; if (window.XMLHttpRequest != null && ...
- C++11 带来的新特性 (1)
1 语法改进 1.1 模板表达式中的空格 在c++03 及以前 vector<list<int>>; //Error vector<list<int> > ...
- java笔记(Idea,Maven):误删maven项目的target的class,怎么再生成target
右边侧边栏clean一下,target目录删掉了.或是手动删掉了.再建. 跑一下 Tomcat. target自动生成. 就这样.:)
- HTC VIVE固定头显位置
用此方法可以限制HTC VIVE头显定位(即固定头显位置,但是视角是不固定的). UnityEngine.XR.InputTracking.disablePositionalTracking = fa ...
- leetcode刷题七<整数反转>
给出一个 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 : 输入: 输出: 示例 : 输入: - 输出: - 示例 : 输入: 输出: 假设我们的环境只能存储得下 32 位的有符号整 ...
- centos7 安装python3.7.11 笔记
安装python依赖包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-deve ...
- PHP常用日期加减计算方法实例
PHP常用日期加减计算方法实例 实例总结了PHP常用日期加减计算方法.分享给大家供大家参考,具体如下: PHP 标准的日期格式 date("Y-m-d H:i:s"); PHP 简 ...
- 201771010118 马昕璐 《面向对象程序设计(java)》第十三周学习总结
第一部分:理论知识学习部分 事件处理基础 1.事件源(event source):能够产生事件的对象都可以成为事件源.一个事件源是一个能够注册监听器并向监听器发送事件对象的对象. 2.事件监听器(ev ...