推导CNN中的BP误差反向传播算法

实际上就是一个:梯度下降反向传播更新

如果熟知高数和懂最优化的梯度下降理论,可以直接跳到

一、反向传播的由来

在我们开始DL的研究之前,需要把ANN—人工神经元网络以及bp算法做一个简单解释。

输入层/输入神经元,输出层/输出神经元,隐层/隐层神经元,权值,偏置,激活函数

接下来我们需要知道ANN是怎么训练的,假设ANN网络已经搭建好了,在所有应用问题中(不管是网络结构,训练手段如何变化)我们的目标是不会变的,那就是网络的权值和偏置最终都变成一个最好的值,这个值可以让我们由输入可以得到理想的输出,于是问题就变成了y=f(x,w,b)(x是输入,w是权值,b为偏置,所有这些量都可以有多个,比如多个x1,x2,x3……最后f()就好比我们的网络它一定可以用一个函数来表示,我们不需要知道f(x)具体是怎样的函数,从小我们就认为只要是函数就一定要是可表示的,像f(x)=sin(x)一样,但是请摈弃这样的错误观念,我们只需要知道一系列的w和b决定了一个函数f(x),这个函数让我们由输入可以计算出合理的y

最后的目标就变成了尝试不同的w,b值,使得最后的y=f(x)无限接近我们希望得到的值t

但是这个问题依然很复杂,我们把它简化一下,让误差(y-t)^2的值尽可能的小。于是原先的问题化为了C(w,b)=(f(x,w,b)-t)^2取到一个尽可能小的值。这个问题不是一个困难的问题,不论函数如何复杂,如果C降低到了一个无法再降低的值,那么就取到了最小值(假设我们不考虑局部最小的情况)

如何下降?数学告诉我们对于一个多变量的函数f(a,b,c,d,……)而言,我们可以求得一个向量,它称作该函数的梯度,要注意的是,梯度是一个方向向量,它表示这个函数在该点变化率最大的方向(这个定理不详细解释了,可以在高等数学教材上找到)于是C(w,b)的变化量ΔC就可以表示成

其中

是该点上的微小变化,我们可以随意指定这些微小变化,只需要保证ΔC<0就可以了,但是为了更快的下降,我们为何不选在梯度方向上做变化呢?

事实上,梯度下降的思想就是这样考虑的,我们使得

从而保证C一直递减,而对于w来说只要每次更新

推导CNN中的BP误差反向传播算法_第1张图片

即可。这个公式表示误差C在沿着w的负梯度方向(下降最快的方向)走 η

ok,到这里,似乎所有的问题都解决了,让我们重新整理一下思绪,我们将问题转化了很多步:

网络权值偏置更新问题 ==> f(x,w,b)的结果逼近t ==> C(w,b)=(f(x,w,b)-t)^2取极小值问题 ==> C(w,b)按梯度下降问题 ==>取到极小值,网络达到最优

千万别忘了一点!!推导基于一个前提:我们已经提前知道了当前点的梯度。然而事实并非如此!!

这个问题困扰了NN研究者多年,1969年M.Minsky和S.Papert所著的《感知机》一书出版,它对单层神经网络进行了深入分析,并且从数学上证明了这种网络功能有限,甚至不能解决象"异或"这样的简单逻辑运算问题。同时,他们还发现有许多模式是不能用单层网络训练的,而对于多层网络则没有行之有效的低复杂度算法,最后他们甚至认为神经元网络无法处理非线性问题。然而于1974年,Paul Werbos首次给出了如何训练一般网络的学习算法—back propagation。这个算法可以高效的计算每一次迭代过程中的梯度,让以上我们的推导得以实现!!

不巧的是,在当时整个人工神经网络社群中无人知晓Paul所提出的学习算法。直到80年代中期,BP算法才重新被David Rumelhart、Geoffrey Hinton及Ronald Williams、David Parker和Yann LeCun独立发现,并获得了广泛的注意,引起了人工神经网络领域研究的第二次热潮。

三、一个很好的例子

现在,我们再把权值考虑进去,以下是一个很好的例子,有助于我们去理解反向传播

来源:Charlotte77的博客http://www.cnblogs.com/charlotte77/p/5629865.html

假设,你有这样一个网络层:

推导CNN中的BP误差反向传播算法_第2张图片

第一层是输入层,包含两个神经元i1,i2,和截距项b1;第二层是隐含层,包含两个神经元h1,h2和截距项b2,第三层是输出o1,o2,每条线上标的wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数。

  现在对他们赋上初值,如下图:

推导CNN中的BP误差反向传播算法_第3张图片

         其中,输入数据  i1=0.05,i2=0.10;

     输出数据 o1=0.01,o2=0.99;

     初始权重  w1=0.15,w2=0.20,w3=0.25,w4=0.30;

           w5=0.40,w6=0.45,w7=0.50,w8=0.88

  目标:给出输入数据i1,i2(0.05和0.10),使输出尽可能与原始输出o1,o2(0.01和0.99)接近。

Step 1 前向传播

1.输入层---->隐含层

  计算神经元h1的输入加权和:

推导CNN中的BP误差反向传播算法_第4张图片

神经元h1的输出o1:(此处用到激活函数为sigmoid函数):

同理,可计算出神经元h2的输出o2:

2.隐含层---->输出层:

  计算输出层神经元o1和o2的值:

推导CNN中的BP误差反向传播算法_第5张图片

这样前向传播的过程就结束了,我们得到输出值为[0.75136079 , 0.772928465],与实际值[0.01 , 0.99]相差还很远,现在我们对误差进行反向传播,更新权值,重新计算输出。

Step 2 反向传播

1.计算总误差

总误差:(square error)

推导CNN中的BP误差反向传播算法_第6张图片

但是有两个输出,所以分别计算o1和o2的误差,总误差为两者之和:

2.隐含层---->输出层的权值更新:

以权重参数w5为例,如果我们想知道w5对整体误差产生了多少影响,可以用整体误差对w5求偏导求出:(链式法则)

下面的图可以更直观的看清楚误差是怎样反向传播的:

推导CNN中的BP误差反向传播算法_第7张图片

现在我们来分别计算每个式子的值:

推导CNN中的BP误差反向传播算法_第8张图片

这样我们就计算出整体误差E(total)对w5的偏导值。

回过头来再看看上面的公式,我们发现:

为了表达方便,用来表示输出层的误差:

推导CNN中的BP误差反向传播算法_第9张图片

因此,整体误差E(total)对w5的偏导公式可以写成:

如果输出层误差计为负的话,也可以写成:

最后我们来更新w5的值:

(其中,是学习速率,也就是往负梯度方向前进的步长,这里我们取0.5)

同理,可更新w6,w7,w8:

推导CNN中的BP误差反向传播算法_第10张图片

3.隐含层---->隐含层的权值更新:

 方法其实与上面说的差不多,但是有个地方需要变一下,在上文计算总误差对w5的偏导时,是从out(o1)---->net(o1)---->w5,但是在隐含层之间的权值更新时,是out(h1)---->net(h1)---->w1,而out(h1)会接受E(o1)和E(o2)两个地方传来的误差,所以这个地方两个都要计算。

推导CNN中的BP误差反向传播算法_第11张图片

推导CNN中的BP误差反向传播算法_第12张图片

推导CNN中的BP误差反向传播算法_第13张图片

最后,三者相乘:

 为了简化公式,用sigma(h1)表示隐含层单元h1的误差:

推导CNN中的BP误差反向传播算法_第14张图片

最后,更新w1的权值:

同理,额可更新w2,w3,w4的权值:

推导CNN中的BP误差反向传播算法_第15张图片

这样误差反向传播法就完成了,最后我们再把更新的权值重新计算,不停地迭代,在这个例子中第一次迭代之后,总误差E(total)由0.298371109下降至0.291027924。迭代10000次后,总误差为0.000035085,输出为[0.015912196,0.984065734](原输入为[0.01,0.99]),证明效果还是不错的

四、最一般的情况

原理部分参考李宏毅机器学习PPT,以下推导过程详细且易理解。

1. 变量定义

推导CNN中的BP误差反向传播算法_第16张图片

推导CNN中的BP误差反向传播算法_第17张图片

2. 代价函数

        代价函数被用来计算ANN输出值与实际值之间的误差。常用的代价函数是二次代价函数(Quadratic cost function):

        其中,表示输入的样本,表示实际的分类,表示预测的输出,表示神经网络的最大层数。

3. 公式及其推导

        本节将介绍反向传播算法用到的4个公式,并进行推导。如果不想了解公式推导过程,请直接看第4节的算法步骤。

        首先,将第层第个神经元中产生的错误(即实际值与预测值之间的误差)定义为:

        本文将以一个输入样本为例进行说明,此时代价函数表示为:

公式1(计算最后一层神经网络产生的错误):

        其中,圆圈中一点  表示Hadamard乘积,用于矩阵或向量之间点对点的乘法运算。公式1的推导过程如下:

推导CNN中的BP误差反向传播算法_第18张图片

公式2(由后往前,计算每一层神经网络产生的错误):

        推导过程:

推导CNN中的BP误差反向传播算法_第19张图片

公式3(计算权重的梯度):

推导CNN中的BP误差反向传播算法_第20张图片

        推导过程:

公式4(计算偏置的梯度):

        推导过程:

推导CNN中的BP误差反向传播算法_第21张图片

4. 反向传播算法伪代码

  1. 输入训练集
  2. 对于训练集中的每个样本x,设置输入层(Input layer)对应的激活值:
    1. 前向传播:

, 

  1. 计算输出层产生的错误:

  1. 反向传播错误:

  1. 使用梯度下降(gradient descent),训练参数:

贴出手写推导:

推导CNN中的BP误差反向传播算法_第22张图片

推导CNN中的BP误差反向传播算法_第23张图片

参考文献:

https://www.cnblogs.com/wlzy/p/7751297.html

https://blog.csdn.net/recsys_ml/article/details/86751401

你可能感兴趣的:(深度学习)