BP神经网络
BP神经网络是指误差逆传播算法训练的多层前馈网络。
如下图为两层两层的BP神经网络(只有隐含层和输出层是参与计算和权值调整的节点层)。
- 图1:两层的BP神经网络
结构和原理
在“单细胞”的神经网络里,实际上只有一层,即最后的输出层。在上图中有两层,第一层每个节点的输入都是一样的,都是 x 1 , x 2 , x 3 … … x n x_1,x_2,x_3……x_n x1,x2,x3……xn。每个节点的超平面都可以用 g ( v ) = w v + b g(v)=wv+b g(v)=wv+b来表示。但是,所有的节点最后输出的函数只有1或0两个状态,所以有激活函数为Logistic函数:
f ( v ) = 1 1 + e − ( w T v + b ) \LARGE f(v)=\frac{1}{1+e^{-(w^Tv+b)}} f(v)=1+e−(wTv+b)1
f ( v ) = 1 1 + e − ( w T v + b ) f(v)=\frac{1}{1+e^{-(w^Tv+b)}} f(v)=1+e−(wTv+b)1这个函数其实是 f ( t ) = 1 1 + e − t f(t)=\frac{1}{1+e^{-t}} f(t)=1+e−t1和 t = w T v + b t=w^Tv+b t=wTv+b这两个函数组合变量代换形成的。 t = w T v + b t=w^Tv+b t=wTv+b在之前的人工神经网络中已经介绍过。 f ( t ) = 1 1 + e − t f(t)=\frac{1}{1+e^{-t}} f(t)=1+e−t1的图形如下图所示。
- 图2: f ( t ) = 1 1 + e − t f(t)=\frac{1}{1+e^{-t}} f(t)=1+e−t1的图形
在t大于某个值时,函数值就是1,t小于某个值时,函数值就是0。
也可以写成以下的形式:
f ( t ) = 1 1 + e − m t \LARGE f(t)=\frac{1}{1+e^{-mt}} f(t)=1+e−mt1
其中m是可以调整的参数,m越小曲线越平缓,m越大曲线越立陡,分类边界越明显。具体在每个应用中怎么取m的值要依情况而定,如果需要边界区分非常明显,那就把m的值设置地大一些。例如,m=10时,函数图形如下图。
- 图3: f ( t ) = 1 1 + e − 10 t f(t)=\frac{1}{1+e^{-10t}} f(t)=1+e−10t1的图形
所以对于 f ( v ) = 1 1 + e − ( w T v + b ) f(v)=\frac{1}{1+e^{-(w^Tv+b)}} f(v)=1+e−(wTv+b)1函数来说,函数会根据v的输入对应产生1和0两种函数值,而这里面待定的就是w这个矩阵,这就是在网络训练中需要决定的。而每个节点都有函数 f ( v ) = 1 1 + e − ( w T v + b ) f(v)=\frac{1}{1+e^{-(w^Tv+b)}} f(v)=1+e−(wTv+b)1,而且每个节点之间都可能完全不一样。从上面的两层的BP神经网络的图可以看出,前面一层的输出结果作为后面一层节点的输入,最后一层的输出是n个不同的1或0,也就是说这个神经网络最多可以标识 2 n 2^n 2n种不同的分类。
训练过程
这里希望找到一种方法可以让设置好的各个权值能够匹配尽可能多的训练样本的分类情况,和线性回归中希望残差尽量小的思路一致。使用最小二乘法,最小二乘法的思路是,如果把误差表示成样本做自变量的函数,然后用求极值的方法来推导就可以找出这个误差最小情况下的各个系数值了。
- (一)误差计算。
隐含层节点的输入为:
h
i
=
w
i
h
x
i
+
b
h
h_i=w_{ih}x_i+b_h
hi=wihxi+bh。
隐含层节点的输出为:
h
o
=
f
(
h
i
)
h_o=f(h_i)
ho=f(hi)。
输出层节点的输入为:
y
i
=
w
h
o
+
b
o
y_i=w_{ho}+b_o
yi=who+bo。
输出层节点的输出为:
y
o
=
f
(
y
i
)
y_o=f(y_i)
yo=f(yi)。
注意,这里面的 x i , w i h , w h o , h o , y o x_i,w_{ih},w_{ho},h_o,y_o xi,wih,who,ho,yo都是向量。
误差函数为: E i = d o i − y o i \LARGE E_i=d_{oi}-y_{oi} Ei=doi−yoi
整个网络误差函数为:
E = 1 2 ∑ i = 1 n E i = 1 2 ∑ i = 1 n ( d o i − y o i ) 2 \LARGE E=\frac{1}{2}\sum_{i=1}^nE_i=\frac{1}{2}\sum_{i=1}^n(d_{oi}-y_{oi})^2 E=21∑i=1nEi=21∑i=1n(doi−yoi)2
这个函数前面的系数 1 2 \frac{1}{2} 21只是为了之后求导方便,不影响函数的性质。
- (二)反向传播。
对这个误差函数进行求导求偏微分。
输出层误差偏微分: ∂ E ∂ w h o = ∂ E y i ∂ y i ∂ w h o \LARGE \frac{∂E}{∂w_{ho}}=\frac{∂E}{y_i}\frac{∂y_i}{∂w_{ho}} ∂who∂E=yi∂E∂who∂yi
其中
∂ E ∂ y i = ∂ 1 2 ∑ i = 1 n ( d o i − y o i ) 2 1 2 ∑ i = 1 n ( d o i − y o i ) 2 y i \LARGE \frac{∂E}{∂y_i}=\frac{∂\frac{1}{2}\sum_{i=1}^n(d_{oi}-y_{oi})^2}{\frac{1}{2}\sum_{i=1}^n(d_{oi}-y_{oi})^2y_i} ∂yi∂E=21∑i=1n(doi−yoi)2yi∂21∑i=1n(doi−yoi)2
= − ( d o i − y o i ) f ‘ ( y i ) = − δ o \LARGE =-(d_{oi}-y_{oi})f^`(y_i)=-δ_o =−(doi−yoi)f‘(yi)=−δo
∂ y i ∂ w h o = ∂ ( w h o h o + b o ) ∂ w h o = h o \LARGE \frac{∂y_i}{∂w_{ho}}=\frac{∂(w_{ho}h_o+b_o)}{∂w_{ho}}=h_o ∂who∂yi=∂who∂(whoho+bo)=ho
那么
∂ E ∂ w h o = ∂ E y i ∂ y i ∂ w h o = − δ o h o \LARGE \frac{∂E}{∂w_{ho}}=\frac{∂E}{y_i}\frac{∂y_i}{∂w_{ho}}=-δ_oh_o ∂who∂E=yi∂E∂who∂yi=−δoho
误差的梯度
δ o = − ( d o i − y o i ) f ‘ ( y i ) \LARGE δ_o=-(d_{oi}-y_{oi})f^`(y_i) δo=−(doi−yoi)f‘(yi)
隐含层误差偏微分: ∂ E ∂ w i h = ∂ E ∂ h i ∂ h i ∂ w i h \LARGE \frac{∂E}{∂w_{ih}}=\frac{∂E}{∂h_i}\frac{∂h_i}{∂w_{ih}} ∂wih∂E=∂hi∂E∂wih∂hi
其中
∂ E ∂ h i = ∂ 1 2 ∑ i = 1 n ( d o i − y o i ) 2 ∂ h o ∂ h o ∂ h i \LARGE \frac{∂E}{∂h_i}=\frac{∂\frac{1}{2}\sum_{i=1}^n(d_{oi}-y_{oi})^2}{∂h_o}\frac{∂h_o}{∂h_i} ∂hi∂E=∂ho∂21∑i=1n(doi−yoi)2∂hi∂ho
= ∂ 1 2 ∑ i = 1 n ( d o i − f ( y i ) ) 2 ∂ h o ∂ h o ∂ h i \LARGE =\frac{∂\frac{1}{2}\sum_{i=1}^n(d_{oi}-f(y_i))^2}{∂h_o}\frac{∂h_o}{∂h_i} =∂ho∂21∑i=1n(doi−f(yi))2∂hi∂ho
= ∂ 1 2 ∑ i = 1 n ( d o i − f ( w h o h o + b o ) ) 2 ∂ h 0 ∂ h o ∂ h i \LARGE =\frac{∂\frac{1}{2}\sum_{i=1}^n(d_{oi}-f(w_{ho}h_o+b_o))^2}{∂h_0}\frac{∂h_o}{∂h_i} =∂h0∂21∑i=1n(doi−f(whoho+bo))2∂hi∂ho
= − ( d o i − y o i ) f ‘ ( y i ) w h o ∂ h o ∂ h i \LARGE =-(d_{oi}-y_{oi})f^`(y_i)w_{ho}\frac{∂h_o}{∂h_i} =−(doi−yoi)f‘(yi)who∂hi∂ho
= − δ o w h o f ‘ ( h i ) \LARGE=-δ_ow_{ho}f^`(h_i) =−δowhof‘(hi)
= − δ h \LARGE =-δ_h =−δh
∂ h i ∂ w i h = ∂ ( w i h x i + b h ) ∂ w i h = x i \LARGE \frac{∂h_i}{∂w_{ih}}=\frac{∂(w_{ih}x_i+b_h)}{∂w_{ih}}=x_i ∂wih∂hi=∂wih∂(wihxi+bh)=xi
那么
∂ E ∂ w i h = − δ h x i \LARGE \frac{∂E}{∂w_{ih}}=-δ_hx_i ∂wih∂E=−δhxi
误差的梯度
δ h = ( δ o w h o ) f ‘ ( h i ) \LARGE δ_h=(δ_ow_{ho})f^`(h_i) δh=(δowho)f‘(hi)
(三)权值更新。
隐含层更新:
w i h N + 1 = w i h N + η δ h x i \LARGE w_{ih}^{N+1}=w_{ih}^N+ηδ_hx_i wihN+1=wihN+ηδhxi
输出层更新:
w h o N + 1 = w h o N + η δ o h o \LARGE w_{ho}^{N+1}=w_{ho}^N+ηδ_oh_o whoN+1=whoN+ηδoho
过程解释
首先设置两套w作为两层网络各自的“超平面”的系数,然后输入一次完整的训练过程,就会有一个误差值出现。
接着就是一次一次地进行w的调整。调整的方法是,首先用最小二乘法的方式,找到一个误差和自变量的关系,然后求误差极值。
在最后的 w i h N + 1 = w i h N + η δ h x i w_{ih}^{N+1}=w_{ih}^N+ηδ_hx_i wihN+1=wihN+ηδhxi和 w h o N + 1 = w h o N + η δ o h o w_{ho}^{N+1}=w_{ho}^N+ηδ_oh_o whoN+1=whoN+ηδoho这两个公式里,用的是试探性的方法。 + η δ h x i +ηδ_hx_i +ηδhxi和 + η δ o h o +ηδ_oh_o +ηδoho是一种试探的“步长”,第一次分别设置了 w i h w_{ih} wih和 w h o w_{ho} who,如果有误差,就试着往误差小的一边“走一步”,这就是一次一次迭代的目的。最后找到一个误差满足要求的点,把这一点的 w i h w_{ih} wih和 w h o w_{ho} who都记录保存下来,网络就训练完毕了。这种步长试探的思路也叫梯度下降法。