前面咱们分享过如何简单形象的理解神经网络是什么。git
今天咱们接着学习 8 个重要的神经网络架构,并简单解读它们的原理和适用范围。github
关于机器学习方面的学习资源,Geoffrey Hinton 的《机器学习中的神经网络》是不少人必看的内容。Geoffrey Hinton 是深度学习理论无可争议的教父级人物,而他在这门课里也确实讲了不少实实在在的知识。程序猿 James Le 小伙就认真学习了这门课程,并分享了他的学习笔记,将 Hinton 在课程中讲解的 8 种神经网络架构进行了总结,正在学习或即将入坑机器学习的小伙伴千万不要错过这篇干货,若是喜欢这类学习笔记的话别忘了收藏和点赞,咱们会增长这类文章的发布。算法
总的来讲,神经网络架构能够具体分红 3 类:数据库
前馈神经网络是实际应用中神经网络最为常见的一种。其第一层是输入层,最后一层为输出层,中间为隐藏层。若是隐藏层有不少个,咱们就称之为“深度”神经网络。它们会进行一系列的转换运算,改变两个案例的类似之处。每一层中神经元的活动都是下面一层神经元活动的一个非线性函数。编程
循环网络表如今链接图上时,包含一些定向循环,也是就说,有时你沿着箭头前进会回到开始的地方。循环网络还有不少复杂的动态变化,这让它们很难训练。它们更接近人脑的神经网络。网络
目前,寻找训练神经网络的有效方法有不少有趣的研究。循环神经网络是为序列数据建模的一种很是天然的方式。它们至关于一种很是深的深度网络,每一个时隙都有一个隐藏层;只是它们在每一个时隙使用相同的权重值,也在每一个时隙得到输入信息。循环神经网络可以在隐藏状态下长时间记住信息,当要想训练它们使用这种潜力是很是困难的。架构
这种网络和循环神经网络有些类似,但单元之间的链接是对称的(它们在两个方向上有相同的权重)。对称网络分析起来,比循环神经网络要容易的多。它们的用途也有更多的限制,由于它们按照能量函数运行。没有隐藏单元的对称链接网络称为“Hopfield 网络”,有隐藏单元的则称为“玻尔兹曼机”(Boltzmann machine)。机器学习
下面咱们具体看看都有哪 8 种神经网络架构:分布式
第一代神经网络感知机只是仅有一个神经元的简单计算模型。上世纪60年代,Frank Rosenblatt 让感知机开始流行。这种神经网络有很是强大的学习算法。1969 年,Minsky 和Papers 出版了一本书叫《感知机》,分析了感知机能作什么及其局限性。不少人认为全部的神经网络都有这些局限性。然而,感知机的学习程序直到今天仍然普遍应用于不少任务中,其数量众多的特征向量包含几百万个特征。函数
在统计模型识别的标准范式中,咱们首先将原始输入向量转换为特征激活的向量,而后用依据常识的手写程序去定义这些特征。接着,咱们学习怎样为每一个特征激活赋予权重,得到一个单个数量(scalar quantity)。若是这个数量大于某个阙值,咱们就决定该输入向量为目标类的正例。
标准的感知机架构属于一种简单的前馈网络,也就是说输入信息被传入神经元中,通过处理后,生成一个输出结果。在下方图表中,意味着神经网络自下而上读值:输入信息来自底部,输出值从顶部输出。
然而,感知机也有些局限性:若是你选择手动选择特征,并且使用足够多的特征,你几乎能够作任何事情。对于二进制输入向量,每一个指数级二进制向量都会有单独的特征单元, 这样以来,咱们能够对二进制输入向量作出任何可能的判别。可是一旦手动编写的特征肯定之后,感知机能学什么内容就有了很强的局限性。
对于感知机来讲这种结果是灾难性的,由于模式识别的关键就是无论转换情况如何都能识别模式。Minsky 等人的“群体不变性理论”指出,若是转换造成一个群组,进行学习的感知机的一部分就没法学习识别模式。要处理这种转换形式,感知机须要使用多个特征单元识别提供信息的子模式的转换。所以,模式识别中比较棘手的部分必须由手动编写的特征检测器完成,而不是学习。
没有隐藏单元的神经网络在它们为输入输出映射建模方面颇有局限性。线性单元的层再多也没有做用,它依然是线性的。光解决输出的非线性是不够的。这样以来,咱们须要自适应非线性隐藏单元的多个层。但咱们怎样训练这种神经网络呢?咱们须要一种有效的方法来适应全部层而不只仅是最后一层的权重。这很难作到。学习传入隐藏单元的权重,至关于学习特征。这比较难作到,由于没有人能直接告诉咱们隐藏单元该怎么作。
机器学习研究一直都比较关注对象检测问题,我站也曾发过这么一篇如何用卷积神经网络提取图像特征。
识别对象存在困难有以下几个因素:
分割:真实场景经常都混满了其它对象。很难分辨哪些碎片应该组到一块儿,是同一对象的一部分。一个对象的某个部分会隐藏在其它对象后面。
光线:光线和对象同样能决定像素的强度。
变形:对象可能会以多种非仿射的方式变形,例如手写字体会有很大的回路或者仅仅一个尖点。
可供性:对象分类经常由它们的使用方式决定。例如,椅子是用来坐的,所以它们有不少种物理形状。
视角:视角的改变会致使图像出现变更,标准的学习方法就没法应付这种状况。信息会在输入维度(例如像素)之间出现跳跃。
你能想象有一个医疗数据库,其中一个患者的名字有时跳跃至一般为权重提供代码的输入维度中么!要想应用机器学习,咱们首先得消除这种维度跳跃问题。
神经网络目前解决对象检测问题的主流方式就是复制特征法。这种方法利用有不一样位置的同一特征检测器的多个不一样副本。它也能在缩放和取向中复制,但比较棘手,成本较高。复制能大幅减小神经网络须要学习的自由参数的数量。其利用几个不一样的特征类型,每一个类型都有对复制检测器的映射。它一样也能让每批图像以不一样的方式表示。
那么,复制特征检测器能获得什么?
对等活动:复制的特征并不会让神经活动对转移保持不变,活动是对等的。
不变性:若是训练期间一个特征在许多位置有用,那么该特征的检测器训练期间适用于全部位置。
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 的结果。随着芯片愈来愈便宜,数据集愈来愈大,大型的神经网络会比老式的计算机视觉系统更快的优化。
要想理解循环神经网络,咱们须要简要概述一下序列建模。当在序列中应用机器学习时,咱们经常想将一个输入序列变成一个不一样域中的输出序列,例如,将声压的一个序列变成词汇特性的一个序列。没有单独的目标序列时,咱们能够经过尝试预测输入序列中的下一个项来获取一个教学信号。目标输出序列是前一步的输入序列。这比从其它像素中预测一个像素,或者从其他照片中预测一张照片的一个 patch 要天然多了。预测序列中的下一个项时,监督式学习和非监督式学习之间的差异就比较模糊了。它使用用于监督式学习的方法,却不须要一个单独的教学信号。
循环神经网络很是强大,由于它们包含 2 个属性:
分布式的隐含状态让它们能有效存储过去的大量信息
非线性动力能让它们以复杂的方式更新自身隐含状态。
若是有足够的神经元和时间,循环神经网络能计算任何能被你的电脑计算的东西。那么循环神经网络会表现哪些行为呢?它们会来回摆动,会指出“吸引子”(attractors),运行会比较混乱。循环神经网络也能潜在学习应用不少小型程序,它们并行运行,相互协做产生很是复杂的效应。
然而,循环神经网络的复杂性也让它们很难训练。由于梯度会迅速大幅增加或消失的问题,要想训练一个循环神经网络至关困难。当咱们经过不少层反向传播时,梯度的幅度会发生什么情况呢?若是权重很小,梯度会呈指数级收缩;若是权重很大,梯度会呈指数级增大。
典型的前馈神经网络能应付这些指数级的效应,由于它们只有不多的隐藏层。然而,在用长序列训练的循环神经网络中,梯度很容易急速增大或消失。即使是有很好的初始权重,根据几个时步以前的输入,也很难检测到当前的目标输出,所以用循环神经网络处理长期依赖性问题存在不少困难。
学习循环神经网络有 4 个有效的方式:
长短时间记忆:用循环神经网络创造出用来长时间记住值的小型模块。
Hessian Free优化:使用一个很好的优化器处理梯度急速消失的问题,该优化器能检测到梯度很小但曲率更小的方向。
回声状态网络(ESN):优化输入 -> 隐藏层及隐藏层 -> 隐藏层和输出层 -> 隐藏层这些过程之间链接的很是紧密,所以隐含状态有个很大的弱耦合振子(coupled oscillators)的“蓄水池”(reservoir),弱耦合振子可由输入分别驱动。
用动量法进行很好的初始化:和回声状态网络中的优化方法相似,可是接着会用动量法学习全部的链接。
1997 年,Hochreiter 和 Schmidhuber 构建了后人熟知的长短时间记忆网络,解决了用循环神经网络实现长期记忆的问题。他们用有相乘交互做用的逻辑和线性单元设计了一种记忆细胞。每当细胞的“写入”(write)门限开启时,信息就输入细胞中,而后一直待在细胞里,直到细胞的“保留”(keep)门限开启。细胞经过开启其“读取”(read)门限来读取信息。
读取弯弯曲曲的手写字体是循环神经网络的自然任务。它一般以笔尖的坐标序列(x,y,p),做为输入,其中 p 表示笔是向上仍是向下,输出为一个特征序列。Grave 和 Schmidhuber 在 2009 年的研究表示用长短时间记忆模型搭配循环神经网络是当前读取弯曲手写体的最佳体系。简言之,他们使用了一系列的小型照片而非笔尖的坐标做为输入。
非线性单元构成的循环神经网络通常很难分析,它们会以不少不一样的方式表现:处于稳定状态,震荡,或沿着没法预测的混乱轨迹运转。一个 Hopfield 网络由二元阙值单元循环链接构成。1982 年,John Hopfield 意识到,若是链接是对称的,那么就存在一个全局能量函数。整个网络的每一个二元“配置”都对应一个能量,而二元阙值决策规则会让神经网络接受该能量函数的最小值。利用这种计算类型的一个有效方式就是将记忆用做该神经网络的能量最小值。使用能量最小值表示记忆提供了一个内容可寻址存储器,这样只需知道某个项的部份内容,就能访问该项,可有效抵抗硬件损坏的问题。
咱们每次记忆一个配置,都但愿建立一个新的能量最小值。可是若是两个接近的最小值在中间位置呢?这种状况就限制了 Hopfield 的性能。所以咱们怎样才能提高 Hopfield 的性能呢?很多物理学家对这个问题很感兴趣,他们已掌握的数学知识或许能解释大脑的工做原理。不少物理期刊上发表了很多论文,探究 Hopfield 网络及其存储能力。最终 Elizabeth Gardner 发现充分利用权重的能力会让神经网络有更好的存储性能。她没有尝试将向量一次性存储完毕,而是在训练集中屡次循环,根据向量中全部剩余单元的状态用感知机的收敛程序训练每一个单元,以得到正确的状态。统计学家将这种方法称为“伪似然”(pseudo-likelihood)。
在 Hopfield 网络中还有另外一种计算方法。这种方法没有利用该神经网络存储记忆,而是构造感受输入的演绎。感受输入由可见的单元表示,演绎则由隐藏单元的状态表示,演绎的好坏由能量表示。
玻尔兹曼机是一种随机循环神经网络,它能够看做 Hopfield 网络的一种随机、生成对应网络。它是首批能学习内部表示以及能表示和解决困难的组合问题的神经网络之一。
玻尔兹曼机器学习算法的学习目标是,将玻尔兹曼机赋给训练集中二元向量的几率乘积进行最大化,这至关于将玻尔兹曼机赋给训练向量的对数几率之和最大化。
2012 年,Salakhutdinov 和 Hinton 提出了针对玻尔兹曼机的小批量学习流程:
对于正相(positive phase),首先以0.5的几率优化隐藏几率,而后在可见单元上固定一个数据向量,而后并行更新全部隐藏单元,直到用平均场(mean-field)更新开始收敛。神经网络收敛后,对每一个链接的单元对记录PiPj值,并小批量对全部数据求平均值。
对于负相(negative phase),首先选一组“假想粒子”(fantasy particles),每一个粒子都有一个值,它是个全局配置。而后按顺序将每一个假想粒子中的全部单元更新几回。对于每对链接的单元,对全部假想粒子中的SiSj求平均值。
在通常玻尔兹曼机中,单元的随机更新须要按照顺序。有个特殊的架构能实现交替并行更新,可大幅提升效率,这种小批量流程让玻尔兹曼机的更新更加并行化。这种架构就叫作深度玻尔兹曼机(DBM),它其实是一个带有缺失链接的普通玻尔兹曼机。
2014 年,Salakhutdinov 和 Hinton 又提出了他们所创模型的更新版,称为“受限玻尔兹曼机”(RBM)。他们将网络中的链接情况加以限制,让推断和学习更容易些(只有一个隐藏单元的层,隐藏单元之间没有链接)。在受限玻尔兹曼机中。当可见单元被固定时,只需一步就能达到热平衡。
对于受限玻尔兹曼机,另外一个有效的小批量学习过程是:
对于正相:首先在可见单元上固定一个数据向量,而后为全部成对的可见隐藏单元计算出 的值。对于每对链接的单元,在全部小批量中的数据上求 平均值。
对于负相:也是选择一组“假想粒子”,而后用交替并行更新的方式把每一个假想粒子更新几回。对于每对链接的单元,在全部假想粒子上求ViHj平均值。
反向传播被视为人工神经网络中处理批量数据后,计算每一个神经元偏差分布的标准方法。然而,使用反向传播也存在几个主要问题:
它须要标记好的训练数据,但几乎全部的数据都是未标记状态。
学习时间不能很好的规模化,这意味着当神经网络有多个隐藏层时,学习会很是慢。
当局部选优问题严重时,反向传播会陷入僵局,所以对于深度网络来讲,它仍是不够理想。
为了解决反向传播的局限性,研究者们还考虑了非监督式学习的方法。这有助于在用梯度方法调整权重时仍能保持效率和简易性,并且还能用它为感受输入的结构建模。具体来讲,他们调整了权重,将生成模型生成感受输入的几率最大化。问题是,咱们应该学习哪一种生成模型?能够是像玻尔兹曼机这样的能量模型吗?或者由理想化的神经元组成的因果模型?或者这两种模型的混合类型?
深度信念网络是一种由随机变量组成的有向非循环图。用信念网络时,咱们须要观察其中一些变量,解决两个问题:1)推断问题:推断未观察到的变量的状态;2)学习问题:调整变量之间的交互情况,让神经网络更能生成训练数据。
早期的图解模型要由专人去定义图表结构和条件几率。当时,图表之间都是松散地链接,因此研究人员最初重点放在了进行正确的推断上,而不是学习上。对于神经网络来讲,学习才是中心任务。可是即便如此,仍是有两个神经网络版的信念网络。
这两种由随机二进制神经元组成的生成神经网络是:1)能量模型:在这种模型中,咱们用对称链接的方式将二进制随机神经元进行链接,以获得一个玻尔兹曼机;2)因果模型:在这种模型中,咱们在一个有向非循环图中将二进制随机神经元进行链接,以获得一个 Sigmoid 信念网络。本文再也不详谈这两种类型的网络。
最后,咱们谈谈深度自动编码器。它们很适合解决非线性降维问题,有如下几个缘由:能在两方面提供灵活的映射;学习时间在训练案例的数量中是线性的;最终编码模型很是简洁迅速。可是使用反向传播优化深度自动编码器时,会变得很是困难。若是初始权重很小,反向传播的梯度就歇菜了。对于优化深度自动编码器,咱们如今有了更好的方法:使用非监督式的逐层预训练方法或者就像回声状态网络(ESN)中那样,只是当心地将权重初始化。
对于预训练任务,有三种 Shallow 自动编码器:
用做自动编码器的RBM:它很像一个自动编码器,可是被隐藏层中的二元活动强烈的正则化了。当用极大似然率训练RBM时,它就不像自动编码器了。在预训练任务中,咱们能够用Shallow自动编码器代替RBM。
去噪自动编码器(Denoising auto encoders):它经过将输入向量的一些成分设为0给该向量添加噪音。但仍然须要将这些成分重构,因此去燥自动编码器必须抽取得到输入之间相关性的特征。若是使用不少去噪自动编码器,预训练任务会颇有效果。
收缩自动编码器(Contractive auto encoders):将一个自动编码器正则化的方法就是试着让隐藏单元的活动尽量对输入不敏感,可是又不能忽视输入,由于它们必须重构输入。经过对与输入相对的每一个隐藏活动的平方梯度进行惩罚,咱们能够实现这种目标。收缩自动编码器很是适合预训练任务,只有一小部分隐藏单元的子集对输入中的变化比较敏感。
简单地说,如今有许多不一样的方法来对特征进行逐层预训练。对于没有大量标记案例的数据集,预训练有助于后续的鉴别学习。对于很是大的、已标记的数据集,初始化在监督学习中使用无监督预训练的权值是没必要要的,即便对于深度网络也是如此。因此预训练是初始化深度网络权重的最优先方法,固然如今还有其余方法。可是若是咱们让网络变得更大,咱们还将须要再次训练!
很抱歉,一会儿说了这么多,但还得再啰嗦一下·······
神经网络是有史以来最美丽的编程范例之一。在传统的编程方法中,咱们告诉计算机要作什么,将大问题分解成许多小的、精肯定义的任务,计算机就能够轻松地执行这些任务。与此不一样,在神经网络中,咱们不会告诉计算机如何解决咱们的问题。相反,它从观察数据中学习,找出本身解决问题的方法。
现在,深度神经网络和深度学习在计算机视觉、语音识别、天然语言处理等许多重要问题上都取得了使人瞩目的成绩。它们普遍应用在了 Google、微软和 Facebook 等公司的部署中。
对于 Hinton 在 Coursera 上开设的课程的全部讲义、研究论文和编程做业,本文做者也都汇总在了 GitHub 上,能够点击获取。
但愿本文对你学习神经网络的核心概念能有所帮助!