深度理解TensorFlow框架,编程原理 —— 第一讲 抽象编程模型

最近读到一篇来自慕尼黑工业大学的论文”A Tour of TensorFlow” , 内容比Tensorflow官方文档更全面深刻, 所以把自己的一些读后心得分享给大家. 做成两次博客. 下一讲会在不久后更新.

首先TensorFlow框架大名鼎鼎大家一定听说过,第一, 比较新,第二,是Google开源的大项目,来看看TensorFlow在历史上机器学习时间线:

qq%e6%88%aa%e5%9b%be20161017164108
25年以来发布的机器学习库时间线 来自:论文 “A Tour of TensorFlow”

TensorFlow是不是挺年轻?但是它的名气自发布以来没有下降的态势,相反,很多人把它称作机器学习界的“Android”。可见这个框架多么受人爱戴。

切入正题,TensorFlow是一个全面的可扩展框架,它试图能够支持任何机器学习,建模算法,而且它现在已经支持分布式计算模型。当然,想象空间还不仅这些,怪不得那些人叫它机器学习界的“Android”。

TensorFlow最大的亮点之一是它的抽象编程模型。它使用的流图计算框架是其他机器学习框架中很少见的。因而,执行模型,优化方式等等都和其他框架有所不同:

1.  流图计算框架

先上一张TensorFlow官网gif图,感受下:

tensors_flowing

机器模型在训练时,会有很多次迭代(比如10000次)。而每一次迭代,上图的演示就是一次迭代的过程。训练10000次,这个流图就要“流动”10000次。

接下来介绍流图中的重要部件:

操作节点

TensorFlow用流图表示一个训练过程不是拍脑袋凭直觉想出来的,很大一部分是因为性能考虑。记住:流图中的每个节点都代表一个操作。 这样做的好处是:任何计算都能表示成若干个节点的组合。如下面论文中图片:

qq%e6%88%aa%e5%9b%be20161019172918

如图,z节点就可以用在多个流图中重用, 而且,节点操作的抽象方便TensorFlow代码编写。节点操作一定会通过操作的内核代码,落实到指定的CPU或者GPU上的。

Tensors

官网中对“Tensors”的解释是可以看做一个数组。其实Tensor就是流图中的边,数据要“流”过边,就需要适合这个”边”, 或者说”管道”大小. 比如这个边只能有维数为5的数据通过, 那么这个Tensor就是5维度固定. 这样设计的好处是, 维数固定, 运行效率就高. 而且, 在整个流图中, 也有复用的可能.

变量 Variables

同一个值在流图的训练过程中会不断地更新, 这个值就应该作为变量. 比如, 梯度下降中的步长, 集成学习中的权重, 等等… 经常要处理的变量, 在Tensorflow内部结构也比较特殊. 看下图:

untitled
论文 “A Tour of TensorFlow”中对Variable结构的解释.

当一个变量定义时, 其实有三个节点生成. v: 内存中一块自由的缓存变量, i: 用来初始化v的初始值, v’: 一个assign操作把i的值赋给v. 这样, v的值就不封闭在内存中, 而是通过v’提供给流图使用了.

会话 Sessions

会话中运行一些流图, 一个会话中流图变量和另一个会话中流图变量是隔离的. 这种通过对话跑流图的方式, 清晰地隔离变量, 利用已有的CPU, GPU等资源(Tensorflow内部有一套placement算法, 安排哪些节点操作应该跑在哪些CPU或GPU上).

2.  流图执行模型

Tensorflow在执行时需要考虑到效率问题, 特别是多机器, 多CPU,GPU设备的情况.

untitled
多机器, 多设备的执行组件 来自:论文 “A Tour of TensorFlow”

当我们写程序在一个Session中run一个流图. Tensorflow做的是, 从客户端client发一个run的请求给master端, 最后master端发送告诉哪些worker应该跑那些cpu和gpu. 这里的组件: client, master, worker 都是软件层面的. cpu, gpu是硬件层面的.

在实际的硬件传输值的过程中, TensorFlow内部还会自动添加一些节点操作:

untitled
实际场景中TensorFlow会添加send和recv操作节点. 来自:论文 “A Tour of TensorFlow”

实际场景中TensorFlow会添加send和recv操作节点. 用来在设备间加一层缓存机制. 当然, (a)是最原始的流图, 也可以使用, 但是不如(b)和(c)来的高效.

3.  流图优化

TensorFlow内部还会对节点计算操作做优化,  如下图把相乘操作简化为平方操作.

untitled
来自:论文 “A Tour of TensorFlow”

对于梯度下降求导, TensorFlow也有自己的一套, 用符号的方法增加操作节点去一步步链接中间值. 大家都记得高数中的复函数求导数吧 ? 就是一个个求下去, 还有许多中间值, 无论如何最后能求出最终值dz/dw:

untitled
来自:论文 “A Tour of TensorFlow”

第一讲的内容抽象编程模型就讲到这里了, 别忘了下次还有更精彩的第二讲: TensorFlow编程接口和TensorFlow可视化的深度理解, 不要错过哦~

 

参考文献:

https://arxiv.org/pdf/1610.01178v1.pdf

附论文下载:

Loader Loading...
EAD Logo Taking too long?

Reload Reload document
| Open Open in new tab

Download [480.27 KB]

发布者

David 9

邮箱:yanchao727@gmail.com 微信: david9ml

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注