BP神经网络原理简单介绍以及公式推导
标签(空格分隔): 神经网络
BP神经网络简单介绍
在60年代提出了神经网络概念之后,由于感知机等神经网络无法处理线性不可分问题(比如异或问题)导致人们对神经网络的兴趣大减,认为神经网络的能力有限,只能处理线性可分问题。之后,有人提出了多层神经网络的想法,用于解决异或问题。下面就是用一个两层的神经网络解决异或问题具体方法:
y = ψ ( − 2 v 1 + v 2 − 0.5 ) v 1 = ψ ( x 1 + x 2 − 1.5 ) v 2 = ψ ( x 1 + x 2 − 0.5 ) ψ ( x ) = { 1 , 0 , x > 0 x ≤ 0
y
是网络的输出,
v 1 和
v 2
是隐藏层的两个神经元,
x 1
和
x 2
是输入。下面的表格验证了这个两层的网络可以处理异或问题。
x 1
x 2
v 1
v 2
y
0
0
0
0
0
1
0
0
1
1
0
1
0
1
1
1
1
1
1
0
虽然这个两层网络能够处理异或问题,但是当时并没有引起太大的关注,直到80年代, Back Propagation(BP)神经网络的提出,才使得神经网络又重新回到了人们的视线中。
这里,主要想通过一个三层的BP神经网络来说明其原理和公式推导。
公式推导
我们首先需要对整个网络进行数学建模,然后进行学习算法的描述,我们列举分量和矩阵两种不同形式的求导方式,分量形式刚开始看比较繁琐但是比较简单,矩阵形式结构简单但是涉及到矩阵求导,求导的相关知识需要比较熟悉。
网络的数学描述
首先我们先说一说激活函数的选择,在感知机中,选择的是非线性的带阈值的激活函数,在BP网络中,通常选择的是Sigmoid函数,这类函数的导数有一个很好的性质:自身相关。比如常见的
f ( x ) = 1 1 + e − x
其导数为
f ′ ( x ) = f ( x ) ( 1 − f ( x ) )
,证明也不难,就是求导,然后进行拼凑就可以了。
接下来我们对这个三层的网络进行数学抽象,可以的话请一个一个的手写一遍,这样能够加深理解它们之间的关系。先是各层的输入和输出变量的定义
input vector : hiden vector : output vector : Y ( 0 ) = [ x 1 , x 2 , ⋯ , x 6 ] T = [ a 1 ( 0 ) , a 2 ( 0 ) , a 3 ( 0 ) , a 4 ( 0 ) , a 5 ( 0 ) , a 6 ( 0 ) ] T Y ( 1 ) = [ a 1 ( 1 ) , a 2 ( 1 ) , a 3 ( 1 ) , a 4 ( 1 ) ] T Y ( 2 ) = [ a 1 ( 2 ) , a 2 ( 2 ) , a 3 ( 2 ) ] T Y ( 3 ) = [ a 1 ( 3 ) , a 2 ( 3 ) ] T
然后,我们一层一层的进行数学描述。
First hiden layer n e t ( 1 ) l = ∑ k = 1 6 W 1 l k y ( 0 ) k , ( 1 ≤ l ≤ 4 ) n e t ( 1 ) = W ( 1 ) Y ( 0 ) n e t ( 1 ) = [ n e t ( 1 ) 1 , n e t ( 1 ) 2 , n e t ( 1 ) 3 , n e t ( 1 ) 4 ] T W ( 1 ) = ⎡ ⎣ ⎢ ⎢ ⎢ W ( 1 ) 11 ⋮ W ( 1 ) 41 ⋯ ⋯ ⋯ W ( 1 ) 16 ⋮ W ( 1 ) 46 ⎤ ⎦ ⎥ ⎥ ⎥ output: Y ( 1 ) = [ Y ( 1 ) 1 , ⋯ , Y ( 1 ) 4 ] T , where Y ( 1 ) = f ( 1 ) ( n e t ( 1 ) )
n e t ( 1 )
的输入是
Y ( 0 )
,利用
W ( 1 )
得到输出
Y ( 1 )
。在第一层中,
k = 6
是因为输入层
Y ( 0 )
有六个输入,
1 ≤ l ≤ 4
是因为第一层中有4个神经元,同理第二层和第三层。请注意
n e t ( 1 )
的和
W ( 1 )
的维数,想一想为什么会这样,你这么聪明一定能想清楚的(输入和输出的个数)。接下来两层与第一层类似,重点在思考清楚
W ( n )
和
n e t ( n )
的维数,就能对BP网络结构有一个大致的认识。还是希望各位能手抄一遍。
Second hiden layer n e t ( 2 ) l = ∑ k = 1 4 W 2 l k y ( 1 ) k , ( 1 ≤ l ≤ 3 ) n e t ( 2 ) = W ( 2 ) Y ( 1 ) n e t ( 2 ) = [ n e t ( 2 ) 1 , n e t ( 2 ) 2 , n e t ( 2 ) 3 ] T W ( 2 ) = ⎡ ⎣ ⎢ ⎢ ⎢ W ( 2 ) 11 ⋮ W ( 2 ) 31 ⋯ ⋯ ⋯ W ( 2 ) 14 ⋮ W ( 2 ) 44 ⎤ ⎦ ⎥ ⎥ ⎥ output: Y ( 2 ) = [ Y ( 2 ) 1 , ⋯ , Y ( 2 ) 3 ] T , where Y ( 2 ) = f ( 2 ) ( n e t ( 2 ) )
Third hiden layer n e t ( 3 ) l = ∑ k = 1 3 W 3 l k y ( 2 ) k , ( 1 ≤ l ≤ 2 ) n e t ( 3 ) = W ( 3 ) Y ( 2 ) n e t ( 3 ) = [ n e t ( 3 ) 1 , n e t ( 3 ) 2 ] T W ( 3 ) = ⎡ ⎣ ⎢ ⎢ ⎢ W ( 3 ) 11 ⋮ W ( 3 ) 21 ⋯ ⋯ ⋯ W ( 3 ) 13 ⋮ W ( 3 ) 23 ⎤ ⎦ ⎥ ⎥ ⎥ output: Y ( 3 ) = [ Y ( 3 ) 1 , Y ( 3 ) 2 ] T , where Y ( 3 ) = f ( 3 ) ( n e t ( 3 ) )
我们总结一下:
1. 一个
n e t
包含了一组输入,一组权重,一组输出。对于
n e t ( n )
,它的输入是
Y ( n − 1 )
,利用权重
W ( n )
得到输出
Y ( n )
,即
n e t ( n ) = W ( n ) Y ( n − 1 )
2.
W ( n ) ∈ R q × p
,q是第n层神经元的个数,p是n-1层神经元的个数也就是当前层的输入个数。
公式推导(分量形式) 我们的目标是希望通过调整
W
使得输出和目标有最小的误差,也就是最小二乘的思想
Least-Squared Error: E = 1 2 ∑ l = 1 2 ( T l − Y ( 3 ) l ) 2 = 1 2 ∑ l = 1 2 ( δ ( 3 ) l ) 2
其中,
δ l = ( T l − Y ( 3 ) l )
。因为BP网络是反馈式网络,所以在更新权值时是从后向前更新的,所以首先更新的是第三层的权值。
那么
E
和
W ( 3 ) 有什么关系呢?通过上面的对网络的数学描述,我们知道
Y ( 3 ) = f ( 3 ) ( n e t ( 3 ) ) = W ( 3 ) Y ( 2 ) 分 量 : Y ( 3 ) 1 Y ( 3 ) 2 = f ( 3 ) ( n e t ( 3 ) 1 ) = f ( 3 ) ( n e t ( 3 ) 2 ) = ∑ k = 1 3 W 3 1 k Y ( 2 ) k = ∑ k = 1 3 W 3 2 k Y ( 2 ) k
所以有:
E = 1 2 ∑ l = 1 2 ( T l − Y ( 3 ) l ) 2 = 1 2 ∑ l = 1 2 ( T l − f ( 3 ) ( n e t ( 3 ) l ) ) 2 = 1 2 ∑ l = 1 2 ( T l − ∑ k = 1 3 W 3 l k Y ( 2 ) k ) 2
因此
E
和
W 求导关系为:
∂ E ∂ W ( 3 ) l k = ∂ E ∂ Y ( 3 ) l ∂ Y ( 3 ) l ∂ n e t ( 3 ) l ∂ n e t ( 3 ) l ∂ W ( 3 ) l k
其中:
∂ E ∂ Y ( 3 ) l = ( Y l − T l ) = − δ l (1)
∂ Y ( 3 ) l ∂ n e t ( 3 ) l = f ′ ( 3 ) ( n e t ( 3 ) l ) (2)
∂ n e t ( 3 ) l ∂ W ( 3 ) l k = Y ( 2 ) k (3)
根据(1)、(2)、(3)可得
∂ E ∂ W ( 3 ) l k = − δ l f ′ ( 3 ) ( n e t ( 3 ) l ) Y ( 2 ) k
我们已经求出单个分量的求导结果,那么对于整个
W ( 3 )
∂ E W ( 3 ) = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ∂ E W ( 3 ) 11 ∂ E W ( 3 ) 21 ∂ E W ( 3 ) 12 ∂ E W ( 3 ) 22 ∂ E W ( 3 ) 13 ∂ E W ( 3 ) 23 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ = − ⎡ ⎣ δ 1 f ′ ( 3 ) ( n e t ( 3 ) 1 ) δ 2 f ′ ( 3 ) ( n e t ( 3 ) 2 ) ⎤ ⎦ [ Y ( 2 ) 1 Y ( 2 ) 2 Y ( 2 ) 3 ] = − S ( 3 ) Y ( 2 ) T
其中
S ( 3 ) = − ⎡ ⎣ f ′ ( 3 ) ( n e t ( 3 ) l ) 0 0 f ′ ( 3 ) ( n e t ( 3 ) 2 ) ⎤ ⎦ ⎡ ⎣ δ ( 3 ) 1 δ ( 3 ) 2 ⎤ ⎦ = F ′ ( 3 ) ( n e t ( 3 ) ) δ = − ∂ E ∂ n e t ( 3 )
至于
∂ E ∂ n e t ( 3 )
怎么求,在后面的矩阵形式分析部分将会说明。
上面已经说明对第三层权值的更新过程,对于第二层权值的更新,最重要的还是理解
E
和
W ( 2 ) 之间的关系。
上面只给出第三层的详细求导,第二层和第一层请看老师给的课件(公式编辑太费时间了)下面给出老师课件里的求导,从第三层到第一层,有些地方有点小错误,不过不影响理解。
公式求导(矩阵形式) 下面我们用矩阵的形式进行求导,涉及到矩阵求导的相关知识,这里有一些参考资料,希望能够帮到大家: 1. 矩阵求导术(上) 2. 闲话矩阵求导 3. 矩阵求导与迹 4. 向量內积、矩阵內积 首先能量函数改写成:
Least-Squared Error: E = 1 2 ∥ T − Y ∥ 2 2
第三层更新: 先算
∂ E ∂ Y ( 3 )
E d E 所 以 : = 1 2 ( T − Y ) T ( T − Y ) = 1 2 ( T T T − 2 T T Y + Y T Y ) = 1 2 t r ( − 2 T T d Y + d Y T Y + Y T d Y ) = 1 2 t r ( − 2 T T d Y ) + t r ( d Y T Y ) + t r ( Y T d Y ) = 1 2 t r ( − 2 T T d Y ) + t r ( Y T d Y ) + t r ( Y T d Y ) = 1 2 ( − 2 T T + 2 Y T ) d X = t r ( ( Y − T ) T d Y ) ∂ E ∂ Y ( 3 ) = Y − T = − δ
再算
∂ E ∂ n e t ( 3 )
d E 所 以 : 设 : = t r ( ( ∂ E ∂ Y ) T d Y ) = t r ( ( ∂ E ∂ Y ) T d f ( 3 ) ( n e t ( 3 ) ) ) = t r ( ( ∂ E ∂ Y ) T f ′ ( 3 ) ( n e t ( 3 ) ) ⊙ d ( n e t ( 3 ) ) ) = t r ( ( ∂ E ∂ Y ⊙ f ′ ( 3 ) ( n e t ( 3 ) ) ) T d ( n e t ( 3 ) ) ) = t r ( ( − δ ⊙ f ′ ( 3 ) ( n e t ( 3 ) ) ) T d ( n e t ( 3 ) ) ) ∂ E ∂ n e t ( 3 ) = − δ ⊙ f ′ ( 3 ) ( n e t ( 3 ) ) S ( 3 ) = δ ⊙ f ′ ( 3 ) ( n e t ( 3 ) ) = − ∂ E ∂ n e t ( 3 )
最后算
∂ E ∂ W ( 3 )
d E 所 以 : ∂ E ∂ W ( 3 ) = t r ( ( ∂ E ∂ n e t ( 3 ) ) T d ( n e t ( 3 ) ) ) = t r ( ( ∂ E ∂ n e t ( 3 ) ) T d ( W ( 3 ) Y ( 2 ) ) ) = t r ( Y ( 2 ) ( ∂ E ∂ n e t ( 3 ) ) T d ( W ( 3 ) ) ) = ∂ E ∂ n e t ( 3 ) Y ( 2 ) T = − δ ⊙ f ′ ( 3 ) ( n e t ( 3 ) ) Y ( 2 ) T = − S ( 3 ) Y ( 2 ) T
第二层更新: 先求
∂ E ∂ Y ( 2 )
d E 所 以 : = t r ( ( ∂ E ∂ n e t ( 3 ) ) T d ( n e t ( 3 ) ) ) = t r ( ( ∂ E ∂ n e t ( 3 ) ) T d ( W ( 3 ) Y ( 2 ) ) ) = t r ( ( ∂ E ∂ n e t ( 3 ) ) T W ( 3 ) d ( Y ( 2 ) ) ) ∂ E ∂ Y ( 2 ) = W ( 3 ) T ∂ E ∂ n e t ( 3 )
再求
∂ E ∂ n e t ( 2 )
d E 所 以 : 设 : = t r ( ( ∂ E ∂ Y ( 2 ) ) T d Y ( 2 ) ) = t r ( ( ∂ E ∂ Y ( 2 ) ) T f ′ ( 2 ) ( n e t ( 2 ) ) ⊙ d ( n e t ( 2 ) ) ) = t r ( ( ∂ E ∂ Y ( 2 ) ⊙ f ′ ( 2 ) ( n e t ( 2 ) ) ) T d ( n e t ( 2 ) ) ) ∂ E ∂ n e t ( 2 ) = ∂ E ∂ Y ( 2 ) ⊙ f ′ ( 2 ) ( n e t ( 2 ) ) = W ( 3 ) T ∂ E ∂ n e t ( 3 ) ⊙ f ′ ( 2 ) ( n e t ( 2 ) ) = − W ( 3 ) T S ( 3 ) ⊙ f ′ ( 2 ) ( n e t ( 2 ) ) S ( 2 ) = W ( 3 ) T S ( 3 ) ⊙ f ′ ( 2 ) ( n e t ( 2 ) ) = − ∂ E ∂ n e t ( 2 )
最后求
∂ E ∂ W ( 2 )
d E 所 以 : = t r ( ( ∂ E ∂ n e t ( 2 ) ) T d ( n e t ( 2 ) ) ) = t r ( ( ∂ E ∂ n e t ( 2 ) ) T d ( W ( 2 ) Y ( 1 ) ) ) = t r ( Y ( 1 ) ( ∂ E ∂ n e t ( 2 ) ) T d ( W ( 2 ) ) ) ∂ E ∂ W ( 2 ) = ∂ E ∂ n e t ( 2 ) Y ( 1 ) T = − S ( 2 ) Y ( 1 ) T
第一层更新:
d E 所 以 : ∂ E ∂ Y ( 1 ) = t r ( ∂ E ∂ n e t ( 2 ) T d ( W ( 2 ) Y ( 1 ) ) ) = t r ( ∂ E ∂ n e t ( 2 ) T W ( 2 ) d Y ( 1 ) ) = ( W ( 2 ) ) T ∂ E ∂ n e t ( 2 ) = − ( W ( 2 ) ) T S ( 2 )
d E 所 以 : ∂ E ∂ n e t ( 1 ) = t r ( ∂ E ∂ Y ( 1 ) T d Y ( 1 ) ) = t r ( ∂ E ∂ Y ( 1 ) T d f ( 1 ) ( n e t ( 1 ) ) ) = t r ( ∂ E ∂ Y ( 1 ) ⊙ f ′ ( 1 ) ( n e t ( 1 ) ) T d ( n e t ( 1 ) ) ) = ∂ E ∂ Y ( 1 ) ⊙ f ′ ( 1 ) ( n e t ( 1 ) ) = − ( W ( 2 ) ) T S ( 2 ) ⊙ f ′ ( 1 ) ( n e t ( 1 ) ) = − S ( 1 )
d E 所 以 : ∂ E ∂ W ( 1 ) = t r ( ∂ E ∂ n e t ( 1 ) T d ( W ( 1 ) Y ( 0 ) ) ) = t r ( Y ( 0 ) ∂ E ∂ n e t ( 1 ) T d W ( 1 ) ) = ∂ E ∂ n e t ( 1 ) ( Y ( 0 ) ) T = − S ( 1 ) ( Y ( 0 ) ) T
以上就是对各层权值
W ( i )
的梯度的公式推导了。下面对
θ ( i )
推导,因为比较简单,我们就以第三层为例简单说明下。
d E 所 以 : ∂ E ∂ θ ( 3 ) = t r ( ∂ E ∂ n e t ( 3 ) T d ( W ( 3 ) Y ( 2 ) + θ ( 3 ) ) ) = t r ( ∂ E ∂ n e t ( 3 ) T d θ ( 3 ) ) = ∂ E ∂ n e t ( 3 ) = − S ( 3 )
总结 至此,可以对以整个学习算法进行总结了。
下一篇博文将会用MATLAB实现以上算法。