神经网络和深度学习之——误差反向传播算法

在讲解误差反向传播算法之前,我们来回顾一下信号在神经网络中的流动过程。请细细体会,当输入向量\(X\)输入感知器时,第一次初始化权重向量\(W\)是随机组成的,也可以理解成我们任意设置了初始值,并和输入做点积运算,然后模型通过权重更新公式来计算新的权重值,更新后的权重值又接着和输入相互作用,如此迭代多次,得到最终的权重。

信号向前传播,权重的更新反向传播,是这样吗?
是的,你的直觉没错,确实是反向传播。

1. 前馈的实质

反向传播这个术语经常被误解为用于多层神经网络的整个学习算法。实际上,反向传播仅指用于计算梯度的方法,而另一种算法,例如随机梯度下降,使用该梯度来进行学习。此外,反向传播经常被误解为仅适用于多层神经网络,但是原则上它可以计算任何函数的导数(对于一些函数,正确的响应是报告函数的导数是未定义的)。

1.1 初始化权重和输入信号

不如我们还是使用上一节矩阵乘法的列子来可视化的讲解,这样有助于我们去理解反向传播。假设有如下三层网络,输入层、隐藏层、输出层,现有一组信号\(X\)输入网络,输入层和隐藏层的链接权重\(W_{input-hidden}\)和隐藏层与输出层之间的权重\(W_{hidden-ouput}\)我们随机初始化。为了清晰效果,我们仅标注了几个权重,第一个输入节点和中间隐藏层第一个节点之间的权重为\(w_{1,1}\) = 0.9,正如上图中的神经网络所示。同样,你可以看到输入的第二节点和隐藏层的第二节点之间的链接的权重为\(w_{2,2}\) = 0.8,隐藏层第三个节点和输出层第二个节点之间链接的权重为\(w_{3,2}\) = 0.2......此命名方式前面解释过,标注之后在分析反向传播时可帮助我们理解。

图5.2.1

输入矩阵:
\[X=\begin{bmatrix}
0.9\\
0.1\\
0.8\end{bmatrix}\]
输入层和隐藏层之间的连接权重:
\[W_{input-hidden}=\begin{bmatrix}
0.9 & 0.3&0.4 \\
0.2& 0.8&0.2 \\
0.8& 0.1&0.9
\end{bmatrix}\]
隐藏层和输出层之间的连接权重:
\[W_{hidden-output}=\begin{bmatrix}
0.3 & 0.7&0.5 \\
0.6& 0.5&0.2 \\
\end{bmatrix}\]

1.2 输入层到隐藏层

初始值定义好以后,开始计算输入到隐藏层的组合调节输入值\(X_{hidden}\)。
\[X_{hidden} = W_{input_hidden} \cdot X\]
此处的矩阵乘法还是交由计算机来执行,计算出的答案如下:
\[X_{hidden} =\begin{bmatrix}
0.9 & 0.3&0.4 \\
0.2& 0.8&0.2 \\
0.8& 0.1&0.9
\end{bmatrix} \cdot \begin{bmatrix}
0.9\\
0.1\\
0.8\end{bmatrix}\]
\[X_{hidden} =\begin{bmatrix}
1.16\\
0.42\\
0.62\end{bmatrix}\]
别着急往下走,让我们来整理一下网络的信号流动情况,\(X_{hidden}\)作为第一层的输出,第二层的输入已经正确求解,现在它准备进入隐藏层。

图5.2.2

\(X_{hidden}\)一进入隐藏层,我们就对\(X_{hidden}\)的这些节点使用S激活函数,使其变得更加自然,并且我们把经过S函数处理后的这组输出信号命名为\(O_{hidden}\)。
\[O_{hidden}=Sigmoid(X_{hidden})=Sigmoid(\begin{bmatrix}
1.16\\
0.42\\
0.62\end{bmatrix})=\begin{bmatrix}
0.761\\
0.603\\
0.650\end{bmatrix}\]

1.3 隐藏层到输出层

让我们再次可视化这些输入到第二层隐藏层的组合调节输入。现在信号已经向前流动到了第二层,下一步当然是计算第三层的输出信号\(X_{output}\)(还未经过S函数的输出信号),计算的方法和前面一样,没有什么区别,不管我们的网络是几层,这种方法都适用。

图5.2.3

于是,我们有:
\[X_{output}=W_{hidden-output} \cdot O_{hidden}=\begin{bmatrix}
0.3 & 0.7&0.5 \\
0.6& 0.5&0.2 \\
\end{bmatrix} \cdot
\begin{bmatrix}
0.761\\
0.603\\
0.650\end{bmatrix}=
\begin{bmatrix}
0.975\\
0.888\\
\end{bmatrix}\]
现在,更新示意图展示我们的进展,从初始输入信号开始,一层层往前流动的前馈信号,最后得到了最终层的组合输入信号。

图5.2.4

最后一步当然是使用S函数得到最后一层的输出,用\(O_{ouput}\)表示:
\[O_{ouput}=Sigmoid(X_{output})=Sigmoid(
\begin{bmatrix}
0.975\\
0.888\\
\end{bmatrix}
)=
\begin{bmatrix}
0.726\\
0.708\\
\end{bmatrix}
\]

前馈信号的流动到此为止,任务完成!通过可视化的图形,前馈神经网络中信号流入方向,变化等情况我们用网络图最后形展示出来。

图5.2.5

毫无疑问,整个过程就是前馈的意思,信号一直向前流动,最后输出,中间任意层没有信号反回上一级网络。
下一步我们会将神经网络的输出值与训练样本中的输出值进行比较,计算出误差,并使用这个误差值来反向调节权重值。

2. 反向传播的实质

上一步我们得到了前向传播的输出值为[0.726, 0.708],这个值与真实值[0.01,0.99]还存在一定差距,不过没关系,反向传播误差会帮助我们更新权值,缩小这些误差,让我们来实验一下。

2.1 计算总误差

因为总误差为:\(E=\sum(target-O_{output})^2=E_{1}+E_{2}=(target1-O_{output1})^2+(target2-O_{output2})^2\)
由于我们的实验网络有两个输出,因此总误差为两个输出误差之和。
第一个误差:
\[E_{1}=(target_{1}-O_{output1})^2=(0.726-0.01)^2=0.512656\]
第二个误差:
\[E_{2}=(target_{2}-O_{output2})^2=(0.706-0.99)^2=0.079524\]
总误差:
\[E=E_{1}+E_{2}=0.512656+0.079524=0.59218\]

2.2 隐藏层和输出层的权重更新

对于隐藏层和输出层之间的权重\(w_{1,1}\)来说,如果我们想知道\(w_{1,1}\)对整体误差产生了多少影响,可以用总误差对\(w_{1,1}\)求偏导,该偏导可以使用链式法则表示。
\[\frac{\partial E}{\partial w_{1,1}}=\frac{\partial E}{\partial O_{ouput1}} \cdot \frac{\partial O_{ouput1}}{\partial X_{ouput1}} \cdot \frac{\partial X_{ouput1}}{\partial w_{1,1}}\]
如图所示的反向传播示意图,并结合求导表达式,可以帮助我们更清楚的了解误差是怎么反向传播的。

图5.2.6

下面我们对以上求导式子中的每个小式子分别求值
1、首先是计算$\frac{\partial E}{\partial O_{ouput1}} $
\[E=(target_{1}-O_{output1})^2+(target2-O_{output2})^2\]
\[\frac{\partial E}{\partial O_{ouput1}}=-2(target_{1}-O_{output1})+0=-2(0.01-0.726)=1.432\]
2、再来计算\(\frac{\partial O_{ouput1}}{\partial X_{ouput1}}\)
\[O_{ouput1}=\frac{1}{1+e^{-X_{ouput1}}}\]
\[\frac{\partial O_{ouput1}}{\partial X_{ouput1}}=O_{ouput1}(1-O_{ouput1})=0.726(1-0.726)=0.198924\]
3、最后计算\(\frac{\partial X_{ouput1}}{\partial w_{1,1}}\)
\[X_{ouput1}=w_{1,1} \cdot O_{hidden1}+w_{2,1} \cdot O_{hidden2}+w_{3,1} \cdot O_{hidden3}\]
\[\frac{\partial X_{ouput1}}{\partial w_{1,1}}=O_{hidden1}=0.761\]
所以:
\[\frac{\partial E}{\partial w_{1,1}}=\frac{\partial E}{\partial O_{ouput1}} \cdot \frac{\partial O_{ouput1}}{\partial X_{ouput1}} \cdot \frac{\partial X_{ouput1}}{\partial w_{1,1}}=1.432 \times 0.198924 \times 0.761=0.216777826848\]
我们取学习率\(\eta=0.5\),利用公式\[{w_{1,1}}_{new}=w_{1,1}-\eta \frac{\partial E}{\partial w_{1,1}}\]
得到更新后的\({w_{1,1}}_{new}\)为:\[{w_{1,1}}_{new}=0.3-0.5 \times 0.216777826848=0.191611086576\]
综上所述,也可以这样去计算\(\frac{\partial E}{\partial w_{1,1}}\):
\[\frac{\partial E}{\partial w_{1,1}}=-2(target_{1}-O_{output1}) \cdot O_{ouput1}(1-O_{ouput1}) \cdot O_{hidden1}\]
因此,改变上述式子的变量可以更新\(w_{2,1}\),\(w_{2,1}\),\(w_{1,2}\),\(w_{2,2}\),\(w_{3,2}\)等权重值。

2.3 输入层和隐藏层的权重更新

计算输入层和隐藏层之间的权重和上面的方法一样,但使用误差对权重进行求导时,该误差应使用两个输出口的总误差,而不是一个输入口的误差。我们仍然用图形化的方式来展示:

图5.2.7

如上图所示,对于隐藏层和输出层之间的权重\(w_{1,1}\)来说,如果我们想知道\(w_{1,1}\)对整体误差产生了多少影响,可以用总误差对\(w_{1,1}\)求偏导,该偏导可以使用链式法则表示。
\[\frac{\partial E}{\partial w_{1,1}}=\frac{\partial E}{\partial O_{hidden1}} \cdot \frac{\partial O_{hidden1}}{\partial X_{hidden1}} \cdot \frac{\partial X_{hidden1}}{\partial w_{1,1}}\]
我们还是一个一个的计算上面的式子。
1、首先计算\(\frac{\partial E}{\partial O_{hidden1}}\)
对于隐藏层的输出,它会接受来自两个输出传来的误差,所以:
\[\frac{\partial E}{\partial O_{hidden1}}=\frac{\partial E_{1}}{\partial O_{hidden1}}+\frac{\partial E_{2}}{\partial O_{hidden1}}\]
\[\because \frac{\partial E_{1}}{\partial O_{hidden1}}=\frac{\partial E_{1}}{\partial X_{output1}} \cdot \frac{\partial X_{output1}}{\partial O_{hidden1}}\]
\[\because \frac{\partial E_{1}}{\partial X_{output1}}=\frac{\partial E_{1}}{\partial O_{output1}} \cdot \frac{\partial O_{output1}}{\partial X_{output1}}=1.437 \times 0.198924=0.285853788\]
下面的\(w'_{j,k}\)为隐藏层和输出层的链接权重
\[X_{output1}=w'_{1,1} \cdot O_{hidden1}+w'_{2,1} \cdot O_{hidden2}+w'_{3,1} \cdot O_{hidden3}\]
\[\therefore \frac{\partial X_{output1}}{\partial O_{hidden1}}=w'_{1,1}=0.3\]
\[\therefore \frac{\partial E_{1}}{\partial O_{hidden1}}=\frac{\partial E_{1}}{\partial X_{output1}} \cdot \frac{\partial X_{output1}}{\partial O_{hidden1}}=0.285853788 \times 0.3=0.0857561364\]
再来计算\(\frac {\partial E_{2}}{\partial O_{hidden1}}\)
\[\because \frac{\partial E_{2}}{\partial O_{hidden1}}=\frac{\partial E_{2}}{\partial X_{output2}} \cdot \frac{\partial X_{output2}}{\partial O_{hidden1}}\]
\[\because \frac{\partial E_{2}}{\partial X_{output2}}=\frac{\partial E_{2}}{\partial O_{output2}} \cdot \frac{\partial O_{output2}}{\partial X_{output2}}\]
\[\because X_{output2}=w'_{1,2} \cdot O_{hidden1}+w'_{2,2} \cdot O_{hidden2}+w'_{3,2} \cdot O_{hidden3}\]
\[\therefore \frac{\partial X_{output2}}{\partial O_{hidden1}}=w'_{1,2}\]
\[\therefore \frac{\partial E_{2}}{\partial O_{hidden1}}=\frac{\partial E_{2}}{\partial X_{output2}} \cdot \frac{\partial X_{output2}}{\partial O_{hidden1}}=-0.116599104 \times 0.2=-0.0233198208\]
最后得到
\[\frac{\partial E}{\partial O_{hidden1}}=\frac{\partial E_{1}}{\partial O_{hidden1}}+\frac{\partial E_{2}}{\partial O_{hidden1}}=0.0857561364-0.0233198208=0.0624363156\]
2、再计算\(\frac{\partial O_{hidden1}}{\partial X_{hidden1}}\)
\[\because O_{hidden1}=\frac{1}{1+e^{-X_{hidden1}}}\]
\[\frac{\partial O_{hidden1}}{\partial X_{hidden1}}=O_{hidden1}(1-O_{hidden1})=0.761(1-0.761)=0.181879\]
3、最后计算\(\frac{\partial X_{hidden1}}{\partial w_{1,1}}\)
\[\because X_{hidden1}=w_{1,1} \cdot X_{1}+w_{2,1} \cdot X_{2}+w_{3,1} \cdot X_{3}\]
\[\therefore \frac{\partial X_{hidden1}}{\partial w_{1,1}}=X1=0.9\]
\[\frac{\partial E}{\partial w_{1,1}}=\frac{\partial E}{\partial O_{hidden1}} \cdot \frac{\partial O_{hidden1}}{\partial X_{hidden1}} \cdot \frac{\partial X_{hidden1}}{\partial w_{1,1}}=0.0624363156 \times 0.181879 \times 0.9=0.01022026918051116\]
我们取学习率\(\eta=0.5\),利用公式\[{w_{1,1}}_{new}=w_{1,1}-\eta \frac{\partial E}{\partial w_{1,1}}\]
得到更新后的\({w_{1,1}}_{new}\)为:\[{w_{1,1}}_{new}=0.9-0.5 \times 0.01022026918051116=0.191611086576=0.89488986540974442\]
同样的方法可以更新其他权重的值。这样我们就完成了误差反向传播算法的介绍,在实际训练中我们通过这种方法不停的迭代,直到总误差接近0为止,得到的最优权重保留下来,训练完成。

参考文献:
1、《Python神经网络编程》
2、https://www.cnblogs.com/charlotte77/p/5629865.html

原文地址:https://www.cnblogs.com/vipyoumay/p/9334961.html

时间: 2024-10-10 04:38:32

神经网络和深度学习之——误差反向传播算法的相关文章

循环神经网络(RNN)模型与前向反向传播算法

在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系.今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Recurrent Neural Networks ,以下简称RNN),它广泛的用于自然语言处理中的语音识别,手写书别以及机器翻译等领域. 1. RNN概述 在前面讲到的DNN和CNN中,训练样本的输入和输出是比较的确定的.但是有一类问题DNN和CNN不好解决,就是训练样本输入是连续的序列,且序列的长短不

【神经网络和深度学习】笔记 - 第二章 反向传播算法

上一章中我们遗留了一个问题,就是在神经网络的学习过程中,在更新参数的时候,如何去计算损失函数关于参数的梯度.这一章,我们将会学到一种快速的计算梯度的算法:反向传播算法. 这一章相较于后面的章节涉及到的数学知识比较多,如果阅读上有点吃力的话也可以完全跳过这一章,把反向传播当成一个计算梯度的黑盒即可,但是学习这些数学知识可以帮助我们更深入的理解神经网络. 反向传播算法的核心目的是对于神经网络中的任何weight或bias计算损失函数$C$关于它们的偏导数$\frac{\partial C}{\par

《神经网络和深度学习》系列文章十五:反向传播算法

出处: Michael Nielsen的<Neural Network and Deep Learning>,点击末尾“阅读原文”即可查看英文原文. 本节译者:哈工大SCIR本科生 王宇轩 声明:如需转载请联系[email protected],未经授权不得转载. 使用神经网络识别手写数字 反向传播算法是如何工作的 热身:一个基于矩阵的快速计算神经网络输出的方法 关于损失函数的两个假设 Hadamard积 反向传播背后的四个基本等式 四个基本等式的证明(选读) 反向传播算法 反向传播算法代码

《神经网络和深度学习》系列文章十六:反向传播算法代码

出处: Michael Nielsen的<Neural Network and Deep Learning>,点击末尾“阅读原文”即可查看英文原文. 本节译者:哈工大SCIR硕士生 李盛秋 声明:如需转载请联系[email protected],未经授权不得转载. 使用神经网络识别手写数字 反向传播算法是如何工作的 热身:一个基于矩阵的快速计算神经网络输出的方法 关于损失函数的两个假设 Hadamard积 反向传播背后的四个基本等式 四个基本等式的证明(选读) 反向传播算法 反向传播算法代码

深度学习基础--神经网络--BP反向传播算法

BP算法: 1.是一种有监督学习算法,常被用来训练多层感知机.  2.要求每个人工神经元(即节点)所使用的激励函数必须可微. (激励函数:单个神经元的输入与输出之间的函数关系叫做激励函数.) (假如不使用激励函数,神经网络中的每层都只是做简单的线性变换,多层输入叠加后也还是线性变换.因为线性模型的表达能力不够,激励函数可以引入非线性因素) 下面两幅图分别为:无激励函数的神经网络和激励函数的神经网络 如图所示,加入非线性激活函数后的差异:上图为用线性组合逼近平滑曲线来分割平面,下图为使用平滑的曲线

python: 深度学习-误差反向传播法

ReLU层的设计: ReLU函数: 导数: class Relu: def __init__(self): self.mask=None def forword(self,x): self.mask=(x<0) #变量mask是由True/False构成的Numpy数组 out=x.copy() out[self.mask]=0 return out def backward(self,dout): dout[self.mask]=0 dx=dout return dx Sigmoid层的设计:

编写C语言版本的卷积神经网络CNN之三:CNN的误差反向传播过程

原创文章 转载请注册来源http://blog.csdn.net/tostq 上一节我们介绍了卷积神经网络的前向传播过程,这一节我们重点介绍反向传播过程,反向传播过程反映神经网络的学习训练过程. 误差反向传播方法是神经网络学习的基础,网络上已经有许多相关的内容了,不过关于卷积网络的误差反向传递的公式推导却比较少,而且也不是很清晰,本文将会详细推导这个过程,虽然内容很复杂,但却值得学习. 首先我们需要知道的是误差反向传播的学习方法,实际是梯度下降法求最小误差的权重过程.当然我们的目的是求误差能量关

CS231n 2017 学习笔记04——反向传播与神经网络 Backpropagation and Neural Networks

本博客内容来自 Stanford University CS231N 2017 Lecture 4 - Backpropagation and Neural Networks 课程官网:http://cs231n.stanford.edu/syllabus.html 从课程官网可以查询到更详细的信息,查看视频需要FQ上YouTube,如果不能FQ或觉得比较麻烦,也可以从我给出的百度云链接中下载. 课程视频&讲义下载:http://pan.baidu.com/s/1gfu51KJ 计算图 Comp

深度学习之反向传播算法

直观理解反向传播 反向传播算法是用来求那个复杂到爆的梯度的. 上一集中提到一点,13000维的梯度向量是难以想象的.换个思路,梯度向量每一项的大小,是在说代价函数对每个参数有多敏感. 如上图,我们可以这样里理解,第一个权重对代价函数的影响是是第二个的32倍. 我们来考虑一个还没有被训练好的网络.我们并不能直接改动这些激活值,只能改变权重和偏置值.但记住,我们想要输出层出现怎样的变动,还是有用的. 我们希望图像的最后分类结果是2,我们期望第3个输出值变大,其余输出值变小,并且变动的大小应该与现在值