开发 | 紧跟未来深度学习框架需求,TensorFlow推出Eager Execution

2017 年 11 月 2 日 AI科技评论 岑大师

AI科技评论按:Google的TensorFlow是AI学习者中使用率最高、名气也最大的深度学习框架,但由于TensorFlow最早是基于Google的需求开发的,在实际使用上也会存在如文档乱、调试难等诸多缺点,而且开发时间比较早未能及时对一些新的需求进行反应(据AI科技评论了解,由于缺乏类似PyTroch、DyNet的动态图功能,Lecun就不止一次吐槽过TensorFlow是“过时的深度学习框架”(yesterday deep learning framework)),而针对用户的需求,Google也在对TensorFlow不断改进。在10月31日,Google为TensorFlow引入了动态图机制Eager Execution,而Google Brain Team的工程师Asim Shankar和Wolff Dobson也在Google官方博客发文详细阐述了这一功能带来的变化,AI 科技评论摘编如下:

今天,我们为 TensorFlow 引入了“Eager Execution”,它是一个命令式、由运行定义的接口,一旦从 Python 被调用可立即执行操作,这使得 TensorFlow 的入门学习变的更简单,也使得研发工作变得更直观。

Eager Execution 的优点包括:

  • 可以在即时的运行错误下进行快速调试,与 Python 工具进行整合

  • 通过易于使用的 Python 控制流支持动态模型

  • 为自定义和高阶梯度提供强大支持

  • 适用于几乎目前所有的 TensorFlow 操作

目前 Eager Execution 仍处于试用阶段,因此我们也在寻求来自社区的反馈以指导我们的方向。

同时Google还举了一些使用 Eager Execution 的直观例子,例如使用两个矩阵相乘的代码是这样编写的:

import tensorflow as tf

import tensorflow.contrib.eager as tfe 


tfe.enable_eager_execution() 


x = [[2.]] 

m = tf.matmul(x, x)

使用 print 或者 Python 调试器检查中间结果也非常直接。

print(m)

# The 1x1 matrix [[4.]]

梯度与自定义梯度

大多数 TensorFlow 用户对自动微分感兴趣。因为每次调用期间可能会产生不同的运算,因此我们将所有的正向运算录到一个“磁带”上,并在计算梯度时进行反向运算。计算了梯度之后,这个“磁带”就没用了。

这一API与 autograd 包非常类似,例子如下:

def square(x):
 return tf.multiply(x, x)


grad = tfe.gradients_function(square)


print(square(3.))    # [9.]

print(grad(3.))      # [6.]

在这里,gradients_function 先调用了一个预先定义的 Python 函数 square() 作为参数,并返回一个 Python 可调用函数 grad 来计算相对于输入的 square() 的偏导数。如以上例子中当输入为 3.0 时, square() 的计算结果为9,而 grad(3.0) 为对 square() 进行偏导,其计算结果为 6。

同样,我们也可以调用 gradient_function 计算 square 的二阶导数。

此外,用户也可能需要为运算或函数自定义梯度。这一功能可能有用,例如,它可以为一系列运算提供了更高效或者数值更稳定的梯度。

以下是一个自定义梯度的例子。我们先来看函数 log(1 + e^x),它通常用于计算交叉熵和对数似然。

def log1pexp(x):
 return tf.log(1 + tf.exp(x))

grad_log1pexp = tfe.gradients_function(log1pexp)


# The gradient computation works fine at x = 0.

print(grad_log1pexp(0.)

)# [0.5]

# However it returns a `nan` at x = 100 due to numerical instability.print(grad_log1pexp(100.))

# [nan]

上述例子中,当 x=0 时,梯度计算表现良好。然而由于数值的不稳定性,当 x=100 时则会返回 `nan` 。使用上述函数的自定义梯度可用于分析简化梯度表达式。 

使用 Eager 和 Graphs

Eager execution 使开发和调试互动性更强,但是 TensorFlow graphs 在分布式训练、性能优化和生产部署中也有着诸多优势。

当启用 eager execution 时,执行运算的代码同时还可以构建一个描述 eager execution 未启用状况的计算图。要将模型转换成图形,只需在新的 Python 进程中运行同样的代码即可。这一做法可以从检查点保存和修复模型变量值,这允许我们在 eager(命令式)和 graph(声明式)编程之间轻松转换。通过这种方式可以轻松地将启用 eager execution 开发出的模型导出到生产部署中。

在不久的将来,我们将提供工具来选择性地将模型的某些部分转换为图形。这样就可以融合部分计算(如自定义RNN单元的内部),以实现高性能并同时保持 eager execution 的灵活性和可读性。

新功能势必带来代码编写上的变化。Google还很贴心地给出了几个Tips:

  • 与TensorFlow一样,我们建议,如果您还没有从队列切换到使用tf.data进行输入处理,请抓紧时间进行切换,它更容易使用,也会更快。 有关帮助参阅相关博客文章文档页面( https://developers.googleblog.com/2017/09/introducing-tensorflow-datasets.html )

  • 使用面向对象层,如tf.layer.Conv2D()或Keras层;;它们可以直接存储变量。

  • 你可以为大多数模型编写代码,无论是执行和图形构建都是一样的。 但也有一些例外,例如使用Python控制流来改变基于输入的计算的动态模型。

  • 一旦你调用了tfe.enable_eager_execution(),它就不能关闭。 要获取图形行为,请启动一个新的Python会话。

更多内容可参阅Google博客( https://research.googleblog.com/2017/10/eager-execution-imperative-define-by.html )

—————  给爱学习的你的福利  —————

随着大众互联网理财观念的逐步普及,理财规模随之扩大,应运而生的智能投顾,成本低、风险分散、无情绪化,越来越多的中产阶层、大众富裕阶层已然在慢慢接受。王蓁博士将以真实项目带你走上智能投顾之路,详情请识别下图二维码或点击文末阅读原文~

————————————————————

登录查看更多
5

相关内容

Google发布的第二代深度学习系统TensorFlow
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
【阿里巴巴】 AI编译器,AI Compiler @ Alibaba,21页ppt
专知会员服务
43+阅读 · 2019年12月22日
TF Boys必看!一文搞懂TensorFlow 2.0新架构!
引力空间站
18+阅读 · 2019年1月16日
深度学习开发必备开源框架
九章算法
12+阅读 · 2018年5月30日
机器学习者必知的 5 种深度学习框架
深度学习世界
7+阅读 · 2018年5月3日
Tensorflow Eager Execution入门指南
专知
6+阅读 · 2018年4月16日
发布TensorFlow 1.4
谷歌开发者
7+阅读 · 2017年11月23日
终于!TensorFlow引入了动态图机制Eager Execution
深度学习世界
5+阅读 · 2017年11月1日
教程 | 如何从TensorFlow转入PyTorch
机器之心
7+阅读 · 2017年9月30日
A Comprehensive Survey on Transfer Learning
Arxiv
117+阅读 · 2019年11月7日
Deep Learning in Video Multi-Object Tracking: A Survey
Arxiv
55+阅读 · 2019年7月31日
Arxiv
5+阅读 · 2018年5月1日
VIP会员
相关资讯
TF Boys必看!一文搞懂TensorFlow 2.0新架构!
引力空间站
18+阅读 · 2019年1月16日
深度学习开发必备开源框架
九章算法
12+阅读 · 2018年5月30日
机器学习者必知的 5 种深度学习框架
深度学习世界
7+阅读 · 2018年5月3日
Tensorflow Eager Execution入门指南
专知
6+阅读 · 2018年4月16日
发布TensorFlow 1.4
谷歌开发者
7+阅读 · 2017年11月23日
终于!TensorFlow引入了动态图机制Eager Execution
深度学习世界
5+阅读 · 2017年11月1日
教程 | 如何从TensorFlow转入PyTorch
机器之心
7+阅读 · 2017年9月30日
Top
微信扫码咨询专知VIP会员