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