摘要:深度学习利用拥有多个处理层的计算模型来学习具有多层抽象的数据的表示。这些方法显著提高了许多方面的最高水平,包括语音识别、视觉对象识别、对象检测和许多其他领域,例如药物发现和基因组学等。深度学习能够发现大规模数据集中的复杂结构。它利用BP算法来完成这一发现过程。BP算法能够指导机器如何修改其内部参数,这些参数用于从前一层的表示计算出当前层的表示。深度卷积网络在处理图像、视频、语音和音频方面带来了突破,而循环网络在处理序列数据,比如文本和语音方面表现出色。
机器学习技术为现代社会的许多方面提供了动力:从网络搜索到社交网络上的内容过滤,再到电子商务网站的推荐,并越来越多地出现在相机和智能手机等消费类产品中。机器学习系统用于识别图像中的目标,将语音转换为文本,将新闻条目、帖子或产品与用户兴趣相匹配,并选择相关的搜索结果。这些应用程序越来越多地使用一类称为深度学习的技术。
传统的机器学习技术在处理未加工过的数据时,体现出来的能力是有限的。数十年来,想要构建模式识别或机器学习系统,需要仔细的工程设计和相当专业的领域知识来设计一个特征提取器,将原始数据(如图像的像素值)转换为合适的内部表示或特征向量(记作 m m m维特征向量 x \textbf{x} x)。学习子系统(通常是分类器)可以根据特征表示对输入中的模式进行检测或分类。
表示学习是一组方法,它让机器在获得原始数据后自动发现所需的用于检测或分类的特征表示。深度学习方法是拥有多层表示的表示学习方法,通过组合简单但非线性模块得到,每个模块将某一层的表示(原始输入作为第一层)转换为更高更抽象一些的层的表示。通过足够多的转换的组合,可以学习到非常复杂的函数。对于分类任务,表示的高层强化有助于区分的输入数据,同时削弱不相关因素。比如,一幅图片的格式是一个像素值数组,那么在表示的第一层上学到的特征通常是在图像的特定方向和位置上是否有边存在。第二层通常会根据边的某些摆放来检测图案,这时候会忽略掉边的位置的细小变化。第三层或许会把那些图案进行组合,从而使其对应于熟悉目标的某部分。随后的一些层会将这些部分再组合,从而构成待检测目标。深度学习的核心方面是,上述各层的特征都不是人类工程师来设计的,而是使用一种通用的学习过程从数据中学到的。
深度学习正在取得重大进展,解决了人工智能界尽最大努力很多年仍没有进展的问题。事实证明,深度学习擅长发现高维数据中的复杂结构,因此适用于科学、商业和政府等领域。除了在图像识别[1-4]、语音识别[5-7]等领域打破了纪录,它还在其他领域击败了其他机器学习技术,包括预测潜在的药物分子的活性[8]、分析粒子加速器数据[9,10]、重建脑回路[11]、预测在非编码DNA突变对基因表达和疾病的影响[12,13]。更令人惊讶的是,深度学习在自然语言理解的各项任务中都取得了非常可喜的成果[14],特别是主题分类、情感分析、自动问答[15]和语言翻译[16,17]。
我们认为,在不久的将来,深度学习将会取得更多的成功,因为它需要很少的手工工程,而且很容易受益于可用计算能力和数据量的增加。目前正在为深度神经网络开发的新的学习算法和架构更会加速这一进程。
机器学习中,不论是否深度学习,最常见的形式是监督学习。试想一下,我们要建立一个系统,对房子、汽车、人或宠物图片进行分类(一共四种类别)。我们先收集大量的房子、汽车、人和宠物的图片,每张图片标上它的类别。在训练期间,向机器每输入一幅图片(实际是输入一个图片的 m m m维特征向量 x \textbf{x} x),就输出一个得分向量( s ( x ) = ( s 1 , s 2 , … , s k ) s(\textbf{x})=(s_1,s_2,\ldots,s_k) s(x)=(s1,s2,…,sk),其中每个得分 s i s_i si对应一个类别,例子中 k = 4 k=4 k=4)。我们希望图片所属类别的得分在所有类别的得分中最高(如果输入一个房子的图片,当然希望房子类别的得分最高,就可以根据得分向量判断这幅图片是房子。例如可以使用条件概率 P ( s i ∣ x ) P(s_i|\textbf{x}) P(si∣x)计算得分,即 s ( x ) = ( P ( s 1 ∣ x ) , … , P ( s k ∣ x ) ) s(\textbf{x})=(P(s_1|\textbf{x}),\ldots,P(s_k|\textbf{x})) s(x)=(P(s1∣x),…,P(sk∣x))。根据得分向量 s ( x ) = ( 0.8 , 0.1 , 0 , 0.1 ) s(\textbf{x})=(0.8,0.1,0,0.1) s(x)=(0.8,0.1,0,0.1)判断图片中是房子),但是这在训练之前是不太可能发生的。通过计算一个目标函数可以获得输出得分和期望得分之间的误差(或距离)(目标函数可以有多种形式,例如, ( s ( x ) − y ) 2 (s(\textbf{x})-\textbf{y})^2 (s(x)−y)2,如果某个样本图片标记为房子,则 y = ( 1 , 0 , 0 , 0 ) \textbf{y}=(1,0,0,0) y=(1,0,0,0))。然后机器会修改其内部可调参数,以减少这种误差。这些可调参数,通常被称为权值,它们是一些实数,可以被看作是“旋钮”,定义了机器的输入输出函数(增加了 m m m维权重向量 w = ( w 1 , … , w m ) \textbf{w}=(w_1,\ldots,w_m) w=(w1,…,wm)作为输入之后,得分向量的表示形式变为 s ( x,w ) s(\textbf{x,w}) s(x,w)。权值向量的维数一般与特征向量维数相同)。在典型的深度学习系统中,有可能有数以亿计的权值和带标签的样本,用来训练机器。
为了正确地调整权值向量,学习算法会计算一个梯度向量。梯度向量(的每个分量)给出某个权值增加一个很小的量时,误差会增加或减少的幅度(就是变化率,误差在某个权值上的偏导数)。然后在梯度向量的相反方向调整权值向量。
在所有训练样本上平均的目标函数(即 L ( X,Y ) = 1 n ∑ x ∈ X , y ∈ Y ( s ( x ) − y ) 2 L(\textbf{X,Y})=\frac{1}{n}\sum_{\textbf{x}\in\textbf{X},\textbf{y}\in\textbf{Y}}(s(\textbf{x})-\textbf{y})^2 L(X,Y)=n1∑x∈X,y∈Y(s(x)−y)2,其中 X \textbf{X} X为样本集合, ∣ X ∣ = n |\textbf{X}|=n ∣X∣=n, Y \textbf{Y} Y为图片类别集合)可以看作是权值的高维空间(有几个特征,就有几个对应的权值,就是几维的权值空间)中的一种陡峭地形。负的梯度向量表示该地形中最陡的下降方向,使其更接近最小值,也就是平均输出误差最低的地方。
在实际应用中,大部分从业者都使用一种称作随机梯度下降的算法(SGD)。它包含了提供少量样本的输入向量,计算输出和误差,计算这些样本的平均梯度,然后相应调整权值。利用训练集中多个小的样本集合来重复这个过程,直到目标函数的均值停止下降。它被称为随机的,是因为利用小的样本集对于全体样本的平均梯度的估计是有噪声的。与更复杂的优化技术相比,这个简单的过程通常会出人意料地快速找到一组好的权重[18]。训练结束之后,通过称为测试集的不同样本来度量系统性能。这用于测试机器的泛化能力——对于未训练过的新样本的识别能力。
当前许多机器学习的实际应用都使用线性分类器来对人工提取的特征分类。2类线性分类器会计算特征向量分量的加权和。如果加权总和高于阈值,则输入被分类为属于其中一个类别。
自20世纪60年代以来,我们已经知道线性分类器只能将其输入空间划分为非常简单的区域,即由超平面分隔的(两个)半空间[19]。但是,诸如图像和语音识别之类的问题要求输入 - 输出函数对输入的无关变化(诸如对象的位置、方向或照明的变化,或者语音的音高或口音的变化)不敏感,而对特定的微小变化(例如,白狼和一种叫做萨摩耶的类似狼的白色狗的区别)非常敏感。在像素级,不同姿势和不同环境中的两个萨摩耶犬的图像可能彼此非常不同,而萨摩耶犬和狼在相同位置和相似背景下的两幅图像可能彼此非常相似。线性分类器或任何其他浅层分类器在原始像素上运行时,无法区分后两者,而将前两者归入同一类别。这就是为什么浅层分类器需要一个好的特征提取器来解决选择性-不变性困境,提取器能够挑选出图像中能够区分目标的那些重要因素,但对诸如动物的姿势这些不相关因素不敏感。为了使分类器功能更强大,可以使用泛化的非线性特征,像核方法中那样[20],但这些泛化特征,比如通过高斯核得到的,并不能够使得学习器从学习样本中产生较好的泛化效果[21]。传统的选择是手工设计一个好的特征提取器,这需要大量的工程技术和专业的领域知识。但如果使用通用学习过程可以自动学习好的特征,就可以避免这种情况。这是深度学习的关键优势。
深度学习架构是一个简单模块的多层堆叠,其中所有(或大部分)模块都需要学习,其中大部分都需要计算非线性的输入到输出的映射。每个模块都转换其输入以增加特征表示的选择性和不变性。比如说,具有一个5到20层的非线性多层系统能够实现非常复杂的函数,这些函数既对细微的细节敏感 - 区分萨摩耶和白狼 - 也对大量不相关的变化(如背景,姿势,灯光和周围的物体)不敏感。
模式识别的早期阶段[22,23],研究人员的目标就是用可训练的多层网络取代手工设计的特征,尽管很简单,但直到20世纪80年代中期,该解决方案才得到广泛的理解。事实证明,多层网络可以通过简单的随机梯度下降进行训练。只要模块是输入和内部权重的相对平滑的函数,就可以使用反向传播步骤计算梯度。这一思想在70年代和80年代由几个不同的小组独立发现[24-27]。
(梯度下降的核心是 w = w − η ∂ E ∂ w w=w-\eta \frac{\partial E}{\partial w} w=w−η∂w∂E,其中 η \eta η为学习速率。反向传播(back propagation)是神经网络中用来求解参数的核心算法,类似SGD,通过从前往后求解梯度的方式来使参数向代价函数减小的方向靠近。BP算法的学习过程由前向传播(forward propagation)过程和反向传播过程组成。在前向传播过程中,输入信息通过输入层经隐含层,逐层处理并传向输出层。如果在输出层得不到期望的输出值,则取输出与期望的误差的平方和作为目标函数,转入反向传播,逐层求出目标函数对各层神经元权值的偏导数,构成目标函数对权值向量的梯度向量,作为修改权值的依据,网络的学习在权值修改过程中完成。误差达到最小值,学习结束。参见百度百科)
计算关于(多层模块)权值的目标函数的梯度的反向传播算法不过是求导链式法则的实际应用。关键的认识是,目标函数关于某层输入的导数(或者梯度)可以通过反向传播由关于该层输出(或者后续层的输入)的导数求得(如图1)。反向传播公式可以重复应用以在所有模块间传播梯度,从最顶层输出开始(网络生成预测的位置)一直到底部(接收外部输入的位置)。一旦计算出这些梯度,就可以直接计算相对于每个模块权重的梯度。
深度学习的许多应用都使用前馈神经网络体系结构(图1)(每个节点代表一个神经元,各神经元从输入层开始,接收前一层输入,并输出到下一层,直至输出层。整个网络中无反馈,可用一个有向无环图表示),该体系结构学习将固定大小的输入(例如图像)映射到固定大小的输出(例如,多个类别中某一个的概率) 。为了从一层到下一层,每一层中的每个节点都要计算来自前一层的输入的加权和,并通过一个非线性函数传递结果(即 y = f ( z ) y=f(z) y=f(z))。目前,最流行的非线性函数是整流线性单元(ReLU读作[relu]),实际就是一个半波整流器 f ( z ) = max ( z , 0 ) f(z)= \max(z,0) f(z)=max(z,0)。过去几十年,神经网络使用更平滑的非线性函数,例如 tanh ( z ) \tanh(z) tanh(z)或 1 / ( 1 + exp ( − z ) ) 1 /(1 + \exp(-z)) 1/(1+exp(−z)),但ReLU在多层网络中通常学习速度更快,允许没有无监督的预训练情况下训练深度监督网络[28]。不在输入或输出层中的节点通常称为隐藏节点。隐藏层可以看作是以非线性方式对输入变形,使得类别在最后一层可以线性分离(图1)。
图1 多层神经网络和反向传播
a.多层神经网络(用连接点表示)可以对输入空间进行变形,使得数据(红色和蓝色线表示的样本)线性可分(如中间图所示,经过空间变形后,蓝色和红色样本之间的分界线近似线性)。注意输入空间中的规则网格(左侧)是如何被隐藏层转换的(中间图)。这个例子中只用了两个输入单元,两个隐藏单元和一个输出单元,但是用于目标识别或自然语言处理的网络通常包含数万或者十数万个这样的单元。获得C.Olah (http://colah.github.io/)的许可后重新构建的这个图。
b.**链式法则告诉我们两个小的影响(x的微小变化对y的影响,以及y的微小变化对z的影响)是如何合成到一起的。**x的微小变化量 Δ x \Delta x Δx首先会通过乘以 ∂ y / ∂ x \partial y/\partial x ∂y/∂x(偏导数)转变成y的变化量 Δ y \Delta y Δy。类似的,Δy会给z带来改变Δz。用一个公式替换另一个就得到了链式法——也就是Δx通过乘以∂y/∂x和∂z/∂y得到Δz的过程(即 Δ z = ∂ z ∂ y Δ y = ∂ z ∂ y ∂ y ∂ x Δ y \Delta z=\frac{\partial z}{\partial y}\Delta y =\frac{\partial z}{\partial y}\frac{\partial y}{\partial x}\Delta y Δz=∂y∂zΔy=∂y∂z∂x∂yΔy)。当x,y,z是向量的时候,链式法则仍然成立(导数是雅克比矩阵)。
c.**具有两个隐层一个输出层的神经网络中计算前向传播的公式。**每层都由一个模块构成,用于反向传播梯度。在每一层,我们首先计算每个节点的总输入z,z是前一层节点输出的加权和。然后利用一个非线性函数f(.)来计算节点的输出。简单起见,我们忽略掉了截距项( z = w T x + b z=\textbf{w}^\textrm{T}\textbf{x}+b z=wTx+b,其中b是偏置项或截距)。神经网络中常用的非线性函数(也叫激活函数,是用来加入非线性因素的,解决线性模型所不能解决的问题。通过多个激活函数,对输入空间变形,使得数据线性可分)包括了最近几年常用的校正线性单元(ReLU) f ( z ) = max ( 0 , z ) f(z) = \max(0,z) f(z)=max(0,z),和更多传统sigmoid函数,比如双曲线正切函数(tanh) f ( z ) = ( exp ( z ) − exp ( − z ) ) / ( exp ( z ) + exp ( − z ) ) f(z) = (\exp(z) − \exp(−z))/(\exp(z) + \exp(−z)) f(z)=(exp(z)−exp(−z))/(exp(z)+exp(−z)) 和logistic函数 f ( z ) = 1 / ( 1 + exp ( − z ) ) f(z) = 1/(1 + \exp(−z)) f(z)=1/(1+exp(−z))。
d.**计算反向传播的公式。**对于每个隐藏层,我们计算误差关于每个节点输出的偏导数,是误差关于上一层每个节点输入的偏导数的加权和(例如,计算隐藏层H2中误差关于结点k的输出的偏导数 ∂ E ∂ y k = ∑ l ∈ o u t w k l ∂ E ∂ z l \frac{\partial E}{\partial y_k}=\sum_{l\in out}w_{kl}\frac{\partial E}{\partial z_l} ∂yk∂E=∑l∈outwkl∂zl∂E,隐藏层的上一层是输出层。根据图1.c, y k = f ( z k ) y_k=f(z_k) yk=f(zk),其中 z k , y k z_k, y_k zk,yk分别是结点 k k k的输入和输出)。然后,通过乘以 f ( z ) f(z) f(z)的梯度,将误差关于输出的偏导数转换到关于输入的偏导数(即 ∂ E ∂ z l = ∂ E ∂ y l ∂ y l ∂ z l \frac{\partial E}{\partial z_l}=\frac{\partial E}{\partial y_l}\frac{\partial y_l}{\partial z_l} ∂zl∂E=∂yl∂E∂zl∂yl,其中 ∂ y l ∂ z l \frac{\partial y_l}{\partial z_l} ∂zl∂yl是 y l = f ( z l ) y_l=f(z_l) yl=f(zl)的梯度)。在输出层,误差关于结点输出的偏导数用代价函数的微分来计算。如果节点 l l l的代价函数是 0.5 ( y l − t l ) 2 0.5(y_l-t_l)^2 0.5(yl−tl)2, 则 ∂ E ∂ y l = y l − t l \frac{\partial E}{\partial y_l}=y_l-t_l ∂yl∂E=yl−tl,其中 t l t_l tl是目标值。一旦知道了 ∂ E / ∂ z k \partial E/\partial z_k ∂E/∂zk的值,从下一层的节点 j j j到节点 k k k的连接上的权值 w j k w_{jk} wjk的误差偏导数就是 y j ∂ E / ∂ z k y_j\partial E/\partial z_k yj∂E/∂zk( ∂ E ∂ w j k = ∂ E ∂ z k ∂ z k ∂ w j k = ∂ E ∂ z k ∂ ∑ j ∈ H 1 w j k y j ∂ w j k = y j ∂ E ∂ z k \frac{\partial E}{\partial w_{jk}}=\frac{\partial E}{\partial z_{k}}\frac{\partial z_k}{\partial w_{jk}}=\frac{\partial E}{\partial z_{k}}\frac{\partial \sum_{j\in H_1}w_{jk}y_j}{\partial w_{jk}}=y_j\frac{\partial E}{\partial z_{k}} ∂wjk∂E=∂zk∂E∂wjk∂zk=∂zk∂E∂wjk∂∑j∈H1wjkyj=yj∂zk∂E)。
在20世纪90年代后期,神经网络和反向传播算法基本被机器学习领域所抛弃,也被计算机视觉和语音识别领域所忽视。人们普遍认为,没有大量的先验知识,想学习到有用的、多阶段的特征提取器是不可行的。特别是,人们普遍认为简单的梯度下降会困在局部最小值——此时权重的微小改变不会降低平均误差。
实际上,较差的局部最小值很少成为大型网络的问题。无论初始条件如何,该系统几乎总能达到效果差不多的解。最近的理论和实验表明,局部最小解一般问题不大。相反,解空间中充满了大量的鞍点,即梯度为零,并且曲面在大多数维度上向上弯曲,在其余维度向下弯曲[29,30]。分析似乎表明,通常向下弯曲方向的鞍点很少,但几乎所有这种情况的目标函数值都非常相似。因此,算法卡在哪些鞍点上并不重要。
2006年前后,一些由加拿大高级研究所(CIFAR)召集的研究人员恢复了对深度前馈网络的兴趣(参考文献[31-34])。研究人员引入了无监督学习过程,可以创建特征检测器层而无需标记数据。学习每层的特征检测器的目的是为了能够重建或模拟下面图层中的特征检测器(或原始输入)的活动。根据这个重建的目的,对多个逐渐复杂的特征检测器进行“预训练”,使得深度网络的权重可以初始化为合理的值(减少后期训练的次数)。然后,将最后一层输出节点添加到网络顶部,并使用标准反向传播[33-35]对整个深度系统进行微调。这对识别手写数字或检测行人非常有效,特别是当标签数据量非常有限时[36]。
预训练方法的第一个主要应用是语音识别,而且,由于编程方便的快速图形处理单元(GPU)的出现[37],使得研究人员能够将网络训练速度提高10到20倍。2009年,该方法用于将从声波中提取的系数的短时间窗口映射到可能由窗口中心的帧表示的各种语音片段的一组概率。它在标准语音识别基准测试中取得了破纪录的成绩,该基准测试使用了一个小词汇表[38],并且很快就发展到可以在大型词汇表上获得破纪录的成绩[39]。到2012年,许多主要的语音团队发展了2009年以来的深度网络版本[6],并且已经部署在Android手机中。对于较小的数据集,无监督的预训练有助于防止过拟合[40],从而在带标记样本的数量较少时,或者在一些转换场景中,“源”任务的样本很多,“目标”任务的样本少,都能带来明显更好的泛化。一旦深度学习重新恢复,事实证明,预训练阶段只需要小数据集。
但是,有一种特殊类型的深层前馈网络,比相邻层之间具有完全连接性的网络更容易训练和泛化。这就是卷积神经网络(ConvNet)[41,42]。它在神经网络不受欢迎的时期取得了许多实际成功,最近它已被计算机视觉领域广泛采用。
卷积神经网络被设计为处理多维数组数据,比如一个由三个二维数组组合成的彩色图像,包含三个颜色通道中的像素强度(输入:三个数组分别代表在屏幕坐标下的R、G、B像素值,见图2输入层)。很多数据形态都是这种多维数组:1D用来表示信号和序列包括语言,2D用来表示图像或者声音,3D用来表示视频或者有声音的图像。卷积神经网络背后有四个关键的思想,它们充分利用自然信号的特性:局部连接、权值共享、池化以及使用多个网络层。
图2 卷积神经网络内部
应用于萨摩耶狗图像(原始图像见左下; 转换为RGB(红,绿,蓝)输入,见右下)的典型卷积网络架构的每层(水平)的输出(不是过滤器)。 每个矩形图像都是一个特征图(feature map),对应于某个学习到的特征的输出,特征是在每个图像位置处检测到的。 信息流自下而上,其中较低层特征用作有向边检测器,每个图像类别在输出中都有一个得分。 ReLU,整流线性单元。
一个典型的卷积神经网络结构(如图2)由一系列阶段组成。最初的几个阶段是由卷积层和池化层组成,卷积层的单元(或节点)以多个特征图(feature map)的形式组织在一起。特征图中每一个单元通过称为过滤器组(filter bank)的一组权值(每个过滤器也称为卷积核,是一个与局部块相同大小的实数矩阵,存放权值)与前一层特征图的一个局部块相连(和前面的前馈神经网络类似,不同之处在于这里每个节点与前一层的局部块而不是所有节点相连),然后这个局部加权和被传给一个非线性函数,比如ReLU。一个特征图中的所有单元共享相同的过滤器,不同层的特征图使用不同的过滤器。使用这种架构出于两方面原因。首先,在数组数据中,比如图像数据,一个值的附近的值经常是高度相关的,形成易于检测的独特局部图案。其次,图像和其他信号的局部统计数据对于位置不变。换句话说,如果一个图案出现在图像的某一部分,它也可能出现在图像的任何地方,这正是不同位置的单元共享相同的权重,并在数组的不同部分检测相同的图案。在数学上,由特征图执行的滤波操作是离散卷积,卷积神经网络也正是由此得名。
卷积层的作用是探测上一层特征的局部结合,而池化层的作用是将语义近似的特征合并为一个。因为形成图案的特征的相对位置可能有所不同,所以可靠地检测图案可通过粗纹理化每个特征的位置来完成。这是因为形成一个主题的特征的相对位置不太一样。典型的池化单元计算一个特征图(或几个特征图)中局部单元块的最大值。相邻的池化单元的输入是将局部单元块移动一行(或多行)或一列(或多列),从而减少了表示的维数并获得对微小平移和变形的不变性。两三个卷积、非线性函数和池化阶段堆叠起来,然后是更多的卷积和完全连接的层。ConvNet的反向传播梯度与常规深度网络一样简单,可以对所有过滤器组中的所有权重一起训练。
深层神经网络利用了这一属性,即许多自然信号是层次组合的,其中高层特征是由低层特征组合得到。在图像中,边的局部组合形成图案,图案组装成物体的局部,然后再形成物体。这种层级结构也存在于语音数据以及文本数据中,从声音到音素、音节、单词和句子。当输入数据在前一层中的位置和外观有变化时,池化操作让这些特征表示对这些变化不敏感。
ConvNets中的卷积和池化层直接受到视觉神经科学中简单细胞和复杂细胞的经典概念的启发[43],整体结构让人联想到视觉皮质腹侧路径中的LGN-V1-V2-V4-IT层次[44]。当向ConvNet模型和猴子显示相同的图片时,ConvNet中高层单元的激活解释了猴子颞颞叶皮层中160个神经元的随机集合的一半发生变化的原因。 ConvNets有神经认知的根源[46],其架构有点类似。但神经认知没有端到端的监督学习算法,如反向传播。原始的一维ConvNet被称为时间延迟神经网络,用于识别音素和简单的单词[47,48]。
回溯到20世纪90年代早期,卷积网络有很多应用,从用于语音识别的时延神经网络[47]和文档阅读[42]开始。文档阅读系统使用ConvNet与实现了语言约束的概率模型一起训练。到20世纪90年代后期,这个系统读取了美国所有支票的10%以上。 Microsoft[49]稍后部署了一些基于ConvNet的光学字符识别和手写识别系统。 ConvNets在20世纪90年代早期还对自然图像中的物体检测进行了试验,包括脸部和手部[50,51]以及人脸识别[52]。
自21世纪初以来,ConvNet已经在图像中的物体和区域的检测、分割和识别方面取得了巨大的成功。这些都是标记数据相对丰富的任务,如交通标志识别[53]、生物图像分割[54],特别是连接组学[55],以及在自然图像中检测面部、文本、行人和人体[36,50,51,56-58] 。 ConvNets最近取得的一项重大成就是人脸识别[59]。
重要的是,图像可以在像素级进行标记,这样就可以应用在自主移动机器人和自动驾驶汽车[60,61]。 Mobileye和NVIDIA等公司正在即将推出的汽车视觉系统中使用这种基于ConvNet的方法。其他重要的应用涉及自然语言理解[14]和语音识别[7]。
尽管取得了这些成功,但2012年ImageNet竞赛之前,ConvNets一直被主流计算机视觉和机器学习领域所抛弃。当深度卷积网络应用于包含1,000个不同类别的网页上的大约100万张图像的数据集时,取得了令人瞩目的成果,误差率几乎是与其竞争的最好方法的一半[1]。这种成功来自GPU的高效使用,ReLU,一种称为dropout[62]的新正则化技术,以及通过变形现有样本来生成更多训练样本的技术。这一成功带来了计算机视觉方面的革命; ConvNets现在是几乎所有识别和检测任务的首要方法[4,58,59,63-65],并且在某些任务上接近人类表现。最近的一个惊人的例证是结合ConvNet和循环网络模块来生成图像标题(图3)。
图3 |从图像到文字。由循环神经网络(RNN)生成的字幕。RNN将深度卷积神经网络(CNN)从测试图像中提取的表示作为额外输入,RNN训练成将图像的高级表示“翻译”为字幕(最上面的图)。许可转载自文献[102]。当RNN产生每个单词(粗体)时,如果它能够将注意力集中在输入图像中的不同位置(中间和底部;更多关注较淡的块),我们发现[86]它可以利用这个将图像更好地“翻译”成标题。
如今的卷积神经网络架构有10-20层采用ReLU激活函数、上亿个权值以及数十亿连接。尽管训练如此大的网络两年前就只需要几周了,但现在硬件、软件以及算法并行的进步,将训练时间压缩到了几小时。
基于卷积神经网络的视觉系统的性能已经引起了大型技术公司的注意,包括Google,Facebook,微软,IBM,雅虎,Twitter和Adobe在内的大多数主要科技公司以及数量迅速增加的初创公司启动研发项目,并且部署基于ConvNet的图像理解产品和服务。
卷积神经网络很容易在芯片或者现场可编程门阵列(FPGA)中高效实现,许多公司比如NVIDIA、Mobileye、Intel、Qualcomm以及Samsung,正在开发卷积神经网络芯片,以实现智能机、相机、机器人以及自动驾驶汽车中的实时视觉系统。
深度学习理论表明,与不使用分布式表示的经典学习算法相比,深度网络具有两种不同的指数优势[21]。这些优势都源于组合的力量,并取决于具有适当组合结构的底层数据生成分布[40]。首先,学习分布式表示能够从训练期间所见的特征值泛化到学到的特征的值的新组合(例如, n n n个二元特征可能有 2 n 2^n 2n个组合)[68,69]。其次,组合深度网络中的表示层带来了另一种指数优势(指数级的深度)的潜力[70]。
多层神经网络的隐藏层学习输入的表示,以便于预测输出。一个很好的示例是,训练多层神经网络,根据前面的几个单词来预测句子中下一个单词[71]。上下文中的每个单词作为一个one-of-N向量输入网络,one-of-N向量即一个项值为1,其余为0的向量(例如 ( 0 , 1 , 0 , … ) (0,1,0,\ldots) (0,1,0,…)是一个one-of-N向量)。在第一层中,每个单词创建不同的激活模式,或词向量(图4)。在语言模型中,网络的其他层学习将输入词向量转换为输出词向量来预测下一个单词,这可以用来预测词汇表中任何单词出现为下一个单词的概率。网络学习的词向量包含多个激活组件,每个组件都可以解释为单词的一个特征,该方法最初在符号的分布式表示学习中使用[27]。这些语义特征在输入中没有明确给出。学习过程发现这些特征,它们可以把输入和输出符号之间的结构化关系分解为多个“微规则”。当单词序列来自大量真实文本并且单个微规则不可靠时[71],学习词向量的方法仍然表现良好。例如,在训练预测新闻报道中的下一个单词时,Tuesday和Wednesday的词向量,Sweden和Norway的词向量非常相似。这种表示称为分布式表示,因为它们的元素(特征)不是相互排斥的,它们的许多配置对应于观察数据中可见的变化。这些词向量由学习到的特征组成,这些特征不是由专家提前确定的,而是由神经网络自动发现的。从文本中学习的词向量表示在自然语言处理中得到了非常广泛的应用[14,17,72-76]。
图4 | 学习到的词向量可视化。 左边学习到的建模语言中单词表示的展示,使用t-SNE算法将表示非线性投影到2D进行可视化[103]。 右边是由英语到法语编码器 - 解码器循环神经网络[75]学习到的短语的2D表示。 可以看到,语义上相似的单词或词序列被映射到邻近的表示。 通过使用反向传播联合学习每个单词的表示和预测目标数量的函数,如序列中的下一个单词(用于语言建模)或翻译单词的整个序列(用于机器翻译),来获得单词的分布式表示[18,75]。
特征表示问题一直处在逻辑启发和神经网络启发的认知范式之间争论的核心。在逻辑启发范例中,符号实例的唯一属性是它与其他符号实例相同或不相同。它没有与其使用相关的内部结构;要用符号来推理,它们必须与推理规则中的变量绑定。相比之下,神经网络只是使用大的活动向量,大权重矩阵和标量非线性函数,来执行快速“直觉”推理,这是支持毫不费力的常识推理的基础。
在引入神经语言模型之前[71],语言统计建模的标准方法没有利用分布式表示:它基于计算长度最大为N的短符号序列(称为N-gram)的出现频率。 可能的N-gram的数量大约是 V N V^N VN,其中 V V V是词汇大小,考虑到文本包含大量单词,需要非常大的训练语料库。 N-gram将每个单词视为一个原子单位,因此它们不能在语义相关的单词序列间进行概括,而神经语言模型可以,因为它将每个单词与实值特征向量相关联,并且语义相关单词在向量空间中彼此靠近(图4)。
第一次引入反向传播时,其最令人兴奋的用途是训练循环神经网络(RNN)。 对于涉及序列输入的任务,如语音和语言,通常使用RNN更好(图5)。 RNN一次处理输入序列的一个元素,同时在隐藏单元中维护一个“状态向量”,隐式地包含关于该序列的所有过去元素的历史信息。 当我们将不同离散时间段的隐藏单元的输出看作深度多层网络中不同神经元的输出(图5,右),就会很清楚如何应用反向传播来训练RNN。
图5 |循环神经网络及其正向计算中按照计算时间的展开。人造神经元(例如,聚集在节点 s s s中的所有隐藏单元,在时刻 t t t其值为 s t s_t st)在前一时间间隔从其他神经元获得输入(用黑色方块表示,表示一个时间间隔的延迟,图中左侧) 。通过这种方式,循环神经网络可以将元素为 x t x_t xt的输入序列映射为元素为 o t o_t ot的输出序列,其中每个 o t o_t ot取决于前面的所有 x t ′ x_t' xt′(对于所有的 t ′ ≤ t t'\le t t′≤t)。在每个时间间隔使用相同的参数(矩阵 , , U , V , W ,,U,V,W ,,U,V,W)。许多其他体系结构也是可能的,包括可以生成一系列输出(例如单词)的网络变体,其中每个输出都用作下一个时间间隔的输入。反向传播算法(图1)可以直接应用于右侧展开网络的计算图,以计算总误差(例如,生成右侧输出序列的对数概率)关于所有状态 s t s_t st和所有参数的导数。
RNN是非常强大的动态系统,但是训练它们被证明是有问题的,因为反向传播的梯度在每个时间间隔都会增长或缩小,所以在许多时间间隔后将导致结果的激增或者降为零[77,78]。
因其先进的架构[79,80]和训练方式[81,82],RNNs可以很好的预测文本中下一个字符[83]或者句子中下一个单词[75],并且可以应用于更加复杂的任务。例如一次读入一个英语句子中的单词,将会训练一个英语的“编码器”网络,使得隐藏单元的最终状态向量能够很好地表示句子所要表达的想法。这种“想法向量”(thought vector)可以作为联合训练的一个法语“解码器”网络的初始化隐藏状态(或者额外的输入),其输出为法语译文第一个单词的概率分布。如果从分布中选择特定的第一个单词并将其作为输入提供给解码器网络,则将输出译文的第二个单词的概率分布,直到选择一个完全停止词[17,72,76]。总的来说,这个过程根据依赖于英语句子的概率分布生成法语单词序列。这种简单的机器翻译方法的表现甚至可以和最先进的的方法相媲美,同时也引起了人们对于理解句子是否需要像用推理规则操作的内部符号表达式这样的东西的质疑。这与日常推理涉及多个对结论有贡献的类推的观点相匹配[84,85]。
不但可以将法语句子翻译成英语句子,还可以将图像的含义“翻译”为英语句子(图3)。这里的编码器是一个深度的ConvNet,它可以在最后一个隐藏层中将像素转换成活动向量。解码器与用于机器翻译和神经语言建模的RNN类似。近来对这类系统的兴趣激增(参见参考文献[86]中提到的例子)。
一种时间展开的RNN(图5),可以看作是非常深的前馈网络,其中所有层共享相同的权值。虽然主要目的是学习长期依赖关系,但理论和经验证据表明很难学习长时间存储信息[78]。
为了解决这个问题,为网络扩充存储的想法随之产生。第一种建议是使用了特殊隐藏单元的长期短期记忆(LSTM)网络,其自然行为是在较长时间内记住输入[79]。一种称作记忆细胞的特殊单元类似于累加器和门控神经元:它在下一个时间间隔将拥有一个权值为1的自连接,因此它复制自己的实值状态并累积外部信号,但这种自联接是由另一个单元的乘法门控制的,该单元学习并决定何时清除记忆内容。
LSTM网络随后被证明比传统的RNN更加有效,尤其当每一个时间间隔内有若干层时87,形成整个语音识别系统,从声音转换到字符序列。 LSTM网络或门控单元的相关形式目前也用于编码器和解码器网络,这些网络在机器翻译中表现得非常好[17,72,76]。
在过去的一年中,一些作者提出了不同的建议,用记忆模块来扩充RNN。其中包括:神经图灵机,用“类似磁带”的记忆来扩充网络,RNN可以选择读取或写入磁带[88]。记忆网络,其中常规网络通过一种关联记忆来增强[89]。记忆网络在标准问答基准测试中表现出色。记忆用于记住后来网络会被要求回答问题的事。
除了简单记忆之外,神经图灵机和记忆网络正用于通常需要推理和符号操作的任务。可以教神经图灵机’算法’。除此之外,它们可以学习输出符号的排序列表。输入是一个未排序的序列,其中每个符号都附带一个指示其在列表中的优先级的实数值[88]。记忆网络可以被训练来跟踪类似于文本冒险游戏的世界状态,并且在阅读故事后,他们可以回答需要复杂推理的问题[90]。在一个测试示例中,网络显示了“指环王”的15个句子版本,并正确回答了诸如“Frodo现在在哪?”等问题[89]。
除了简单的记忆化,神经图灵机和记忆网络正在被用于那些通常需要推理和符号操作的任务,还可以教神经图灵机“算法”。除此以外,他们可以从未排序的输入符号序列(其中每个符号都有与其在列表中对应的表明优先级的真实值)中,学习输出一个排序的符号序列。可以训练记忆网络用来追踪一个类似文字冒险游戏中世界的状态,回答一些需要复杂推理的问题。在一个测试例子中,网络能够正确回答15句版的《指环王》中诸如“Frodo现在在哪?”的问题。
人类视觉是一个智能的、基于特定方式的利用小或大分辨率的视网膜中央窝与周围环绕区域对光线采集成像的活跃的过程。我们期望未来在机器视觉方面会有更多的进步,这些进步来自那些端对端的训练系统,并结合ConvNets和RNNs,采用增强学习来决定走向。结合了深度学习和增强学习的系统正处在初期,但已经在分类任务中超过了被动视频系统,并在学习操作视频游戏中产生了令人印象深刻的效果。
无监督学习[91-98]对重新唤起深度学习热潮具有促进作用,但后来被纯监督学习的成功所掩盖。虽然本篇综述没有关注它,但我们预计无监督学习在未来会变得更加重要。人类和动物的学习主要是无监督的:我们通过观察世界来发现世界的结构,而不是通过被告知每个事物的名称。
人类视觉是一个活跃的过程,它使用具有大型低分辨率环绕的小型高分辨率视网膜中央凹,以智能的、任务特定的方式对光学数组进行顺序采样。我们期望计算机视觉的未来发展来自于端到端训练的系统,结合ConvNets与RNN,使用强化学习来决定走向。结合深度学习和强化学习的系统还处于初级阶段,但它们在分类任务方面已经胜过被动视觉系统[99],并在学习操作多个不同视频游戏时产生令人印象深刻的结果。
自然语言理解是深度学习在未来几年内将会产生巨大影响的另一个领域。我们预计,使用RNNs理解句子或整个文档的系统在学习有选择性地参与某个部分的策略时会变得更好[76,86]。
最终,人工智能的重大进展将通过结合表示学习和复杂推理的系统来实现。虽然深度学习和简单推理已经用于语音和手写识别很长一段时间,但需要新的范式来替代基于规则的符号表达式处理方式,该方式需要对高维向量进行操作[101]。