机器学习 第5章-神经网络
5.1 神经元模型
神经网络(neural networks)方面的研究很早就已出现,今天“神经网络已是一个相当大的、多学科交叉的学科领域。各相关学科对神经网络的定义多种多样,本书采用目前使用得最广泛的一种,即“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应”。我们在机器学习中谈论神经网络时指的是“神经网络学习”,或者说,是机器学习与神经网络这两个学科领域的交叉部分。
神经网络中最基本的成分是神经元(neuron)模型,即上述定义中的“简单单元”:在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”(threshold),那么它就会被激活,即“兴奋起来,向其他神经元发送化学物质。
1943年,将上述情形抽象为图 5.1所示的简单模型,这就是一直沿用至今的“M-P神经元模型”。在这个模型中,神经元接收到来自几个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接(connection)进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”(activation function)处理以产生神经元的输出
理想中的激活函数是图5.2(a)所示的阶跃函数,它将输入值映射为输出值“0”或“1”,显然“1”对应于神经元兴奋,“0”对应于神经元抑制。然而,阶跃函数具有不连续、不光滑等不太好的性质,因此实际常用Sigmoid函数作为激活函数。典型的Sigmoid 函数如图5.2(b)所示,它把可能在较大范围内变化的输入值挤压到(0,1)输出值范围内,因此有时也称为“挤压函数”(squashing function)
把许多个这样的神经元按一定的层次结构连接起来,就得到了神经网络
事实上,从计算机科学的角度看,我们可以先不考虑神经网络是否真的模拟了生物神经网络,只需将一个神经网络视为包含了许多参数的数学模型,这个模型是若干个函数,例如 y j = f ( ∑ i w i x i − θ j ) y_j=f(∑_iw_ix_i-θ_j) yj=f(∑iwixi−θj)相互(嵌套)代入而得。有效的神经网络学习算法大多以数学证明为支撑
5.2 感知机与多层网络
感知机(Perceptron)由两层神经元组成,如图5.3所示,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”(threshold logic unit)。
感知机能容易地实现逻辑与、或、非运算。
给定训练数据集,权重
w
i
(
i
=
1
,
2
,
.
.
.
,
n
)
w_i(i=1,2,...,n)
wi(i=1,2,...,n)以及阈值
θ
θ
θ可通过学习得到。阈值
θ
θ
θ可看作一个固定输入为-1.0的“哑结点”(dummy node)所对应的连接权重
w
n
+
1
w_{n+1}
wn+1,这样,权重和阈值的学习就可统一为权重的学习。感知机学习规则非常简单,对训练样例
(
x
,
y
)
(x,y)
(x,y),若当前感知机的输出为
y
^
\hat y
y^则感知机权重将这样调整:
w
i
←
w
i
+
Δ
w
i
w_i←w_i+Δw_i
wi←wi+Δwi
Δ
w
i
=
η
(
y
−
y
^
)
x
i
Δw_i=η(y-\hat y)x_i
Δwi=η(y−y^)xi
其中
η
∈
(
0
,
1
)
η∈(0,1)
η∈(0,1)称为学习率(learning rate)。可看出,若感知机对训练样例
(
x
,
y
)
(x,y)
(x,y)预测正确,即
y
^
=
y
\hat y=y
y^=y,则感知机不发生变化,否则将根据错误的程度进行权重调整
需注意的是,感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元(functional neuron),其学习能力非常有限。事实上,上述与、或、非问题都是线性可分(linearly separable)的问题。若要解决非线性可分问题,则需考虑使用多层功能神经元。
要解决非线性可分问题,需考虑使用多层功能神经元。例如图5.5中这个简单的两层感知机就能解决异或问题。在图5.5(a)中,输出层与输入层之间的层神经元,被称为隐层或隐含层(hidden layer),隐含层和输出层神经元都是拥有激活函数的功能神经元。
更一般的,常见的神经网络是形如图5.6所示的层级结构,每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接。这样的神经网络结构通常称为“多层前馈神经网络”(multi-layer feedforward neural networks)
其中输入层神经元接收外界输入,隐层与输出层神经元对信号进行加工,最终结果由输出层神经元输出;换言之,输入层神经元仅是接受输入,不进行函数处理,隐层与输出层包含功能神经元。因此,图5.6(a)通常被称为“两层网络”。为避免歧义,称其为“单隐层网络”。只需包含隐层,即可称为多层网络。神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权”(connection weight)以及每个功能神经元的阈值;换言之,神经网络“学”到的东西,蕴涵在连接权与阈值中。
5.3 误差逆传播算法
多层网络的学习能力比单层感知机强得多。欲训练多层网络,简单感知机学习规则显然不够了,需要更强大的学习算法。误差逆传播(errorBackPropagation,简称BP)算法就是其中最杰出的代表,它是迄今最成功的神经网络学习算法。现实任务中使用神经网络时,大多是在使用BP算法进行训练。值得指出的是,BP算法不仅可用于多层前馈神经网络,还可用于其他类型的神经网络,例如训练递归神经网络。但通常说“BP 网络”时般是指用 BP 算法训练的多层前馈神经网络
BP是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计,即与前面类似,任意参数v的更新估计式为
v
←
v
+
Δ
v
v←v+Δv
v←v+Δv
BP算法基于梯度下降(gradient descent)策略,以目标的负梯度方向对参数进行调整。学习率
η
η
η控制着算法每一轮迭代中的更新步长,若太大则容易振荡,太小则收敛速度又会过慢。
图 5.8给出了BP算法的工作流程。对每个训练样例,BP算法执行以下操作:先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差(第 4-5 行),再将误差逆向传播至隐层神经元(第6行),最后根据隐层神经元的误差来对连接权和值进行调整(第7行)该迭代过程循环进行,直到达到某些停止条件为止,例如训练误差已达到一个很小的值。图5.9给出了在2个属性、5个样本的西瓜数据上,随着训练轮数的增加,网络参数和分类边界的变化情况。
需注意的是,BP算法的目标是要最小化训练集D上的累积误差
E
=
1
m
∑
k
=
1
m
E
k
E={1\over m}∑^m_{k=1}E_k
E=m1k=1∑mEk
基于累积误差最小化的更新规则,就得到了累积误差逆传播(accumulated error backpropagation)算法。 累积 BP 算法与标准 BP 算法都很常用。一般来说,标准 BP算法每次更新只针对单个样例,参数更新得非常频繁,而且对不同样例进行更新的效果可能出现“抵消”现象。因此,为了达到同样的累积误差极小点,标准 BP 算法往往需进行更多次数的迭代。累积 BP 算法直接针对累积误差最小化,它在读取整个训练集D一遍后才对参数进行更新其参数更新的频率低得多。但在很多任务中,累积误差下降到一定程度之后,进一步下降会非常缓慢,这时标准BP往往会更快获得较好的解,尤其是在训练集 D 非常大时更明显。
正是由于其强大的表示能力,BP神经网络经常遭遇过拟合,其训练误差持续降低,但测试误差却可能上升。
有两种策略常用来缓解BP网络的过拟合:
第一种策略是“早停”(earlystopping):将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。
第二种策略是“正则化”(regularization),其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。仍令
E
k
E_k
Ek表示第
k
k
k个训练样例上的误差,
w
i
w_i
wi表示连接权和阈值,则误差目标函数为
E
=
λ
1
m
∑
k
=
1
m
E
k
+
(
1
−
λ
)
∑
i
w
i
2
E=λ{1\over m}∑^m_{k=1}E_k+(1-λ)∑_iw^2_i
E=λm1k=1∑mEk+(1−λ)i∑wi2
其中
λ
∈
(
0
,
1
)
λ∈(0,1)
λ∈(0,1)用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。
5.4 全局最小与局部极小
若用 E E E表示神经网络在训练集上的误差,则它显然是关于连接权和阈值 θ θ θ的函数。此时,神经网络的训练过程可看作一个参数寻优过程,即在参数空间中,寻找一组最优参数使得最小。
我们常会谈到两种“最优”:
“局部极小”(local minimum),即参数空间中的某个点,其邻域点的误差函数值均不小于该点的误差函数值。
“全局最小”(global minimum),即参数空间中的某个点,所有其他点的误差函数值均不小于该点的误差函数值
要成为局部极小点,在数学上,只要满足该点在参数空间中的梯度为零。局部极小可以有多个,而全局最小只有一个。全局最小一定是局部极小,但局部最小却不一定是全局最小。
在现实任务中,人们常采用以下策略来试图“跳出”局部极小,从而进步接近全局最小:
1、以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数。这相当于从多个不同的初始点开始搜索,这样就可能陷入不同的局部极小,从中进行选择有可能获得更接近全局最小的结果。
2、使用“模拟退火”(simulated annealing)技术,模拟退火在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小。在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法稳定。
3、使用随机梯度下降。与标准梯度下降法精确计算梯度不同,随机梯度下降法在计算梯度时加入了随机因素。于是,即便陷入局部极小点,它计算出的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索
此外,遗传算法(genetic algorithms)也常用来训练神经网络以更好地逼近全局最小。需注意的是,上述用于跳出局部极小的技术大多是启发式,理论上尚缺乏保障。
5.5 其他常见神经网络
5.5.1 RBF网络
RBF(Radial Basis Function,径向基函数)网络是一种单隐层前馈神经网络,它使用径向基函数作为隐层神经元激活函数,而输出层则是对隐层神经元输出的线性组合。假定输入为
d
d
d维向量
x
x
x,输出为实值,则 RBF 网络可表示为
φ
(
x
)
=
∑
i
=
1
q
w
i
ρ
(
x
,
c
i
)
\varphi (x)=\sum_{i=1}^{q}w_i\rho (x,c_i)
φ(x)=i=1∑qwiρ(x,ci)
其中
q
q
q为隐层神经元个数,
x
i
x_i
xi和
w
i
w_i
wi分别是第
i
i
i个隐层神经元所对应的中心和权重,
ρ
(
x
,
c
i
)
ρ(x,c_i)
ρ(x,ci)是径向基函数,这是某种沿径向对称的标量函数,通常定义为样本
x
x
x到数据中心
c
i
c_i
ci之间欧氏距离的单调函数。
5.5.2 ART网络
竞争型学习(competitive learning)是神经网络中一种常用的无监督学习策略,在使用该策略时,网络的输出神经元相互竞争,每一时刻仅有一个竞争获胜的神经元被激活,其他神经元的状态被抑制。这种机制亦称“胜者通吃”(winner-take-all)原则。
ART(Adaptive Resonance Theory,自适应谐振理论)网络是竞争型学习的重要代表。该网络由比较层、识别层、识别阈值和重置模块构成。其中,比较层负责接收输入样本,并将其传递给识别层神经元,识别层每个神经元对应一个模式类,神经元数目可在训练过程中动态增长以增加新的模式类。
在接收到比较层的输入信号后,识别层神经元之间相互竞争以产生获胜神经元。竞争的最简单方式是,计算输入向量与每个识别层神经元所对应的模式类的代表向量之间的距离,距离最小者胜。获胜神经元将向其他识别层神经元发送信号,抑制其激活。若输入向量与获胜神经元所对应的代表向量之间的相似度大于识别阈值,则当前输入样本将被归为该代表向量所属类别,同时,网络连接权将会更新,使得以后在接收到相似输入样本时该模式类会计算出更大的相似度,从而使该获胜神经元有更大可能获胜:若相似度不大于识别值,则重置模块将在识别层增设一个新的神经元,其代表向量就设置为当前输入向量。
显然,识别阈值对ART网络的性能有重要影响。当识别值较高时,输入样本将会被分成比较多、比较精细的模式类,而如果识别阈值较低,则会产生比较少、比较粗略的模式类。
ART比较好地缓解了竞争型学习中的“可塑性-稳定性窘境”(stabilityplasticity dilemma),可塑性是指神经网络要有学习新知识的能力,而稳定性则是指神经网络在学习新知识时要保持对旧知识的记忆。这就使得ART网络具有一个很重要的优点:可进行增量学习(incremental learning)或在线学习(online learning)。
早期的 ART 网络只能处理布尔型输入数据,此后ART发展成了一个算法族,包括能处理实值输入的 ART2网络、结合模糊处理的FuzzyART 网络,以及可进行监督学习的 ARTMAP 网络等。
5.5.3 SOM网络
SOM(Self-Organizing Map,自组织映射)网络是一种竞争学习型的无监督神经网络,它能将高维输入数据映射到低维空间(通常为二维),同时保持输入数据在高维空间的拓扑结构,即将高维空间中相似的样本点映射到网络输出层中的邻近神经元。
如图5.11所示,SOM 网络中的输出层神经元以矩阵方式排列在二维空间中,每个神经元都拥有一个权向量,网络在接收输入向量后,将会确定输出层获胜神经元,它决定了该输入向量在低维空间中的位置。SOM的训练目标就是为每个输出层神经元找到合适的权向量,以达到保持拓扑结构的目的。
SOM 的训练过程很简单:在接收到一个训练样本后,每个输出层神经元会计算该样本与自身携带的权向量之间的距离,距离最近的神经元成为竞争获胜者,称为最佳匹配单元(best matching unit)。然后,最佳匹配单元及其邻近神经元的权向量将被调整,以使得这些权向量与当前输入样本的距离缩小,这个过程不断迭代,直至收敛。
5.5.4 级联相关网络
般的神经网络模型通常假定网络结构是事先固定的,训练的目的是利用训练样本来确定合适的连接权、阈值等参数,与此不同,结构自适应网络则将网络结构也当作学习的目标之一,并希望能在训练过程中找到最符合数据特点的网络结构。级联相关(Cascade-Correlation)网络是结构自适应网络的重要代表
级联相关网络有两个主要成分:“级联”和“相关”。级联是指建立层次连接的层级结构。在开始训练时,网络只有输入层和输出层,处于最小拓扑结构;随着训练的进行,如图 5.12所示,新的隐层神经元逐渐加入,从而创建起层级结构。当新的隐层神经元加入时,其输入端连接权值是冻结固定的。相关是指通过最大化新神经元的输出与网络误差之间的相关性(correlation)来训练相关的参数。
与一般的前馈神经网络相比,级联相关网络无需设置网络层数、隐层神经元数目,且训练速度较快,但其在数据较小时易陷入过拟合
5.5.5 Elman网络
与前馈神经网络不同,“递归神经网络”(recurrent neural networks)允许网络中出现环形结构,从而可让一些神经元的输出反馈回来作为输入信号。这样的结构与信息反馈过程,使得网络在t时刻的输出状态不仅与t时刻的输入有关,还与t-1时刻的网络状态有关,从而能处理与时间有关的动态变化。
Elman网络是最常用的递归神经网络之一,其结构如图5.13所示,它的结构与多层前馈网络很相似,但隐层神经元的输出被反馈回来,与下一时刻输入层神经元提供的信号一起,作为隐层神经元在下一时刻的输入。隐层神经元通常采用 Sigmoid 激活函数,而网络的训练则常通过推广的 BP 算法进行
5.5.6 Boltzmann机
神经网络中有一类模型是为网络状态定义一个“能量”(energy),能量最小化时网络达到理想状态,而网络的训练就是在最小化这个能量函数。Boltzmann机就是一种“基于能量的模型”(energy-basedmodel),常见结构如图 5.14(a)所示,其神经元分为两层:显层与隐层。显层用于表示数据的输入与输出,隐层则被理解为数据的内在表达。Boltzmann 机中的神经元都是布尔型的,即只能取 0、1两种状态,状态1表示激活,状态0表示抑制。
5.6 深度学习
理论上来说,参数越多的模型复杂度越高、“容量”(capacity)越大,这意味着它能完成更复杂的学习任务。但一般情形下,复杂模型的训练效率低,易陷入过拟合,因此难以受到人们青睐。而随着云计算、大数据时代的到来,计算能力的大幅提高可缓解训练低效性,训练数据的大幅增加则可降低过拟合风险因此,以“深度学习”(deep learning)为代表的复杂模型开始受到人们的关注。
典型的深度学习模型就是很深层的神经网络。显然,对神经网络模型,提高容量的一个简单办法是增加隐层的数目。隐层多了,相应的神经元连接权、阈值等参数就会更多。模型复杂度也可通过单纯增加隐层神经元的数目来实现前面我们谈到过,单隐层的多层前馈网络已具有很强大的学习能力:但从增加模型复杂度的角度来看,增加隐层的数目显然比增加隐层神经元的数目更有效因为增加隐层数不仅增加了拥有激活函数的神经元数目,还增加了激活函数嵌套的层数。然而,多隐层神经网络难以直接用经典算法(例如标准 BP 算法)进行训练,因为误差在多隐层内逆传播时,往往会“发散”(diverge)而不能收敛到稳定状态。
无监督逐层训练(unsupervised layer-wise training)是多隐层网络训练的有效手段,其基本思想是每次训练一层隐结点,训练时将上一层隐结点的输出作为输入,而本层隐结点的输出作为下一层隐结点的输入,这称为“预训练”(pre-training);在预训练全部完成后,再对整个网络进行“微调”(fnetuning)训练。例如,在深度信念网络(deep belief network,简称DBN)中,每层都是一个受限 Boltzmann机,即整个网络可视为若干个RBM 堆叠而得。在使用无监督逐层训练时,首先训练第一层,这是关于训练样本的RBM模型,可按标准的 RBM 训练;然后,将第一层预训练好的隐结点视为第二层的输入结点,对第二层进行预训练:……各层预训练完成后,再利用 BP算法等对整个网络进行训练。
事实上,“预训练+微调”的做法可视为将大量参数分组,对每组先找到局部看来比较好的设置,然后再基于这些局部较优的结果联合起来进行全局寻优这样就在利用了模型大量参数所提供的自由度的同时,有效地节省了训练开销。
另一种节省训练开销的策略是“权共享”(weightsharing),即让一组神经元使用相同的连接权。这个策略在卷积神经网络(ConvolutionalNeuralNetwork,简称 CNN)中发挥了重要作用。以 CNN 进行手写数字识别任务为例,如图 5.15所示,网络输入是一个 32x32的手写数字图像,输出是其识别结果,CNN 复合多个“卷积层”和“采样层”对输入信号进行加工,然后在连接层实现与输出目标之间的映射。每个卷积层都包含多个特征映射(feature map),每个特征映射是一个由多个神经元构成的“平面”,通过一种卷积滤波器提取输入的一种特征。
我们可以从另一个角度来理解深度学习。无论是DBN还是CNN,其多隐层堆叠、每层对上一层的输出进行处理的机制,可看作是在对输入信号进行逐层加工,从而把初始的、与输出目标之间联系不太密切的输入表示,转化成与输出目标联系更密切的表示,使得原来仅基于最后一层输出映射难以完成的任务成为可能。换言之,通过多层处理,逐渐将初始的“低层”特征表示转化为“高层”特征表示后,用“简单模型”即可完成复杂的分类等学习任务。由此可将深度学习理解为进行“特征学习”(feature learning)或“表示学习”(representation learning)
以往在机器学习用于现实任务时,描述样本的特征通常需由人类专家来设计,这称为“特征工程(feature engineering)。众所周知,特征的好坏对泛化性能有至关重要的影响,人类专家设计出好特征也并非易事:特征学习则通过机器学习技术自身来产生好特征,这使机器学习向“全自动数据分析”又前进了一步。