1. 神经元模型
神经网络机器学习中最基本的成分是 “M-P 神经元模型”,如下所示,在这个模型中,神经元接收到来自
n
n
n 个其他神经元传递过来的输入信号,这些输入信号通过带权重的链接(connection)进行传递,神经元接收到的总输入将与神经元的阈值进行比较,然后通过 “激活函数” (activation function)处理以产生神经元的输出。
理想中的激活函数
f
\boldsymbol{f}
f 是下图所示的 阶跃函数,它将输入值映射为输出值 “0” 或 “1”,“0” 对应于神经元抑制,“1” 对应于神经元激活。但是阶跃函数有不连续,不光滑的性质,因此常用 Sigmoid 函数 作为激活函数,典型的 Sigmoid 函数如下面右图所示,它把可能在较大范围内变化的输入值挤压到
(
0
,
1
)
(0,1)
(0,1) 输出值范围内,因此有时也称为 “挤压函数” (squashing function)。
把许多个这样的神经元按照一定的层次结构连接起来,就得到了神经网络。我们可以将神经网络看作包含了许多参数的数学模型,这个模型是若干个函数相互嵌套带入而得。
2. 感知机与多层网络
感知机 (Perceptron) 由两层的神经元组成:
- 输入层 接受外界输入信号后传递给输出层
- 输出层 是 M-P 神经元,也称为 “阈值逻辑单元”(threshold logic unit)。
给定训练数据集,权重
w
i
(
i
=
1
,
2
,
⋯
,
n
)
w_i(i=1,2,\cdots,n)
wi(i=1,2,⋯,n) 以及阈值
θ
\theta
θ 可通过学习得到。我们可以将阈值
θ
\theta
θ 看作一个固定输入为
−
1.0
-1.0
−1.0 的 “哑结点” (dummy node) 所对应的连接权重
w
n
+
1
w_{n+1}
wn+1 ,这样,权重和阈值的学习就可以统一为权重的学习。感知机的学习规制为,对训练样例
(
x
,
y
)
(\boldsymbol{x},y)
(x,y) ,若当前感知机的输出为
h
^
\hat{h}
h^ ,则感知机权重将这样调整:
Δ
w
i
=
η
(
y
−
y
^
)
x
i
\Delta w_i=\eta(y-\hat{y})x_i
Δwi=η(y−y^)xi
w i ← w i + Δ w i w_i \leftarrow w_i+\Delta w_i wi←wi+Δwi
其中 η ∈ ( 0 , 1 ) \eta \in (0,1) η∈(0,1) 称为学习率 (learning rate) 。从上式可以看出,若感知机对训练样例 ( x , y ) (\boldsymbol{x},y) (x,y) 预测正确,则感知机不发生变化,否则将根据错误的程度进行权重调整。
感知机只有输出层神经元进行激活函数处理,我们称为 功能神经元(functional neuron),只有一层功能神经元的感知机学习能力非常有限,其实,感知机只能解决 线性可分 (linearly separable) 的问题,即存在一个线性超平面能够将两类模型分开,对于这样的问题,感知机的学习一定会 收敛 (converge),从而能够学得适当的权向量 w = ( w 1 ; w 2 ; ⋯ ; w n + 1 ) \boldsymbol{w}=(w_1;w_2;\cdots;w_{n+1}) w=(w1;w2;⋯;wn+1) ;否则,感知机学习过程将会发生 振荡(fluctuation) , w \boldsymbol{w} w 难以稳定下来,不能求得合适的解。下图的与、或、非问题都是线性可分的,,但是感知机不能解决异或这种非线性可分的问题。
要解决非线性可分的问题,需要考虑使用多层功能神经元,下图的两层感知机就能解决异或问题,它的输入层与输出层之间的一层神经元被称为 隐层 或 隐含层(hidden layer),隐含层和输入层神经元都是拥有激活函数的功能神经元。
更常见的神经网络是下图所示的层级结构,每层神经元与下一层神经元全互连,同层神经元之间不存在同层连接,也不存在跨层连接。这样的神经网络结构通常称为 “多层前馈神经网络” (multi-layer feedforward neural networks),其中输入神经元接收外界输入,隐层与输入层神经元对信号进行加工,最终结果由输出层神经元输出,即输入层神经元仅仅接受输入,不进行函数处理,隐层与输出层包含功能神经元,因此下图的网络通常被称为 “两层网络”。
实际上,只需要包含隐层,即可称为多层网络,神经网络的学习过程,就是根据训练数据来调整神经元之间的 “连接权”(connection weight) 以及每个功能神经元的阈值,也就是神经元学到的东西,蕴含在连接权与阈值中。前馈神经网络中的 “前馈” 并不意味着网络中信号不能向后传,而是指网络拓扑结构上不存在环或回路。
3. 误差逆传播算法
多层网络的学习能力比单层感知机强得多,但是想要训练多层网络,需要更强大的学习算法。误差逆传播 (error BackPropagation,BP) 就是其中的代表,它是迄今最成功的神经网络学习算法。BP 算法不仅可用于多层前馈神经网络,还可用于其他类型的神经网络,但通常说 “BP 网络” 时,一般是指用 BP 算法训练的多层前馈神经网络。
对于下图所示的神经网络,我们记输出层第 j j j 个神经元的阈值用 θ j \theta_j θj 表示,隐层第 h h h 个神经元的阈值用 γ h \gamma_h γh 表示,并假设隐层和输出层神经元都使用上面提到的 Sigmoid 函数。
对训练例
(
x
k
,
y
k
)
(\boldsymbol{x}_k,\boldsymbol{y}_k)
(xk,yk) ,假定神经网络的输出为
y
^
k
=
(
y
^
1
k
,
y
^
2
k
,
…
,
y
^
l
k
)
\hat{\boldsymbol{y}}_{k}=\left(\hat{y}_{1}^{k}, \hat{y}_{2}^{k}, \ldots, \hat{y}_{l}^{k}\right)
y^k=(y^1k,y^2k,…,y^lk) ,即
y
^
j
k
=
f
(
β
j
−
θ
j
)
\hat{y}_{j}^{k}=f\left(\beta_{j}-\theta_{j}\right)
y^jk=f(βj−θj)
则网络在
(
x
k
,
y
k
)
(\boldsymbol{x}_k,\boldsymbol{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}\left(\hat{y}_{j}^{k}-y_{j}^{k}\right)^{2}
Ek=21j=1∑l(y^jk−yjk)2
BP 是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计,也就是对于任意参数
v
v
v 的更新表达式为:
v
←
v
+
Δ
v
v \leftarrow v+\Delta v
v←v+Δv
可以看出,更新整个网络的主要任务就是求出每个参数的 Δ v \Delta v Δv 。
BP 算法基于 梯度下降 (gradient descent) 策略,以目标的负梯度方向对参数进行调整。对于上式给定的误差
E
k
E_k
Ek ,给定学习率
η
\eta
η ,有
Δ
w
h
j
=
−
η
∂
E
k
∂
w
h
j
\Delta w_{h j}=-\eta \frac{\partial E_{k}}{\partial w_{h j}}
Δ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_{h j}}=\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_{h j}}
∂whj∂Ek=∂y^jk∂Ek⋅∂βj∂y^jk⋅∂whj∂βj
之后有
∂
β
j
∂
w
h
j
=
b
h
,
\frac{\partial \beta_{j}}{\partial w_{h j}}=b_{h},
∂whj∂βj=bh,
g j = − ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j = − ( y ^ j k − y j k ) f ′ ( β j − θ j ) = y ^ j k ( 1 − y ^ j k ) ( y j k − y ^ j k ) \begin{aligned} g_{j} &=-\frac{\partial E_{k}}{\partial \hat{y}_{j}^{k}} \cdot \frac{\partial \hat{y}_{j}^{k}}{\partial \beta_{j}} \\ &=-\left(\hat{y}_{j}^{k}-y_{j}^{k}\right) f^{\prime}\left(\beta_{j}-\theta_{j}\right) \\ &=\hat{y}_{j}^{k}\left(1-\hat{y}_{j}^{k}\right)\left(y_{j}^{k}-\hat{y}_{j}^{k}\right) \end{aligned} gj=−∂y^jk∂Ek⋅∂βj∂y^jk=−(y^jk−yjk)f′(βj−θj)=y^jk(1−y^jk)(yjk−y^jk)
所以可以得到关于
w
h
j
w_{hj}
whj 的更新公式:
Δ
w
h
j
=
η
g
j
b
h
\Delta w_{h j}=\eta g_{j} b_{h}
Δwhj=ηgjbh
类似可以得到:
Δ
θ
j
=
−
η
g
j
Δ
v
i
h
=
η
e
h
x
i
Δ
γ
h
=
−
η
e
h
\begin{aligned} \Delta \theta_{j} &=-\eta g_{j} \\ \Delta v_{i h} &=\eta e_{h} x_{i} \\ \Delta \gamma_{h} &=-\eta e_{h} \end{aligned}
ΔθjΔvihΔγh=−ηgj=ηehxi=−ηeh
其中,
e
h
=
−
∂
E
k
∂
b
h
⋅
∂
b
h
∂
α
h
=
−
∑
j
=
1
l
∂
E
k
∂
β
j
⋅
∂
β
j
∂
b
h
f
′
(
α
h
−
γ
h
)
=
∑
j
=
1
l
w
h
j
g
j
f
′
(
α
h
−
γ
h
)
=
b
h
(
1
−
b
h
)
∑
j
=
1
l
w
h
j
g
j
\begin{aligned} e_{h} &=-\frac{\partial E_{k}}{\partial b_{h}} \cdot \frac{\partial b_{h}}{\partial \alpha_{h}} \\ &=-\sum_{j=1}^{l} \frac{\partial E_{k}}{\partial \beta_{j}} \cdot \frac{\partial \beta_{j}}{\partial b_{h}} f^{\prime}\left(\alpha_{h}-\gamma_{h}\right) \\ &=\sum_{j=1}^{l} w_{h j} g_{j} f^{\prime}\left(\alpha_{h}-\gamma_{h}\right) \\ &=b_{h}\left(1-b_{h}\right) \sum_{j=1}^{l} w_{h j} g_{j} \end{aligned}
eh=−∂bh∂Ek⋅∂αh∂bh=−j=1∑l∂βj∂Ek⋅∂bh∂βjf′(αh−γh)=j=1∑lwhjgjf′(αh−γh)=bh(1−bh)j=1∑lwhjgj
学习率 η ∈ ( 0 , 1 ) \eta\in (0,1) η∈(0,1) 控制每一轮迭代中的更新步长,若太大则容易振荡,太小则收敛速度又会过慢。有时为了精细调节,可以令更新 w w w 和 θ \theta θ 的学习率和更新 v v v 与 γ \gamma γ 的学习率不同。
综上所述,BP 算法的工作流程为:
- 先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果
- 计算输出层的误差,再将误差逆向传播至隐层神经元
- 最后根据隐层神经元的误差来对连接权和阈值进行调整
- 迭代上面的步骤,直到达到某个停止条件
BP 算法的目标是最小化训练集 D 上的累积误差:
E
=
1
m
∑
k
=
1
m
E
k
E=\frac{1}{m} \sum_{k=1}^{m} E_{k}
E=m1k=1∑mEk
但是我们上面使用的是 “标准 BP 算法”,每次仅针对一个训练样本样例进行更新连接权和阈值,它的更新规则是基于单个的 E k E_k Ek 推到得到的,如果类似的推导出基于累计误差最小化的更新规则,就得到了 累计误差逆传播(accumulated error backpropagation) 算法。
一般来说,标准 BP 算法每次更新只针对单个样例,参数更新的非常频繁,而且对不同样例进行更新的效果可能出现 “抵消” 现象,因此为了达到同样的累计误差极小点,往往需要进行更多次数的迭代。累积 BP 算法直接针对累积误差最小化,它在读取整个训练集 D 一遍后才会对参数更新,其参数更新的频率低得多。但在很多任务中,累积误差下降到一定程度后,进一步下降会变得非常缓慢,这时标准 BP 算法往往会更快获得较好的解。
只需要一个包含足够多神经元的隐层,多层前馈神经网络就能以任意精度逼近任意复杂的连续函数,但是如何设置隐层神经元的个数,需要通过 “试错法”(trial-by-error) 调整。
BP 神经网络有着强大的表示能力,这让他经常遭遇过拟合,即在训练集上的误差持续降低,但测试误差却可能上升。有两种策略常用来缓解 BP 网络的过拟合:
- 早停(early stopping):将数据分成训练集和验证集,训练集用于更新参数,验证集用于估计误差,如果训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。
- 正则化(regularization):在误差目标函数中增加一个用于描述网络复杂的的部分,例如连接权与阈值的平方和,那么误差函数将变为
E = λ 1 m ∑ k = 1 m E k + ( 1 − λ ) ∑ i w i 2 E=\lambda \frac{1}{m} \sum_{k=1}^{m} E_{k}+(1-\lambda) \sum_{i} w_{i}^{2} E=λm1k=1∑mEk+(1−λ)i∑wi2
其中 λ ∈ ( 0 , 1 ) \lambda \in (0,1) λ∈(0,1) 用于对经验误差对网络复杂度这两项进行折中,通常通过交叉验证法来估计。
4. 全局最小与局部最小
若用 E 表示神经网络在训练集上的误差,它是关于连接权 w \boldsymbol{w} w 和阈值 θ \theta θ 的函数。这样整个训练过程可以看作一个参数寻优的过程,也就是在参数空间中,寻找一组最优参数使得 E E E 最小。
这里我们首先讨论两种 “最优”:
-
局部极小(local minimum):若对于 w ∗ \boldsymbol{w}^* w∗ 和 θ ∗ \theta^* θ∗,若存在 ϵ > 0 \epsilon>0 ϵ>0,使得
∀ ( w ; θ ) ∈ { ( w ; θ ) ∣ ∥ ( w ; θ ) − ( w ∗ ; θ ∗ ) ∥ ⩽ ϵ } \forall(\boldsymbol{w} ; \theta) \in\left\{(\boldsymbol{w} ; \theta) \mid\left\|(\boldsymbol{w} ; \theta)-\left(\boldsymbol{w}^{*} ; \theta^{*}\right)\right\| \leqslant \epsilon\right\} ∀(w;θ)∈{(w;θ)∣∥(w;θ)−(w∗;θ∗)∥⩽ϵ}都有 E ( w ; θ ) ⩾ E ( w ∗ ; θ ∗ ) E(\boldsymbol{w} ; \theta) \geqslant E\left(\boldsymbol{w}^{*} ; \theta^{*}\right) E(w;θ)⩾E(w∗;θ∗) 成立,则 ( w ∗ ; θ ∗ ) (\boldsymbol{w}^*;\theta^*) (w∗;θ∗) 为局部极小解。它表示参数空间中的某个点,其邻域点的误差函数均不小于该点的误差值。
-
全局最小(global minimum):若对于参数空间中的任意 ( w ; θ ) (\boldsymbol{w};\theta) (w;θ) 都有 E ( w ; θ ) ⩾ E ( w ∗ ; θ ∗ ) E(\boldsymbol{w} ; \theta) \geqslant E\left(\boldsymbol{w}^{*} ; \theta^{*}\right) E(w;θ)⩾E(w∗;θ∗) ,则 ( w ∗ ; θ ∗ ) (\boldsymbol{w}^*;\theta^*) (w∗;θ∗) 为全局最小解。它是指参数空间中所有点的误差函数值军不小于该点的误差函数值。
参数空间内梯度为零的点,只要其误差函数值小于邻点的误差函数值,就是局部极小点。可能有多个局部最小,但只会有一个全局最小,我们希望找到的是全局最小。基于梯度的搜索时使用最广范的参数寻优方法。这种方法,我们从初始解出发,迭代寻找最优参数值,每次迭代中先计算误差函数在当前点的梯度,然后根据梯度确定搜索方向,因为负梯度方向是函数值下降最快的方向,因此梯度下降法就是沿着负梯度方向搜索最优解。若找到梯度为零的点,则已达到局部极小,将停止更新。
但是如果误差函数有多个局部极小,就不能找到全局最小,这里我们可以选择下面的策略来 “跳出” 局部极小,从而进一步接近全局最小:
- 以多组不同参数值初始化多个神经网络,最后取误差最小的解作为最终参数。这相当于从多个不同的初始点开始搜索,这样就可能陷入不同的局部最小,从中选择有可能获得更接近全局最小的结果。
- 使用 “模拟退火” (simulated annealing) 技术,它每一步都以一定的概率接受比当前解更差的结果,从而有助于 “跳出” 局部极小。在每一步迭代中,接受 “次优解” 的概率要逐渐降低,从而保证算法稳定。
- 使用随机梯度下降,随机梯度下降算法在计算梯度时加入了随机因素,这样即便陷入局部极小点,它计算出的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索。
5. 其他常见神经网络
5.1 RBF 网络
RBF(Radial Basis Function,径向基函数) 网络是一种 单隐层前馈神经网络,它使用径向基函数作为隐层神经元激活函数,而输出层是对隐层神经元输出的线性组合。假定输入为
d
d
d 维向量
x
\boldsymbol{x}
x ,输出为实值,则 RBF 网络可以表示为
φ
(
x
)
=
∑
i
=
1
q
w
i
ρ
(
x
,
c
i
)
\varphi(\boldsymbol{x})=\sum_{i=1}^{q} w_{i} \rho\left(\boldsymbol{x}, \boldsymbol{c}_{i}\right)
φ(x)=i=1∑qwiρ(x,ci)
其中 q q q 为隐层神经元个数, c i \boldsymbol{c}_i ci 和 w i w_i wi 分别是第 i i i 个隐层神经元所对应的中心和权重, ρ ( x , c i ) \rho\left(\boldsymbol{x}, \boldsymbol{c}_{i}\right) ρ(x,ci) 是径向基函数,这是某种沿径向对称的标量函数,通常定义为样本 x \boldsymbol{x} x 到数据中心 c i \boldsymbol{c}_i ci 之间欧式距离的单调函数。常用的高斯径向基函数为
足够多隐层神经元的 RBF 网络能够以任意精度逼近任意连续函数。RBF 网络通常采用两步训练:
- 确定神经元中心 c i \boldsymbol{c}_i ci ,常使用随机采样、聚类等方法。
- 利用 BP 算法等来确定参数 w i w_i wi 和 β i \beta_i βi 。
5.2 ART 网络
竞争型学习(competitive learning) 是神经网络中一种常用的 无监督学习 策略,该策略使得网络的输出神经元相互竞争,每一时刻仅有一个竞争获胜的神经元被激活,其他神经元被抑制。
ART(Adaptive Resonance Theroy,自适应谐振理论) 网络是竞争型学习的重要代表。该网络由 比较层、识别层、识别阈值 和 重置模块 构成。比较层接收输入样本,传给识别层神经元。识别层的每个神经元对应一个模式类,神经元数目可以在训练过程中动态增长以增加新的模式类。
在接收到比较层的输入后,
- 识别层神经元之间相互竞争以产生获胜神经元。竞争的最简单的方式是,计算输入向量与每个识别层神经元所对应的模式类的代表向量之间的距离,距离最小者获胜。
- 获胜神经元将向其他识别层神经元发送信号,抑制其激活。
- 之后比较输入向量与获胜神经元所对应的代表向量之间的相似度,
①如果相似度大于阈值,则把当前输入样本归为该代表向量所属类别,同时网络连接权将会更新,使得以后再收到相似输入样本时该模式类会计算出更大的相似度,从而使该获胜神经元由更大的可能获胜。
②若相似度不大于识别阈值,则重置模块将在识别层增设一个新的神经元,其代表向量就设置为当前输入向量。
识别阈值对整个网络的性能有重要影响,当识别阈值较高时,输入样本将会被分为更多更细的模式类。而如果阈值较低,则会产生比较少、比较粗略的模式类。
ART 可以比较好的进行增量学习或在线学习。增量学习(incremental learning) 是指在学得模型后,再收到训练样例时,仅根据新样例对模型进行更新,不必重新训练整个模型,并且先前学得的有效信息不会被 “冲掉”;在线学习(online learning) 是指每获得一个新样本就进行一次模型更新,在线学习是增量学习的特例,增量学习可以看成 “批模式”(batch-mode) 的在线学习。
5.3 SOM 网络
SOM(Self-Organizing Map,自组织映射)网络是一种竞争型的无监督神经网络,他能将高维输入数据映射到低维空间(通常为二维),同时保持输入数据在高维空间的拓扑结构,即将高维空间中相似的样本点映射到网络输出层中的邻近神经元。
如下图所示,SOM 网络中的输出层神经元以矩阵方式排列在二维空间中,每个神经元都拥有一个权向量,网络在接受输入向量后,将会确定输出层获胜神经元,它决定了该输入向量在低维空间中的位置。SOM 的训练目标就是为了每个输出神经元找到合适的权向量,以达到保持拓扑结构的目的。
SOM 的训练过程为:
- 输入层接收训练样本后,每个输出层神经元会计算该样本与自身携带的权向量之间的距离,距离最近的神经元成为竞争获胜者,称为最佳匹配单元(best matching unit)。
- 最佳匹配单元及其邻近神经元的权向量被调整,使得这些权向量与当前输入样本的距离缩小。
- 重复上面的步骤,直至收敛。
5.4 级联相关网络
结构自适应网络 是网络结构不是事先固定的神经网络,训练的目的是使用训练样本来确定合适的连接权、阈值等参数。其将网络结构也作为学习的目标之一,并希望在训练中找到最符合数据特点的网络结构。
级联相关网络(Cascade-Correlation)是结构自适应网络的重要代表。它主要有两个成分:
- 级联:级联是指建立层次连接的层级结构,在开始训练时网络只有输入层和输出层,处于最小拓扑结构,随着训练的进行,新的隐层神经元逐渐加入,从而创建层级结构,当新的隐层神经元加入时,其输入端连接权值是冻结固定的。
- 相关:相关指通过最大化新神经元的输出与网络误差之间的相关性来训练相关的参数。
与一般的网络相比,级联相关网络无需设置网络层数、隐层神经元数目,且其训练速度较快,但其在数据较小时易陷入过拟合。
5.5 Elman 网络
“递归神经网络” (recurrent neural networks)允许网络中出现环形结构,从而可以让一些神经元的输出反馈回来作为输入信号。这样的结构,使得网络在 t t t 时刻的输出状态不仅与 t t t 时刻的输入有关,还与 t − 1 t-1 t−1 时刻的网络状态有关,从而能处理与时间有关的动态变化。
Elman 网络是最常用的递归神经网络之一,其结构如下,它的一层神经元的输出被反馈回来,与下一时刻输入层神经元提供的信号一起,作为隐层神经元在下一时刻的输入。隐层神经元通常采用 Sigmoid 激活函数,而网络的训练常通过推广的 BP 算法进行。
5.6 Boltzmann 机
神经网络中有一类模型是为网络状态定义一个 “能量”(energy),能量最小化时网络达到理想状态,而网络的训练就是在最小化整个能量函数。
Boltzmann 机 就是一种 基于能量的模型(energy-based model) 的神经网络,常见的结构如下
其神经元分为两层:
- 显层:用于表示数据的输入与输出
- 隐层:隐层被理解为数据的内在表达
Boltzmann 机中的神经元都是布尔型的,只能取 0、1 两种状态,状态 1 表示激活,状态 0 表示抑制。令向量
s
∈
{
0
,
1
}
n
\boldsymbol{s} \in \{ 0,1 \}^n
s∈{0,1}n 表示
n
n
n 个神经元的状态,
w
i
j
w_{ij}
wij 表示神经元
i
i
i 与
j
j
j 之间的连接权,
θ
i
\theta_i
θi 表示神经元
i
i
i 的阈值,则状态向量
s
\boldsymbol{s}
s 所对应的 Boltzmann 机能量定义为
E
(
s
)
=
−
∑
i
=
1
n
−
1
∑
j
=
i
+
1
n
w
i
j
s
i
s
j
−
∑
i
=
1
n
θ
i
s
i
E(\boldsymbol{s})=-\sum_{i=1}^{n-1} \sum_{j=i+1}^{n} w_{i j} s_{i} s_{j}-\sum_{i=1}^{n} \theta_{i} s_{i}
E(s)=−i=1∑n−1j=i+1∑nwijsisj−i=1∑nθisi
若网络中的神经元以任意不依赖于输入值的顺序进行更新,则网络最终将达到 Boltzmann 分布,此时状态向量
s
\boldsymbol{s}
s 出现的概率将仅由其能量与所有可能状态向量的能量确定:
P
(
s
)
=
e
−
E
(
s
)
∑
t
e
−
E
(
t
)
P(\boldsymbol{s})=\frac{e^{-E(\boldsymbol{s})}}{\sum_{\boldsymbol{t}} e^{-E(\boldsymbol{t})}}
P(s)=∑te−E(t)e−E(s)
Boltzmann 机的训练过程就是将每个训练样本视为一个状态向量,使其出现的概率尽可能大。标准的 Boltzmann 机是一个全连接图,训练的复杂度很高,现实中常采用 受限 Boltzmann 机(Restricted Boltzmann Machine,RBM),也就是仅保留显层与隐层之间的连接,从而将 Boltzmann 机结构由完全图简化为二部图。
受限 Boltzmann 机常用 “对比散度”(Contrastive Divergence,CD) 算法来进行训练。假定网络中有
d
d
d 个显层神经元和
q
q
q 个隐层神经元,令
v
\boldsymbol{v}
v 和
h
\boldsymbol{h}
h 分别表示显层与隐层的状态向量,则有
P
(
v
∣
h
)
=
∏
i
=
1
d
P
(
v
i
∣
h
)
P
(
h
∣
v
)
=
∏
j
=
1
q
P
(
h
j
∣
v
)
\begin{aligned} P(\boldsymbol{v} \mid \boldsymbol{h}) &=\prod_{i=1}^{d} P\left(v_{i} \mid \boldsymbol{h}\right) \\ P(\boldsymbol{h} \mid \boldsymbol{v}) &=\prod_{j=1}^{q} P\left(h_{j} \mid \boldsymbol{v}\right) \end{aligned}
P(v∣h)P(h∣v)=i=1∏dP(vi∣h)=j=1∏qP(hj∣v)
CD 算法对每个训练样本
v
\boldsymbol{v}
v ,先根据上式计算出隐层神经元的概率分布,然后根据这个概率分布采样得到
h
\boldsymbol{h}
h;之后再从
h
\boldsymbol{h}
h 产生
v
′
\boldsymbol{v}'
v′ ,再从
v
′
\boldsymbol{v}'
v′ 产生
h
′
\boldsymbol{h}'
h′ ;连接权的更新公式为:
Δ
w
=
η
(
v
h
⊤
−
v
′
h
′
⊤
)
\Delta w=\eta\left(\boldsymbol{v} \boldsymbol{h}^{\top}-\boldsymbol{v}^{\prime} \boldsymbol{h}^{\prime \top}\right)
Δw=η(vh⊤−v′h′⊤)
6. 深度学习
理论上说,参数越多的模型复杂度越高、“容量”(capacity) 越大,这就意味着它能完成更复杂的学习任务。复杂模型的训练效率会比较较低,但随着计算能力的提升,效率低下的问题得到了缓解,同时训练数据的大幅增加可以降低过拟合的风险,因此,以 “深度学习”(deep learning) 为代表的复杂模型开始受到人们的关注。
典型的深度学习模型是很深层的神经网络。可以通过增加隐层的层数或者神经元的个数提高复杂度,但是增加隐层的层数比增加隐层神经元更有效,因为增加隐层不仅增加了神经元个数,还增加了激活函数嵌套的层数。然而,多隐层神经网络不能直接用经典算法(标准 BP 算法)进行训练,因为误差在多隐层内逆传播时,往往会 “发散”(diverge) 而不能收敛到稳定状态。
无监督逐层训练(unsupervised layer-wise training) 是多隐层网络训练的有效手段,其基本思想为:每次训练一层隐结点,训练时将上一层隐结点的输出作为输入,而本层隐结点的输出作为下一层隐结点的输入,这称为 “预训练”(pre-training);在预训练全部完成后,再对整个网络进行 “微调”(finetuning) 训练。
事实上,“预训练+微调” 的做法可以看成将大量参数分组,对每组先找到局部看来比较好的设置,再基于这些局部较优的结果联合起来进行全局寻优。
另一种节省开销的策略是 “权共享”(weight sharing) ,即让一组神经元使用相同的连接权。这个策略在卷积神经网络(Convolutional Neural Network,CNN)中有重要的作用。CNN 可以用 BP 算法进行训练,但在训练中无论是卷积还是采样,其每组神经元都是用相同的连接权,从而大幅减少了需要训练的参数数目。
深度学习通过多层的处理,将初始的、与输出目标联系不密切的输入进行逐层加工,从而把输入转化为与输出目标联系更密切的表示。通过多层处理,将初始的 “低层” 特征表示转化为 “高层” 特征表示后,用 “简单模型” 即可完成复杂的分类等学习任务。由此可以将深度学习理解为进行 “特征学习”(feature learning) 或 “表示学习”(representation learning)。
以往在机器学习中用于现实任务时,描述样本的特征通常需要由人类专家来设计,这称为 特征工程(feature engineering)。特征的好坏对泛化性能有很重要的作用,特征学习通过机器学习技术自身来产生好特征,这使得机器学习向 “全自动数据分析” 又前进了一步。