MLer必知的8个神经网络架构

983 阅读24分钟

前面我们分享过如何简单形象的理解神经网络是什么

今天我们接着学习 8 个重要的神经网络架构,并简单解读它们的原理和适用范围。

关于机器学习方面的学习资源,Geoffrey Hinton 的《机器学习中的神经网络》是很多人必看的内容。Geoffrey Hinton 是深度学习理论无可争议的教父级人物,而他在这门课里也确实讲了很多实实在在的知识。程序猿 James Le 小伙就认真学习了这门课程,并分享了他的学习笔记,将 Hinton 在课程中讲解的 8 种神经网络架构进行了总结,正在学习或即将入坑机器学习的小伙伴千万不要错过这篇干货,如果喜欢这类学习笔记的话别忘了收藏和点赞,我们会增加这类文章的发布。


总的来说,神经网络架构可以具体分成 3 类:

一:前馈神经网络

前馈神经网络是实际应用中神经网络最为常见的一种。其第一层是输入层,最后一层为输出层,中间为隐藏层。如果隐藏层有很多个,我们就称之为“深度”神经网络。它们会进行一系列的转换运算,改变两个案例的相似之处。每一层中神经元的活动都是下面一层神经元活动的一个非线性函数。

二:循环网络

循环网络表现在连接图上时,包含一些定向循环,也是就说,有时你沿着箭头前进会回到开始的地方。循环网络还有很多复杂的动态变化,这让它们很难训练。它们更接近人脑的神经网络。

目前,寻找训练神经网络的有效方法有很多有趣的研究。循环神经网络是为序列数据建模的一种非常自然的方式。它们相当于一种非常深的深度网络,每个时隙都有一个隐藏层;只是它们在每个时隙使用相同的权重值,也在每个时隙获得输入信息。循环神经网络能够在隐藏状态下长时间记住信息,当要想训练它们使用这种潜力是非常困难的。

三:对称连接网络(Symmetrically Connected Networks)

这种网络和循环神经网络有些相似,但单元之间的连接是对称的(它们在两个方向上有相同的权重)。对称网络分析起来,比循环神经网络要容易的多。它们的用途也有更多的限制,因为它们按照能量函数运行。没有隐藏单元的对称连接网络称为“Hopfield 网络”,有隐藏单元的则称为“玻尔兹曼机”(Boltzmann machine)。


下面我们具体看看都有哪 8 种神经网络架构:

1 感知机

第一代神经网络感知机只是仅有一个神经元的简单计算模型。上世纪60年代,Frank Rosenblatt 让感知机开始流行。这种神经网络有非常强大的学习算法。1969 年,Minsky 和Papers 出版了一本书叫《感知机》,分析了感知机能做什么及其局限性。很多人认为所有的神经网络都有这些局限性。然而,感知机的学习程序直到今天仍然广泛应用于很多任务中,其数量众多的特征向量包含几百万个特征。

在统计模型识别的标准范式中,我们首先将原始输入向量转换为特征激活的向量,然后用依据常识的手写程序去定义这些特征。接着,我们学习怎样为每个特征激活赋予权重,获得一个单个数量(scalar quantity)。如果这个数量大于某个阙值,我们就决定该输入向量为目标类的正例。

标准的感知机架构属于一种简单的前馈网络,也就是说输入信息被传入神经元中,经过处理后,生成一个输出结果。在下方图表中,意味着神经网络自下而上读值:输入信息来自底部,输出值从顶部输出

然而,感知机也有些局限性:如果你选择手动选择特征,而且使用足够多的特征,你几乎可以做任何事情。对于二进制输入向量,每个指数级二进制向量都会有单独的特征单元, 这样以来,我们可以对二进制输入向量做出任何可能的判别。但是一旦手动编写的特征确定以后,感知机能学什么内容就有了很强的局限性。

对于感知机来说这种结果是灾难性的,因为模式识别的关键就是不管转换状况如何都能识别模式。Minsky 等人的“群体不变性理论”指出,如果转换形成一个群组,进行学习的感知机的一部分就无法学习识别模式。要处理这种转换形式,感知机需要使用多个特征单元识别提供信息的子模式的转换。因此,模式识别中比较棘手的部分必须由手动编写的特征检测器完成,而不是学习。

没有隐藏单元的神经网络在它们为输入输出映射建模方面很有局限性。线性单元的层再多也没有作用,它依然是线性的。光解决输出的非线性是不够的。这样以来,我们需要自适应非线性隐藏单元的多个层。但我们怎样训练这种神经网络呢?我们需要一种有效的方法来适应所有层而不仅仅是最后一层的权重。这很难做到。学习传入隐藏单元的权重,相当于学习特征。这比较难做到,因为没有人能直接告诉我们隐藏单元该怎么做。

2 卷积神经网络

机器学习研究一直都比较关注对象检测问题,我站也曾发过这么一篇如何用卷积神经网络提取图像特征

识别对象存在困难有如下几个因素:

  • 分割:真实场景常常都混满了其它对象。很难分辨哪些碎片应该组到一起,是同一对象的一部分。一个对象的某个部分会隐藏在其它对象后面。

  • 光线:光线和对象一样能决定像素的强度。

  • 变形:对象可能会以多种非仿射的方式变形,例如手写字体会有很大的回路或者仅仅一个尖点。

  • 可供性:对象分类常常由它们的使用方式决定。例如,椅子是用来坐的,因此它们有很多种物理形状。

  • 视角:视角的改变会导致图像出现变动,标准的学习方法就无法应付这种情况。信息会在输入维度(例如像素)之间出现跳跃。

你能想象有一个医疗数据库,其中一个患者的名字有时跳跃至通常为权重提供代码的输入维度中么!要想应用机器学习,我们首先得消除这种维度跳跃问题。

神经网络目前解决对象检测问题的主流方式就是复制特征法。这种方法利用有不同位置的同一特征检测器的多个不同副本。它也能在缩放和取向中复制,但比较棘手,成本较高。复制能大幅减少神经网络需要学习的自由参数的数量。其利用几个不同的特征类型,每个类型都有对复制检测器的映射。它同样也能让每批图像以不同的方式表示。

那么,复制特征检测器能得到什么?

  • 对等活动:复制的特征并不会让神经活动对转移保持不变,活动是对等的。

  • 不变性:如果训练期间一个特征在许多位置有用,那么该特征的检测器训练期间适用于所有位置。

1998年,Yann LeCun 及其同事研发出了一个能很好地识别手写字体的网络,叫做 LeNet。该神经网络是一种前馈网络,利用“反向传播法”,有很多隐藏层,每一层的复制单元有很多映射,邻近复制单元的输出进行了池化。如果几个特征重叠,这种网络能每次处理多个特征,是训练一个完整系统的一种很聪明的方法,而非仅仅是个识别器。后来,LeNet 经过优化后改名为卷积神经网络。有个有趣的事情:如今北美大约10%的支票都是由这种网络检查。

卷积神经网络可以用于关于对象识别的所有工作,从识别手写体到 3D 物体等。然而,识别从网上下载的彩色照片中的真正对象要比识别手写字体复杂的多:类别增加了几百倍,像素也增加了几百倍,各种场景混在一起需要进行分割,2 维照片和 3 维照片的场景混在一起,每张图像中存在多个对象等。那么使用同一种卷积神经网络会有效果吗?

接着是著名的 ImageNet 图像识别大赛,ImageNet 是个庞大的图像数据集,包含了大约 120 万张高分辨率的训练图像。参加比赛的测试图像会表示为没有原始注释(即没有分割或标签)的形式,算法也必须生成具体的标签,表明图像中是什么对象。来自哈佛等多家顶尖机构的计算机视觉研究团队先后在 ImageNet 上测试了现今最厉害的计算机视觉方法。通常,计算机视觉系统使用复杂的多级系统,初级的层级通常要进行手动调整,优化一些参数。

2012 年 ImageNet 大赛的获胜者 Alex Krizhevsky 研发出一种非常深层的卷积神经网络 AlexNet 。其架构包括7个隐藏层,还有数不清的最大池化层。初级层都是卷积层,最后两个层是全连接层。每个隐藏层中的激活函数都是修正线性单元。这些函数让训练速度大幅提升,也比逻辑函数更有表现力。此外,当邻近单元有较强的活动时,这种神经网络还使用有竞争性的标准化方法压缩隐藏活动,这有助于改变强度。

有一些技巧,大幅改善了该神经网络的过拟合问题:

  • 从 256 X 256 图像中选取 224 X 224 patch随机训练,以获取更多训练数据,并将这些图像水平翻转。在测试中,将 10 个不同 patch 的情况进行组合:4角+中间,再翻转。

  • 使用 Dropout 将全连接层(其包含了大部分参数)的权重正则化。Dropout 意思是针对每个训练样本,将一个层级中一半的隐藏单元随机移除。这能阻止隐藏单元不过度依赖其他隐藏单元。

至于所需的硬件,Alex 在英伟达 GTX 580 GPU 上部署了卷积神经网络。GPU 非常适合矩阵相乘,同时也有很高的存储带宽。这让 Alex 一周内就训练完了这个网络,在测试中能迅速融合来自 10 个 patch 的结果。随着芯片越来越便宜,数据集越来越大,大型的神经网络会比老式的计算机视觉系统更快的优化。

3 循环神经网络

要想理解循环神经网络,我们需要简要概述一下序列建模。当在序列中应用机器学习时,我们常常想将一个输入序列变成一个不同域中的输出序列,例如,将声压的一个序列变成词汇特性的一个序列。没有单独的目标序列时,我们可以通过尝试预测输入序列中的下一个项来获取一个教学信号。目标输出序列是前一步的输入序列。这比从其它像素中预测一个像素,或者从其余照片中预测一张照片的一个 patch 要自然多了。预测序列中的下一个项时,监督式学习和非监督式学习之间的差别就比较模糊了。它使用用于监督式学习的方法,却不需要一个单独的教学信号。

完成这项任务的标准方法是使用无记忆模型。具体来说,自回归模型能从固定数量的先前的项中预测序列中的下一个项。前馈神经网络就是一种广义的自回归模型,使用一个或多个非线性隐藏单元的层。然而,如果我们给生成模型一些隐含状态,且隐含状态有自己的内部动力,那么我们会得到一个更有趣的模型:它能够在其隐含状态中长时间存储信息。如果这些内部动力有噪音,由隐含状态产生输出的方式也有噪音,那么我们会永远无法得知隐含状态的具体情况。最好的方式就是推断所有可能的隐含状态向量所在的空间的概率分布,但这种方法仅易于处理两种类型的隐含状态模型。

循环神经网络非常强大,因为它们包含 2 个属性:

  • 分布式的隐含状态让它们能有效存储过去的大量信息

  • 非线性动力能让它们以复杂的方式更新自身隐含状态。

如果有足够的神经元和时间,循环神经网络能计算任何能被你的电脑计算的东西。那么循环神经网络会表现哪些行为呢?它们会来回摆动,会指出“吸引子”(attractors),运行会比较混乱。循环神经网络也能潜在学习应用很多小型程序,它们并行运行,相互协作产生非常复杂的效应。

然而,循环神经网络的复杂性也让它们很难训练。因为梯度会迅速大幅增长或消失的问题,要想训练一个循环神经网络相当困难。当我们通过很多层反向传播时,梯度的幅度会发生什么状况呢?如果权重很小,梯度会呈指数级收缩;如果权重很大,梯度会呈指数级增大

典型的前馈神经网络能应付这些指数级的效应,因为它们只有很少的隐藏层。然而,在用长序列训练的循环神经网络中,梯度很容易急速增大或消失。即便是有很好的初始权重,根据几个时步之前的输入,也很难检测到当前的目标输出,因此用循环神经网络处理长期依赖性问题存在很多困难。

学习循环神经网络有 4 个有效的方式:

  • 长短期记忆:用循环神经网络创造出用来长时间记住值的小型模块。

  • Hessian Free优化:使用一个很好的优化器处理梯度急速消失的问题,该优化器能检测到梯度很小但曲率更小的方向。

  • 回声状态网络(ESN):优化输入 -> 隐藏层及隐藏层 -> 隐藏层和输出层 -> 隐藏层这些过程之间连接的非常紧密,因此隐含状态有个很大的弱耦合振子(coupled oscillators)的“蓄水池”(reservoir),弱耦合振子可由输入分别驱动。

  • 用动量法进行很好的初始化:和回声状态网络中的优化方法类似,但是接着会用动量法学习所有的连接。

4 长短期记忆模型

1997 年,Hochreiter 和 Schmidhuber 构建了后人熟知的长短期记忆网络,解决了用循环神经网络实现长期记忆的问题。他们用有相乘交互作用的逻辑和线性单元设计了一种记忆细胞。每当细胞的“写入”(write)门限开启时,信息就输入细胞中,然后一直待在细胞里,直到细胞的“保留”(keep)门限开启。细胞通过开启其“读取”(read)门限来读取信息。

读取弯弯曲曲的手写字体是循环神经网络的天然任务。它通常以笔尖的坐标序列(x,y,p),作为输入,其中 p 表示笔是向上还是向下,输出为一个特征序列。Grave 和 Schmidhuber 在 2009 年的研究表示用长短期记忆模型搭配循环神经网络是当前读取弯曲手写体的最佳体系。简言之,他们使用了一系列的小型照片而非笔尖的坐标作为输入。

5 Hopfield 神经网络

非线性单元构成的循环神经网络一般很难分析,它们会以很多不同的方式表现:处于稳定状态,震荡,或沿着无法预测的混乱轨迹运转。一个 Hopfield 网络由二元阙值单元循环连接构成。1982 年,John Hopfield 意识到,如果连接是对称的,那么就存在一个全局能量函数。整个网络的每个二元“配置”都对应一个能量,而二元阙值决策规则会让神经网络接受该能量函数的最小值。利用这种计算类型的一个有效方式就是将记忆用作该神经网络的能量最小值。使用能量最小值表示记忆提供了一个内容可寻址存储器,这样只需知道某个项的部分内容,就能访问该项,可有效抵抗硬件损坏的问题。

我们每次记忆一个配置,都希望创建一个新的能量最小值。但是如果两个接近的最小值在中间位置呢?这种情况就限制了 Hopfield 的性能。因此我们怎样才能提升 Hopfield 的性能呢?不少物理学家对这个问题很感兴趣,他们已掌握的数学知识或许能解释大脑的工作原理。很多物理期刊上发表了不少论文,探究 Hopfield 网络及其存储能力。最终 Elizabeth Gardner 发现充分利用权重的能力会让神经网络有更好的存储性能。她没有尝试将向量一次性存储完毕,而是在训练集中多次循环,根据向量中所有剩余单元的状态用感知机的收敛程序训练每个单元,以获得正确的状态。统计学家将这种方法称为“伪似然”(pseudo-likelihood)。

在 Hopfield 网络中还有另一种计算方法。这种方法没有利用该神经网络存储记忆,而是构造感觉输入的演绎。感觉输入由可见的单元表示,演绎则由隐藏单元的状态表示,演绎的好坏由能量表示。

6 玻尔兹曼机网络

玻尔兹曼机是一种随机循环神经网络,它可以看作 Hopfield 网络的一种随机、生成对应网络。它是首批能学习内部表示以及能表示和解决困难的组合问题的神经网络之一。

玻尔兹曼机器学习算法的学习目标是,将玻尔兹曼机赋给训练集中二元向量的概率乘积进行最大化,这相当于将玻尔兹曼机赋给训练向量的对数概率之和最大化。

2012 年,Salakhutdinov 和 Hinton 提出了针对玻尔兹曼机的小批量学习流程:

  • 对于正相(positive phase),首先以0.5的概率优化隐藏概率,然后在可见单元上固定一个数据向量,然后并行更新所有隐藏单元,直到用平均场(mean-field)更新开始收敛。神经网络收敛后,对每个连接的单元对记录PiPj值,并小批量对所有数据求平均值。

  • 对于负相(negative phase),首先选一组“假想粒子”(fantasy particles),每个粒子都有一个值,它是个全局配置。然后按顺序将每个假想粒子中的所有单元更新几次。对于每对连接的单元,对所有假想粒子中的SiSj求平均值。

在一般玻尔兹曼机中,单元的随机更新需要按照顺序。有个特殊的架构能实现交替并行更新,可大幅提高效率,这种小批量流程让玻尔兹曼机的更新更加并行化。这种架构就叫做深度玻尔兹曼机(DBM),它实际上是一个带有缺失连接的普通玻尔兹曼机。

2014 年,Salakhutdinov 和 Hinton 又提出了他们所创模型的更新版,称为“受限玻尔兹曼机”(RBM)。他们将网络中的连接状况加以限制,让推断和学习更容易些(只有一个隐藏单元的层,隐藏单元之间没有连接)。在受限玻尔兹曼机中。当可见单元被固定时,只需一步就能达到热平衡。

对于受限玻尔兹曼机,另一个有效的小批量学习过程是:

  • 对于正相:首先在可见单元上固定一个数据向量,然后为所有成对的可见隐藏单元计算出 的值。对于每对连接的单元,在所有小批量中的数据上求 平均值。

  • 对于负相:也是选择一组“假想粒子”,然后用交替并行更新的方式把每个假想粒子更新几次。对于每对连接的单元,在所有假想粒子上求ViHj平均值。

7 深度信念网络(DBN)

反向传播被视为人工神经网络中处理批量数据后,计算每个神经元误差分布的标准方法。然而,使用反向传播也存在几个主要问题:

  • 它需要标记好的训练数据,但几乎所有的数据都是未标记状态。

  • 学习时间不能很好的规模化,这意味着当神经网络有多个隐藏层时,学习会非常慢。

  • 当局部选优问题严重时,反向传播会陷入僵局,因此对于深度网络来说,它还是不够理想。

为了解决反向传播的局限性,研究者们还考虑了非监督式学习的方法。这有助于在用梯度方法调整权重时仍能保持效率和简易性,而且还能用它为感觉输入的结构建模。具体来说,他们调整了权重,将生成模型生成感觉输入的概率最大化。问题是,我们应该学习哪种生成模型?可以是像玻尔兹曼机这样的能量模型吗?或者由理想化的神经元组成的因果模型?或者这两种模型的混合类型?

深度信念网络是一种由随机变量组成的有向非循环图。用信念网络时,我们需要观察其中一些变量,解决两个问题:1)推断问题:推断未观察到的变量的状态;2)学习问题:调整变量之间的交互状况,让神经网络更能生成训练数据。

早期的图解模型要由专人去定义图表结构和条件概率。当时,图表之间都是松散地连接,所以研究人员最初重点放在了进行正确的推断上,而不是学习上。对于神经网络来说,学习才是中心任务。但是即使如此,还是有两个神经网络版的信念网络。

这两种由随机二进制神经元组成的生成神经网络是:1)能量模型:在这种模型中,我们用对称连接的方式将二进制随机神经元进行连接,以得到一个玻尔兹曼机;2)因果模型:在这种模型中,我们在一个有向非循环图中将二进制随机神经元进行连接,以得到一个 Sigmoid 信念网络。本文不再详谈这两种类型的网络。

8 深度自动编码器

最后,我们谈谈深度自动编码器。它们很适合解决非线性降维问题,有以下几个原因:能在两方面提供灵活的映射;学习时间在训练案例的数量中是线性的;最终编码模型非常简洁迅速。但是使用反向传播优化深度自动编码器时,会变得非常困难。如果初始权重很小,反向传播的梯度就歇菜了。对于优化深度自动编码器,我们现在有了更好的方法:使用非监督式的逐层预训练方法或者就像回声状态网络(ESN)中那样,只是小心地将权重初始化。

对于预训练任务,有三种 Shallow 自动编码器:

  • 用作自动编码器的RBM:它很像一个自动编码器,但是被隐藏层中的二元活动强烈的正则化了。当用极大似然率训练RBM时,它就不像自动编码器了。在预训练任务中,我们可以用Shallow自动编码器代替RBM。

  • 去噪自动编码器(Denoising auto encoders):它通过将输入向量的一些成分设为0给该向量添加噪音。但仍然需要将这些成分重构,所以去燥自动编码器必须抽取获得输入之间相关性的特征。如果使用很多去噪自动编码器,预训练任务会很有效果。

  • 收缩自动编码器(Contractive auto encoders):将一个自动编码器正则化的方法就是试着让隐藏单元的活动尽可能对输入不敏感,但是又不能忽视输入,因为它们必须重构输入。通过对与输入相对的每个隐藏活动的平方梯度进行惩罚,我们可以实现这种目标。收缩自动编码器非常适合预训练任务,只有一小部分隐藏单元的子集对输入中的变化比较敏感。

简单地说,现在有许多不同的方法来对特征进行逐层预训练。对于没有大量标记案例的数据集,预训练有助于后续的鉴别学习。对于非常大的、已标记的数据集,初始化在监督学习中使用无监督预训练的权值是不必要的,即使对于深度网络也是如此。所以预训练是初始化深度网络权重的最优先方法,当然现在还有其他方法。但是如果我们让网络变得更大,我们还将需要再次训练!

很抱歉,一下子说了这么多,但还得再啰嗦一下·······

神经网络是有史以来最美丽的编程范例之一。在传统的编程方法中,我们告诉计算机要做什么,将大问题分解成许多小的、精确定义的任务,计算机就可以轻松地执行这些任务。与此不同,在神经网络中,我们不会告诉计算机如何解决我们的问题。相反,它从观察数据中学习,找出自己解决问题的方法。

如今,深度神经网络和深度学习在计算机视觉、语音识别、自然语言处理等许多重要问题上都取得了令人瞩目的成绩。它们广泛应用在了 Google、微软和 Facebook 等公司的部署中。

对于 Hinton 在 Coursera 上开设的课程的所有讲义、研究论文和编程作业,本文作者也都汇总在了 GitHub 上,可以点击获取

希望本文对你学习神经网络的核心概念能有所帮助!