电子说
机器学习已经在各个行业得到了大规模的广泛应用,并为提升业务流程的效率、提高生产率做出了极大的贡献。这篇文章主要介绍了机器学习中最先进的算法之一——神经网络的八种不同架构,并从原理和适用范围进行了解读。机器学习和神经网络如此优秀,我们先来探讨两个问题——为什么需要机器学习?为何要使用神经网络?之后在来详细了解八种不同的网络架构。
一、为何需要机器学习?
通常来讲,对于人类十分复杂的任务就是机器学习大显身手的地方,那些问题都过于复杂,让人类解决是不现实或者是不可能的。所以人们想出了一个办法,为机器学习算法提供大量的数据,并让算法去探索这些数据,搜索出一个可以描述这些数据的模型来实现解决问题的目标。
让我们来看两个小例子:
要写出一个能在不同光照条件下、新的视角下、杂乱的环境中识别一个新的物体的程序是极度困难的。我们不知道如何去写这个程序,如何建模,因为我们根本就不知道我们的大脑是如何处理这样的情况的。即使我们能想到一个办法,那么程序将会复杂到难以置信的程度!
编写一个检测信用卡欺诈的程序也十分困难,几乎不存在又简单又可靠的规则,我们需要结合一系列弱规则来实现。当欺诈目标变化时,程序也需要随机应变的改变以适应。
还有大量的例子使我们束手无策,于是机器学习就成为了一种有效的方法。我们不在去编写程序解决某个特定的任务,而是对于需要解决的问题收集大量的输入——输出数据。机器学习算法可以通过这些数据产生可以解决问题的程序。这些程序与传统的code不同,是由成千上万个参数构成。如果我们建模有效,那么程序将会在新的数据上获得和训练数据一样好的表现,并且可以输入新的训练数据来使得程序适应新的变化。需要注意的是,现在大规模计算的成本已经比请经验丰富的程序员便宜了,这也是经济上机器学习得以发展的原因所在。
目前机器学习主要在以下方面应用:
模式识别:实际场景中的目标、包括人脸、表情、语音识别等等;
异常检测:例如信用卡交易的异常检测、传感器异常数据模式检测和异常行为检测等;
预测:预测股票或者汇率、或者预测消费者喜欢的电影、音乐等。
二、什么是神经网络?
神经网络是一类机器学习算法和模型的统称,也是目前机器学习发展最快的一个领域。它在生物大脑结构的启发下诞生,并衍生为现在最为前沿的深度神经网络,可以处理输入和输出间极为复杂的映射过程。神经网络具有如下三个特征使它成为了机器学习中的重要组成部分:
有助于理解大脑实际工作的流程,
有助于理解神经元和期间的自适应链接以及并行计算的概念,与顺序处理的序列模型大不相同;
在大脑的启发下利用新的算法解决实际问题。
要想系统地学习机器学习,吴恩达的课程对于机器学习入门很有帮助,进一步的可以学习被称为"深度学习教父"Hinton的神经网络课程来进一步理解神经网络。
接下来的内容我们会具体阐述八种常见的神经网络架构,这应该是每个机器学习从业者和研究者都应该熟悉并掌握的工具。
神经网络的架构主要分为三大类——前馈、循环和对称链接网络。
前馈网络是最常见的架构,第一次负责输入、最后一层负责输出,中间的称为隐藏层。如果有一层以上的隐藏层则称为深度结构。可以将每一层看做是一次变换,并在变换后利用非线性激活函数进行激活。
循环神经网络(RNNs):在连接图中表现的是一个循环,它们的动力学特性十分复杂并难以训练,但更真实地反映了生物真实的情况。有很多工作在寻找更高效的方法来训练网络。这种网络对于处理序列数据十分有效,其中每一个单元与深度网络中的神经元类似,但其在每一个时隙内采用相同的权重,并在每一个时隙内都接收输入。他们同时还具有利用隐藏状态记忆信息的能力。
对称连接网络与循环网络类似,但单元间的链接对称。他们遵循能量函数更容易分析。没有隐藏层的对称连接网络成为Hopfield网络,有隐藏层的则称为玻尔兹曼机(具体参见Hinton课程内容)
三、八种核心神经网络架构
1.感知机(Perceptrons)
感知机可以称为第一代的神经网络,主要包括输入的多个特征单元(人工定义或程序寻找),中间由学习权重连接,最后由决策单元输出。典型的感知机单元遵循前馈模型,输入通过权重处理后直接连接到输出单元上。
如果人们手动选取足够的有效特征,感知机几乎可以做任何事。但一旦人工特征固定下来将会极大的限制感知机的学习能力。同时如何选择一个好的、有效的特征也是困扰人们的难点。这对于感知机来说是毁灭性的,由于感知机将所有的注意力放在了模式识别上而忽视了变换过程。Minsky和Papert的"群体不变性理论"指出无法通过学习来识别出一组变化中的变换过程。为了处理这样的变换,感知机需要利用多特征单元来识别出变换。而这模式识别中最为复杂的一步则需要手工来完成特征提取,而不是学习。
没有隐藏层的神经网络在为输入输出映射建模的过程中具有很大的局限性。而更多层的线性单元似乎也没有帮助,因为线性的叠加依旧是线性的。固定的非线性输出也不足以建立复杂的映射关系。所以在感知机的基础上我们需要建立多层具有适应性非线性的隐藏单元网络。但我们该如何训练这样的网络呢?我们需要有效的方法来调整所有层而不仅仅是最后一层的权重。这十分困难,因为学习隐藏层的权重就等同于学习特征,但没人会告诉你每个隐藏单元应该做什么。这就需要更先进的结构来处理了!
2.卷积神经网络(Convolutional Neural Networks)
机器学习领域对于目标识别和检测进行了多年的探索,问题始终悬而未决的原因在于以下问题始终困扰着物体的视觉识别:
分割、遮挡问题
光照变化问题
扭曲和形变问题
同一类物体在功能性区别下的外形变化
视角不同带来的困难
维度尺度带来的问题
这些问题一直困扰着传统的模式识别。人们阐释手工创造各种各样的特征来描述物体的特征,但结果总不尽如人意。热别是在物体识别领域,轻微的变化就会造成结果的巨大差别。
图 卷积网络的可视化图形
在感知机和多层感知机的基础上,人们提出了一种新的网络结构——卷积神经网络。利用卷积神经网络可以对一些特征的检测进行共享,并在尺度和位置和方向上具有一定的不变性。较早的著名例子就是1998年Yann LeCun提出的一个称为LeNet的网络进行手写字符识别获得了巨大的成功。下图是LeNet的主要结构:一个包括卷积、池化和全连接的六层网络结构。
它利用反向传播算法来对隐藏层的单元权重进行训练,并在每个卷积层中实现了卷积操作的(卷积核)权值共享,并引入池化层实现了特征的缩聚(后面的网络层具有较大的感受野),最后通过全连接层来实现输出。
而后时间来到了ILSVRC2012年的比赛,由ImageNet提供了120万张的高清训练数据,目的是训练一个可以分类出图像属于一千类中每一类的概率的模型,并以此来进行图像的识别。Hinton的学生Alex Krizhevsky最后夺魁。在LeNet的基础上改进了神经网络,训练出了一个具有7个隐藏层深度网络,更深更强大的AlexNet,并引入了GPU进行并行训练,极大的提高了深度学习模型的训练效率。自此GPU开始进入了广大机器学习研究者的视野中。远超过第二名的成绩展示了深度学习的强大魅力,也使得深度学习开始走入了高速发展的快车道中。
3. 循环神经网络(Recurrent Neural Network)
循环神经网络主要用于处理序列数据。在机器学习领域,序列模型一般利用序列数据作为输入,来训练序列模型用于预测序列数据的下一项。在循环神经网络之前主要使用无记忆模型处理这类任务。
循环神经网络是一种十分有力的武器,它包含了两个重要的特点。首先拥有一系列隐含状态的分布可以高效的存储过去的信息;其次它具有非线性动力学可以允许它以复杂的方式更新隐藏状态。在足够的时间和神经元数量下,RNN甚至可以计算出计算机能计算的任何东西。它们甚至会表现出振动、牵引和混沌的行为。
然而循环神经网络的训练复杂,需要面对梯度消失或者爆炸的问题。由于训练的RNN是一个很长的序列模型,训练过程中的梯度十分容易出现问题。即使在很好的初值下,它也很难检测到目前的目标和先前很多步前输入间的联系,所以循环神经网络处理长程依赖性还十分困难。
目前主要有四种有效的方式实现循环神经网络,主要包括长短时记忆(Long Short Term Memory),海森自由优化方法(Hessian Free Optimization),回声状态网络(Echo State Networks)以及利用动量的初始化(Good initialization with momentum)
4 . 长短时记忆网络(Long/Short Term Memory Network)
Hochreiter和Schmidhuber(1997)通过构建长短时记忆网络(LSTM:Long Short Term Memory),解决了RNN长时间记忆(如数百个时间步)的问题。 他们使用相互作用的逻辑单元和线性单元来设计专门的存储细胞(Memory Cell)。 当“写入”门打开时,信息就可以进入存储细胞。 只要“保持”门处于开启状态,信息就会一直保留在存储细胞中。开启“读取”门就可以从细胞中读取信息:RNN特别适合用于手写草书识别这样的任务。通常会以笔尖坐标x,y以及表示笔是向上还是向下的参数p作为输入,输出则是一段字符序列。Graves和Schmidhuber(2009)将LSTM结合到RNN中,得到了当前草书识别的最佳结果。 不过,他们使用小图像序列而非笔尖坐标序列作为输入。
5. Hopfield网络
带有非线性单元的循环网络通常是很难分析的,它们会以许多不同的方式表现出来:稳定状态,振荡,或遵循不可预测的混沌轨迹。 Hopfield网络由二进制阈值单元反复连接组成。1982年,约翰·霍普菲尔德认识到如果这种连接是对称的,那就存在一个全局的能量函数。整个网络每个二进制单元的“配置”都对应了能量的多与少,二进制单元的阈值决策规则会让网络的配置朝着能量函数最小化的方向进行。 使用这种类型的计算的一种简洁方法是使用存储器作为神经网络的能量最小值,使用能量极小值的记忆提供了一个内存关联存储器(CAM) 。项目只用知道其内容的一部分便可实现访问,可以有效应对硬件损坏的情况。
每当我们记忆一次配置,我们希望得到一个新的能量最小值。 但是,一旦同时存在两个最小值,怎么办? 这就限制了Hopfield网络的能力。 那么我们如何增加Hopfield网络的能力呢? 物理学家们喜欢用已有的数学知识去解释大脑的工作原理。 许多关于Hopfield网络及其存储能力的论文在物理学期刊上发表。最终,伊丽莎白·加德纳(Elizabeth Gardner)发现了一个更好的存储规则,它使用权重的全部容量。 她并不一次存储所有向量,而是多次循环训练集,并利用感知器收敛过程来训练每个单元,使其具有正确的状态,给定该向量中所有其他单元的状态。 统计学家称这种技术为“拟似然估计”。
Hopfield网络还有另一种计算角色。 我们并不用网络来存储记忆,而是用它来构建感官输入的演绎,用可见单元表示输入,用隐层节点的状态表示演绎,用能量表示演绎的好坏。
6 .玻尔兹曼机(Boltzmann Machine Network)
玻尔兹曼机是一种随机递归神经网络, 它可以被看作是Hopfield网络随机生成的, 它也是第一批能够学习内部表示、能够表示和解决困难的组合学问题的神经网络之一。
玻尔兹曼机学习算法的学习目标是最大化玻尔兹曼机分配给训练集中的二进制向量的概率乘积。这相当于最大化了玻尔兹曼机分配给训练向量的对数概率之和。如果我们1)让网络在没有外部输入的情况下稳定到N不同时间平稳分布; 2)每次采样一次可见向量,那也可以理解为最大化我们得到N个样本的概率。
2012年,Salakhutdinov和Hinton提出了玻尔兹曼机的高效小批量学习程序。 对于正向,首先将隐藏概率初始化为0.5,然后将可见单元上的数据向量进行固定,然后并行更新所有隐藏单元,直到使用平均场更新进行收敛。 在网络收敛之后,为每个连接的单元对记录PiPj,并在最小批量中对所有数据进行平均。 对于反向:首先保留一组“幻想粒子”,每个粒子的值都是全局配置。 然后依次更新每个幻想粒子中的所有单元几次。 对于每个连接的单元对,在所有的幻想粒子上平均SiSj。
在普通玻尔兹曼机中,单元的随机更新是有序的。 有一个特殊的体系结构允许更有效的交替并行更新(层内无连接,无跨层连接)。 这个小批量程序使得玻尔兹曼机的更新更加并行化。 这就是所谓的深玻尔兹曼机器(DBM),一个带有很多缺失连接的普通玻尔兹曼机。
2014年,Salakhutdinov和Hinton为他们的模型提出了更新,称之为受限玻尔兹曼机(Restricted Boltzmann Machines)。 他们限制连通性使得推理和学习变得更简单,隐藏单元只有一层,隐藏单元之间没有连接。 在受限玻尔兹曼机中,当可见单元被固定时,只需要一步就能达到热平衡。 另一个有效的小批量RBM学习程序是这样的: 对于正向,首先将可见单元的数据向量固定。 然后计算所有可见和隐藏单元对的
7. 深度信念网络(Deep Belief Network)
反向传播被认为是人工神经网络的标准方法,在处理数据后,计算每个神经元的误差贡献。但是,使用反向传播也存在一些很明显的问题。首先,它需要的数据是要标注训练好的,但实际生活中几乎所有的数据都是没有标注过的。其次,其学习的延展性不好,这意味着在具有多个隐藏层的网络中,它的学习时间是非常慢的。第三,它很可能会被陷在一个局部最优的位置,这对于深度网络来说,远不是最优解。
为了克服反向传播的上述局限性,研究人员已经考虑使用无监督学习方法。这有助于保持使用梯度法调整权重的效率和简单性,同时也可以用于对感觉输入的结构进行建模。尤其是可以通过调整权重来使得生成模型的输入概率最大化。那么问题就来了,我们应该学习什么样的生成模型?它能像Boltzmann机器那样以能量为基础吗?它是一个非常理想的由神经元组成的因果模型,还是两者的混合?
信念网络(belief net)是由随机变量构成的有向无环图。用信念网络,我们要观察的一些变量和想要解决二个问题是:推理的问题——推断未观测的状态变量,以及学习的问题——调整变量之间的相互作用,使网络更容易生成训练数据。
早期的图形模型使用专家来定义图形结构和条件概率。当时这些图形是稀疏连接的;因此,研究人员最初专注于做正确的推断,而不是学习。神经网络是以学习为中心的,自己死记硬背的知识并不酷,因为知识来自于学习训练数据。神经网络的目的不是为了便于解释,也不是为了让推理变得简单。但即便如此,还是有神经网络版本的信念网络。
由随机二元神经元组成的生成神经网络有两种。一个是基于能量的,在此基础上,我们利用对称连接将二元随机神经元连接到一个波耳兹曼机器上。另一个是基于因果关系,我们在一个有向无环图中连接二元随机神经元,得到一个s型信念网络。这两种类型的具体描述不再赘述。
8. 深度自动编码器(Deep Auto-encoders)
最后,让我们讨论一下deep auto-encoders。由于一些原因,它们看起来总是很好地进行非线性降维,因为它们提供了两种方式的灵活映射。在训练目标的数量上,学习时间是线性的(或更好的)。最终的编码模型是相当紧凑快速的。然而,利用反向传播来优化深度自动编码器是非常困难的。初始权值小,后传播梯度消失。我们现在有了更好的方法来优化它们:要么使用无监督的分层预训练,要么就像在回声状态网络中一样小心地初始化权重。
对于预训练任务,主要有三种不同类型的shallow auto-encoders:
RBM
去噪自动编码器
压缩自动编码器
简单地说,现在有许多不同的方法来对特性进行逐层预训练。对于没有大量标记案例的数据集,预训练有助于后续的鉴别学习。对于非常大的、已标记的数据集,初始化在监督学习中使用无监督预训练的权值是不必要的,即使对于深网也是如此。所以预训练是初始化深网权重的最优先方法,当然现在还有其他方法。但是如果我们让网络变得更大,我们还将需要再次训练!
说了这么多...
神经网络是有史以来最美丽的编程范例之一。在传统的编程方法中,我们告诉计算机要做什么,将大问题分解成许多小的、精确定义的任务,计算机就可以轻松地执行这些任务。相比之下,在神经网络中,我们不会告诉计算机如何解决我们的问题。相反,它从观察数据中学习,找出自己解决问题的方法。
今天,深度神经网络和深度学习在计算机视觉、语音识别、自然语言处理等许多重要问题上都取得了令人瞩目的成绩。它们广泛应用在了Google、微软和Facebook等公司的部署中。
希望这篇文章对你学习神经网络的核心概念能有所帮助!
全部0条评论
快来发表一下你的评论吧 !