本文改编自我的书"Deep Learning with Python(用Python深度学习)"中第9章第2节( Manning Publications 出版)
本文是一系列丛书中的两部分的内容,包括当今深度学习的局限性和深度学习的未来。
本文目标受众是具有相当深度学习经验的人(例如读过本书一到八章),我们假设读者已有了足够的先修知识。
关于深度学习,最惊人的是它实现的方法出奇得简单——十年前,没人想到我们能仅用梯度下降算法调整参数就得到如今这么惊人的结果。如今人们已经发现,你只要用大量的训练数据通过梯度下降算法去训练巨型参数化模型就可以了。正如费曼说到宇宙时说的那样:“宇宙并不复杂,它只是东西很多罢了”。
对深度学习而言,所有东西都是向量,即一切都是几何空间里的一个点。模型的输入(可以是文本、图像等)和目标首先被“向量化”,即转化到初始的输入向量空间和目标向量空间。深度学习模型中的每一层都对通过它的数据进行简单的几何变换。这么多简单的变换串联起来,从整体上看,就形成了一个非常复杂的几何变换,用以逐点地将输入空间映射到目标空间。这种变换是由层的权重值量化(参数化)的,而权重会根据当前模型表现情况迭代更新。这种几何变换的一个明显特征是它必须是可微的,这样我们就能通过梯度下降来了解它的参数。简单来说,就是从输入到输出的几何变换必须是平滑且连续的——这是一个重要的约束条件。
上述对输入数据进行的复杂变换过程可以3D可视化,就像人展开一个纸球一样:皱巴巴的纸球就是模型一开始收到的输入数据流形,每个展开的动作就类似于一层的简单几何变换,而整个展开的过程则是这整个模型的复杂变换。深度学习模型就是把复杂多样的高维数据流形“展开”的数学机器。
这就是深度学习的神奇之处:将事物的“意义”量化为向量,转换到几何空间,然后逐渐学会将其在不同空间之间转换。你只需要有一个足够高维的空间,用来发现原始数据中的所有内在联系。
这个简单的方法几乎可以应用到任何空间中,然而对目前的深度学习来说,即使给了它海量的数据,也还是还有很多应用无法实现。比如说,你可以弄出成千上万条个对一个软件的描述——不管是产品经理写的,还是码农的成品代码——但即使有这些海量的数据,你也没办法训练一个深度学习模型让他按照你的描述码出代码。类似的例子还有很多。一般来说,任何问题一旦涉及到推理(比如编程)、应用科学方法(比如长期规划)或算法(比如数据处理),无论你喂它多少数据,深度学习模型都拿它没辙。就算是一个简简单单的排序算法,深度学习的神经网络也很难学会。
这是因为深度学习模型“仅仅”是一连串简单的、连续的实现向量空间映射的几何变换。假设存在一种可以被学会的连续变换,可以实现从X到Y的映射,并且有足够的 X:Y 的稠密样本作为训练数据,它也只能把一个数据流形X映射到另一个流形Y。因此,即使深度学习模型可以被视作一种程序,大多数程序也不能被表示为深度学习模型。对于大多数任务来说,不管深度神经网络的规模如何,它都未必学得会——即相应的几何变换可能过于复杂,或者没有合适的数据用来供其学习。
通过增加层数和增大训练数据量来提高深度学习的方法,只能做一些表面文章,而不能解决深度学习模型能表现的东西很有限的本质问题,而且大多数我们想让深度学习学习的程序都不能表示为连续的数据流形的几何变换。
当代对于人工智能的一个非常普遍的误区是误解了深度学习模型的作用,并高估了它们的能力。人的意识的一个基本特征是我们的“心智理论(Theory of mind)”——即我们习惯把意图、理念和知识投影到我们周围的事物上。比如在石头上画一个笑脸,在我们看来,它就突然变得“快乐”了。同理之于深度学习,就好比我们训练了一个深度学习模型,它能用文字描述图片的内容了,于是我们就感觉模型“理解”了图片的内容和它写的文字。然后,当训练数据里的图像出现一点点的偏差,导致我们的模型开始胡言乱语的时候,我们就会感到非常惊讶。
“对抗样本”非常明显地揭示了这一点。所谓“对抗样本”,就是一个人为设计的深度学习网络的输入样本,专门用来诱导模型犯错。我们已经知道,我们可以在输入空间中进行梯度上升,以最大限度上激活某些卷积神经网络卷积核(Convnet filter)——这是我们在第5章中介绍的过滤器可视化技术基础,以及第8章的Deep Dream算法。同样的,用梯度上升,我们可以通过稍微修饰图像,以最大化引导其对某类图片的类别判断。比如拍摄一张熊猫的照片,叠加上一个“长臂猿”的梯度,我们可以得到一个把这个熊猫当作长臂猿的神经网络。这证明了这些深度学习模型十分脆弱,而且它们对输入、输出的映射和人有着巨大的差别。
总之,深度学习模型理解不了输入的内容——至少不是以人类的方式理解的。与所有生物一样,我们理解的图像、声音和语言是建立在我们作为人类的感觉体验的基础上的。机器学习模式没有这样的体验,也就不能以人的方式“理解”他们的输入。通过把大量的带有注释的训练样本喂给我们的模型,它可以学到一种几何变换方式,以将数据映射到人类的概念上。但是这种映射只是从以人脑为中介获得的体验中发展出的一种对事物的简单轮廓,就像镜上朦胧的画面一样。
在着手做机器学习的时候,一定要铭记于心:神经网络不懂它们在干什么——至少对咱们来说没有意义。咱们对它的训练,和咱们想的不一样,这种训练仅局限在非常狭窄范围里:仅仅是在训练他们把输入数据逐点映射到目标罢了。如果你喂给它们有偏差的训练数据,他们可能就会皮得不行。
深度学习和人脑学习的方式有着本质的区别。这不仅因为人类是从具体的体验中学习,而不是从明确的训练样本中学习;还有更深层次的原因。
人类的反应远不止像深层网络或昆虫一样,只有对刺激做出反应这么简单。人类对情景、自己、他人建立复杂、抽象的模型,而且可以用这些模型来预测未来或者做出长期规划,他们能用已知概念描述完全陌生的未知概念——例如画一匹穿牛仔裤的马,或做做中彩票的梦。这种处理假设、把精神空间推广到我们根本不可能直接体验得到的地方——简单来说就是抽象和推理——可以说是人类认知的决定性特征,我把它称为“极端泛化”:就是一种小说般的能力,依靠很少的数据——甚至根本不依靠数据——完全临场发挥。
深层网络工作模式与之形成鲜明对比,我称之为“局部泛化”:如果新输入数据与训练时用的略有不同,则其从输入到输出的映射就会立刻失去意义。如果你使用深度网络去找发射火箭到月球的合适的参数,那无论你是用监督式学习还是强化学习进行训练,你都要用数千甚至数百万次的发射试验对网络进行训练,也就是说,你需要给它密集采样的输入空间,以让它学习找到从输入空间到输出空间的可靠映射。反观人类,我们可以发挥抽象的能力构建出物理模型,从而得到一个只需要几次实验的确切的解决方案。同样的,如果你开发一个控制人体的深层网络,想让它学会在城市穿行而不被汽车撞到,那你的网络可能要死上几千次才行。如果再换一个新的城市,那它基本要重新来过了。相较而言,人类可以不死就学会如何保持安全,这都要归功于咱们对假设情境的抽象建模能力。
总之,尽管我们在机器认知方面取得了进步,我们离拟人AI还有很长的路要走:我们的模型只能进行局部泛化,来适应与之前的数据非常相似的情况,而人类的认知能够实现极端泛化以快速适应完全不同的情景,或为未来长期的情形做出规划。
我们应该记住的是:到目前为止,深度学习的唯一能真正实现是,在海量的人工数据中,使用连续的几何变换将空间X映射到空间Y的能力。基本对于每个行业,深度学习用得好都可以掀起一场革命;但对拟人化AI来说,仍是路漫漫其修远。
为了降低神经网络的局限性,让它能和人脑相提并论,我们需要从简单的输入到输出的映射中跳出来,进入推理和抽象的层次。电脑程序可能可以作为普适抽象建模的基础。我们之前在书中提到过,机器学习模型可视为“可学习程序”。目前我们只能学习非常少的一部分程序,但是如果我们能够”模块化“、”可复用“地学习任意程序又将如何?下一篇文章中我们将介绍未来的发展可能会是什么样子的。
这里是本文的第二部分:深度学习的未来。
@fchollet 2017年5月