机器学习并不是一个离大众很遥远的技术,相反,它已经渗透到了当今社会的方方面面,比如说音乐软件的音乐推荐系统、购物网站的商品推荐、社交媒体的内容筛选与推送、智能手机的人脸解锁以及照相机的智能物体识别与美化。机器学习在图像识别、语音识别、推荐系统和搜索引擎等应用领域都表现出令人满意的效果。而近年来,业界开始越来越多的使用一项成为深度学习的技术。
传统的机器学习技术在处理原始形式的自然数据时,其性能会受到限制。在过去,设计一个优秀的机器学习系统需要相当多的专业知识和工程技术,通过设计一个较好的特征分类器,将原始数据转换为合适的特征向量,从而让分类器能够检测输入模式。
在介绍深度学习之前,需要先介绍一下表征学习。严格来说,表征学习是一系列方法,这些方法能让机器从原始数据中自动找出那些可以用来分类或是识别的特征。
深度学习就是多层级的表征学习方法。整个深度学习系统由许多简单但非线形的模块组成,在每一层中,模块将输入的表征(数据)转换为更为抽象、更为高级的表征。通过上述转换的各种组合方式,深度学习系统可以学习那些很复杂的特征。
以图像识别举例来说,图像以一个像素值矩阵的形式输入深度学习系统,那么在第一层学习到的特征通常会是图像中特定方向或者位置出现或未出现的边缘。第二层通常会通过特定的边缘分布来检测图案,同时忽视边缘位置的细微变化。第三层则会将这些图案进行组合——这些组合通常与某些物体有关。最后一层则会识别出相对应的物体。这样便完成了一次图像识别。
值得注意的是,在这样一个深度学习系统中,没有任何特征层是由人工设计的,所有的特征层都通过一个通用学习程序从原始数据中得到。这也是深度学习相较于传统机器学习的最大优势。
深度学习与传统的机器学习不同,它不需要异常庞大的工程量,易于上手,同时得益于近年来计算机硬件与大数据的发展,它又拥有充沛的数据与足够的计算能力。随着工业界和学术界对深度学习领域的不断投入,新的算法与架构也会不断推陈出新,这将会大大推动深度学习的发展。
目前提到的深度学习,大多将其分为两个范式——即监督学习(supervised learning)和无监督学习(unsupervised learning)。
在机器学习领域,无论“深度”与否,最常见的学习形式就是监督学习。试想构建一个图像分类系统,为了使系统能够区分出人,汽车,狗或是手机,首先需要收集大量人,汽车,狗以及手机的图片,且每张照片都标记了它所属的类别。对于每一张输入图片,这个系统都会给出一个输出向量,这个向量中最大值的位置就对应其所属的类别。我们训练这个系统的目的就是使系统所给出的输出向量的最大值位置就对应输入图片的类别。这就需要计算一个损失函数来表示系统输出值与“正确答案”之间的误差,然后依托某些算法不断地更新系统中的参数,使损失函数的值不断下降,直到这个系统令人满意。
上面这个例子中,机器学习系统的终极目标就是使自己输出尽可能的接近“正确答案”,而这种从始至终都有“正确答案”的机器学习方法就被称为监督学习。之相对应的,无监督学习就是没有正确答案的机器学习方法,无监督学习要求模型能够从原始数据自发挖掘出规律或是分类。
监督式学习是一个机器学习中的方法,可以从训练数据中学到或建立一个模式,并依此模式来推测新的实例。训练数据是由输入向量和预期输出(标签)所组成的。模型的输出可以是一个连续的值(线性回归),也可以是一个分类标签(分类问题)。
在深度学习领域的监督学习主要集中在深度神经网络方向,具体有DNN、RNN和CNN等类型。
目前提到的大多数深度学习其实是深度神经网络的简称。通常来讲,具有一到两个隐藏层的神经网络就能被称为多层神经网络(或称为浅层神经网络),而随着隐藏层的增多,一般超过五层的神经网络就被称为深度神经网络(DNN)。
因此,“深度”更像是一个商业上的概念,不用特别在意其具体层数。在深度学习领域,有超过五层隐藏层的就可以成为深度网络。
深度神经网络主要分为最为普通的神经网络(DNN)、卷积神经网络(CNN)、循环神经网络(RNN)以及递归神经网络(RNN)等类别。由于CNN与RNN的结构一般都很深,所以不用特别指明它们是“深度”的,而有一些网络则需要特别指明。
卷积神经网络可能最为大家熟知的神经网络,它在一定意义上借鉴了生物学上的神经网络,与人类的视觉系统有异曲同工之妙,而它也因此在图像识别领域大放异彩。
卷积网络最显著的特点便是在多个空间位置上共享参数,这是通过一系列的卷积与池化完成的。卷积运算可以实现参数共享和稀疏矩阵相乘,它不需要像普通DNN一样针对每个输入数据提供一个单独的参数,而只需要提取一定范围(在图像识别中这一范围通常为矩阵)内的公共数据。再加之以CNN特有的池化层,大大降低了输入数据的维度。
下图是一个用CNN进行手写数字识别的可视化结果(http://scs.ryerson.ca/~aharley/vis/conv/),从图中可以看出,CNN的卷积、池化等一系列过程压缩了图片的维度,但又在一定程度上保留了不同区域数据的联系。
权值共享、本地连接、池化以及多层结构是卷积网络网络标志性的四个特征,这让它特别适合处理结构化的数据(比如矩阵)。人们总是将CNN与图像识别联系在一起,但其实它适用于任何拥有结构化数据的领域。
虽然递归神经网络与循环神经网络的简称都是RNN,但他们之间还是有很多区别的。当然它们都适合处理有序列的问题,比如说语音分析,文字分析以及时间序列分析。在预测股票走势的时候,就会选择RNN。因为每天的股票价格与昨天,上周,上月,去年都有关系。
当一段序列输入到RNN中时,每个时刻RNN只会处理序列中的一个元素。每个元素都会保留在RNN隐藏单元中被称为“状态向量”的地方,单元内暗含了序列当前元素之前所有序列的历史记录。下面这幅图(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)很直观的展现了一个展开的RNN结构,
这种链式的性质很容易让人联想到序列以及链表。而这也恰恰是RNN所应用的领域:语音识别、语言建模、翻译以及图片标签化。准确来说,应用最为广泛也最为成功的其实是一类特殊的RNN——LSTMs。普通的RNN并不能很好的“记住”长时间的信息(Hochreiter(1991)和Bengio(1994)挖掘了这种缺陷的原因)并将其联系到当前任务,而LSTMs则解决这个“长期及远距离依赖关系”的问题。
LSTMs(Long Short Term Memory networks),被称为“长短期记忆网络”,它在诞生伊始就适合适合于处理和预测时间序列中间隔和延迟非常长的重要事件。和所有的RNN一样,LSTMs也拥有链式结构,唯一不同的是其单个模块有着更为复杂的结构——比如说下图(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)的LSTMs的每个单元都有四层神经网络层,而普通RNN则只有一层神经网络。
LSTMs天生具有长期记忆输入数据的性质,它的每个单元就像是一个累加器或说是门控神经元:它在下一个时刻与自己相连,既复制了了自己的实时状态同时也累积外部信号,但这种自我连接是由一个乘法门控单元来进行控制的,这个乘法门控可以决定保留或是清除“记忆”中的信息。
LSTMs具有非常多的变种,许多论文中的LSTMs都会有微小的差别,这些变种在适用于某些特定的任务时可能会有更好的表现,但面对大部分任务时它们都取得了非常出色的效果。
众所周知,机器学习的发展历程几经波折,历史上曾经掀起过几次机器学习热潮而又归于平静。近年来的机器学习的火热并不是完全靠前面介绍的深度神经网络带动,无监督学习也在其中起到了催化的作用。人类和动物的学习过程很大意义上就是无监督的,我们观察这个世界,接触这个世界,而不是用一堆贴上正确标签的数据来训练我们的大脑(后天的教育可能会采用这种方式)。因此,人们都认为无监督学习是深度学习未来发展的趋势,甚至是通往真正人工智能的一条道路。
与使用正确标签训练数据的监督学习相比,无监督学习的模型必须自主学习数据集中元素之间的关系,并且在没有“帮助”的情况下对原始数据进行分类。无监督学习中有不同形式的算法来学习这种关系,但所有的模型都具有发现数据间隐藏结构、模式或特征的能力——而这也正是人类大脑思考的模式。
无监督学习中常用的算法有聚类分析、异常检测、神经网络等。由于本篇文章着眼于深度学习,所以主要会介绍无监督学习中与深度学习相关的模型或算法。
深度置信网络(DBN)是一种生成图形模型,它也属于深度神经网络,由多层的隐藏单元组成,各层之间有连接但每层内部的单元之间没有连接。
当在没有监督的情况下训练一组示例时,DBN可以学习尽可能得重建模型输入,然后将这些层充当特征检测器。在完成该步骤之后,可以使用传统的神经网络进一步学习。
DBN可以被视为简单的无监督网络的组合,例如受限玻尔兹曼机(RBM)或自动编码器,其中每个子网络的隐藏层用作下一个可见层。RBM是一种无向的,基于能量的生成模型,具有“可见”输入层和隐藏层以及层之间的连接。
总的来说,DBN更多是了解深度学习方式和其“思考模式”的一个手段,实际应用中还是以CNN和RNN为主,类似的深度玻尔兹曼机也有这样的特性但工业界使用较少。
自编码器是一种人工神经网络,它以无监督学习的方式学习有效的数据编码。自动编码器的目的是学习一组数据的表示(编码),通常可以用于降低维数。最近,自编码器概念已经被广泛用于学习数据的生成模型。
如上图所示,自编码器主要由两个部分组成:一个是编码器(Encoder),另一个则是解码器(Decoder)。以图片为例,当含有数字“2”的图片从左端输入后,经过了编码器与解码器,得到了一个略有不同的新的数字“2”。事实上,自编码器真正学习的是中间的用红色方框框起来的部分——即数字在低维度上的压缩表示。评估自编码器的方法是重建误差,即输出的数字“2”和输入的数字“2”之间的误差,误差值越小越好。
和主成分分析(PCA)类似,自编码器也可以用来进行数据压缩(也可以理解成降维),从而从原始数据中提取出较为重要的特征。上图中输出端的数字与输入端的略有不同,这是降维过程中正常存在的数据损失。
生成式对抗网络(GAN)是一类用于无监督学习的算法,它的核心思想来源于博弈论。GAN由在零和游戏框架中相互竞争的两个神经网络系统实现。GAN的算法思想可以用下图(https://sthalles.github.io/assets/dcgan/GANs.png)来表示
由上图可以看出,GAN会训练两个神经网络:左边那个为生成网络,通过添加一些噪声,生成一些与训练数据相类似的图片;右边为判别网络,用来区分生成网络中输出的数据是真实数据还是伪装数据。左右两个网络在“对抗中”不断学习,不断调整参数,其最终目的是使判决网络无法判断生成网络的的输出是否真实。
GAN的算法思想会让人们觉得这是一个复杂且低效的模型,但在实际应用中则超出了人们的预期。GAN能够更有效的学习到数据的分布,同时需要的参数也比一般神经网络要少。
未来的深度学习
值得注意的是上述发展趋势并不局限于深度学习领域,它同样适用于自监督学习、强化学习等其他机器学习领域。
这是一种脱胎于传统纯模式识别的模型,它能够实现抽象和推理,从而完成对各种数据更高维度的抽象和泛化(类似于人类大脑)。目前能够进行基本推理形式的人工智能程序都是由程序员来编写的,比如说依赖于搜索算法、图形操作、形式逻辑的程序。
由DeepMind开发的AlphaGo在2016年战胜人类围棋手李世石,但其大部分“智能”功能都是由专业程序员设计并实现的(例如蒙特卡罗搜索树),而其向外宣称的深度学习只存在于专门的子模块中(比如价值网络或决策网络)。但是在未来,这种人工智能系统很可能完全由机器自主学习,没有人类参与。
这类系统使用可重复使用的模块化组件,这些组件是由从数千个任务和数据集上学习到的高性能模型抽象而来。这类元学习系统可以直接识别出问题解决模式,并通过调用不同的子模块,从而完成了问题的解决方案(这一点与软件工程中的思路非常接近,只不过实现的主体是机器而不是人)。
当我们的模型变得更像程序时,它们不再可微。这些程序仍然会使用可区分的几何图层作为子程序,但整个模型不会如此。因此,通过反向传播算法来调整网络中的权重值不能解决所有问题。反向传播算法在解决可微问题时仍然是一大利器,但是未来的模型不会局限于可微问题,因此它们的学习过程需要的不仅仅是反向传播。
目前能有效训练不可微微分模型的方法主要有遗传算法、“进化策略”、某些强化学习方法以及ADMM(乘数的交替方向法)。
目前,深度学习工程师的大部分工作都是在编写Python脚本进行数据整合,然后对深度网络的体系结构和超参数进行长时间调整以获得理想的工作模型。这显然不是一个很好的选择,我们希望机器能够自动完成这些工作。不幸的是,参数调整部分很难自动化,因为它通常需要专业领域知识以及对实现目标清晰而高级的理解。
亲手实现过现有深度学习模型的人一定知道:一旦模型的架构发生很细微的变化,整个训练过程就需要推倒重来,这显然是非常低效的。所以另一个重要的自动化机器学习方向是系统能够在学习权重的同时也学习模型架构。这个系统将在通过训练数据调整模型参数的同时改善模型架构,因此尽可能的消除计算冗余。
自动化学习的到来并不会让机器学习工程师的工作消失。相反,工程师将向价值创造链的上游移动。他们可以投入更多精力来制作真正反映业务目标的复杂损失函数,并深入了解模型如何影响他们所部署的数字生态系统。