最近在看神经网络中的前向传播算法(FP)和反向传播算法(BP),特地进行总结一下,方便以后理解。
1.基本概念
上图是一张自己画的神经网络的图。假设每一层都添加了偏度单元(即值为1的神经元),用来表示阀值(因为阀值通常是一个常数)。
上图中{x1,x2,x3}{x1,x2,x3}表示输入(假设其中添加了偏度单元,后面不再重复),wij(k)wij(k)表示联结权重,其中ii表示每次输入中的第个元素,jj表示经过联结权重处理之后的输出中的第个元素,kk指明是第层到第(k+1)(k+1)层之间的联结权重。aijaij表示经过联结权重处理后的输出,其中ii表示第层,j表示第jj个输出;表示激活函数,ZijZij表示aijaij经过激活函数处理之后的输出,即Zij=H(aij)Zij=H(aij)。{y1,y2,y3}{y1,y2,y3}表示经过神经网络处理之后最终的输出。
其中
其中ii表示第层,jj表示第个元素,NN表示总输入个数,表示输入,对于输入层{x1,x2,x3}{x1,x2,x3}可以表示为{z11,z12,z13}{z11,z12,z13}。例如上图中有:
a31=w11(2)∗z21+w21(2)∗z22+w31(2)∗z23a31=w11(2)∗z21+w21(2)∗z22+w31(2)∗z23
2.前向传播算法
前向传播算法,顾名思义,是由前往后进行的一个算法。最开始,我们会初始化一组ww的取值,并且选定一个激活函数,为了后面的方便,我们假设选定函数作为函数,其函数形式为:
并且它的导数为H′(x)=H(x)(1−H(x))H′(x)=H(x)(1−H(x))。
有了联结权重ww和激活函数之后,就可以由前往后计算,依次算出所有的aa值,值,最终算出输出层的yy值。这就是前向传播算法。
3.反向传播算法
前面用初始化的联结权重计算的输出层值和实际值肯定会有很大的偏差,我们需要对连接权重进行优化,此时就需要使用反向传播算法。
现在假设经过前向传播算法计算的某个输出值为,表示输出层的第kk个输出,而其实际的值为(训练样本的标签值是已知的,不然怎么训练)。那么误差函数定义如下:
后向传播算法是通过梯度下降的方法对联结权重进行优化,所以需要计算误差函数对联结权重的偏导数。
对于和输出层直接关联的连接权重,即上图中的wij(3)wij(3),简称为w(3)w(3),对其求偏导有:
例如图中,假设仅仅计算y1y1的输出偏差对w11(3)w11(3)的偏导数:
其中因为a41=w11(3)∗z31+w21(3)∗z32+w31(3)∗z33a41=w11(3)∗z31+w21(3)∗z32+w31(3)∗z33,当aa对求偏导数时,仅仅有一项zz和对应的相乘得到aa,所以求导结果便是某个,请结合上面例子理解。
1.对于和输出层直连的wij(k)wij(k)有:
我们假设∂E∂a(k+1)j≡δk+1∂E∂a(k+1)j≡δk+1,并且有∂a(k+1)j∂wij(k)=zkj∂a(k+1)j∂wij(k)=zkj,那么有:
由于zkjzkj在前向传播算法中就已经可以求得,所以重点是求解各层的δδ,以便获得对ww的偏导,用于梯度下降过程中的更新。
2.对于隐藏层的wij(k)wij(k),我们无法直接知道该层该层的损失为多少,需要由后面传播过来,这就是反向传播的原理。这里假设输出层(第k+1层)共有jj个神经元,第k层有个神经元,第(k-1)层有ll个神经元;与输出层相连的为wij(k)wij(k),和输出层最近的隐藏层的ww为,表示该层(k−1k−1层)共有ll个神经元。则输出误差对该层的偏导数为:
又:
即=:
将公式3.2和公式3.3进行对比,可以发现:
所以就可以由后面的δδ推出前面的δδ,即用δk+1δk+1推出δkδk,依次类推,就可以求出每一层对应的δδ,又根据公式3.1,就可以求解出误差对每一层联结权重w(k)w(k)的偏导数,再利用如下公式利用梯度下降法更新权重:
其中m表示第m轮迭代,(m+1)表示第(m+1)轮迭代。
所以反向传播算法就是,先根据输出层的误差,计算出输出层对应的δδ,然后再依次反向往前推出隐藏层的δδ。看公式3.4你会发现,其实第kk层的某个,相当于从第k+1层的δk+1k+1层的δk+1中分配了一部分误差过来,而这个分配的权重,就是前向传播算法中使用的连接权重ww,所以这类似于一个反复的过程。以下图中的为例,误差对它的偏导数为:
又:
可以看出w11(2)w11(2)影响了a31a31,进而影响了z31z31,而z31z31对后面的输出{a41,a42,a43}{a41,a42,a43}都有影响,并且是通过连接权重w1j(3)w1j(3)来实现的;所以当有错误发生时,误差也是通过相应的联结权重w1j(3)w1j(3)反向回去,分配错误。
所以反向传播算法的完整过程如下:
1.初始化联结权重wijwij.
2.对于输入的训练样本,求取每个节点输出和最终输出层的输出值.
3.对输出层求取δk=(yk−tk)∗H′(ak)δk=(yk−tk)∗H′(ak)
4.对于隐藏层求取δj=H′(ak)∗∑kδk∗wjkδj=H′(ak)∗∑kδk∗wjk
5.求取输出误差对于每个权重的梯度:∂En∂wji=δj∗zi∂En∂wji=δj∗zi
6.更新权重:wm+1=wm+α∂E∂wwm+1=wm+α∂E∂w