第五章 神经网络
5.1 M-P神经元模型
神经网络(neural network)的基础是神经元(neuron)模型,其中最常用的是M-P神经元模型:
在该模型中,神经元接收n个其他神经元的信号,通过w进行带权重连接,将所有带权重输入与阈值相减,通过激活函数(activation function)进行输出:
y
=
f
(
w
T
x
−
θ
)
\begin{aligned} y&=f\left(\boldsymbol{w}^\mathbf{T}\boldsymbol{x}-\theta\right) \end{aligned}
y=f(wTx−θ)
5.2 感知机
感知机(perceptron)由两层神经元组成,输入层有两个神经元,负责接收外界输入信号,输出层有一个神经元,负责处理信号并输出,因此只有输出层为M-P神经元且仅有一个M-P神经元
感知机的激活函数为阶跃函数,因此其数学表达式为:
y
=
sgn
(
w
T
x
−
θ
)
=
{
1
if
(
w
T
x
−
θ
)
⩾
0
0
if
(
w
T
x
−
θ
)
<
0
\begin{aligned} y&=\text{sgn}\left(\boldsymbol{w}^\mathbf{T}\boldsymbol{x}-\theta\right) \\ &=\begin{cases} 1 & \text{ if} \left(\boldsymbol{w}^\mathbf{T}\boldsymbol{x}-\theta\right)\geqslant0 \\ 0& \text{ if}\left(\boldsymbol{w}^\mathbf{T}\boldsymbol{x}-\theta\right) <0 \end{cases} \end{aligned}
y=sgn(wTx−θ)={10 if(wTx−θ)⩾0 if(wTx−θ)<0
通过对分类错误样本的分析,我们可以找到它的损失函数:
L
(
w
,
θ
)
=
∑
x
∈
M
(
y
^
−
y
)
(
w
T
x
−
θ
)
\begin{aligned} L(\boldsymbol w,\theta)=\sum_{\boldsymbol x\in M}(\hat{y}-y)(\boldsymbol{w}^\mathbf{T}\boldsymbol{x}-\theta) \end{aligned}
L(w,θ)=x∈M∑(y^−y)(wTx−θ)
式中,
M
M
M为分类错误的样本集合,
y
^
\hat{y}
y^为感知机的预测值。很明显,该损失函数非负。
为了方便讨论,现在将
θ
\theta
θ看作一个固定输入为-1的哑结点(dummy node)所对应的权重,并令
x
n
+
1
=
−
1
x_{n+1}=-1
xn+1=−1,则求解目标变为:
arg min
w
L
(
w
)
=
arg min
w
∑
x
∈
M
(
y
^
−
y
)
w
T
x
\begin{aligned} \underset{\boldsymbol w}{\text{arg min }}L(\boldsymbol w)=\underset{\boldsymbol w}{\text{arg min }}{\sum_{\boldsymbol x\in M}(\hat{y}-y)\boldsymbol{w}^\mathbf{T}\boldsymbol{x}} \end{aligned}
warg min L(w)=warg min x∈M∑(y^−y)wTx
我们可以通过随机梯度下降(SGD,即训练时对每个样本都进行一次参数更新)来求解此问题:
w
←
w
+
Δ
w
Δ
w
=
η
(
y
−
y
^
)
x
\begin{aligned} \boldsymbol w&\leftarrow\boldsymbol w +\Delta\boldsymbol w \\ \Delta\boldsymbol w&=\eta(y-\hat y)\boldsymbol x \end{aligned}
wΔw←w+Δw=η(y−y^)x
式中,
Δ
w
\Delta\boldsymbol w
Δw由损失函数对
w
\boldsymbol w
w求导得到(因为采用的是SGD,因此损失函数中将求和去除,只考虑单个样本的损失函数),
η
∈
(
0
,
1
)
\eta\in(0,1)
η∈(0,1)称为学习率(learning rate),是一个可进行人为调整的超参数(super parameter)
对于任意线性可分(linearly separable)的数据集,即在特征空间中存在一个超平面可以将正反例一分为二,那么感知机一定可以找到该超平面,相对的,如果数据集非线性可分,那么感知机将难以稳定,无法求解。(意思就是感知机只能解决部分二分类问题)
5.3 BP算法
5.3.1 多层前馈网络
既然感知机只能解决线性可分问题,那么什么样的神经网络可以解决非线性可分问题呢?
考虑到应该使用更多的M-P神经元,如下图所示:
上图即为多层前馈神经网络(multi-layer feedforward nerural networks),每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接。
5.3.2 误差逆传播算法
对于多层前馈网络,一般的算法是无法进行参数优化的,因此需要更强大的学习算法:误差逆传播算法(BackPropagation,简称BP,又称反向传播算法)
考虑如下的多层前馈网络,非输入神经元的激活函数均为sigmoid函数
其中,有 d d d个输入神经元, q q q个隐层神经元, l l l个输出神经元,输出层第 j j j个神经元的阈值用 θ j \theta_j θj表示,隐层第 h h h个神经元的阈值用 γ h \gamma_h γh表示,隐层第 h h h个神经元与输出层第 j j j个神经元之间的连接权为 w h j w_{hj} whj,输入层第 i i i个神经元与隐层第 h h h个神经元之间的连接权为 v i h v_{ih} vih:
对于样例
(
x
k
,
y
k
)
(\boldsymbol x_k,\boldsymbol y_k)
(xk,yk),神经网络输出为
y
^
k
=
sigmoid
(
β
−
θ
)
∈
R
l
\hat{\boldsymbol y}_k=\text{sigmoid}(\boldsymbol\beta-\boldsymbol\theta)\in\mathbb{R}^l
y^k=sigmoid(β−θ)∈Rl,则对该样例的均方误差为:
L
k
=
1
2
∑
j
=
1
l
(
y
^
j
k
−
y
j
k
)
2
\begin{aligned} L_k=\frac{1}{2}\sum_{j=1}^l(\hat y^k_j-y^k_j)^2 \end{aligned}
Lk=21j=1∑l(y^jk−yjk)2
考虑类似感知机的参数更新公式:
w
h
j
←
w
h
j
+
Δ
w
h
j
θ
j
←
θ
j
+
Δ
θ
j
v
i
h
←
v
i
h
+
Δ
v
i
h
γ
h
←
γ
h
+
Δ
γ
h
\begin{aligned} w_{hj}&\leftarrow w_{hj}+\Delta w_{hj} \\ \theta_{j}&\leftarrow \theta_{j}+\Delta \theta_{j} \\ v_{ih}&\leftarrow v_{ih}+\Delta v_{ih} \\ \gamma_{h}&\leftarrow \gamma_{h}+\Delta \gamma_{h} \\ \end{aligned}
whjθjvihγh←whj+Δwhj←θj+Δθj←vih+Δvih←γh+Δγh
BP算法基于梯度下降算法,以目标的负梯度方向对参数进行调整:
Δ
w
h
j
=
−
η
∂
L
k
∂
w
h
j
=
η
g
j
b
h
Δ
θ
j
=
−
η
∂
L
k
∂
θ
j
=
−
η
g
j
Δ
v
i
h
=
−
η
∂
L
k
∂
v
i
h
=
η
e
h
x
i
Δ
γ
h
=
−
η
∂
L
k
∂
γ
h
=
−
η
e
h
\begin{aligned} \Delta w_{hj}&=-\eta\frac{\partial L_k}{\partial w_{hj}}=\eta g_jb_h \\ \Delta \theta_{j}&=-\eta\frac{\partial L_k}{\partial \theta_{j}}=-\eta g_j \\ \Delta v_{ih}&=-\eta\frac{\partial L_k}{\partial v_{ih}}=\eta e_hx_i \\ \Delta \gamma_{h}&=-\eta\frac{\partial L_k}{\partial \gamma_{h}}=-\eta e_h \\ \end{aligned}
ΔwhjΔθjΔvihΔγh=−η∂whj∂Lk=ηgjbh=−η∂θj∂Lk=−ηgj=−η∂vih∂Lk=ηehxi=−η∂γh∂Lk=−ηeh
其中
g
j
g_j
gj称为输出层梯度项,
e
h
e_h
eh称为隐层梯度项:
g
j
=
−
∂
L
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
=
y
^
j
k
(
1
−
y
^
j
k
)
(
y
j
k
−
y
^
j
k
)
e
h
=
−
∂
L
k
∂
b
h
⋅
∂
b
h
∂
α
h
=
b
h
(
1
−
b
h
)
∑
j
=
1
l
w
h
j
g
j
\begin{aligned} g_j&=-\frac{\partial L_k}{\partial\hat y^k_j}\cdot\frac{\partial\hat y^k_j}{\partial\beta_j} \\ &=\hat y^k_j(1-\hat y^k_j)(y^k_j-\hat y^k_j)\\ e_h&=-\frac{\partial L_k}{\partial b_h}\cdot\frac{\partial b_h}{\partial\alpha_h} \\ &=b_h(1-b_h)\sum_{j=1}^lw_{hj}g_j \end{aligned}
gjeh=−∂y^jk∂Lk⋅∂βj∂y^jk=y^jk(1−y^jk)(yjk−y^jk)=−∂bh∂Lk⋅∂αh∂bh=bh(1−bh)j=1∑lwhjgj
具体推导过程比较长,请参考南瓜书。
上述即为标准BP算法:对于每个样例,都先计算输出 y ^ k \hat y_k y^k与损失函数 L k L_k Lk,再计算各层梯度项 g j , e h g_j,e_h gj,eh,最后通过负梯度进行参数更新。
除了标准BP算法外,还有累计BP算法,区别就是累计BP算法通过整个数据集上的平均误差来进行梯度计算以及参数更新,每遍历一次数据集更新一次参数。其损失函数为:
L
=
1
m
∑
k
=
1
m
L
k
L=\frac{1}{m}\sum^m_{k=1}L_k
L=m1k=1∑mLk
5.3.3 BP网络的不足
只需一个包含足够多神经元的隐层,多层前馈网络就能以任意精度逼近任意复杂度的连续函数。
但因为其学习能力过强,常会遇到过拟合的情况。
为了缓解过拟合,常用以下两种方法:
- 早停(early stopping):将数据集分成训练集与验证集,验证集不参与训练,若训练集误差降低且验证集误差升高,则停止训练
- 正则化(regularization):在损失函数中增加一个描述网络复杂度的部分,例如:
L = λ 1 m ∑ k = 1 m L k + ( 1 − λ ) ∑ i w i 2 L=\lambda\frac{1}{m}\sum^m_{k=1}L_k+(1-\lambda)\sum_iw_i^2 L=λm1k=1∑mLk+(1−λ)i∑wi2
BP网络也常常会落入局部极小(local minimum)之中,而非全局极小(global minimum),这显然是我们不希望遇到的
通常可以采取以下办法来缓解这种情况,但是这些方法都没有严格的理论保障
- 使用多组不同初始参数来训练网络,取最终结果最好的那一组
- 使用模拟退火(simulated annealing)技术,即每一步都有一定概率接受比当前解更差的结果
- 使用随机梯度下降
5.4 其他网络简介
西瓜书在这一节是匆匆带过,毕竟时代在进步,我在这里贴一些链接,就不做详细分析了
5.4.1 RBF网络
5.4.2 ART网络
5.4.3 SOM网络
5.4.4 级联相关网络
5.4.5 Elman网络(RNN)
5.4.6 玻尔兹曼机
5.4.7 深度神经网络
现在最火人工智能领域:深度学习
西瓜书中只做了一丢丢的介绍,那这里我就贴一份本人学过,感觉质量非常高的教程,希望对读者有帮助
参考资料
周志华:《机器学习》
李沐:《动手学深度学习》
Datawhale:【吃瓜教程】《机器学习公式详解》(南瓜书)与西瓜书公式推导直播合集