1. 章节主要内容
今天让我们来好好理解一下机器学习中的神经网络算法吧,其中多隐含层的神经网络算法就是目前最热的深度学习算法。本章将从神经网络最小单元神经元开始,慢慢深入介绍,一步步的将神经网络算法娓娓道来。我将争取对其中的具体的算法逻辑和思考策略进行总结和概括,使大伙能更快更轻松的理解神经网络算法是什么!
1)神经网络的的基础单元:神经元(neuron)
神经元是神经网络中的最基本的成分,其是仿造生物学中神经细胞之间传递信号的方式而设计的。在生物神经网络中,神经细胞都是相互相连的,当一个神经元接收到其它神经元发送的化学物质时,其会判断神经元的电位是否超过阈值。如果超过了,该神经元将会被激活,并向其它神经元发送化学物质。
与此类似,机器学习中的神经元接收来自 n 个其它神经元传递过来的输入信号,这些输入数据通过加权计算之后,神经元将会判断其是否超过神经元阈值。如果超过阈值,神经元将被激活,并通过“激活函数”(activation function)产生神经元的输出。
回顾我们在本书第三章线性模型中学到的内容,其实每一个神经元就如同一个广义线性模型一般,激活函数就是广义线性模型中的联系函数。下图是书中一个具体的神经元示例图,以帮助大伙理解:
2)神经元的初步组合:感知机和多层网络
将许多个神经元按一定的层次结构连接起来,就得到了神经网络,而不同的组合形式将生成不同的神经网络。
[1]感知机(perceptron)是早期的神经网络组合形式,由输入层和输出层两层神经元组成。因为感知机只拥有一层功能神经元(functional neuron)-输出层,其学习能力有限,在处理线性可分问题(如逻辑与、非、或运算)上效果很好,但在非线性可分问题(逻辑异或)上无法求得合适解。
[2]多层网络
要解决非线性可分问题,需要考虑使用多层功能神经元,即在输入输出层之外再加入中间层,这个中间层也叫隐含层。隐含层可以是一到多层,当隐含层很多时,这时的神经网络就是深度神经网络。
更一般的,每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接,这样的神经网络结构通常称为“多层前馈神经网络”(multi-layer feedforward neural networks)
神经网络的学习过程就是根据训练数据对网络中神经元之间的权重以及每个功能神经元的阈值进行调整的过程;换言之,神经网络“学”到的东西,蕴涵在权重和阈值中。
3)多层网络的学习算法:误差逆传播算法(error BackPropagation,简称BP算法)
多层网络学习算法的目标是通过调整网络中的权重和阈值使得神经网络模型的泛化误差最小(其实每一种机器学习算法的中心思想都是一致的,这在我们第二章的学习中已经了解到了,设定一个模型/算法,用训练数据进行训练,然后用测试数据进行测试,以找到泛化性能最高的模型结构和参数)。
BP算法也是一样的,其目标是要最小化训练集 D 上的累计误差。对每个训练样例,BP算法执行以下操作:先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差,再将误差逆向传播至隐层神经元;最后根据隐层神经元的误差来对连接权和阈值进行调整。该循环重复进行直到达到停止条件(比如训练误差小于一定的值)
如何设置隐含层神经元的个数仍是个未决问题,实际应用中通常靠“试错法”(trial-by-error)调整。
由于神经网络具有强大的表示能力,BP神经网络容易遭遇过拟合。目前有两种策略常用来缓解神经网络过拟合现象:
[1]早停(early stopping):将数据分成训练集和验证集的策略,训练集用来计算梯度、更新权值和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练。
[2]正则化(regularization):其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,这样的话训练过程将会偏好比较小的连接权和阈值,使网络输出更加“光滑”,从而对过拟合有所缓解。
4)学习的参数是否是最优解
神经网络的学习算法是根据误差的导数来对参数进行调优的过程。在数学上,导数值代表的是一个函数的斜率,是一种倾向性,所以以目标的负梯度方向对参数进行调整会使得误差变小。
当梯度为零时,此时的误差达到了一个极值,即其误差函数值小于邻点的误差函数值。但是这个极值只可能是一个局部极小值,而并不一定是全局极小值。我们可以根据下图来理解一下局部极小和全局极小之间的关系:
实际上,我们所要计算的是全局最小值,在现实任务中,人们常采用以下策略来试图“跳出”局部极小,从而进一步接近全局最小:
[1]以多组不同参数初始化多个神经网络,取其中误差最小的解。类似于从不同出发点开始搜索最小值,得到的多个局部最小中最小的那个更可能是全局最小
[2]“模拟退火”(simulated annealing)技术:每一步以一定概率接受次优解。每次以一定概率接受次优解有助于“跳出”局部极小,不过接受次优解的概率要随着时间的推移而逐渐降低,从而保证算法稳定
[3]随机梯度下降。每次一个训练样本算完后就直接调整参数,而不要积累一定误差再调整,这样的好处在于在计算梯度时加入了随机因素,于是即便陷入局部极小点,它计算的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索了
需注意的是,上述用于跳出局部极小的技术大多是启发式,理论上尚缺乏保障。
5)神经网络的各种常用算法
将许多个神经元按一定的层次结构连接起来,就得到了神经网络,而不同的神经元结构、不同的激活函数选择、不同的误差指标选择、不同的学习策略都会导致形成不同的神经网络
[1]RBF网络
RBF(Radial Basis Function,径向基函数)网络是一种单隐层前馈神经网络。
它的特点是:单隐层前馈神经网络结构;使用径向基函数作为隐层的激活函数,而输出层则是对隐层神经元输出的线性组合。
具体训练过程:第一步,确定神经元中心,常用的包括随机采样、聚类等;第二步,利用BP算法来确定参数。
[2]ART网络
ART(Adaptive Resonance Theory,自适应协振理论)网络是一种竞争型(competitive learning)学习网络。竞争型学习是神经网络中一种常用的无监督学习策略,在使用该策略时,网络的输出神经元相互竞争,每一时刻只有一个竞争获胜的神经元被激活。
它的特点是:两层的神经网络结构,分别是比较层(输入)和识别层(输出);无监督的学习方式;竞争型的神经网络,即同时只有一个识别层结点被激活;识别层的神经元数量可以动态增加。
一个简单的ART网络是这样训练的:对输入的数据向量,找到与每个识别层神经元所对应的模式类代表向量的距离最小的神经元。如果这个距离小于阈值,则将这个数据归入该神经元所属的类中,并重新计算这个神经元的代表向量,否则重置模块并在识别层上增设一个新的神经元,其代表向量就设为当前输入向量。
[3]SOM网络
SOM(Self-Organizing Map,自组织映射)网络也是一种竞争学习型的无监督神经网络。
它的特点是:两层的神经网络结构,分别是输入层和输出层(输出层以矩阵方式排列在二维空间中);无监督的学习方式;竞争型的神经网络,即同时只有一个识别层结点被激活;
训练过程如下:对每个训练样本,找到距离训练样本最近的输出神经元,我们称为最佳匹配单元;调整最佳匹配单元及其附近神经元的权向量,使得权向量与当前输入样本的距离缩小;不断迭代直到收敛。
[4]级联相关网络
级联相关网络是一种结构自适应网络,其不像一般的神经网络,它还将网络结构也当作学习的目标之一。
训练过程如下:刚开始训练时,只有输入和输出层,处于最小拓扑结构;随着训练的进行,逐渐加入新的隐层神经元;其是通过最大化新神经元的输出与网络误差之间的相关性(correlation)来训练相关参数。
和前馈神经网络相比,级联相关网络无需设置网络层数、隐层神经元数目,所以训练速度较快,但在数据较小时容易陷入过拟合。
[5]Elman网络
递归神经网络(recurrent neural networks)允许网络中出现环形结构,从而可让一些神经元的输出反馈回来作为输入信号。这样的结构使得网络状态不仅与自身状态相关,还跟前一刻的状态相关,从而能处理与时间有关的动态变化。
Elman网络是最常用的一个递归神经网络,其使用隐层神经元的输出与下一刻的神经元输入一起作为下一刻的输入。它使用Sigmoid激活函数,并使用BP算法进行训练
[6]Boltzmann机
Boltzmann机是一种“基于能量的模型”,其为网络状态定义一个“能量”,当能量最小化时网络达到理想状态。
它的特点是:两层结构,显层与隐层,显层即代表输入也代表输出,隐层则被理解为数据的内部表达;神经元是布尔型
训练过程(对比散度 Contrastive Divergence 算法)如下:通过输入层算出隐层分布,再通过隐层分布重新算出输入层的新分布;并利用新分布与旧分布之间的差别调整连接权重
6)深度学习
理论上来说,参数越多的模型复杂度越高,这意味着它能完成更复杂的学习任务。但同样的,复杂模型的缺点是训练慢,且易陷入过拟合。
但随着大数据、云计算时代的到来,计算能力大幅提高可缓解训练低效性,训练数据的大幅增加则可降低过拟合风险,所以以“深度学习”为代表的复杂模型开始受到人们的关注。
深度学习无法直接使用BP算法进行训练,因为误差在多隐层内传播时,往往会“发散”而不能收敛到稳定状态。
深度学习采用无监督逐层训练(unsupervised layer-wise training)来训练模型,其基本思想是每次用无监督方法训练一层隐结点,并用本层结点的输出作为下一层隐结点的输入,这称为“预训练”(pre-training);在预训练全部完成后,再对整个网络进行“微调”(fine-tuning)训练。
比如,在深度信念网络(Deep Belif networks,简称DBN)中,每层都是一个受限Boltzmann机,所以训练过程是对每一层的Boltzmann机进行训练,等各层预训练完成后,再利用BP算法等对整个网络进行训练。
这种“预训练+微调”的训练策略很值得我们学习,其等于将大量参数分组,先对每组进行无监督学习找到局部较优解,然后再基于这些局部较优解进行全局寻优。既保证了自由度,还有效的节省了训练开销
我们可以从另一个角度来理解深度学习,其多隐层堆叠,可看作是在对输入信号进行逐层加工,从而把初始的、与输出目标之间联系不太密切的输入表示,转换成与输出目标联系更密切的表示。换言之,通过多层处理,逐渐将初始“低层”的特征转换为“高层”特征表示,使得用简单模型就能完成复杂的分类等学习任务。
由此,我们可以将深度学习理解为进行“特征学习”的过程
2. 基础知识
1)激活函数
用来产生神经元输出的函数,一般是在区间[0,1](有例外),用来判断神经元是否被激活。常用的激活函数有阶越函数、Sigmoid函数和ReLu函数。
2)多层前馈神经网络
每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接,这样的神经网络结构通常称为多层前馈神经网络
3)误差逆传播算法
对每个训练样例,BP算法执行一下操作:先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差,再将误差逆向传播至隐层神经元;最后根据隐层神经元的误差来对连接权和阈值进行调整。该循环重复进行直到达到停止条件(比如训练误差小于一定的值)
4)结构自适应网络
其不像一般的神经网络,它还将网络结构也当作学习的目标之一。
5)递归神经网络(recurrent neural networks)
允许网络中出现环形结构,从而可让一些神经元的输出反馈回来作为输入信号。这样的结构使得网络状态不仅与自身状态相关,还跟前一刻的状态相关,从而能处理与时间有关的动态变化。
6)竞争型学习
竞争型学习是神经网络中一种常用的无监督学习策略,在使用该策略时,网络的输出神经元相互竞争,每一时刻只有一个竞争获胜的神经元被激活。
3. 总结
1)神经元是神经网络中的基础元件,其接收来自 n 个其它神经元传递过来的输入信号,这些输入数据通过加权计算之后,神经元将会判断其是否超过神经元阈值。如果超过阈值,神经元将被激活,并通过“激活函数”(activation function)产生神经元的输出。
2)神经网络的学习过程就是根据训练数据对网络中神经元之间的权重以及每个功能神经元的阈值进行调整的过程、
3)BP算法是多层神经网络进行学习主流算法
4)神经网络训练过程中要加入适当的“意外”,以避免陷入局部最优
5)将许多个神经元按一定的层次结构连接起来,就得到了神经网络,而不同的神经元结构、不同的激活函数选择、不同的误差指标选择、不同的学习策略都会导致形成不同的神经网络
6)深度学习的训练是基于“预训练+微调”的策略进行的
7)我们可以将深度学习理解为进行“特征学习”的过程