基本概念
1、神经元
在这个模型中,神经元接收到来自n个其他神经元传递来的信号,这些输入信号通过带权的连接进行传递,神经元接收到总输入值,再与阈值进行比较,然后通过“激活函数”处理以产生神经元输出。
2、激活函数
为什么神经网络模型要使用激活函数:
(1)引入非线性因素,解决非线性问题。
(2)可知输出范围,有限的输出范围使得网络对于一些比较大的输入也会比较稳定,这也是为什么早期的激活函数都以此类函数为主,如Sigmoid、TanH。
激活函数的性质要求:
(1)可微性:BP神经网络的优化方法是基于梯度的,所以必须要求激活函数可微
(2)单调性:即导数符号不变。单调性使得在激活函数处的梯度方向不会经常改变,从而让训练更容易收敛。
常见激活函数如下:
(1)ReLu函数
该函数是工程上使用较多的激活函数,其定义为:
y
=
{
0
(
x
≤
0
)
x
(
x
>
0
)
y=\left \{\begin{array} {lr} 0 \qquad(x\le 0)\\ x \qquad(x> 0) \end{array}\right.
y={0(x≤0)x(x>0)
(2)sigmoid函数
f
(
x
)
=
1
1
+
e
−
x
f(x) = \frac{1}{1+e^{-x}}
f(x)=1+e−x1
其图像如下:
Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,可以用作输出层。求导容易,求导结果为 f ( x ) ( 1 − f ( x ) ) f(x)(1-f(x)) f(x)(1−f(x)),其最大的局限性在于:当x达到一定值时,其导数值等于0,容易产生梯度消失,导致训练出现问题。
(3)tanh函数
t
a
n
h
(
x
)
=
1
−
e
−
2
x
1
+
e
−
2
x
tanh(x) = \frac{1-e^{-2x}}{1+e^{-2x}}
tanh(x)=1+e−2x1−e−2x
其图像如下:
相比Sigmoid函数,其输出以0为中心而且收敛速度快。但他和sigmoid一样,也存在梯度消失问题。
神经网络模型
回顾感知机模型 ,感知机模型也可以理解为一个简单的神经网络模型,由两层神经元组成,如下图所示:
需要注意的是,感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元,其学习能力非常有限。
在感知机模型 中也提到过,感知机只能解决简单的二分类问题,如:“与”,“非”,“或”;不能解决异或问题,为了解决非线性问题,需要考虑使用多层功能神经元。如下图所示:
那么如何训练得到这个神经网络的参数,我们使用误差逆传播(BP)算法进行学习,学习得到的神经网络称为BP神经网络。
给定训练集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } , x i ∈ R d , y i ∈ R l D=\{(x_1,y_1),(x_2,y_2),\ldots,(x_m,y_m)\},x_i \in \mathbf R^d,y_i \in \mathbf R^l D={(x1,y1),(x2,y2),…,(xm,ym)},xi∈Rd,yi∈Rl ,即输入数据有 d d d个属性,输出 l l l维实值向量。隐层神经元个数是 q q q。输出层第 j j j个神经元的阈值用 θ j \theta_j θj表示,隐层第 h h h个神经元的阈值用 γ h \gamma_h γh表示。激活函数采用sigmoid函数。
对训练样本
(
x
k
,
y
k
)
(x_k,y_k)
(xk,yk),假定神经网络的输出为
y
^
=
(
y
^
1
k
,
y
^
2
k
,
…
,
y
^
l
k
)
\hat {\mathbf y} =(\hat y_1^k,\hat y_2^k,\ldots,\hat y_l^k)
y^=(y^1k,y^2k,…,y^lk),所以有:
y
^
j
k
=
f
(
β
j
−
θ
j
)
\hat y_j^k = f(\beta_j - \theta_j)
y^jk=f(βj−θj)
则网络在
(
x
k
,
y
k
)
(x_k,y_k)
(xk,yk)上的均方误差为:
E
k
=
1
2
∑
j
=
1
l
(
y
^
j
k
−
y
j
k
)
2
E_k = \frac{1}{2}\sum_{j=1}^l(\hat y_j^k - y_j^k)^2
Ek=21j=1∑l(y^jk−yjk)2
我们的目标是最小化这个误差函数。
待求参数:
(1)输入层到隐藏层有 d × q d\times q d×q个参数。
(2) 隐藏层到输出层有 q × l q\times l q×l个参数。
(3)隐层 q q q个神经元的阈值。
(4)输出层 l l l个神经元的阈值。
BP神经网络基于梯度下降策略,以目标的负梯度方向对参数进行调整。不断优化参数。
(1)求 △ w h j \triangle w_{hj} △whj
对误差函数
E
k
E_k
Ek,给定学习了
η
\eta
η,有:
△
w
h
j
=
−
η
∂
E
k
∂
w
h
j
\triangle w_{hj} = -\eta \frac{\partial E_k}{\partial w_{hj}}
△whj=−η∂whj∂Ek
根据链式求导法则:
∂
E
k
∂
w
h
j
=
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
∂
β
j
∂
w
h
j
\frac{\partial E_k}{\partial w_{hj}} = \frac{\partial {E_k}}{\partial{\hat{y}_j^k}} \cdot \frac{\partial{\hat{y}_j^k}}{\partial{\beta_j}} \cdot \frac{\partial{\beta_j}}{\partial{w_{hj}}}
∂whj∂Ek=∂y^jk∂Ek⋅∂βj∂y^jk⋅∂whj∂βj
由
β
j
=
∑
h
=
1
q
w
h
j
b
h
\beta_j=\sum_{h=1}^q w_{hj}b_h
βj=∑h=1qwhjbh得:
∂
β
j
∂
w
h
j
=
b
h
\frac{\partial{\beta_j}}{\partial{w_{hj}}} = b_h
∂whj∂βj=bh
sigmoid函数求导结果如下:
f
′
(
x
)
=
f
(
x
)
(
1
−
f
(
x
)
)
f'(x) = f(x)(1-f(x))
f′(x)=f(x)(1−f(x))
定义
g
i
g_i
gi:
g
i
=
−
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
=
−
(
y
^
j
k
−
y
j
k
)
f
′
(
β
j
−
θ
j
)
=
−
(
y
^
j
k
−
y
j
k
)
f
(
β
j
−
θ
j
)
(
1
−
f
(
β
j
−
θ
j
)
)
=
y
^
j
k
(
1
−
y
^
j
k
)
(
y
j
k
−
y
^
j
k
)
\begin{aligned} g_i &= - \frac{\partial {E_k}}{\partial{\hat{y}_j^k}} \cdot \frac{\partial{\hat{y}_j^k}}{\partial{\beta_j}} \\ & = -(\hat y_j^k - y_j^k)f'(\beta_j - \theta_j) \\ & = -(\hat y_j^k - y_j^k)f(\beta_j - \theta_j)(1-f(\beta_j - \theta_j))\\ &=\hat{y}_j^k(1-\hat{y}_j^k)(y_j^k-\hat{y}_j^k) \end{aligned}
gi=−∂y^jk∂Ek⋅∂βj∂y^jk=−(y^jk−yjk)f′(βj−θj)=−(y^jk−yjk)f(βj−θj)(1−f(βj−θj))=y^jk(1−y^jk)(yjk−y^jk)
称
g
j
g_j
gj为输出神经元得梯度
所以:
△
w
h
j
=
η
g
j
b
h
\triangle w_{hj} = \eta g_j b_h
△whj=ηgjbh
(2)求
△
θ
j
\triangle \theta_j
△θj
Δ
θ
j
=
−
η
∂
E
k
∂
θ
j
\Delta \theta_j = -\eta \cfrac{\partial E_k}{\partial \theta_j}
Δθj=−η∂θj∂Ek
∂ E k ∂ θ j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ θ j = ∂ E k ∂ y ^ j k ⋅ ∂ [ f ( β j − θ j ) ] ∂ θ j = ∂ E k ∂ y ^ j k ⋅ f ′ ( β j − θ j ) × ( − 1 ) = ∂ E k ∂ y ^ j k ⋅ f ( β j − θ j ) × [ 1 − f ( β j − θ j ) ] × ( − 1 ) = ∂ E k ∂ y ^ j k ⋅ y ^ j k ( 1 − y ^ j k ) × ( − 1 ) = ∂ [ 1 2 ∑ j = 1 l ( y ^ j k − y j k ) 2 ] ∂ y ^ j k ⋅ y ^ j k ( 1 − y ^ j k ) × ( − 1 ) = 1 2 × 2 ( y ^ j k − y j k ) × 1 ⋅ y ^ j k ( 1 − y ^ j k ) × ( − 1 ) = ( y j k − y ^ j k ) y ^ j k ( 1 − y ^ j k ) = g j \begin{aligned} \cfrac{\partial E_k}{\partial \theta_j} &= \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot\cfrac{\partial \hat{y}_j^k}{\partial \theta_j} \\ &= \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot\cfrac{\partial [f(\beta_j-\theta_j)]}{\partial \theta_j} \\ &=\cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot f^{\prime}(\beta_j-\theta_j) \times (-1) \\ &=\cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot f\left(\beta_{j}-\theta_{j}\right)\times\left[1-f\left(\beta_{j}-\theta_{j}\right)\right] \times (-1) \\ &=\cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \hat{y}_j^k\left(1-\hat{y}_j^k\right) \times (-1) \\ &=\cfrac{\partial\left[ \cfrac{1}{2} \sum\limits_{j=1}^{l}\left(\hat{y}_{j}^{k}-y_{j}^{k}\right)^{2}\right]}{\partial \hat{y}_{j}^{k}} \cdot \hat{y}_j^k\left(1-\hat{y}_j^k\right) \times (-1) \\ &=\cfrac{1}{2}\times 2(\hat{y}_j^k-y_j^k)\times 1 \cdot\hat{y}_j^k\left(1-\hat{y}_j^k\right) \times (-1) \\ &=(y_j^k-\hat{y}_j^k)\hat{y}_j^k\left(1-\hat{y}_j^k\right) \\ &= g_j \end{aligned} ∂θj∂Ek=∂y^jk∂Ek⋅∂θj∂y^jk=∂y^jk∂Ek⋅∂θj∂[f(βj−θj)]=∂y^jk∂Ek⋅f′(βj−θj)×(−1)=∂y^jk∂Ek⋅f(βj−θj)×[1−f(βj−θj)]×(−1)=∂y^jk∂Ek⋅y^jk(1−y^jk)×(−1)=∂y^jk∂[21j=1∑l(y^jk−yjk)2]⋅y^jk(1−y^jk)×(−1)=21×2(y^jk−yjk)×1⋅y^jk(1−y^jk)×(−1)=(yjk−y^jk)y^jk(1−y^jk)=gj
所以:
Δ
θ
j
=
−
η
g
j
\Delta \theta_j = -\eta g_j
Δθj=−ηgj
(3)求
Δ
v
i
h
\Delta v_{ih}
Δvih
因为
Δ
v
i
h
=
−
η
∂
E
k
∂
v
i
h
\Delta v_{ih} = -\eta \cfrac{\partial E_k}{\partial v_{ih}}
Δvih=−η∂vih∂Ek
所以:
∂
E
k
∂
v
i
h
=
∑
j
=
1
l
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
∂
β
j
∂
b
h
⋅
∂
b
h
∂
α
h
⋅
∂
α
h
∂
v
i
h
=
∑
j
=
1
l
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
∂
β
j
∂
b
h
⋅
∂
b
h
∂
α
h
⋅
x
i
=
∑
j
=
1
l
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
∂
β
j
∂
b
h
⋅
f
′
(
α
h
−
γ
h
)
⋅
x
i
=
∑
j
=
1
l
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
w
h
j
⋅
f
′
(
α
h
−
γ
h
)
⋅
x
i
=
∑
j
=
1
l
(
−
g
j
)
⋅
w
h
j
⋅
f
′
(
α
h
−
γ
h
)
⋅
x
i
=
−
f
′
(
α
h
−
γ
h
)
⋅
∑
j
=
1
l
g
j
⋅
w
h
j
⋅
x
i
=
−
b
h
(
1
−
b
h
)
⋅
∑
j
=
1
l
g
j
⋅
w
h
j
⋅
x
i
=
−
e
h
⋅
x
i
\begin{aligned} \cfrac{\partial E_k}{\partial v_{ih}} &= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot \cfrac{\partial b_h}{\partial \alpha_h} \cdot \cfrac{\partial \alpha_h}{\partial v_{ih}} \\&= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot \cfrac{\partial b_h}{\partial \alpha_h} \cdot x_i \\ &= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot f^{\prime}(\alpha_h-\gamma_h) \cdot x_i \\&= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot w_{hj} \cdot f^{\prime}(\alpha_h-\gamma_h) \cdot x_i \\&= \sum_{j=1}^{l} (-g_j) \cdot w_{hj} \cdot f^{\prime}(\alpha_h-\gamma_h) \cdot x_i \\&= -f^{\prime}(\alpha_h-\gamma_h) \cdot \sum_{j=1}^{l} g_j \cdot w_{hj} \cdot x_i\\&= -b_h(1-b_h) \cdot \sum_{j=1}^{l} g_j \cdot w_{hj} \cdot x_i \\&= -e_h \cdot x_i\end{aligned}
∂vih∂Ek=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅∂αh∂bh⋅∂vih∂αh=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅∂αh∂bh⋅xi=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅f′(αh−γh)⋅xi=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅whj⋅f′(αh−γh)⋅xi=j=1∑l(−gj)⋅whj⋅f′(αh−γh)⋅xi=−f′(αh−γh)⋅j=1∑lgj⋅whj⋅xi=−bh(1−bh)⋅j=1∑lgj⋅whj⋅xi=−eh⋅xi
称
e
h
=
∑
j
=
1
l
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
∂
β
j
∂
b
h
⋅
∂
b
h
∂
α
h
e_h= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot \cfrac{\partial b_h}{\partial \alpha_h}
eh=∑j=1l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅∂αh∂bh为隐层神经元得梯度项
所以:
Δ
v
i
h
=
−
η
∂
E
k
∂
v
i
h
=
η
e
h
x
i
\Delta v_{ih} =-\eta \cfrac{\partial E_k}{\partial v_{ih}} =\eta e_h x_i
Δvih=−η∂vih∂Ek=ηehxi
(4)求
Δ
γ
h
\Delta \gamma_h
Δγh
因为:
Δ
γ
h
=
−
η
∂
E
k
∂
γ
h
\Delta \gamma_h = -\eta \cfrac{\partial E_k}{\partial \gamma_h}
Δγh=−η∂γh∂Ek
所以:
∂
E
k
∂
γ
h
=
∑
j
=
1
l
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
∂
β
j
∂
b
h
⋅
∂
b
h
∂
γ
h
=
∑
j
=
1
l
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
∂
β
j
∂
b
h
⋅
f
′
(
α
h
−
γ
h
)
⋅
(
−
1
)
=
−
∑
j
=
1
l
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
w
h
j
⋅
f
′
(
α
h
−
γ
h
)
=
−
∑
j
=
1
l
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
w
h
j
⋅
b
h
(
1
−
b
h
)
=
∑
j
=
1
l
g
j
⋅
w
h
j
⋅
b
h
(
1
−
b
h
)
=
e
h
\begin{aligned} \cfrac{\partial E_k}{\partial \gamma_h} &= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot \cfrac{\partial b_h}{\partial \gamma_h} \\ &= \sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \cfrac{\partial \beta_j}{\partial b_h} \cdot f^{\prime}(\alpha_h-\gamma_h) \cdot (-1) \\ &= -\sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot w_{hj} \cdot f^{\prime}(\alpha_h-\gamma_h)\\ &= -\sum_{j=1}^{l} \cfrac{\partial E_k}{\partial \hat{y}_j^k} \cdot \cfrac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot w_{hj} \cdot b_h(1-b_h)\\ &= \sum_{j=1}^{l}g_j\cdot w_{hj} \cdot b_h(1-b_h)\\ &=e_h \end{aligned}
∂γh∂Ek=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅∂γh∂bh=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅f′(αh−γh)⋅(−1)=−j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅whj⋅f′(αh−γh)=−j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅whj⋅bh(1−bh)=j=1∑lgj⋅whj⋅bh(1−bh)=eh
所以:
Δ
γ
h
=
−
η
∂
E
k
∂
γ
h
=
−
η
e
h
\Delta \gamma_h=-\eta\cfrac{\partial E_k}{\partial \gamma_h} = -\eta e_h
Δγh=−η∂γh∂Ek=−ηeh
注:学习了
η
∈
(
0
,
1
)
\eta \in (0,1)
η∈(0,1) 控制每一轮迭代中得更新步长,太大容易震荡太小收敛速度很慢。
误差逆传播算法如下:
输入:训练集 D = { ( x k , y k ) } k = 1 m D=\{(\mathbf x_k,\mathbf y_k)\}_{k=1}^m D={(xk,yk)}k=1m ,学习率 η \eta η
输出:连接全与阈值确定的多层前馈神经网络。
过程:
在(0,1)范围内随机初始神经网络中得所有连接权和阈值
repeat:
for all ( x k , y k ) (\mathbf x_k,\mathbf y_k) (xk,yk) do
根据当前参数计算当前得样本输出 y k ^ \hat {\mathbf y_k} yk^
计算输出神经元梯度项 g j g_j gj
计算隐层神经元得梯度项 e h e_h eh
根据求导的最终结果:
△ w h j = η g j b h Δ θ j = − η g j Δ v i h = η e h x i Δ γ h = − η e h \triangle w_{hj} = \eta g_j b_h \\ \Delta \theta_j = -\eta g_j \\ \Delta v_{ih} =\eta e_h x_i \\ \Delta \gamma_h = -\eta e_h △whj=ηgjbhΔθj=−ηgjΔvih=ηehxiΔγh=−ηeh
更新权值 w h j , v i h w_{hj},v_{ih} whj,vih 与阈值 θ j , γ h \theta_j,\gamma_h θj,γh end for
util 达到条件
这个过程中,需要注意BP算法的目标是要最小化训练集D上的累计误差:
E
=
1
m
∑
k
=
1
m
E
k
E = \frac{1}{m} \sum_{k=1}^mE_k
E=m1k=1∑mEk
最小化并非累积误差为0,若累积误差为0,会导致过拟合现象;因此通常采用“正则化”的策略,即在误差目标函数中增加一项用于描述网络复杂度的部分,例如连接权与阈值的平方和;则误差目标函数可以改为:
E
=
λ
1
m
∑
k
=
1
m
E
k
+
(
1
−
λ
)
∑
i
w
i
2
E = \lambda \frac{1}{m} \sum_{k=1}^mE_k + (1-\lambda) \sum_{i} w_i^2
E=λm1k=1∑mEk+(1−λ)i∑wi2
其中
λ
∈
(
0
,
1
)
λ ∈(0,1)
λ∈(0,1),其作用是对经验误差与网络复杂度这两项进行折中。 由上式可知,误差E是连接权和阀值的函数,此时,神经网络可以看做一个参数寻优的过程,即在参数空间中寻找一组最优的参数使得误差最小。