在AlphaGo与李世石比赛期间,谷歌天才工程师Jeff Dean在Google Campus汉城校区做了一次关于智能计算机系统的大规模深度学习(Large-Scale Deep Learning for Intelligent Computer Systems)的演讲。本文是对他这次演讲的总结。完整演讲视频(如下):
如果你无法理解信息里包含的内容,那么就会很难将其组织起来。
自从AlphaGo与李世石的比赛——这是约翰·亨利对战蒸汽锤的现代版本——吸引了全世界,再次滋生了对「人工智能毁灭世界」的恐惧感,似乎此时一睹Jeff的演讲是绝佳时刻。如果你认为AlphaGo现在很好,就等待它的beta版本吧。
Jeff当然提到了谷歌的著名语录:组织这个世界的信息,使信息唾手可得并变得有用。
过去,我们可能会将「组织」和收集、清除、存储、索引、报告和搜索数据联系起来。所有这些都是谷歌早期精通的业务。而这些任务完成后,谷歌已经开始进行下一项挑战了。
现在,组织意味着理解。
此次演讲的一些重点:
真正的神经网络由几亿个参数组成。谷歌现在所拥有的技能在于如何建造并快速训练这些大型模型来处理大量数据集,并用它们去解决实际问题,之后快速将这些模型部署到不同平台上的大量产品中(手机、传感器、云等等)。
神经网络在90年代没有得到快速发展是由于缺乏足够的计算能力和大型的数据集。你能看到谷歌对算法的天然热爱是如何与他们的大量基础设施结合到一起的,也能看到不断扩大的数据集如何为谷歌的人工智能创造了完美的推动。
谷歌和其他公司的一个关键区别就在于,当他们在2011年启动谷歌大脑计划时,他们并没有将他们的研究独立成该公司一个单独的研究部门,成为象牙塔一般的存在。而是项目团队和其他团队紧密合作,比如安卓、Gmail 和photo等部门,以确实改进它们的特性,解决困难的问题。这对每一家公司来说都是非常珍贵的一刻。通过和你的人一起工作将研究进行实际应用。
这一想法十分强大:他们知道他们能够获取完整的子系统,有些可能是机器学习到的,用更加通用的端对端的机器学习块进行替换。通常当你有很多复杂的子系统时,总会有很多复杂的代码将这些系统拼接起来。如果能够用数据和非常简单的算法将这一切进行替换的话就再好不过了。
机器学习很快将会变得更好。引用Jeff的话说:机器学习领域的发展非常快。一篇论文发布出来,一周内全球众多研究团体会下载这篇论文,阅读、解析论文,验证论文的内容,然后把自己对论文的延展发布到arXiv.org上。这与计算机学的其他领域不同,他们首先需要提交文件,而后六个月会议讨论决定是否接收,再过三个月会议上才会有结果。这就耗费了一年时间。电子论文能把这个时间压缩到一周是非常惊人的。
技术能够非常神奇的结合起来。谷歌翻译团队写了一个APP,能够使用计算机视觉在取景器上识别文本。在翻译完文本后,可以把翻译后的内容自动添加到图片上。另外一个例子是写图片字幕。把图片识别和一序列一序列的神经网络结合起来。可以想象,这些模块化的内容在未来将何等紧密的结合起来。
有强大功能的模型要小到足以在智能手机上运行。科技想要想取代智力必须走到这一步。它不能依靠网络连接外部的「云大脑」。既然TensorFlow模型能够在手机上运行,那这一点是有可能实现的。
如果你还没有思考深度神经网络如何解决数据理解问题,那你就要开始思考了。这条起始线从现在开始,但它的实现是非常明了的,我们看到了很多难题在深度学习网络面前都迎刃而解。
Jeff 发表的讲话都非常的棒,这次毫不例外。内容非常直接有趣,有深度,还非常容易理解。如果你想了解深度学习或了解Googel打算做什么,这些内容就值得一看了。
理解意味着什么?
当一个人看到街道景象时,他能轻而易举地挑选出图片上的文本,了解到有的商店卖纪念品,有家店价格特别低等信息。但直到现在,计算机依然不能从图片中提取出这些信息。
如果计算机想要从图片中了解现实世界,它需要能够从中挑选出有趣的信息点,阅读文本并理解它。
在未来,小型移动设备将主宰着计算机交互。这些设备都需要不同类型的界面。需要真的能够理解并生成对话。
我们在搜索引擎中输入:[汽车零部件]。旧的谷歌版本会因为关键词匹配给你第一条结果,但更好的结果其实是第二个结果。真正的理解是这个问题深层次的意义是什么,并非字眼的表面意义。这才是构建好的搜索与语言理解产品所需要的。
谷歌深度神经网络小历史
谷歌大脑计划于2011年启动,聚焦于真正推动神经网络科学能达到的最先进的技术。
神经网络已经存在很多年了,出现于19世纪60年代至70年代之间,在80年代晚期和90年代早期红极一时,然后逐渐暗淡。主要因为两个问题:1)缺乏必备的计算能力去训练大量的模型,这意味着神经网络不能应用于包含大量有趣的数据集的大型问题。2)缺乏大量的有趣的数据集。
谷歌开始只有几个产品团队工作。随着这些团队发布一些很好的、能解决以前不能解决的问题的产品。名声渐起,很快,更多的团队加入其中帮助解决问题。
谷歌需要利用深度学习技术的产品/领域:安卓,Apps,药物发现,谷歌邮箱,图像理解,地图,自然语言,图片,机器人,语音翻译,等等。
深度学习能应用于如此完全不同的项目的原因是他们涉及相同的基石,这些基石可用于不同的领域:语音、文本、搜索查询、图像、视频、标签、实体(一种特定的软件模块)、文字、音频特性。你可以输入一种类型的信息,决定你想要输出信息类型,收集训练数据集指示出你想要计算的功能。然后,你可以放手不管了。
这些模型十分奏效,因为你输入的是非常原始的数据。你不必给出数据大量的有趣特点,模型的力量足以让它自动地通过观察许多许多例子决定数据集的有趣之处。
你可以学习常见的表征,这种学习很可能是跨领域的。例如,一辆『汽车』可以指图像中与真实相同的汽车。
他们已经学到他们可以聚集一大堆的子系统,其中一些可能是由机器学习的,然后用更通用的端对端的机器学习块代替它。通常当你有很多复杂的子系统时,往往有大量复杂的代码将这些子系统缝结在一起。如果你能用数据和简单的算法代替所有复杂代码,那就太好了。
什么是单个深度神经网络?
神经网络从数据中学习真正复杂的函数。从一端输入内容转换成另一端的输出内容。
这一函数不像计算x2,而是真正复杂的函数。当你输入原始像素,比如一只猫是,输出结果就会是事物的类别。
深度学习中的「深度」是指神经网络的层的数量。
对于深度,一个好的属性是系统是由简单的可训练的数学函数的集合构成的。
深度神经网络与大量机器学习方式是兼容的。
例如,你输入猫的图片,输出的是一张人为标注为猫的图像,这叫作监督式学习。你可以给系统列举大量的监督式样例,并且将学习结合一个函数,这个函数与在监督式例子所描述的是相似的。
你也可以进行非监督式训练,你只得到图像而不知道图像里面的什么。然后系统可以依靠在众多图片中出现的模式学会挑选。所以,即使不知道图像叫作什么,它也可以在所有这些有猫的图形辨别出共同的事物来。
这也和更多像强化学习这样的外来技术是兼容的。强化学习是非常重要的技术,它正在被AlphaGo使用。
什么是深度学习?
神经网络模型可以说是基于我们所认识的大脑运作的方式,它并不是对神经元真正工作的详细模拟,而是一个简单抽象的神经元版本。
一个神经元能够接收许多输入信息,真实的神经元会将不同的优势(strengths)与不同的输入相联系。人工智能网络试着学习为所有那些边缘,亦即与这些不同输入关联的优势进行加权。
真实的神经元吸收一些输入与优势的组合,并决定是否发出一个脉冲。人工神经元不仅仅会发出脉冲,还会发出一个实数值。这些神经元计算的函数是输入的加权求和乘以非线性函数的权重。
现今通常所用的非线性函数是ReLU(max(0,x))。在上世纪九十年代,大部分非线性函数都是更加平滑 (https://www.quora.com/What-is-special-about-rectifier-neural-units-used-in-NN-learning)的 sigmoid或tanh函数。当神经元不放电的时候会取真正的零值,而不是非常接近零的数值的优秀特性,从而帮助优化系统。
例如,如果神经元有着三个输入X1,X2,X3,分别有着0.21,0.3,0.7的权重,那么计算函数将为:y = max(0, -.0.21*x1 + 0.3*x2 + 0.7*x3)。
在识别图片里是一只猫还是一只狗的过程中,图像会经过多层级处理,基于它们的输入神经元可以决定是否发射脉冲。
最底层的神经元只处理一小部分像素,更高层的神经元则会处理下层神经元的输出并决定是否发射脉冲。
模型会如此向上直至最后一层处理完毕,举个例子,这是一只猫。在这种情况下它错了,这是一只狗(尽管我也认为那是一只猫,那是一只在篮子里的狗吗?)。
输出错误的信号会反馈回系统中,接着其余模型会做出调整以让它在下一次处理图片时更有可能给出正确的答案。
调整整个模型所有的边缘权重以增大获得正确结果的可能性,这就是神经网络的目标。人们在所有的样本都如此处理,这样在大部分的样本中都会得到正确的输出。
学习算法非常简单。循环计算步骤如下:
随机选择一个训练样本「(输入,标签)」。例如,一张猫的图片,以及预期输出「猫」。
用「输入」运行神经网络,并观察它的结果。
调整边缘权重,让输出更接近与标签」。
该如何调整边缘权重以让输出接近标签呢?
反向传播法:这里是一篇针对此的推荐文章:Calculus on Computational Graphs: Backpropagation (http://colah.github.io/posts/2015-08-Backprop/)。
当神经网顶层选择的是猫而不是狗的时候,通过微积分链式法则来调整权重参数使得网络可以做更准确的预测。
你需要和权重的箭头保持同一方向,让它更有可能认为这是一只狗。不要跳一大步,因为这可是一个复杂坎坷的表面。小步前进会让结果在下一次更有可能变成狗。通过大量迭代以及对样本的观察,结果就越有可能变成狗。
通过链式法则你可以理解底层的参数变化会如何影响输出。这意味着神经网络网络的变化如同涟漪般波及至输入,调整整个模型,并增大它说出狗的可能性。
真的神经网络由数以亿计参数组成,因此你正在一个亿维空间内做调整,并试着理解那是怎样影响网络输出结果的。
神经网络的很多优秀特性
神经网络可以运用到多个不同领域,用来解决不同的问题:
文本:英语和其他语言包含数万亿的单词。现有很多对应的文字资料,包含句与句对应的一种源语言文字与其翻译版的另一种语言文字。
视觉数据:数十亿的图像和视频。
声音:每天会产生几万小时的音频数据;
用户行为:不同的应用程序都在产生数据,无论你在搜索引擎敲下的字符还是在邮箱里标记的垃圾邮件,这些用户行为里可以不断被学习,并用来给你「定制」智能系统。
知识图谱:数十亿打标签的RDF triple数据。
你给的数据越多,其反馈的结果越好,你也会让这个模型更大。
如果你投入更多的数据却不去扩大你的模型,会进入一个模型能力的饱和状态,此时,模型学习到的只是关于你的数据集最显而易见的事实。
通过增加模型的规模,模型不仅可以记住一些明显的特征,还会记住一些只是偶然在数据集中出现的细微特征。
打造更大的模型需要更多数据和更强大的计算能力。谷歌一直在做的就是如何规模化计算量并投入到这些问题的解决中,从而训练更大的模型。
深度学习给谷歌带来哪些影响?
语音识别
语音识别团队第一个和谷歌大脑团队合作部署神经网络。在谷歌大脑团队帮助下,部署上线了一个新的、基于神经网络的语音模型,不再使用之前的隐马尔科夫模型。
声学模型的问题是从150毫秒的语音里预测其中10毫秒的声音是什么。类似与「ba」还是「ka」。接着你有了这些预测的完整序列,然后将它们和语言模型对接起来,以理解用户在说什么。
这个模型将识别错误率降低了30%,意义非常重大。此后语音团队继续在构建更加复杂的模型,并结合更好的神经网络降低错误率。现在你在手机上说话,语音识别已经比三到五年前好太多了。
Image 挑战赛
大约六年前, ImageNet的数据库公开,大约有100万图像数据,这个巨大的图像数据库对于推进计算机视觉的发展意义重大。
图像被分为1000个不同种类,每个种类大约1000张照片;
大约有1000张不同的豹子照片、1000张不同的汽车、滑板车照片等等;
其中有个复杂的因素:并非所有的标签都是正确的;
比赛的目标是概括出照片的新的类型。对于一张新照片,你能判断出来上面是猎豹还是樱桃吗?
在神经网络运用到比赛之前,这项比赛的错误率为26℅。2014年,谷歌赢得比赛时的错误率为6.66%。2015年的时候,获胜团队的错误率降低到3.46%。
这是一个巨大而且有深度的模型。每个盒子都布满了完整层级的神经元,它们正在进行卷积运算,关于这方面的详细情况,可以查看这篇论文《Going Deeper with Convolutions》
一个名叫 Andrej Karpathy 的人也参与了比赛,他的错误率是5.1%,他后来还写了篇文章《What I learned from competing against a ConvNet on ImageNet.》
神经网络模型擅长什么?
神经网络模型非常擅长识别精细程度的差别。比如,计算机擅长辨别人类不善于分辨的犬种。人类可能看到一朵花就只知道那是一朵花,计算机可以分辨那是一朵「芙蓉」或是一朵「大丽花」。
神经网络模型擅长归纳。比如不同种类的饭菜,尽管看起来不一样,但都会被标记为「饭菜」。
当计算机出错时,错误的原因是合理的。比如一只蛞蝓看起来很像一条蛇。
谷歌照片搜索
检查照片的像素并理解图像中的内容,这是个很强大的能力。
Google Photos 团队在没有标记它们的情况下部署了这一能力。你可以在没有标记图片的情况下搜索到雕像、尤达、图画、水等图片。
街景影像
在街景影像中,你希望可以阅读到所有的文本。这是更为精细更为具体的视觉任务。
首先需要能够找到图像中的文本。模型基本上都是被训练用来预测像素热图的:哪些像素包含文本,哪些不包含。训练数据是绘制于文本像素周围的多边形。
因为训练数据包含不同的字符集,它可以找到多种不同语言的文本。它可以识别大字体和小字体,离镜头近的和离得很远的文字,以及不同颜色的文本。
这是一个训练相对简单的模型。这是一个试图预测每个像素是否包含文本的传统的网络。
谷歌搜索排名的RankBrain
RankBrain于2015年推出,是谷歌第三重要的搜索排名因素。了解更多:谷歌将其利润丰厚的网络搜索交给人工智能机器。
搜索排名是不同的,因为你想要能够理解该模型,你想理解为什么它会做出特定的决策。
这是搜索排名团队犹豫在搜索排名中使用神经网络的一个原因。当系统出错时,他们希望了解什么会这样。
调试工具已被制造出来,而且模型也能被充分地理解,以克服这种异议。
一般来说你不想手动调整参数。你尝试理解为什么模型会做出那样的预测并搞清楚是否与训练数据相关,是与问题不匹配吗?你可能在一个分布式数据上进行训练,然后将其应用于另一个。通过搜索查询的分布,模型每天都能获得一点改变。因为事件在改变,模型也一直在改变。你必须了解你的分布是否是稳定的,比如在语音识别中,人们的声音并不会发生太大改变。查询和文档内容经常在改变,所以你必须确保你的模型是新鲜的。更一般地,我们需要打造更好的用于理解这些神经网络内部状况的工具,搞清楚是什么得出了预测。
序列至序列(Sequence-to-Sequence)映射模型
世界上许多问题都可归入到一个序列映射到另一个序列的框架中。谷歌的Sutskever、Vinyals 和 Le 在这个主题上写了一篇开关性的论文:使用神经网络的序列到序列学习 (http://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf)。
特别地,他们研究了语言翻译,将英语翻译成法语中的问题。翻译事实上只是将英语句子序列映射到法语句子序列。
神经网络非常擅长学习非常复杂的功能,所以这个模型学习了映射英语句子到法语句子的功能。
一种语言的一个句子通过EOS(end of sentence)信号一次输入一个词。当模型看到EOS 开始产出其它语言对应的句子时,模型就得到了训练。训练数据是具有同样含义的不同语言中的配对句子。它只是试图该函数建模。
模型会在每一步发出你的词汇中所有词条输入的概率分布。在推理而不是训练时间,你需要做一点搜索。如果你必须最大化每个词的概率,你并不一定会得到最可能的句子。直到找到最大可能的句子,联合概率的搜索才完成。
该系统是现在公共翻译服务中最先进的。其它翻译系统是一堆手写的代码或这个翻译问题的子块的机器学习模型,而非完全的端到端学习系统。
人们对这一模型的兴趣在暴增,因为很多问题都可被映射到序列到序列的方法。
智能回复(Smart Reply)
Smart Reply是序列到序列在产品中的一个应用案例。在手机上,你希望快速回复邮件,而打字又让人痛苦。
和 Gmail 团队合作,他们开发了一个能预测一条信息可能的回复的系统。
第一步是训练一个小模型以预测一条信息是否是可以快速回复的信息。如果是,就会激活一个更大的计算上更昂贵的模型;该模型将该信息作为一个序列,并尝试预测回复的单词序列。
比如,对于一封询问感恩节邀请的电子邮件,可预测到的回复有三个:把我们算上;我们会去;抱歉我们去不了。
Inbox 应用中惊人数量的回复都是通过 Smart Reply 生成的。
图片说明
生成一张图片说明时,你会试着让机器尽可能写出类似人类基于图片会做出的说明。
采用已经开发出来的图片模型,以及已经研发出来的Sequence-to-Sequence模型,把它们插在一起。图片模型被用作输入。
它被训练用来生成说明。训练数据集拥有五种不同的人给出的五种不同说明的图片。10万到20万的图片需要写70万句的说明。
一张婴儿怀抱泰迪熊的图片,电脑这么写的:一个抱着填充玩具动物孩子的特写;一个婴儿在泰迪熊旁边睡着了。
还没有达到人类理解水平,但机器出错时,结果可能会有趣。
综合视觉+翻译
技术能够综合起来。翻译团队编写了使用了在取景器中识别文本的计算机视觉APP。翻译文本,然后给图片叠加翻译文本(让人印象非常深刻,约37;29)。
模型足够小,整个计算都在设备上运行。
迭代(turnaround)时间和对研究的影响
在一天内完成单个CPU花费6周才能完成的训练
谷歌真的关心能够快速迭代研究。它的想法是快速的训练模型。理解什么运行良好,什么运行欠佳,找出下一组要运行的实验。
一个模型应该在在几分钟几小时内就能可训练,而不是几天甚至几个礼拜。让每个做这类研究的人更加富有生产力。
如何快速训练模型?
模型的并行性
一个神经网络有许多内在的并行性。
所有不同的个体神经元几乎都是彼此独立的,当你计算它们时,特别是,加入你有Local Receptive Fields,这是一个神经元从其下方少量神经元那里接受输入的地方。
能够跨越不同GPU卡上的不同机器对工作进行划分,只有跨越边界的数据才需要交流。
数据的并行性
当你对模型的参数集进行优化时,不应该在中央服务的一台机器上进行,这样你就有不同的模型副本,通过它们之间的合作来进行参数优化。
在训练中理解不同的随机数据片段。每一个副本都会获得模型中当前的参数集,通过对相当规模数据的理解来判断出梯度,找出需要对参数所作的调整,并且将调整值发回至中央参数集服务器。参数服务器会对参数进行调整。不断重复这个过程。
这会在多个副本之间完成。有时他们会使用500台机器来生成500个模型副本,以便迅速实现参数的优化和处理数据。
这个过程可以异步进行,每个数据分任务在各自独自的循环运算中,获取参数,计算梯度并将它们传回,不会受到其他彼此的控制和同步。结果是,按照50-100的副本规模进行练习,对许多模型来说是可行的。
Q&A
如果不是诸如谷歌这样的大公司,无法获取海量数据集,你会怎么做?从一个运行良好的模型开始,用公共数据集进行训练。公共数据集普遍可以获取。然后用更加适合你问题的数据进行训练。当你从一个类似并且公开可获取的数据组开始时,针对你的特殊问题,可能只需要1,000或者10,000标签实例。ImageNet就是这种处理可行的好例子。
身为一个工程师,你所犯过的最大错误是什么?没有在BigTable里放入分布式事务处理能力。如果你想要更新多条数据,你不得不运作你自己的事务处理流程。没有放入事务处理能力是因为会增加系统设计的复杂度。回想起来,很对团队想要有那种能力,他们各自独立(在上层)去添加这个能力,也获得了不同程度成功。我们应该在核心系统实现事务处理能力。它在内部应用场景也会很有用。Spanner系统增加了事务处理搞定了这个问题。