TensorFlow是世界上最流行的开源机器学习框架。在2017年谷歌开发者大会欧洲站中,Andrew Gasparovic介绍了TensorFlow以及发展的最新成果。他还介绍了一些例子,演示了如何在谷歌和现实问题中使用TensorFlow。
什么是GDD?
谷歌开发者大会(Google Developer Day)是一个年度性的、在世界范围内的举办的、由众多讲座课程组成的技术教育和产品信息分享大会。
演讲者
Andrew Gasparovic
在谷歌研究院欧洲,机器智能部门。飞行员,跑步者,bloopmusic的开发者。
大家好,我叫Andrew Gasparovic。我是来自谷歌欧洲研究部苏黎世的一名工程师,致力于研究机器智能的基础设施。
今天我很高兴可以给大家介绍如何使用TensorFlow进行机器学习。
首先我将向你们讲解TensorFlow,然后再给大家举一些例子,关于我们如何在Google使用TensorFlow。接着分享一些最新以及即将出现的发展情况。然后再谈谈如何使用机器学习解决实际问题。
TensorFlow是什么?
首先介绍下TensorFlow究竟是做什么的,以及人们为什么想要使用它。
TensorFlow能够让你直接解决各种机器学习任务。目标就是在一般情况下,无论你遇到什么问题,TensorFlow都可以在一定程度上提供API的支持。
总的来说TensorFlow就是为了快而设计的,所以它针对你实际使用的硬件和平台做了优化。
其中在机器学习框架方面,TensorFlow的真正独特之处在于,能够在5行或者10行代码中构建模型。然后应用这个模型,进行扩展做出产品。
因此,你能够在几十甚至几百个机器的簇上进行训练。从而用该模型进行非常低的延迟预测。
我们在这里稍微展开说一下什么是模型。以及机器学习是怎样与模型相关联的。
这里有个简单的预测问题,判断一张图片中包含的是猫还是狗。这用传统的编程方法很难甚至不可能解决。因为很难制定出一系列规则,来决定什么是猫什么是狗。最重要该如何把握所有的变量,比如品种、姿势、亮度、以及比例等等。
因此作为替代,我们可以构建一个神经网络。这像是人脑中神经元运行的极简版本。
图中每个小点都是一个神经元,这些神经元以层为集合单位被关联起来。从那些我们所看到的图片,到我们所能理解的输出。
接着浏览大量猫狗的图片,它们均被标注为正确的类别,然后进行预测。一开始,所有这些神经元都被随机地初始化,完全凭猜。
我们要计算猜测与正确结果之间的距离,即误差。然后使用误差,来调整神经元之间的连接强度。基本上,我们想缓慢地逼近正确答案。在我们重复上述步骤约一百万次之后,你就可以得到一个不错的猫狗预测模型。
但是你真正想实现的,其实是创建一个预测猫狗的网站。用户给了你一张图片,你需要告诉他们这当中包含了猫还是狗。在训练中习得的连接强度,能使你的模型推广。
因此如果给出一张图片,即使它从未见过这张图,并且图片也没有附上任何标签,模型也能预测出图片中是狗。这是根据从神经元的权值习得的,关于猫狗本质的对比。至少是根据它所看的图片。
而模型真正能学习到什么程度,是一个基于模型大小和复杂度的函数。直到最近我们才有相应的计算机性能和工具,可以用来实验巨大且复杂的模型。
这张图片是神经网络在5到10年前的样子,那时还只有为数不多的几个神经元。每层神经元完全相互连接,但也没有那么多层神经元。最后的结果也没有那么准确。
事实上对于类似计算机视觉的问题,过去的神经网络几乎无用武之地。相比于为某个确切的任务,由专家们专门手动调节的模型。
如今可以用来与图像分类的神经网络作比较,这个被称为Inception。它的设计思路是给出一张图片,它就能从成千上万,我记得是大约1万7千种类别中,预测出图中包含了什么。
借助于TensorFlow的框架,你能够训练出这样的模型。含许多层,并且比早期的神经网络更复杂。
这就是我们说深度学习时所指的"深度”。在这里'深度'指的就是,层与层之间更深层次的协调。以及随之产生的更加复杂的连接。最终的结果就是你的模型中,有百万级别甚至十亿级别数量的神经元。这就是为什么通过深度神经网络得到的结果。能够极大地优于,早期的手工构建并且手工调试的模型。
但是,TensorFlow能够在大型神经网络中表现地如此高效的原因是,它能把你写的代码转换成操作图。而真正运行的正是这种图。
顺便提一下,在这些操作之间运行的数据叫做张量(Tensor)。这也是名字的来源。
因为你的模型以图的形式展现出来,你可以推迟或者删除不必要的操作。甚至重用部分结果。你还可以很轻松地实现的一个过程叫做反向传播。如果你还记得的话,当我们基于所见的样本以及计算的误差,来更新模型中的连接强度。这整个过程就是反向传播。
因为模型表现为操作图而不是代码,因此你不需要为此写额外的代码。只需直接自动地计算以及应用这些迭代更新。模型表现为图的另一个好处就是,在你的代码中,你可以用一行声明就表明:"我想这部分图在这里运行,我想另一部分图分布式运行在不同的机器群上"
你甚至可以说"我想要这部分注重数学的图在GPU上运行,与此同时,数据输入部分的代码在CPU上运行"。
TensorFlow一开始就可以在CPU和GPU上运行,它还可以在iOS 安卓、甚至Raspberry Pi设备上加载模型,以及做一些像预测或者分类的推理型任务。
因此在我们的数据中心内部,我们使用专门打造的硬件TPU(tensor processing unit),来提供TensorFlow图。
所以实现在网络中先反向传播,然后再前向传播。每一层神经元之间的连接强度,基本上就是非常大的矩阵数学运算。这正是TPU常做的,并且算得又快又好。
第二版TPU硬件我们称之为云TPU,之后我会多谈谈这方面。
曾有一段时间,Python几乎是构建TensorFlow图的唯一选择。直到现在它也是一个不错的选择。Python非常简单,现成的样例代码非常多,几乎支持任何内容。
但是也有来自很多其他语言的支持。因为TensorFlow是开源的,长期以来在社区的支持下,越来越多的语言开始支持TensorFlow。所以,最终的情况是,如果你对TensorFlow感兴趣,你可以用自己喜欢的语言使用TensorFlow。
在此我想说一下,我的TensorFlow Serving团队的同事们。上个月刚刚发布了他们的1.0版本。这对他们来说是一个十分重大的里程碑。
因为TensorFlow Serving是非常高性能的基础设施。你能够在自己的服务器上加载模型,用于低延时的推断请求。在内部,我们已经把它应用于大约800个产品上 。但是我们想把它作为开源分布的一部分 。
因为这是在实际部署中很重要的一个方面 。当我们说TensorFlow可用于生产时 ,这才能把用来做研究所写的代码与实际生产用来解决问题相区分 。
还有一个项目是称为TensorBoard的工具 ,这是包中的可视化工具之一 。这张图展示的是针对某个任务模型,学到的手写体数字簇。
总体来说,把模型的运行过程进行可视化 ,并且尝试对模型预测的结果进行调试 。
一直以来都是一个机器学习的难点,是许多机器学习框架中的薄弱环节。因此正如TensorFlow Serving,这也正是我们想要加入的内容 。
因为你不可能将其投入生产 ,除非真正弄清机器学习模型中的运行原理 。以及明确是否模型预测的结果与预期不同 ,还有当中的原因 。
所以总体而言 ,生产前的准备工作是构建成功框架的关键之一 ,这也使它与众不同 。
TensorFlow自发布以来 ,就成为了GitHub上排名第一的机器学习开源库 。自从发布以来的其使用量是惊人的 。这张图表显示了它自发行以来,在GitHub上的Star数。上一次我看的时候超过了6万8千点。
另一个原因就是,我们很重视自己在开源社区中的地位。 对于我们来说,这从来就不是随意打出一些代码,或者随意从源代码存储库中取出一些 ,选择开源然后就完事了。
自从发布以来,开放源码和开源贡献者,一直是整个过程中的重要部分。如今 TensorFlow中有超过1千为外部贡献者。
其中一些外部贡献者的添加了很多新的特性,如我前面提到的其他语言,额外的硬件支持。甚至是TensorFlow运行的全新平台。
我们开源工作的另一个方面是 ,确保用户能够高效,并了解如何最好地使用TensorFlow。
为此我们已经回答了Stack Overflow上数千个问题,同时也认真地研究并解决了我们GitHub Issue页面上的问题。我们希望从你在下载框架到实际发布模型时,都有非常无缝的体验。
只是需要明确的是,我们经常在谷歌里中使用TensorFlow。这张图显示了随着时间的推移,我们模型的源代码控制树的目录数量。
橙色线是当我们内部发布TensorFlow,可供所有项目使用时的情况。可以看到在此之前,有一些人对机器学习的兴趣 。比如一些人是白色名单,或使用我们先进的框架 。然后在其发布之后就激增了。
如今,谷歌有6千多个产品使用了TensorFlow。事实上,几乎谷歌所有的主要产品都使用TensorFlow,并以某种形式进行机器学习。这给了我们大量的反馈和机会来进行优化。通过简化API,或添加新的API使其更容易使用。还提供一些我提到过的生产工具。
可以用TensorFlow做什么?
让我展示一些TensorFlow的应用实例。因为有各种各样的问题,这很好的展示它作为框架具有的灵活性。
谷歌翻译曾经使用逐词翻译的模型,一句句的短语,其性能仅此而已。
当中具有上千条由语言学家输入编写的手调代码。即便如此,这是无法体会人类语言的中差别和差异。
右侧是将中文"请问,洗手间在哪里?"翻译为"Where Will the restroom?"的例子,有很大的改进空间。我们使用全新的基于深度神经网络的系统,代替了之前的系统系统。该系统称为神经网络机器翻译。这是在TensorFlow上运行的。
结果是在一些情况下,许多语言组合的翻译质量上有显著提高,达到了85%。
原因在于模型会从整个一系列单词的角度来考虑,输入序列和输出序列。结果是你得到了更自然的输出,更像人工翻译的成果。例如 此处"excuse me, where is the toilet?”,就是一个更好的翻译结果。
继续这个翻译的主题。我们在翻译App中加入实时相机翻译(Word Lens)。而且是在手机上运行的,能在飞行模式使用,这是非常惊人的。
因为在同样的模型中,这结合了计算机视觉和翻译。我们在TensorFlow中加入了特性,使这些成为可能。
如今你可以在一个服务器的集群,或一台机器上对模型进行训练。你通常会这样做,然后对取该模型,缩小尺寸。从而适应设备,同时保持高质量。
谷歌图片就是加入机器学习功能而大为提升的例子。在6个月时间里,该团队使用基于Inception的图象分类系统,在谷歌图片中实时使用。
思路就是你通过输入词在图片中进行搜索。比如输入"海滩" ,就会得到海滩的图片。搜索"雨伞" ,就得到雨伞的图片。或者甚至搜索一个抽象的词如”晴天”。而且之前不用在你的图片中添加这这些标签。
另一个使用深层神经网络处理更复杂图像任务的,是来自谷歌研究院的Show and Tell。输入图像,并输出文字说明。这也始于Inception模型,但它不只是对出现在图像中的对象进行分类。还会得出自然的描述 并把握图像中对象之间的关系。
为了做到这一点,模型在人工生成说明的例子上进行调整。从而它习得了关系的内容。
当中的副作用是,模型更擅长描述图像中比如颜色的细节。因为它发现在人类更喜欢这类描述。
因此谷歌研究院将整个模型开源。在博客上有关于这方面很深度的帖子,你可以按照文章链接自己试试。
另外谷歌研究眼在致力于使用计算机视觉,对糖尿病性视网膜病变的状况进行诊断。
一般来说是你去看眼科医生,通过拍这样的图像,分析糖尿病视网膜病变的早期迹象。这很重要,因为如果尽早发现疾病,能够更容易治疗。但发展中国家没有足够多的眼科医生,所以很难及时发现病变。
我们发表在《美国医学会期刊》上发表了文章,当中指出在诊断该症状时,计算机视觉能够达到等同、甚至略优于平均眼科医生的水平。这让我们很兴奋,因为如果让该模型得到普及,就能够帮助发现更多类似症状,在为时已晚之前。
研究小组的最后一个问题是,让深层神经网络学习。什么样的结构能够解决不同的问题?那么我们能做的就是,从表现不佳的机器学习模型开始学习,直到达到一个更准确的模型,而无需人工干预。
这个模型建立了解决问题的机器学习模型,这些问题被称为学习会学习。这是一个非常令人兴奋的领域,未来几年会在该领域做出很多成果。
在你认为TensorFlow是用于长期研究、或者大预算的大型应用程序时,我想给你看一个种黄瓜的日本农民。
照片后面他的儿子,使用建了黄瓜自动分类器,使用TensorFlow Arduino Controller以及Raspberry Pi。
他通过属于九个类别的七千根黄瓜样本训练模型。这之前每次黄瓜收获后,他母亲需要用10个小时进行这项分类工作。
他说"我想把分类工作交给AI来做,这样我们可以把更多精力放在培育好的黄瓜上"。在训练完模型后,他用传送带将其与控制器连接,并将许多摄像头连接到Raspberry Pi。当每条黄瓜沿着传送带传送时,它的影像会被摄像头捕捉,然后并被自动分类。我认为这是一个实际运用机器学习的出色例子。
TensorFlow的最新进展
我认为自从TensorFlow 1.0版本发布起,它就非常擅长解决这一系列类问题。从那以后又有很多新的发展。
现在让我介绍一下。首先它变得更容易使用。就像说过的,在解决给出的各种问题时,TensorFlow非常灵活。
但它使用起来并不是最简单的。它在底层用分布式执行引擎。这个设备实际上用于执行图像处理操作,并在处理器中实现对该任务的分配,这个是不变的。
我们在1.0版本后,加入了Layers API。其理念是你可以构建模型,而无需直接进行图形和操作。但你仍然需要建立网络结构和所有的层,而且这类工作需要手工完成。
然后我们添加了Estimators API,能够更先进地选模型 结合输入 并进行训练和评估。现在的1.3版本,我们添加了另一层,我们称之为Canned Estimators。只需一行代码就能够创建深层神经网络分类器。
使用Estimators API 你能够免费获取,如分布式训练、自动快照。并且能够运行混合硬件,比如CPU和GPU。
同时对性能的改进能够应用于你的模型,我们发布了用不同硬件组合处理不同的任务的基准。这是很重要的,因为这显示了随着时间的推移,我们将如何继续提高性能。但同样重要的是, 这说明了针对你的硬件组合,TensorFlow解决问题的性能。
至于不常见的配置,这个之前提到的云TPU。这是第二代TPU(Tensor Processing Unit)。
第一代我们只用于加快机器学习的推算部分,第二代还加速了训练部分,总的来说这是一个巨大的进步。因为每个云TPU能够每秒能计算180万亿次,但这意味着需要每次连接64个TUP pod。一个pod是每秒能计算11.5万亿次。这是很大的运算量。
之前提到的神经网络翻译模型,需要一整天进行训练,而且是用我们能找到的32个GPU。如今达到同样的正确率,使用1/8的TPU只需半天就可以完成训练。
在一年内我们将面向外部用户提供在云平台使用云TPU。之后我会分享这方面的信息。
还要确保我们能够充分利用用于处理机器学习任务的任何硬件,无论是TPU还是GPU,甚至只是你的CPU支持的指令等。
我们一直使用编译器,将之前提到的图直接转换为汇编码,称为加速线性代数(accelerated linear algebra)。
在TPU上运行时这必不可少,并且在Jet Mode下为CPU和GPU编写图。因此能够选择你硬件的对应内核。
还有第三适合手机端的模式。你能够事前编写模型,
然后在移动设备上运行预测。优点是编写的模型要小得多,但仍然能够在特定设备上高效运行。
关于手机端,最后要注意的是我们推出了TensorFlow Lite。专门为安卓移动设备推出的全新runtime。原理是在移动应用程序中放入很薄的引擎,完全支持你设备上的硬件,省去了所有不必要的通用代码。
当你结合该编译模型时,你能够高效实用硬件,且内存占用小。
因此你能够进行之前提到的设备上的推断任务,或者新出的Federated Learning。当中你可以利用在云端训练的模型,与此同时在个人的设备中有自己的训练数据。这从未被发送到云,但是可以在设备上整合。
如何开始学习TensorFlow
即使你有很多编程经验,我还是会说进入机器学习领域是很难的,非常难。
使用TensorFlow的好处之一在于,你处理的内容最终能够实际生产出来。不管你是什么水平,我想提供一些开始起步的建议。
第一个建议是利用网站tensorflow.org。上面有入门部分,附有可以实际操作的介绍,以及一些机器学习的任务。默认需要一些Python的知识,但仅此而已。
一旦开始,你可以一步步跟着教程学习。达到构建卷积网络等内容,这很适合处理图像分类任务。而递归神经网络适合处理语言及翻译任务。
在 playground.TensorFlow.org 上,有很有趣的不同神经网络架构和参数的演示。你可以试着改变层或神经元的数量,改变特征、学习率等。通过处理简单分类问题,了解神经网络的工作原理。
一旦你准备好开始真正构建用于生产的模型,我建议使用高等级的Estimator,以及Canned Estimator API。
因为你会自动地获得,比如保存和恢复checkpoint 导出TensorBoard,以及分布式训练,不需要额外操作。因此百分之八九十的情况下,Estimators和Canned Estimators是不错的选择。
当然通过使用Estimators,只要你愿意,你也可以把模型移动到云TPU,几乎是自动的。
在g.co/tpusignup 有一个申请表,如果你想了解更多信息的话。在这些链接中也可以了解更多关于TensorFlow Research Cloud的信息。
面向机器学习研究者,我们免费提供了上千个云TPU。因为有许多人有好的想法,但缺乏合适硬件进行先进研究。如果你想申请的话,可以看看这些链接。
最后还有一些优秀的机器学习在线课程,比如Google Developers的YouTube频道。Udacity还有使用TensorFlow的深度学习课程。深入机器学习的理论和数学背景。如果你喜欢那个课程,并且想继续的话,获得它的机器学习纳米学位是不错的选择。
我真的希望你想继续深入机器学习,因为这是一个令人兴奋的领域,这比以往更容易,而且有很多的成果。
感谢你们抽出时间,谢谢。