0%

神经网络与深度学习

神经元模型

神经网络中最基本的成分是神经元模型。

M-P神经元模型

在这个模型中,神经元接收来自n个其他神经元传递过来的输入信号,这些输入信号通过权重的连接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”处理以产生神经元的输出。

理想中的激活函数是阶跃函数,它将输入值映射为输出值为0,1,其中0对应神经元抑制,1对应神经元兴奋。然而,阶跃函数具有不连续、不光滑等不好的性质,因此实际常用Sigmoid函数作为激活函数,典型的Sigmoid函数就是对数几率函数。

神经元激活函数

把许多个这样的神经元按一定的层次结构连接起来,就得到了神经网络。

感知机与多层网络

感知机由两层神经元组成,输入层接收外界输入信号后传递给输出层(输入层只负责接收信号,不负责处理),输出层是M-P神经元,亦称“阈值逻辑单元”。感知机能实现逻辑与、或、非运算。例如对于只有两个输入、一个输出的感知机,令$w_1 = w_2 = 1$,$\theta = 1$,则$y = 1·x_1 + 1·x_2 - 1$则当$x_1 = x_2 = 1$时,$y=1$。

给定训练集数据,权重$wi(i=1,2,\cdots,n)$以及阈值$\theta$可通过学习算法得到,阈值$\theta$可看作一个固定输入为$-1$的结点,所对应的连接权重为$w{n+1}$(即$x{n+1} = -1, w{n+1} = \theta$),这样权重和阈值的学习就可以统一为权重的学习。感知机学习规则非常简单,对训练样例$(x,y)$,若当前感知机的输出为$\hat{y}$,则感知机权重将这样调整:

其中$\eta \in (0,1)$为学习率。

解释:假设$w_i > 0$,$x_i > 0$,预测结果$\hat{y} > y$时,说明需要使得$x_i$分类占的比例变小,此时$\Delta w_i < 0$,$w_i$减小。其他情况同理。

感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元,其学习能力非常有限。可以证明,若学习样例是线性可分的,即存在一个超平面能将它们分开,则感知机的学习过程一定会收敛而求得适当的权重向量;否则感知机学习过程将会发生振荡,权重向量难以稳定下来,不能求得合适解,例如感知机甚至不能解决异或这样简单的非线性可分问题

异或问题

要解决非线性可分问题,需考虑使用多层功能神经元。输出层与输入层之间的一层神经元,被称为隐层或隐含层,隐含层和输出层神经元都是拥有激活函数的功能神经元。

更一般的,常见的神经网络是如下图的层级结构,每层神经元与下一层神经元互连,神经元之间不存在同层连接,也不存在跨层连接。这样的神经网络结构通常称为多层前馈神经网络

前馈网络

注意,前馈并不意味着网络中信号不能向后传,而指网络拓扑结构上不存在环或回路。输入层神经元仅是接收输入,不进行函数处理,隐含层与输出层包含功能神经元。

神经网络的学习过程,就是根据训练集数据来调整神经元之间的连接权以及每个功能神经元的阈值。

误差逆传播(BP)算法

欲训练多层网络,简单的感知机学习规则显然不够了,需要更强大的学习算法。误差逆传播(Error BackPropagation, 简称BP)算法就是其中的最杰出的代表。BP算法不仅可用于多层前馈神经网络,还可用于其他类型的神经网络,例如训练递归神经网络,但通常说BP网络时,一般是指用BP算法训练的多层前馈神经网络

标准BP算法推导

对于给定的训练集$D = {(xi, y_i)}{i=1}^{m}$,其中$x_i \in R^d, y_i \in R^l$,即输入示例由$d$个属性描述,输出$l$维实值向量。首先定义一下变量:

下图是相关变量在神经网络中的表示:

BP网络及算法中的变量符号

假设隐层和输出层神经元都使用对数几率函数(以下公式的推导都是在这个前提下进行的,当实际运用中不是使用这个函数时需要自己另行推导公式),即$f(x) = \frac{1}{1 + e^{-x}}$,对训练例$(x_k, y_k)$,假定神经网络的输出为$\hat{y}_k = (\hat{y}_1^k,\hat{y}_2^k, \cdots,\hat{y}_l^k)$,即

则网络在$(x_k, y_k)$上的均方误差为

对于上面的公式,总过用$dq + lq + q + l$个参数需要确定。BP是一个迭代算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计,对于任意参数$v$的更新估计式为

BP算法基于梯度下降策略,以隐层到输出层的连接权$w_{hj}$为例子,以目标的负梯度方向对参数进行调整。对均方误差$E_k$,给定学习率$\eta$,有

由于$\betaj = \sum{h=1}^{q} w_{hj}b_h$,则有

对于对数几率函数,有一个很好的性质:

则:

令$gj = - \frac{\partial E_k}{\partial \hat{y}_j^k} \frac{\partial \hat{y}_j^k}{\partial \beta_j} = \hat{y}_j^k(1-\hat{y}_j^k)(y_j^k - \hat{y}_j^k)$,则可得到关于$w{hj}$的更新公式

同理可得到

有时为了做精细调节,计算$\Delta w{hj}、\Delta \theta_j$使用的$\eta$可以和计算$\Delta v{ih}、\Delta \gamma_h$使用的$\eta$可以不同。

标准BP算法流程

对每个训练样例,BP算法执行以下操作:先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差,再将误差逆向传播至隐层神经元,最后根据隐层神经云的误差来对连接权和阈值进行调整。该迭代过程一直进行,直到达到某个停止条件为止,例如训练误差已达到一个很小的值。

累计BP算法

BP算法的目标是要最小化训练集D上的累积误差,即:

标准BP算法每次仅对一个训练样例更新连接权和阈值,更新的规则也是基于单个 $E_k$ 推导的,如果类似地推导出基于累积误差最小化的更新规则,就得到了累积误差逆传播算法。累积BP算法与标准BP算法都很常用。

一般来说,标准BP算法每次更新都值针对单个样例,参数更新得非常频繁,而且对不同样例进行更新得效果可能出现抵消现象,因此,为了达到同样的累积误差极小点,标准BP算法往往需进行更多次数的迭代。

累积BP算法直接针对累积误差最小化,它在读取整个训练集D一遍后才对参数进行更新。其参数更新的频率低得多,但在很多任务中,累积误差下降到一定程度之后,进一步下降会非常缓慢,这时标准BP往往会更快获得较好的解,尤其是在训练集D非常大时会更明显。

防止过拟合

已证明,只需一个包含足够多神经元的隐层,多层前馈神经网络就能以任意精度逼近任意复杂度的连续函数。然而如何设置隐层神经元的个数仍是个未决问题,实际应用中通常靠“试错法”调整。

正是由于神经网络强大的表示能力,BP神经网络经常遭遇过拟合。有两种策略常用来缓解BP网络的过拟合。

第一种策略是早停:将数据分为训练集和验证集,训练集用于计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练。

第二种策略是“正则化”,其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权和阈值的平方和(增加连接权和阈值平方和这一项后,训练过程将会偏好比较小的连接权和阈值,使网络输出更加“光滑”,从而对过拟合有所缓解),令$E_k$表示第k个训练集上的误差,$w_i$表示连接权和阈值,则误差目标函数改变为

其中$\lambda$用于对经验误差与网络复杂度这两项进行折中,通常通过交叉验证法(见模型评估方法那一节)来估计。

全局最小与局部最小

由于上面的神经网络算法是基于梯度下降方法的,所以在寻找最优参数的时候很有可能最后得到的结果是局部最小值而不是全局最小值,我们在参数寻优的过程中是希望找到全局最小。

为了避免陷入局部最小,在现实任务中,人们常采用以下策略来试图“跳出”局部最小,从而进一步接近全局最小。

  • 以多种不同参数初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终方案。这相当于从多个不同的初始开始搜索,这样就可能陷入不同的局部最小,从中进行选择有可能更接近全局最小的结果。
  • 使用“模拟退火”技术,模拟退火在每一步都以一定的概率接受比当前接更差的结果,从而有助于“跳出”局部最小,在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法的稳定性。
  • 使用随机梯度下降。使用随机梯度下降,由于每次迭代都是随机选择的部分数据,所以当陷入了局部最小,它计算出来的梯度仍可能不为零,这样就有机会跳出局部最小继续搜索。

此外,遗传算法也常用来训练神经网络以更好逼近全局最小。需注意的是,上述用于跳出局部最小的技术大多是启发式,理论上尚缺乏保障

深度学习

理论上来说,参数越多的模型复杂度越高,这意味着它能完成更复杂的学习任务,但一般情形下,复杂模型的训练效率低,易陷入过拟合。而随着云计算、大数据时代的到来,计算能力的大幅提高可缓解训练低效性,训练数据的大幅增加则可降低过拟合风险。因此,以深度学习为代表的复杂模型开始受到人们的关注。(大型深度学习模型中甚至有上百亿个参数)

典型的深度学习就是很深层的神经网络。典型的深度学习模型就是很深层的神经网络。单隐层的多层前馈网络已具有很强大的学习能力;模型复杂度的增加可通过单纯增加隐层神经元的数目来实现,但从增加模型复杂度的角度来看,增加隐层的数目比增加隐层神经元的数目更有效。然而,多隐层神经网络难以直接用经典算法(例如标准BP算法)进行训练,因为误差在多隐层内逆传播时,往往会“发散”而不能收敛到稳定状态。

深度学习训练方法

无监督逐层训练是多隐层网络训练的有效手段,其基本思想是每次训练一层隐结点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐结点的输入,这成为“预训练”;在预训练全部完成后,再对整个网络进行“微调”训练。

“预训练+微调”的做法可视为将大量参数分组,对每组先找到局部看来比较好的设置,然后再基于这些局部较优的结果联合起来进行全局寻优。这样就在利用了模型大量参数所提供的自由度的同时,有效地节省了训练开销。

另一种节省训练开销的策略是“权共享”,即让一组神经元使用相同的连接权,这个策略在卷积神经网络中发挥了重要作用。

深度学习总结

对于深度学习,可看作是对输入信号进行逐层加工,从而把初始的、与输出目标之间联系不大密切的输入表示、转化成与输出目标联系更密切的表示,使得原来仅基于最后一层输出映射难以完成的任务成为可能。换言之,通过多层处理,逐渐将初始“低层”特征表示转化为“高层”特征表示后,用“简单模型”即可完成复杂的分类等学习任务,由此可将深度学习理解为进行“特征学习”或“表示学习”。

以往在机器学习用于现实任务时,描述样本的特征通常需要由人类专家来设计,这成为”特征工程“。特征的好坏对泛化性能有至关重要的影响,人类专家设计出好特征也并非易事;特征学习则通过机器学习技术自身来产生好特征,这使机器学习向“全自动数据分析”又前进了一步。