赞
踩
BP神经网络(Backpropagation Neural network),具有多层神经元,并且神经元的信号(输入输出)总是向前(由输入层指向输出层)传播,所以是多层向前网络。
设BP神经网络有m层。第一层是输入层,最后一层(第m层)是输出层,中间各层称为隐层。
除了输出层以外,每一层都可以加上一个偏置节点(又称偏置单元,如图标注“+1”的圆圈)。偏置单元没有输入(没有其他神经元指向它),它的输出总是1。(相当于把外部输入“+1”看作是某个神经元的输出)。
因为偏置节点与神经元存在差异,所以一般把神经元和偏执节点统称为节点。
直觉上,偏置节点可以对下一层的神经元产生直接影响,而其他神经元因为经过了层层传递,对下一层的影响相对间接。
偏置单元并不是必需的,但它可以为每个隐藏层和输出层中的神经元提供一个可学习的常数偏移量,这个偏移量允许神经网络更好地拟合数据集并提高模型的表达能力。
并且偏置单元允许神经网络在输入为零时仍能有输出,在没有偏置单元的情况下,即使输入不为零,如果加权求和结果为零,那么神经元的输出也将为零(陷入得不到非零的有效输出,神经元无法激活的状况)。通过引入偏置项,即使输入为零,神经元也有可能激活,从而提高了网络的表达能力。
BP神经网络中,输入层作为数据的缓冲,不对数据做任何处理。也就是说,输入的数据直接作为输入层神经元的输出,则:
y
i
1
=
x
i
(
i
=
1
,
2
,
⋯
,
p
1
)
y_i^1=x_i\quad(i=1,2,\cdots,p_1)\\
yi1=xi(i=1,2,⋯,p1)
隐层和输出层的神经元,需要把神经元的输入作为参数,传递给激活函数,得到的结果作为神经元的输出。实际需要解决的问题都有着复杂的非线性特征,所以激活函数都选择非线性函数。
隐层
k
k
k与输出层各个神经元的非线性输入输出关系记为
f
k
(
k
=
2
,
⋯
,
m
)
f_k(k=2,\cdots,m)
fk(k=2,⋯,m),由
k
−
1
k-1
k−1层的第
j
j
j个神经元到
k
k
k层的第
i
i
i个神经元的连接权值记为
w
i
j
k
w_{ij}^k
wijk,第
k
k
k层中第
i
i
i个神经元的输入总和记为
u
i
k
u_i^k
uik,输出为
y
i
k
y_i^k
yik,则有:
y
i
k
=
f
k
(
u
i
k
)
u
i
k
=
∑
j
w
i
j
k
y
j
k
−
1
(
k
=
2
,
⋯
,
m
)
y^k_i=f_k(u_i^k)\\ u_i^k=\sum_jw_{ij}^{k}y_j^{k-1}\quad(k=2,\cdots,m)
yik=fk(uik)uik=j∑wijkyjk−1(k=2,⋯,m)
当从输入层输入数据
X
=
[
x
1
,
x
2
,
⋯
,
x
p
1
]
T
X=[x_1,x_2,\cdots,x_{p_1}]^T
X=[x1,x2,⋯,xp1]T(设第n层有
p
n
p_n
pn个神经元,则输入层有
p
1
p_1
p1个神经元),得到输出层的输出为
Y
=
[
y
1
,
y
2
,
⋯
,
y
p
m
]
T
Y=[y_1,y_2,\cdots,y_{p_m}]^T
Y=[y1,y2,⋯,ypm]T(输出层有
p
m
p_m
pm个神经元)。
计算机科学中,常用
[
x
1
,
x
2
,
⋯
,
x
p
1
]
[x_1,x_2,\cdots,x_{p_1}]
[x1,x2,⋯,xp1]的形式表示一组序列,称为行向量(即水平方向的列表或者一维数组,向量是只有一个维度的矩阵)。而
T
T
T代表线性代数中的矩阵转置操作,所以
[
x
1
,
x
2
,
⋯
,
x
p
1
]
T
[x_1,x_2,\cdots,x_{p_1}]^T
[x1,x2,⋯,xp1]T代表一个列向量,其中的元素从上往下排列,与BP神经网络结构图中,纵向画出的神经元一一对应。
例如输入层第
n
n
n个节点的输入是
x
n
x_n
xn,输出层第
n
n
n个节点的输出是
y
n
y_n
yn。
因此,可以把BP神经网络看成是一个从输入到输出的非线性映射,从 p 1 p_1 p1个输入映射成 p m p_m pm个输出。
给定任意 ε \varepsilon ε>0,对于任意的连续函数 f f f,存在一个三层前向神经网络,可以在任意 ε \varepsilon ε平方误差精度内逼近 f f f。
也就是说,只需要三层BP神经网络,就可以逼近任意一个连续的非线性函数,但是可能需要大量的隐层神经元个数,或者给BP神经网络添加更多的隐层数量。
如何最有效地确定BP神经网络的结构尚无定论,但通常默认,输入层的神经元个数,与样本的特征数一致,使每一个输入层神经元对应一种特征。输入层的神经元个数,与样本的类别数一致,使每一个输出层神经元对应一种分类。
在BP神经网络中,权值初始化是一个非常重要的步骤,它可以影响网络的收敛速度和性能。
常用的初始化方法如下:
随机初始化
w
i
j
k
=
r
a
n
d
o
m
(
−
a
,
a
)
w_{ij}^k=random(-a,a)
wijk=random(−a,a)
所有权值表现为(-a,a)上的随机分布。
Xavier初始化
略
损失函数,又称为代价函数,误差函数,在机器学习和统计建模中用于度量模型预测值与真实值之间的差异或损失程度,在BP神经网络中,表示输出层的实际输出与期望输出之间的总误差。
常用的损失函数
J
J
J如下:
BP算法的目标就是要通过反向学习,改变权值,使输出层的输出结果越来越接近期望输出。这个问题等价于,求误差函数的极小值,约束条件是上述的输入输出关系。
利用非线性规划中的“最快下降法(梯度下降法)”,使权值沿着误差函数的负梯度方向改变,得到神经网络权值的修正量为:
Δ
w
i
j
k
−
1
=
−
ε
∂
J
∂
w
i
j
k
−
1
(
ε
>
0
)
其中,
ε
\varepsilon
ε为学习步长(又称为学习效率),它决定了每次对权值修正量的大小。
学习效率太大可能导致误差函数增大,难以或者无法收敛到最优解。学习效率太小,则会导致收敛缓慢,需要更多的学习次数和更多的计算,增加学习成本,还可能导致陷入局部最优解无法跳出。
一般学习效率小于0.5。
梯度下降法中有一个重要概念,即误差梯度。在BP神经网络中,误差梯度表示由误差函数对所有权值的偏导数构成的向量,即
Δ
E
=
[
∂
J
∂
w
i
j
2
,
∂
J
∂
w
i
j
3
,
∂
J
∂
w
i
j
n
,
∂
J
∂
w
i
j
m
]
(
n
=
2
,
3
,
⋯
,
m
i
=
1
,
2
,
⋯
,
p
n
j
=
1
,
2
,
⋯
,
p
n
−
1
)
\Delta E= \left[\frac{\partial J}{\partial w_{ij}^2},\frac{\partial J}{\partial w_{ij}^3},\frac{\partial J}{\partial w_{ij}^n},\frac{\partial J}{\partial w_{ij}^m}\right]\quad \left(
其中,
p
n
p_n
pn表示第n层神经元的个数。
可以看到,
权值的修正量
=
−
学习效率
×
误差梯度元素
权值的修正量=-学习效率\times误差梯度元素
权值的修正量=−学习效率×误差梯度元素。
所以求所有权值的修正量,实际上就是求误差梯度。
对上式求偏导(由于本文章面向初学者,偏向应用,省略复杂计算),得
∂
J
∂
w
i
j
k
−
1
=
∂
J
∂
u
i
k
y
j
k
−
1
\frac{\partial J}{\partial w_{ij}^{k-1}}=\frac{\partial J}{\partial u_{i}^{k}}y_j^{k-1}
∂wijk−1∂J=∂uik∂Jyjk−1
记
d
i
k
=
∂
J
∂
u
i
k
则
Δ
w
i
j
k
−
1
=
−
ε
d
i
k
y
j
k
−
1
(
k
=
2
,
⋯
,
m
)
\Delta w_{ij}^{k-1}=-\varepsilon d_i^ky_j^{k-1}\quad(k=2,\cdots,m)
Δwijk−1=−εdikyjk−1(k=2,⋯,m)
对 (2) 式求偏导,得
d
i
k
=
∂
J
∂
y
i
k
f
k
′
(
u
i
k
)
分两种情况求 (3) 式:
可以看出,要求第 k k k层节点的误差信号 d i k d_i^k dik,就要先求 ( k + 1 ) (k+1) (k+1)层的误差信号 d i k + 1 d_i^{k+1} dik+1。求所有节点的误差信号,求所有权值,求误差梯度,三者是同时进行的。
误差信号的求取是一个从输出层到输入层的反向传播的递归过程,所以称为反向传播(Backpropagation,BP)学习算法。
在实际问题中,样本特征和分类都是抽象的描述,而神经网络的输入只能接收数值类型,并且输出也是数值类型。所以需要对它们进行编码。
当然不是所有的样本特征都需要编码。比如以数列作为样本进行分类(如等比和等差数列等),其本身就是数值类型,所以无需编码,这个例子还有一个特殊的地方在于,数列的每一个单独的数值,都不能作为数列的特征,因为这些数值只有作为一个整体,才能表达数列的特征。
很多实际问题中的样本特征,都是难以量化的,为此,需要把这些特征映射为特征值,才能作为输入。
特征值通常取{0,1}或者{-1,1}。
例如,水果的分类问题:
1 | 0 | |
---|---|---|
外形 | 圆 | 椭圆 |
质地 | 光滑 | 粗糙 |
质量 | ≤ \le ≤ 300g | > > > 300g |
任意一个水果,若特征值描述为
X
=
[
x
1
,
x
2
,
x
3
]
X=[x_1,x_2,x_3]
X=[x1,x2,x3],其中,
x
1
x_1
x1,
x
2
x_2
x2,
x
3
x_3
x3分别对应外形、质地、质量三种特征。
则一个圆形,粗糙,质量小于300g的水果,其特征值为[1,0,1]。
在分类问题中,需要为每一个分类设定一种编码(可称为名义输出),也就是指定分类所对应的输出层神经元的输出。
输入学习样本时,为了保证每一个样本数据对应一种分类,需要同时输入一个名义输出作为期望输出,和一个标签作为分类的名称。一般把所有样本数据的集合称为数据集,所有标签的集合称为标签集。数据集、期望输出列表和标签集,是一一对应的。
与特征值一样,名义输出值通常是整数,取{0,1}或者{-1,1}。
这样,神经网络在学习过程中,不断缩小实际输出与期望输出(名义输出)的差值,就是不断地强化神经网络对样本的分类准确度;当神经网络输出了某个设定的名义输出,就可以判定样本的分类。
由于一般输出层神经元数与分类数保持一致,所以可以让每一个神经元输出对应一种分类,只有一个输出可以取1,其他的只能取0,但输出1的神经元可以变化。例如在四分类问题中,四种名义输出分别为[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]。这样可以保证不同分类的输出,有两位是不同的1。
如果输出层神经元数与分类数不一致,比如四分类问题中,输出层只有3个神经元,名义输出可以设置为[0,0,0],[0,1,1],[1,0,1],[1,1,0]。这种选值方式也是为了保证不同分类的输出,有两位不同,所以没有使用[0,0,1]等其他值。
直觉上,制造更大的区分度,更有利于神经网络对分类的判别。但这样的分类编码也存在一些问题,比如输出值可能与任何名义输出都不相同,则无法确定分类,这种情况也一定程度上反映了神经网络的学习效果不佳。
实际上存在其他的分类方法,可以避免无法确定分类的情况,即使用softmax函数处理输出,把输出层的输出转换成概率分布,每一个神经元的输出,对应一种分类的概率,总能够选出概率最大的分类。
softmax函数如下:
f
i
m
=
e
y
i
∑
n
=
1
p
m
e
y
n
(
i
=
1
,
2
,
⋯
,
p
m
)
f_i^m=\frac{e^{y_i}}{
其中
p
m
p_m
pm为输出层神经元的个数,
f
i
m
f_i^m
fim表示输出层的第
i
i
i个神经元输出转换成概率的结果。
由于BP神经网络使用非线性激活函数,最终输出通常是小数的序列,而名义输出为整数序列,所以需要把输出层的输出映射成整数,通常使用非线性函数中的阶跃函数完成这种转换
f
(
x
i
)
=
{
0
x
i
<
0
1
x
i
≥
0
f(x_i)=\left\{
f
(
x
i
)
=
{
−
1
x
i
<
0
1
x
i
≥
0
f(x_i)=\left\{
针对不同的名义输出,选择恰当的阶跃函数,就解决了这个问题。
信息论中的海明距离,用于描述两个等长编码之间不同位的个数,这里可以说海明距离为2。 ↩︎
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。