前向传播算法和反向传播算法

  最近在看神经网络中的前向传播算法(FP)和反向传播算法(BP),特地进行总结一下,方便以后理解。

1.基本概念

前向传播算法和反向传播算法

  上图是一张自己画的神经网络的图。假设每一层都添加了偏度单元(即值为1的神经元),用来表示阀值(因为阀值通常是一个常数)。

  上图中{x1,x2,x3}表示输入(假设其中添加了偏度单元,后面不再重复),wij(k)表示联结权重,其中i表示每次输入中的第i个元素,j表示经过联结权重处理之后的输出中的第j个元素,k指明是第k层到第(k+1)层之间的联结权重。aij表示经过联结权重处理后的输出,其中i表示第i层,j表示第j个输出;H(x)表示**函数,Zij表示aij经过**函数处理之后的输出,即Zij=H(aij){y1,y2,y3}表示经过神经网络处理之后最终的输出。

  其中

aij=k=1Nwkj(i1)z(i1)k

其中i表示第i层,j表示第j个元素,N表示总输入个数,z表示输入,对于输入层{x1,x2,x3}可以表示为{z11,z12,z13}。例如上图中有:
    a31=w11(2)z21+w21(2)z22+w31(2)z23

2.前向传播算法

  前向传播算法,顾名思义,是由前往后进行的一个算法。最开始,我们会初始化一组w的取值,并且选定一个**函数,为了后面的方便,我们假设选定sigmoid函数作为函数,其函数形式为:

H(x)=ginmoid(x)=11+ex

并且它的导数为H(x)=H(x)(1H(x))

  有了联结权重w和**函数H(x)之后,就可以由前往后计算,依次算出所有的a值,z值,最终算出输出层的y值。这就是前向传播算法。

3.反向传播算法

  前面用初始化的联结权重计算的输出层值和实际值肯定会有很大的偏差,我们需要对连接权重进行优化,此时就需要使用反向传播算法。

  现在假设经过前向传播算法计算的某个输出值为yk,表示输出层的第k个输出,而其实际的值为tk(训练样本的标签值是已知的,不然怎么训练)。那么误差函数定义如下:

E=12k(yktk)2

后向传播算法是通过梯度下降的方法对联结权重进行优化,所以需要计算误差函数对联结权重的偏导数。

前向传播算法和反向传播算法

  对于和输出层直接关联的连接权重,即上图中的wij(3),简称为w(3),对其求偏导有:

Ew(3)=Eykyka4da4dw(3)=(yktk)H(a4d)z3

例如图中,假设仅仅计算y1的输出偏差对w11(3)的偏导数:
Ew11(3)=Ey1y1a41a41w11(3)=(y1t1)H(a41)z31

其中因为a41=w11(3)z31+w21(3)z32+w31(3)z33,当aw求偏导数时,仅仅有一项z和对应的w相乘得到a,所以求导结果便是某个z,请结合上面例子理解。

  1.对于和输出层直连的wij(k)有:

Ewij(k)=Ea(k+1)ja(k+1)jwij(k)

我们假设Ea(k+1)jδk+1,并且有a(k+1)jwij(k)=zkj,那么有:
Ewij(k)=δk+1zkj(3.1)

由于zkj在前向传播算法中就已经可以求得,所以重点是求解各层的δ,以便获得对w的偏导,用于梯度下降过程中w的更新。

  2.对于隐藏层的wij(k),我们无法直接知道该层该层的损失为多少,需要由后面传播过来,这就是反向传播的原理。这里假设输出层(第k+1层)共有j个神经元,第k层有i个神经元,第(k-1)层有l个神经元;与输出层相连的wwij(k),和输出层最近的隐藏层的wwli(k1),表示该层(k1层)共有l个神经元。则输出误差对该层w的偏导数为:

Ewli(k1)=Eakiakiwli(k1)=δkz(k1)i(3.2)

又:
Ewli(k1)=jEa(k+1)ja(k+1)jzkizkiakiakiwli(k1)

即=:
Ewli(k1)=jδk+1wij(k)H(a(k+1)j)z(k1)i(3.3)

将公式3.2和公式3.3进行对比,可以发现:
δk=H(a(k+1)j)jδk+1wij(k)(3.4)

所以就可以由后面的δ推出前面的δ,即用δk+1推出δk,依次类推,就可以求出每一层对应的δ,又根据公式3.1,就可以求解出误差对每一层联结权重w(k)的偏导数,再利用如下公式利用梯度下降法更新权重:
wm+1=wm+αEw

其中m表示第m轮迭代,(m+1)表示第(m+1)轮迭代。

  所以反向传播算法就是,先根据输出层的误差,计算出输出层对应的δ,然后再依次反向往前推出隐藏层的δ看公式3.4你会发现,其实第k层的某个δk,相当于从第k+1δk+1中分配了一部分误差过来,而这个分配的权重,就是前向传播算法中使用的连接权重w,所以这类似于一个反复的过程。以下图中的w11(2)为例,误差对它的偏导数为:

Ew11(2)=Ea31a31w11(2)=δ1kz21

又:
δ1k=H(a31)j=13δjk+1w1j(k)

可以看出w11(2)影响了a31,进而影响了z31,而z31对后面的输出{a41,a42,a43}都有影响,并且是通过连接权重w1j(3)来实现的;所以当有错误发生时,误差也是通过相应的联结权重w1j(3)反向回去,分配错误。

前向传播算法和反向传播算法

所以反向传播算法的完整过程如下:
1.初始化联结权重wij.
2.对于输入的训练样本,求取每个节点输出和最终输出层的输出值.
3.对输出层求取δk=(yktk)H(ak)
4.对于隐藏层求取δj=H(ak)kδkwjk
5.求取输出误差对于每个权重的梯度:Enwji=δjzi
6.更新权重:wm+1=wm+αEw