1、前言

看完讲卷积神经网络基础讲得非常好的cs231后总感觉不过瘾,主要原因在于虽然知道了卷积神经网络的计算过程和基本结构,但还是无法透彻理解卷积神经网络的学习过程。于是找来了进阶的教材Notes on Convolutional Neural Networks,结果刚看到第2章教材对BP算法的回顾就犯难了,不同于之前我学习的对每一个权值分别进行更新的公式推导,通过向量化表示它只用了5个式子就完成了对连接权值更新公式的描述,因此我第一眼看过去对每个向量的内部结构根本不清楚。原因还估计是自己当初学习得不够深入,正好离上次自己推导BP算法已经过去挺长时间了,所以重新拿起教材学习复习了一下并逐个对应起来,最终把Notes on Convolutional Neural Networks中的向量化表示搞清楚了。本篇就是对上面的复习和对应过程的详细记录,如果看完并自己推导一遍的话肯定能清楚BP算法的每个更新公式是怎么来的。

2、符号定义

任何不说明符号含义就开始的推导就是耍流氓,所以此部分对用于推导的网络结构和符号进行说明。基本采用了周志华教授的《机器学习》书中的符号定义,不过自己还是做了些符号变更。

网络结构:

图1. 全连接的网络结构,从上到下依次为输出层、隐含层和输入层

符号说明:

 :输出层第j个神经元的输出(j=1,2,…,l);

:输出层第j个神经元的偏置;

:输出层第j个神经元的输入;

:隐含层第h个神经元的输出(h=1,2,…,q);

 :隐含层第h个神经元的偏置;

 :隐含层第h个神经元的输入;

:输入层第i个神经元的输入;

:隐含层第h个神经元和输出层第j个神经元之间的连接权值;

:输入层第i个神经元和隐含层第h个神经元之间的连接权值;

例如图1中的两条橙色直线即分别代表上述两个权值所在的连接

3、问题目标

对于某一个样例它的输入可以描述成:

已知该输入的期望输出为:

而它的实际输出为:

我们的目标即为利用上述信息更新网络中的参数,从而使误差减小。

4、详细推导

首先采用均方误差公式来衡量误差:

(1)

其中我们有:

(2)

上式的意思是输出层神经元的输出可以由它的输入、偏置再加上激活函数f(*)确定。并且它的输入等于隐含层神经元的输出与连接权值的乘积之和,即:

(3)

-------------------------下面是隐含层和输出层之间连接权值更新公式的推导-----------------------------

BP算法使用梯度下降法调整参数,从而使误差向减小的方向移动。因此连接权值的更新公式可以表示为:

(4)

(5)

其中式(4)中的是学习速率。可以看出我们的任务就是求出式(4),然后就可以通过和旧的连接权值相加完成权值的更新。然而式(4)中的偏导数无法直接求出,需要利用链式法则进行转换。为了进行转换我们首先需要知道隐含层和输出层之间的连接权值是如何影响到最终的均方误差E的。显然它首先会影响到输出层神经元的输入,再影响到输出层神经元的输出,最终影响到均方误差E。所以根据上述描述我们可以构造出链式法则:

(6)

式(6)中的三个偏导数从左到右依次为:输出层神经元j的输出对均方误差的影响,输出层神经元j的输入对它自己的输出的影响,我们所要更新的连接权值对输出层神经元j的输入的影响。

之后问题就可以转化为求解这三个偏导数

[1] 根据式(1)我们很容易得到第一个偏导数的结果:

(7)

[2] 根据式(2)也可以很容易得得到第二个偏导数的结果:

(8)

[3] 根据式(3)也可以得到第三个偏导数的结果:

(9)

因此综合起来我们就可以得到隐含层和输出层之间连接权值的最终更新公式:

(10)

----------------------------下面是输出层神经元偏置的更新公式的推导-----------------------------------

输出层神经元偏置的更新公式可以利用等效思想非常"优雅"地解决。我们常把偏置等效成一个连接权值始终为-1,输出为的隐含层神经元,进一步思考我们还可以等效成连接权值为,而输出始终为-1的隐含层神经元不是么?而隐含层神经元与输出层神经元之间连接权值我们已经推导出来了。

因此事实上我们只需要把式(10)的换成-1就得到输出层神经元偏置的更新公式:

(11)

-------------------------下面是输入层与隐含层之间连接权值更新公式的推导-----------------------------

首先类似隐含层与输出层之间连接权值的更新公式我们有:

(12)

并且我们有:
(13)

(14)

同样的,需要使用链式法则将式(12)转换成以下形式:

(15)

由式(14)可以发现第一个偏导数无法直接求出,还需要进一步分解。不过为了简化公式我们先将后面两个偏导数求出来放在一边。具体地:

[1] 根据式(14)可以得到第二个偏导数的结果:

(16)

[2] 根据式(13)可以得到第三个偏导数的结果:

(17)

现在我们来求第一个偏导数,它可以根据链式法则分解为:

(18)

参考式(3),(7),(8)就可以得到式(18)的最终结果:

(19)

综合式(16),(17),(19)就可以得到式(15)的最终结果:

(20)

---------------------------------------------------------------------------------------------------------

额外地,隐含层神经元的偏置也可以通过类似上面叙述的等效思想解决。只需要将式(20)的最后一项更改为-1就得到了隐含层神经元偏置的更新公式。

---------------------------------------------------------------------------------------------------------

至此BP算法所有参数的更新公式推导完毕。

五、向量化表示

虽然推导容易理解,但公式还是比较长的。因此可以用向量化的表示方法来重新表示公式。

首先以输出层的计算来说明符号。输出层的计算可以用下面的矩阵乘法进行表示:

(21)

通用地对于第a层(由于第一层是输入层,因此a大于1)的计算过程可以用下式表示:

(22)

其中的每一项的意义和式(21)中的每一项一一对应起来。

接着由式(4)和(12)我们可以整理出连接权值更新的通用公式:

(23)

并且:

(24)

其中的需要分情况考虑:

[1] 第a层是输出层:

(25)

[2] 第a层不是输出层:

(26)

其中的 运算符代表对应元素相乘而不是矩阵乘法,并且注意到式(26)还是一个递归式。

至此向量化表示完毕。

误差逆传播(error BackPropagation, BP)算法推导及向量化表示的更多相关文章

  1. 神经网络 误差逆传播算法推导 BP算法

      误差逆传播算法是迄今最成功的神经网络学习算法,现实任务中使用神经网络时,大多使用BP算法进行训练.   给定训练集\(D={(x_1,y_1),(x_2,y_2),......(x_m,y_m)} ...

  2. 神经网络和误差逆传播算法(BP)

    本人弱学校的CS 渣硕一枚,在找工作的时候,发现好多公司都对深度学习有要求,尤其是CNN和RNN,好吧,啥也不说了,拿过来好好看看.以前看习西瓜书的时候神经网络这块就是一个看的很模糊的块,包括台大的视 ...

  3. BP算法推导python实现

    def sigmoid(inX):   return 1.0/(1+exp(-inX))   '''标准bp算法每次更新都只针对单个样例,参数更新得很频繁sdataSet 训练数据集labels 训练 ...

  4. BP(back propagation)误差逆传播神经网络

    [学习笔记] BP神经网络是一种按误差反向传播的神经网络,它的基本思想还是梯度下降法,中间隐含层的误差和最后一层的误差存在一定的数学关系,(可以计算出来),就像误差被反向传回来了,所以顾名思义BP.想 ...

  5. 神经网络和BP算法推导

    注意:绘画太难了,因为他们画,本文中的所有插图来自基本算法饺子机类.请勿转载 1.习模型: 事实上,基本上全部的基本机器学习模型都能够概括为下面的特征:依据某个函数,将输入计算并输出. 图形化表示为下 ...

  6. bp算法推导过程

    参考:张玉宏<深度学习之美:AI时代的数据处理与最佳实践>265-271页

  7. BP神经网络模型及算法推导

    一,什么是BP "BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最 ...

  8. BP神经网络算法推导及代码实现笔记zz

    一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的 ...

  9. 深度学习——前向传播算法和反向传播算法(BP算法)及其推导

    1 BP算法的推导 图1 一个简单的三层神经网络 图1所示是一个简单的三层(两个隐藏层,一个输出层)神经网络结构,假设我们使用这个神经网络来解决二分类问题,我们给这个网络一个输入样本,通过前向运算得到 ...

随机推荐

  1. flash引入

    博客页面引入一个小人的动画时钟代码 <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase ...

  2. 【Android - V】之DrawerLayout的使用

    DrawerLayout是Android V4包中的一个布局控件,用来实现一个抽屉样式的布局. DrawerLayout通过设置子视图的layout_gravity来决定子视图停靠在屏幕的哪个边缘外侧 ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-[过滤器+Cache] 系列目录 上次的探讨没有任何结果,我浏览了大量的文章 ...

  4. Android获得线性渐变某点的颜色

    安卓官方确实提供了好多非常强大的工具给我们了,例如我们最近经常在shape中加入gradient(渐变),像我的项目中用的是线性渐变, <?xml version="1.0" ...

  5. 如何写一个网页标题title的闪动提示(转)

    通过网页title来提示用户有新消息这个功能很常见,比如现在的微博,还有一些邮箱,这个功能都很常见.如何实现则个功能呢? 思路是:通过ajax访问后台,若有新消息,则将网页的title替换为 提示信息 ...

  6. iOS-iPad开发之popoverController使用介绍

    iOS-iPad开发之popoverController使用介绍 iOS开发UI篇-popoverController使用注意 iOS SDK:自定义Popover(弹出窗口) 实现的简单例子: // ...

  7. [转] 学习使用:before和:after伪元素

    http://www.w3cplus.com/css3/learning-to-use-the-before-and-after-pseudo-elements-in-css.html 如果你一直密切 ...

  8. 为什么你需要使用instancetype而不是id

    四年前Clang添加了关键字instancetype,目的在于取代-alloc和-init等方法的返回类型id,那么使用instancetype到底比id好在哪里? instancetype宣言 不管 ...

  9. Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题

    该问题有两种方法: 一 利用两个数组,此法简单,不讨论 二 利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历.---但是这种情况要特别注意,当后续 ...

  10. 14、SQL Server 存储过程

    SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...