谷歌大神带你十分钟看懂TensorFlow

文/数据侠Gasparovic编程

TensorFlow 是世界上最受欢迎的开源机器学习框架,它具备快速、灵活并适合产品级大规模应用等特色,让每一个开发者和研究者都能方便地使用人工智能来解决多样化的挑战。服务器

今天DT君给你们推荐的这个视频(及文字实录),是2017年谷歌开发者大会欧洲站上,谷歌研究院工程师Andrew Gasparovic所作演讲。他用深刻浅出、妙不可言的方式,给你们分享了TensorFlow的发展状况与最新成果。网络

本文转自公众号CDA数据分析师(IDcdacdacda)架构

你们好,我叫Andrew Gasparovic。我是来自谷歌欧洲研究部苏黎世的一名工程师,致力于研究机器智能的基础设施。框架

今天我很高兴能够给你们介绍如何使用TensorFlow进行机器学习。机器学习

首先我将向大家讲解TensorFlow,而后再给你们举一些例子,关于咱们如何在Google使用TensorFlow。接着分享一些最新以及即将出现的发展状况。而后再谈谈如何使用机器学习解决实际问题。分布式

TensorFlow是什么?函数

首先介绍下TensorFlow到底是作什么的,以及人们为何想要使用它。工具

TensorFlow可以让你直接解决各类机器学习任务。目标就是在通常状况下,不管你遇到什么问题,TensorFlow均可以在必定程度上提供API的支持。oop

总的来讲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的深度学习课程。深刻机器学习的理论和数学背景。若是你喜欢那个课程,而且想继续的话,得到它的机器学习纳米学位是不错的选择。

我真的但愿你想继续深刻机器学习,由于这是一个使人兴奋的领域,这比以往更容易,并且有不少的成果。

注:本文编译自Andrew Gasparovic在谷歌开发者大会的演讲实录,内容仅为做者观点,不表明DT财经立场。

译 | CDA字幕组

题图 | bilibili

期待更多数据侠干货分享、话题讨论、福利发放?在公众号DT数据侠(ID:DTdatahero)后台回复“数据社群”,可申请加入DT数据社群。

数据侠门派

本文数据侠Andrew Gasparovic,任职于谷歌欧洲研究院机器智能部门。飞行员,跑步者,bloopmusic的开发者。