积跬步以致千里,积怠惰以致深渊
注:本篇文章在整理时主要参考了 周志华 的《机器学习》。
主要内容
神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激活函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重(weight),神经网络就是通过这种方式来模拟人类的记忆。网络的输出则取决于网络的结构、网络的连接方式、权重和激活函数。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。
神经元模型
神经网络的基础单元:神经元(neuron)
机器学习中的神经元接收来自 n 个其它神经元传递过来的输入信号,这些输入数据通过加权计算之后,神经元将会判断其是否超过神经元阈值。如果超过阈值,神经元将被激活,并通过“激活函数”(activation function)产生神经元的输出。
回顾我们在线性模型中学到的内容,其实每一个神经元就如同一个广义线性模型一般,激活函数就是广义线性模型中的联系函数。
激活函数
激活函数将输入值映射为输出值“0”或“1”,“1”对应于神经元兴奋,“0”对应于神经元抑制。阶跃函数具有不连续、不光滑等不太好的性质。因此常用Sigmoid函数作为激活函数进行非线性转化。
把许多个这样的神经元按一定的层次结构连接起来,就得到了神经网络。
我们可以将一个神经网络视为包含了许多参数的数学模型,这个模型是若干个函数,例如
相互(嵌套)代入而得。有效的神经网络学习算法大多以数学证明为支撑。
感知机与多层神经网络
感知机(perceptron)
感知机是早期的神经网络组合形式,由输入层和输出层两层神经元组成。因为感知机只拥有一层功能神经元(functional neuron)-输出层,只有输出神经元进行激活函数处理,其学习能力有限,在处理线性可分问题(如逻辑与、非、或运算)上效果很好,但在非线性可分问题(逻辑异或)上无法求得合适解。
参数学习
一般地,给定训练样本集,权重wi(i=1,2,...,n)以及阈值θ可通过学习得到。阈值θ可看作一个固定输入为-1.0的“哑结点”(dummy node)所对应的连接权重wn+1,这样,权重和阈值的学习就可统一为权重的学习。感知机学习规则非常简单,对训练例(x,y),若当前感知机的输出为̂y,则感知机权重将这样调整:
其中η∈(0,1)称为学习率(learning rate)。若感知机对训练样例(x,y)预测正确,即为̂y=y,则感知机不发生变化,否则将根据错误的程度进行权重调整。
多层网络
要解决非线性可分问题,需要考虑使用多层功能神经元,即在输入输出层之外再加入中间层,这个中间层也叫隐含层。隐含层可以是一到多层,当隐含层很多时,这时的神经网络就是深度神经网络。
另外,每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接,这样的神经网络结构通常称为“多层前馈神经网络”(multi-layer feedforward neural networks)
神经网络的学习过程就是根据训练数据对网络中神经元之间的权重以及每个功能神经元的阈值进行调整的过程;换言之,神经网络“学”到的东西,蕴涵在权重和阈值中。
多层网络的学习算法:误差逆传播算法(error BackPropagation,简称BP算法)
多层网络学习算法的目标是通过调整网络中的权重和阈值使得神经网络模型的泛化误差最小(其实每一种机器学习算法的中心思想都是一致的,这在我们模型评估与选择的学习中已经了解到了,设定一个模型/算法,用训练数据进行训练,然后用测试数据进行测试,以找到泛化性能最高的模型结构和参数)。
BP算法也是一样的,其目标是要最小化训练集 D 上的累计误差。对每个训练样例,BP算法执行以下操作:先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差,再将误差逆向传播至隐层神经元;最后根据隐层神经元的误差来对连接权和阈值进行调整。该循环过程重复进行直到达到停止条件(比如训练误差小于一定的值,或循环次数达到指定阈值)。
学习率η∈(0,1)控制着算法每一轮迭代中的更新步长,若太大则容易震荡,太小则收敛速度又会过慢。
如何设置隐含层神经元的个数仍是个未决问题,实际应用中通常靠“试错法”(trial-by-error)调整。
由于神经网络具有强大的表示能力,BP神经网络容易遭遇过拟合。目前有两种策略常用来缓解神经网络过拟合现象:
[1]早停(early stopping):将数据分成训练集和验证集的策略,训练集用来计算梯度、更新权值和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练。
[2]正则化(regularization):其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,这样的话训练过程将会偏好比较小的连接权和阈值,使网络输出更加“光滑”,从而对过拟合有所缓解。
参数学习的最优解
神经网络的学习算法是根据误差的导数来对参数进行调优的过程。在数学上,导数值代表的是一个函数的斜率,是一种倾向性,所以以目标的负梯度方向对参数进行调整会使得误差变小。
当梯度为零时,此时的误差达到了一个极值,即其误差函数值小于邻点的误差函数值。但是这个极值只可能是一个局部极小值,而并不一定是全局极小值。我们可以根据下图来理解一下局部极小和全局极小之间的关系:
实际上,我们所要计算的是全局最小值,在现实任务中,人们常采用以下策略来试图“跳出”局部极小,从而进一步接近全局最小:
[1]以多组不同参数初始化多个神经网络,取其中误差最小的解。类似于从不同出发点开始搜索最小值,得到的多个局部最小中最小的那个更可能是全局最小。
[2]“模拟退火”(simulated annealing)技术:每一步以一定概率接受次优解。每次以一定概率接受次优解有助于“跳出”局部极小,不过接受次优解的概率要随着时间的推移而逐渐降低,从而保证算法稳定。
[3]随机梯度下降。每次一个训练样本算完后就直接调整参数,而不要积累一定误差再调整,这样的好处在于在计算梯度时加入了随机因素,于是即便陷入局部极小点,它计算的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索了。
此外,遗传算法(genetic algorithms)也常用来训练神经网络以更好地逼近全局最小。需注意的是,上述用于跳出局部极小的技术大多是启发式,理论上尚缺乏保障。
注解
激活函数(activation function)
sigmoid函数(S曲线)用来作activation function:
[1] 双曲函数(tanh)
双曲线函数是一类常见的三角函数(也叫圆函数)类似的函数。
[2] 逻辑函数(logistic function)
总结
1)神经元是神经网络中的基础元件,其接收来自其它神经元传递过来的输入信号,这些输入数据通过加权计算之后,神经元将会判断其是否超过神经元阈值。如果超过阈值,神经元将被激活,并通过“激活函数”(activation function)产生神经元的输出。
2)神经网络的学习过程就是根据训练数据对网络中神经元之间的权重以及每个功能神经元的阈值进行调整的过程。
3)对于分类问题,如果是2类,可以用一个输出单元表示(0和1分别代表2类);如果多余2类,每一个类别用一个输出单元表示。
4)神经网络训练过程中要加入适当的“意外”,以避免陷入局部最优。
5)终止条件:权重的更新低于某个阈值;预测的错误率低于某个阈值;达到预设一定的循环次数。
6)将许多个神经元按一定的层次结构连接起来,就得到了神经网络,而不同的神经元结构、不同的激活函数选择、不同的误差指标选择、不同的学习策略都会导致形成不同的神经网络。
7)深度学习的训练是基于“预训练+微调”的策略进行的。
8)我们可以将深度学习理解为进行“特征学习”的过程。