http://www.tuicool.com/articles/MBBbeeQgit
在AlphaGo与李世石比赛期间,谷歌天才工程师Jeff Dean在Google Campus汉城校区作了一次关于智能计算机系统的大规模深度学习(Large-Scale Deep Learning for Intelligent Computer Systems)的演讲。本文是对他此次演讲的总结。github
若是你没法理解信息里包含的内容,那么就会很难将其组织起来。算法
自从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系统增长了事务处理搞定了这个问题。