用人话解释神经网络里面的前向传播和反向传播
神经网络是一个模仿人脑的计算模型和系统。人脑有复杂多层的神经元系统以及架构于之上的正向传导和反向反馈信号回路。
神经网络里面所谓前向传播(Forward Propagation)和反向传播(Backword Propagation)概念则与之类似。
一、前言
这是一场以误差(Error)为主导的反向传播(Back Propagation)运动,旨在得到最优的全局参数矩阵,进而将多层神经网络应用到分类或者回归任务中去。
前向传递输入信号直至输出产生误差,反向传播误差信息更新权重矩阵。这两句话很好的形容了信息的流动方向,权重得以在信息双向流动中得到优化,其实就类似一个带反馈校正循环的电子信号处理系统。
我们知道梯度下降可以应对带有明确求导函数的情况,或者说可以应对那些可以求出误差的情况,比如逻辑回归(Logistic Regression),我们可以把它看做没有隐层的网络;但对于多隐层的神经网络,输出层可以直接求出误差来更新参数,但其中隐层的误差是不存在的,因此不能对它直接应用梯度下降,而是先将误差反向传播至隐层,然后再应用梯度下降,其中将误差从末层往前传递的过程需要链式法则(Chain Rule)的帮助,因此反向传播算法可以说是梯度下降在链式法则中的应用。
二、举个例子
为了帮助较好的理解反向传播概念,对它有一个直观的理解,接下来就拿猜数字游戏举个例子。
2.1 两人猜数字
这一过程类比没有隐层的神经网络,比如逻辑回归,其中小黄帽代表输出层节点,左侧接受输入信号,右侧产生输出结果,小蓝猫则代表了误差,指导参数往更优的方向调整。由于小蓝猫可以直接将误差反馈给小黄帽,同时只有一个参数矩阵和小黄帽直接相连,所以可以直接通过误差进行参数优化(实纵线),迭代几轮,误差会降低到最小。
2.2 三人猜数字
这一过程类比带有一个隐层的三层神经网络,其中小女孩代表隐藏层节点,小黄帽依然代表输出层节点,小女孩左侧接受输入信号,经过隐层节点产生输出结果,小蓝猫代表了误差,指导参数往更优的方向调整。由于小蓝猫可以直接将误差反馈给小黄帽,所以与小黄帽直接相连的左侧参数矩阵可以直接通过误差进行参数优化(实纵线);而与小女孩直接相连的左侧参数矩阵由于不能得到小蓝猫的直接反馈而不能直接被优化(虚棕线)。但由于反向传播算法使得小蓝猫的反馈可以被传递到小女孩那进而产生间接误差,所以与小女孩直接相连的左侧权重矩阵可以通过间接误差得到权重更新,迭代几轮,误差会降低到最小。
三、完整流程
上边的栗子从直观角度了解了反向传播,接下来就详细的介绍其中两个流程前向传播与反向传播,在介绍之前先统一一下标记。
3.1 数学标记
3.2 前向传播
如何将输入层的信号传输至隐藏层呢,以隐藏层节点c为例,站在节点c上往后看(输入层的方向),可以看到有两个箭头指向节点c,因此a,b节点的信息将传递给c,同时每个箭头有一定的权重,因此对于c节点来说,输入信号为:
同理,节点d的输入信号为:
由于计算机善于做带有循环的任务,因此我们可以用矩阵相乘来表示:
所以,隐藏层节点经过非线性变换后的输出表示如下:
同理,输出层的输入信号表示为权重矩阵乘以上一层的输出:
同样,输出层节点经过非线性映射后的最终输出表示为:
输入信号在权重矩阵们的帮助下,得到每一层的输出,最终到达输出层。可见,权重矩阵在前向传播信号的过程中扮演着运输兵的作用,起到承上启下的功能。
3.3 反向传播
既然梯度下降需要每一层都有明确的误差才能更新参数,所以接下来的重点是如何将输出层的误差反向传播给隐藏层。
其中输出层、隐藏层节点的误差如图所示,输出层误差已知,接下来对隐藏层第一个节点c作误差分析。还是站在节点c上,不同的是这次是往前看(输出层的方向),可以看到指向c节点的两个蓝色粗箭头是从节点e和节点f开始的,因此对于节点c的误差肯定是和输出层的节点e和f有关。
不难发现,输出层的节点e有箭头分别指向了隐藏层的节点c和d,因此对于隐藏节点e的误差不能被隐藏节点c霸为己有,而是要服从按劳分配的原则(按权重分配),同理节点f的误差也需服从这样的原则,因此对于隐藏层节点c的误差为:
同理,对于隐藏层节点d的误差为:
为了减少工作量,我们还是乐意写成矩阵相乘的形式:
你会发现这个矩阵比较繁琐,如果能够简化到前向传播那样的形式就更好了。实际上我们可以这么来做,只要不破坏它们的比例就好,因此我们可以忽略掉分母部分,所以重新成矩阵形式为:
仔细观察,你会发现这个权重矩阵,其实是前向传播时权重矩阵w的转置,因此简写形式如下:
不难发现,输出层误差在转置权重矩阵的帮助下,传递到了隐藏层,这样我们就可以利用间接误差来更新与隐藏层相连的权重矩阵。可见,权重矩阵在反向传播的过程中同样扮演着运输兵的作用,只不过这次是搬运的输出误差,而不是输入信号(我们不生产误差,只是误差的搬运工(っ̯ -。))。
四、链式求导
第三部分大致介绍了输入信息的前向传播与输出误差的后向传播,接下来就根据求得的误差来更新参数。
首先对隐藏层的w11进行参数更新,更新之前让我们从后往前推导,直到预见w11为止:
因此误差对w11求偏导如下:
求导得如下公式(所有值已知):
同理,误差对于w12的偏导如下:
同样,求导得w12的求值公式:
同理,误差对于偏置求偏导如下:
带入上述公式为:
接着对输入层的w11进行参数更新,更新之前我们依然从后往前推导,直到预见第一层的w11为止(只不过这次需要往前推的更久一些):
因此误差对输入层的w11求偏导如下:
求导得如下公式(有点长(ฅ́˘ฅ̀)):
同理,输入层的其他三个参数按照同样的方法即可求出各自的偏导,在这不再赘述。
在每个参数偏导数明确的情况下,带入梯度下降公式即可(不在重点介绍):
至此,利用链式法则来对每层参数进行更新的任务已经完成。
- 相关文章
微信公众号在线生成二维码带参数怎么搞?
带参数二维码是微信公众号渠道二维码的一种实现
微信的带参数二维码有两种,一种是临时二维码,一种是永久二维码,但是永久二维码的生成是有个数限制的,微...踏得网精选2016年度10大最佳HTML5动画
踏得网精选2016年度最酷最新的HTML5动画集,评选标准为:创意新颖度+实现技术难度+趣味程度。使用一些在线H5生成工具的作品,因其主要使用图片和CSS3套路动画,...
CSS3特性查询(Feature Query: @supports)功能简介
这是2017年不能不了解和学习的一个CSS新特性,非常实用,考虑到现实世界浏览器的复杂性,该特性本应该先于其他新特性出来。我们已经知道使用媒体查询(Media Que...
CSS3弹性布局弹性流(flex-flow)属性详解和实例
弹性布局是CSS3引入的强大的布局方式,用来替代以前Web开发人员使用的一些复杂而易错hacks方法(如使用float进行类似流式布局)。其中flex-flow是flex-direction...
HTML5动画背后的数学2 - 仿生智能算法综述
HTML5动画背后的数学 - 粒子群仿生算法简介
本站收录了多个算法可视化动画,如模拟鸟群运动:http://wow.techbrood.com/fiddle/30529等等。这里面除...
HTTP/2背景和新特性简介
使用SVG和CSS3创建圆形进度条动画
圆形进度条是一个经典的控制面板元素,常用于显示任务进度,比如用户档案的完整程度,或者升级状态。有很多方法来实现圆形进度条,比如用JS, CSS3, Canvas, SVG...
Three.js入门教程6 - 创建全景图和纹理
全景图非常酷。使用Three.js做一个属于自己的全景图并不是那么困难。要做一个全景图,你需要一个软件用来做一张全景图片。我使用了iPhone上的Microsoft Photosyn...
S3TC(S3 Texture Compression)纹理压缩格式详解
使用S3TC格式存储的压缩纹理是以4X4的纹理单元块(texel blocks)为基本单位存储的,每纹理单元块(texel blocks)有64bit或者128bit的纹理单元数据(texel data)。这...
WebGL入门教程5 - 详解纹理滤镜(Texture Filter)
WebGL中使用纹理贴图来实现细腻的物体表面观感,其中一个重要的参数是纹理滤镜(Texture Filter)。
这个参数用来处理当对象出现缩放时,纹理如何处理中间...HTML网页布局:静态、自适应、流式、响应式
静态布局(Static Layout)即传统Web设计,对于PC设计一个Layout,在屏幕宽高有调整时,使用横向和竖向的滚动条来查阅被遮掩部分;对于移动设备,单独设计一个布...
D3.js读取外部json数据
D3.js是一个很好的数据可视化工具,支持从web服务读取json数据,或者从外部文件如.json, .csv文件中直接读取。由于部分服务比如flickrs上的图文数据服务需要VPN...
更多...