大家期待已久的
DevFest 2018 现场实录
终于出炉了!
11 月 25 日,1125 位开发者之约,你在吗?
什么?你错过了 DevFest 2018 ?
不要担心,我们已经为大家推送本次大会的嘉宾演讲实录,不在现场也能干货满满!
回顾前情:
AI 选手别错过!谷歌云美女工程师 Shirley 教你用 AutoML 定制机器学习模型 | DevFest 2018 实录
谷歌移动技术专家 Palances Liao 带你解析 PWA/AMP & 洞察Web趋势 | DevFest 2018 实录
谷歌机器学习专家江骏 详解 TensorFlow Hub & Tensor2Tensor | DevFest 2018 实录
本文由谷歌机器学习专家、了得研究院 CEO 彭靖田为我们分享《TensorFlow Eager》。
1
关于演讲者
2
演讲实录
开场白
这里简单的做一个自我介绍,我叫彭靖田,我从 16 年的时候开始做 TensorFlow 的开发和产品化,当时在华为 AI 团队做开源和华为深度学习平台。同时,在社区做开源贡献,成为了 Top 40 Contributor。
我自己写了一本书叫《深入理解 TensorFlow》,是我在华为的时候和另外两位博士完成的。离开华为之后我去了才云带团队做 Cloud AI,也成功地和国家电网、百胜集团达成合作。现在自己合作做了一个公司叫了得研究院,主要聚焦AI和区块链技术研究与产学研转化。除此之外,我也是一个资本的合伙人,所以大家有一些好的创业项目也可以来找我。
我相信在座的对 AI 都有一些自己的看法和理解,今天我也跟大家讲一下我对于 TensorFlow 和 AI 的一些简单的想法。

刚才很多人提到 TensorFlow 2.0,都在期待它,也就是 TensorFlow Eager Execution。我们想怎么样可以让 TensorFlow 的用户更快地上手 TensorFlow?
在讲 TensorFlow Eager 之前我们先讲一讲 Eager 出现的背景,在 Eager 之前我们用的是什么。
这幅图大家不陌生,在 TensorFlow 官网上经常出现,叫数据流图。大家如果有学过算法课应该知道,图论里面分成两个元素,边和点,所有的边都是有限的,有限的边里流动的是什么呢?我们叫做 Tensor。比如一千维的向量并不是所有的值都是有效的,针对稀疏的向量我们也会有一些 Operation,就是操作。比如加减乘除、矩阵运算,比如开箱即用的算法,比如我们说的卷积层都是。
当我们训练一个模型的时候我们训练的是什么?我们训练的是这些参数,这些参数存在 Variable 里面。我们用数据训练,比如一个初中生会写的线性方程,这是很容易去显示的,因为它是一个标量。如果是 N 维的向量,如果大家看过 VGG,如何表示输入数据和输出数据?我们用占位符来表示。

刚刚是很静态的东西,我们把它表示出来,怎么运行呢? TensorFlow 里面有一个概念叫做 Session,Session 可以认为是一个上下文环境,Session 也是开启了一段上下文环境。
对于 Session 来说,怎么创建它或者它有哪些重要的属性呢?它有三个重要的属性,第一个是 target,还有一个是 graph,还有 config。它有一个特定的方法,当你把这幅图画好,一切的运算还没有开始,只有当你开启了绘画,在绘画里执行这个操作的时候才会结束。如果没有显示这个资源,会一直占用在那里,这是很多人开始写 TensorFlow 的时候不知道为什么内存溢出了,明明 10 个 G 的很好的 GPU 的卡为什么溢出了,就是这个原因。
举个例子,下图是一个乘法操作,我们用占位符来表示它,最后执行乘法操作,Z = X * Y。我们展示一个绘画,执行 Z,这个地方才会输出 6.0,这是我们在 TensorFlow 1.0 的时候来执行的一套逻辑。它是否麻烦?看起来好像不麻烦。
大家可以看到这里是 Dataflow Graph 的写法,在 TensorFlow 里面会发生什么样的事情呢?它并没有把值输出出来,这个地方会一直延续下去,因为它是一个死循环,它会一直生成不同的 Tensor。
到现在为止很多人一直搞不明白,为什么在 TensorFlow 里面是这样一个操作,陷入了死循环。在 Eager 里面很好,它就能输出。你们可以对照一下,它首先是 6,然后可以被 2 整除,等于 3 输出来。这个是很多人在直观上面的一个误解。
在 TensorFlow 1.0 中,我们如何训练一个模型呢?首先分为几块。
第一块,定义图的部分,这个图现在不是一个标量的算法,是一个矩阵相乘,我们把图定义好,但是并没有计算。我们需要开启绘画,初始化所有的变量。
第二块,训练,直到这里我们才真正开始每一步的训练。
大家可以看到,这个过程非常复杂,因为跟我们直观上的运算非常不一样,我们直观的运算当我输出它的时候就应该计算了,但这个不是。
为什么数据流图不好?和静态图相比哪里不好?我这里列举了一些。
首先,它是特定语言,它不是 Python,这个东西其实很麻烦,它不是一个运行值的东西,会让你的脑子很混乱。
同时,它缺少实时计算,把图构建好了,只是一个壳,什么东西没有,只有你把数据导进去之后才知道计算结果是什么东西。
然后很多人都想 TensorFlow 到底怎么 Debug,尤其是复杂的图很难。除此之外在运行的时候要怎么 Debug,这是另一件事,也很困难。另外为什么设计这个图?其实设计这个图是非常有好处的,有这些编译器技术你可以很好地提升你的运算性能。一个是写这个代码要花一周时间,但是这个代码运算起来一秒钟就可以运算完;另外一个是写代码只要一天,但是运算要十秒。这个就看你如何选择了。
TensorFlow Eager 如何设计?
我们在去年推出了 TensorFlow Eager。大家在不断的改进,到底怎么样去用 TensorFlow Eager,或者说 TensorFlow Eager 要怎么设计才足够好用呢?
首先要足够好的 Debug,因为所有的程序员都无可避免的会写出 Bug,Debug 是不可避免的。
其次是 Workflows,还有更加自然的 Control Flow,还有 Dynamic Models。
另外就是实时的计算。
除此之外,最早用过来的人都对这个很熟悉,它不能做自动微分,所有做深度学习的人都知道前向传播完了之后会做后向传播,如何做微分,几十层的网络肯定不能手动去写,怎么做?
TensorFlow 这一代的计算框架、AI 框架它们都支持自动微分,所以说大家期望 TensorFlow Eager 一样好用的时候能不能支持自动微分?它能支持!我觉得这个可能是大家普遍对于 TensorFlow Eager 或者 TensorFlow 2.0 的一些期待。
怎么去用呢?其实现在是可以用的,只是说它没有那么完美,上面把 TensorFlow 导进来,开启 Eager 这样一个计算环境很简单。举个例子,刚刚如果我们要把 a 这个常数打印出来,我们看到它会输一对的向量,而不会再把数字打印出来,因为它认为你在定义图,但是在 TensorFlow Eager 会认为你要打印出来,所以它直接打印出来了。如果你现在是一个静态图,不是在 Eager 的环境下,这是一个很大的不同。
这是 Dynamic Control Flow 的例子,你该如何去断逻辑就如何去判断这个逻辑。
比如,写这样一个分支函数,输出的东西是 15。把 15 调进去,它就从 1 - 15 开始,如果同时被 3 跟 5 整除的时候输出,其他的情况我就输出自己,输入最大的数字是 15。如果没有判断逻辑就应该输出 1 - 15。之前的逻辑是很难实现这一套东西的,在写算法的时候你会需要这个东西。
再举个例子,如果大家做过推荐系统会知道,推荐系统大部分用的逻辑实际回归,我们要做大规模的数据处理。后面谷歌提出一个新的算法,怎么用 TensorFlow 去做结合。
这里还有一个东西叫做 tfe。通过 tfe 可以用一套符号系统同时支持 Eager 跟 Graph 两种运算模式,这个对很多人是非常有帮助的。
我们讲到自动微分的问题,在之前大家是怎么去做微分的呢?现在有了 Eager 之后你要怎么做这个微分呢,你是不是要自己去写呢?在 tfe 里面用了一个叫 GradientTape 的东西,它就是一个帐本。通过它可以去记录一组特定的,自动微分就通过这种方式就完成了。
这个是怎么去做训练?我们可以看到在 TensorFlow 1.0 版本的时候推出了 Dataset,这个 Dataset 相当于是一个监督学习,通过这个接口可以得到,得到之后你需要进行训练,训练的时候需要把自动微分的东西做好,同时在实际求微分的时候跟刚刚是一样的。这里有一个模型的方法,这个模型的方法等价于我们之前讲的那张图,其实在 Eager 的编程模式下面我们大部分用这种方式,我们自己去定义模型。
这其实就是一个线性模型的例子,这里有几个关键点大家需要注意,上面我们定义了模型,就是一元线性方程,用刚刚的方法去求解,直接以数组的形式写下来。我们其实是在有意构造这个函数应该是 Y = 3 * X + 2,但是我有意的制造噪声,Y 很接近于 3,跟之前的那套是一样的,是完全兼容的。
TensorFlow Eager VS 数据流图
这里讲了这么久,现在 Eager 也出现了,到底用谁,它们各自有什么好处呢?这是我那个书里面写的内容,大部分的逻辑是不变的,只有 Y 是没有用的,我们是训练,不是做推理,如果你不是训练直接往下走就好了。
这个时候我们还会从命令行接收很多东西,大量的参数都会通过命令行输入。到这个地方为止你已经完成了图的构建,也就是 Eager 里面模型的定义,接下来你还需要创建绘画。如果继续训练,其实不是从零开始,不会像刚刚那个例子一样直接给一堆随机数据。你到从文件里面去,这个时候你才真正的做初始化的工作,结束之后把这些数据放进去,数据可能是 NFS、GFS 等,可能是任何东西。最后会去做这个运算,有可能是单机的,也有可能是分布式的,完成之后你会获取那个结果,你会反复的去训练,直到结束,结束之后你会选择是否会存储,因为它可能没有训练完,或者它只是一个版本。
之后你会去做可视化、去做各种东西,这样一个东西才做完。这里面每一项都可以扩展,所以这个足够灵活,可以完成任何东西,当然还有一个分布式的,那个更复杂。这个问题大家都已经意识到了,Eager 是什么样的感觉呢?Eager 就是这样的感觉,Native 是我自己加的,对 Keras 有很好的支持,其实在模型定义的时候继承了 Keras。这个时候它又是一个实时得到结果的。所以说如果你用 Eager 的话,你就会有非常好的体验,你会觉得它非常的友好,尤其是对于 TensorFlow 本来没有了解那么多的人。
Eager 跟 Dataflow Graph 有什么区别? Eager 就是用一天的时间写出来,然后运行十秒,同时它最足够的直接,也很简单很好的去学,不好的是它现在还是一个宝宝。Dataflow Graph 有很高的性能,虽然没有那么快速实现这个原形。它很抽象,一旦有一个小错误错了,就没法运算。还有一点它难做问题的定位,它是一种静态的图,有一个缺陷就在于它有大量冗余的 API,这么多东西,其实有些东西是重合的,怎么把这些冗余的 API 整合,也是最近我们跟 TensorFlow 的产品经理讲,我们一定要把冗余的 API 做到整合,一个功能一种 API 就够了。
我们现在也在开发这个东西,怎么把 Eager 的模型自动转换然后在上面运行,这个是我们现在在做的,虽然它有些不足。我们最早的数据流图它有很好的性能,同时 Eager 对于它来说是生态系统的一个补全,我们并没有说谁好谁坏,都有不同的使用场景。
谢谢大家,这就是我今天分享的内容。
请保持关注哦,我们后续还会分享更多嘉宾的演讲实录。嘉宾演讲资料请点击:DevFest 2018 再见!附资料链接。
GDG , 即 Google Developer Groups 谷歌开发者社区,是谷歌开发者部门发起的全球项目。 GDG 是面向对 Google 和开源技术感兴趣的人群而存在的公益性开发者社区,内容涵盖 Web/Chrome、Android 和其它 Google API 等。全世界各大城市都成立了自己的 GDG 社区,GDG Shanghai (上海谷歌开发者社区)也是其中之一。作为全球GDG 社区中最活跃的技术社区,GDG Shanghai 自创立之初就一直专注 Google 技术和开源技术为主的交流, 基本每周都有 Meetup,我们服务 IT 男,更服务 IT 女!
社区中的各位组织者均是来自各个行业有着本职工作的互联网从业者,我们需要更多新鲜血液的加入!如果你对谷歌技术感兴趣,业余时间可调配,认同社区的价值观,愿意为社区做出贡献,欢迎加入我们成为社区志愿者!
加入方式:关注上海 GDG 微信公众号:GDG_Shanghai,并回复:志愿者。
本文分享自微信公众号 - GDG(GDG_Shanghai)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/3989964/blog/4472505