这段时间又重新来看了看这个算法,发现学过的东西一段时间过去几乎忘完了,还是决定每次学习过一个比较重要的算法就写一个总结,第一次的总结尽量简单,后面再充实,以便查缺补漏。
概念:
BP算法是由学习过程由信号的正向传播与误差的反向传播两个过程组成。由于多层前馈网络的训练经常采用误差反向传播算法,人们也常把将多层前馈网络直接称为BP网络。
给定一个多层前馈神经网络,我们要思考的问题首先是这样一个网络可能含有很多参数如何进行学习,最容易想到的方法梯度下降算法,最小化损失函数;定义损失函数为
,假设含有n个样本每个样本的损失值为
,它是关于真实值和预测值的一个函数,可以交叉熵也可以是均方误差等等。言而总之,最大的问题是这个损失函数对参数w的偏导数如何得到,特别是针对一个复杂的神经网络,下面我们来思考如何解决这个问题.
特别解释下这个z,是我们引入的一个值,代表每个节点还没有经过激活函数进行激活处理的值,也可以把该节点的激活函数看成线性函数的输出,即每个节点的输入为
.拿出神经网络的一部分来看,
高等数学基本公式,这时我们称求解
的过程为正向过程,称
为反向过程。
下面我们看这个正向过程:
每个z对参数w的偏导数即是z这条线的输入,(注意:计算每个input所用到的w应是上次迭代得到值),这样从左到右依次计算便可以得到所有z对w的偏导数,这个过程便称为正向过程。
下面来看看反向过程(这个过程会比正向过程复杂很多):
这个第一项
好说,它就是激活函数的导数,并且z的值在经过正向传播已经拿到,相当于这项就是已知的,即
。问题是
第二项这项,假设a后面只有2个分支流向下一层,那么
的值可以写成如上图中2项的和
,这样又引入这个问题
和
,下面开始思考如何计算这2项的值。我们分开2种情况来讨论
和
如何得到:
第一种情况:
后面直接是该模型的输入再没有其他的隐含层,这是比较理想的,可以直接写成上式。损失函数C是我们定义好的,对
的偏导也可以轻松得到。
第二种情况:
后面还连接多层隐含层,并不是输出层,我们要得到
和
,首先要得到
与
,显然这是一个迭代的过程,直到到输出层(最后一层),这样也许不好计算,我们直接从最后一层开始往前计算。
我们随机拿出一项
,从左到右,依次得到c对z的偏导数。
最后我们看如何将前向过程和后向过程得到的结果如何运用起来:
经过一次前向过程和一次后向过程,将每一层拿到的结果
与对应的
的乘积便是这一层的某一个参数
的偏导数.