当前位置:首页 > 工程资源 > 正文

架构图还是构架图?架构图

  中生代技术第52期分享

  分享嘉宾:刘光聪

  中生小编预告:中生代技术年度大会上海站将在2017年3月11号举行,请扫描下面二维码关注中生代技术公众号了解详细信息。

中生代技术公众号

  

  祝大家在2017年有新的收获。非常感谢大家在春节前夕依然还坚持参加中生代技术的分享活动,也感谢中生代提供的强大的分享平台。 我是刘光聪,来自于中兴通讯技术规划部,关注敏捷软件开发,从事机器学习算法研究,目前负责AI平台架构与设计。 今天我给大家分享的题目是:剖析TensorFlow架构与设计之编程模型。其目标是对深度学习有一个初步的了解,了解TensorFlow的基本编程模型,及其掌握TensorFlow的几个重要概念。

  

  今天我的分享主要包括3个部分,简单介绍TensorFlow的架构;理解计算图的工作原理;通过Mnist实战,了解TensorFlow编程模型。

  

  

  TensorFlow在跨平台,通用性,分布式, 可扩展性,可视化等方面优势非常明显。

  

  TensorFlow是一种典型的基于符号编程的数值计算框架,从总架构上分为两层:

1. 前端:负责计算图的构造,支持多语言,其中Python提供的 API最为成熟;

2. 后端:负责计算图的执行,使用C++实现,直接操作分布式的CPU/GPU环境。

  

  

  计算图是TensorFlow最重要的领域概念,OP代表节点,Tensor代表边; 数据从节点流入,通过OP运算,从节点流出,并做为下一节点的输入,TensorFlow的命名由此而来。

  

  OP用于表示计算图的一个节点,完成某种抽象的计算。

  

  TensorFlow支持丰富的OP集合,并且支持OP的扩展。

  

  OP通过OP构造器(OP Constructor)生成OP实例,该工厂具有副作用,它将该OP实例注册到计算图中。 此时用户对图实例无感知,因为其上下文存在一个默认的图实例。

  

  OP的输入和输出以Tensor的形式传递,支持三种基本类型。

  

  描述OP可以通过三个维度描述:

1. 类型

2. Tensor的Shape:维度,及其每一维度的大小

3. 约束:例如默认值,允许的值列表

  

  以placeholder的OP为例,该OP是一个特殊的OP,它没有输入,只有输出。而且,他的类型为确定,待用户在构造OP是确定,可以看成一个「泛型编程」的过程。

  

  这是placeholder OP的构造器(constructor),或称为工厂。调用OP时,指定OP的属性,从而确定OP的基本规格。该过程类似于C++模板实例化,但还未生成对象实例(直至执行计算图阶段)。

  

  Operation描述了OP的接口(类型,约束,属性,设备等),Kernel是针对具体设备类型,或者数据类型,Tensor的维度及大小的某种具体实现。典型地,OP会有GPU实现的Kernel,及其CPU实现的Kernel 。 这是一种典型的多态设计(区别于编程语言的多态)。

  

  Tensor表示计算图的边实例,表示OP之间的数据流方向。

  

  Tensor可以通过三元组描述:(Type, Rank, Shape)。

  

  查看源代码(简化之后),其Protobuf是如此描述Tensor的,其很好地形式化描述了Tensor的本质。

  

  在计算图中,存在两种类型的边:

1. 正常的边:用于传递Tensor;

2. 特殊的边:用于控制依赖。

  

  控制依赖是一种构建复杂网络模型的重要工具,它表示OP之间执行的依赖关系。

  

  当前上下文,维护了一个指向default graph的指针;也就是说,在任何一个时刻,在上下文中都存在一个默认的图实例。 图实例包括两类:

1. 隐式的图实例

2. 显式的图实例

  

  前者的OP注册到隐式的图实例,后者的OP注册到显式的图实例中。

  

  OP命名的层次化是一种搭建复杂网络的重要工具。例如,将OP看成西安市,那么如何从地球中找到它呢? 首先,通过世界地图,先找到亚洲,然后找到中国,然后再找到陕西,最后才找到西安。 当搭建复杂的网络模型时,OP命名的层次化,对于OP定位是非常有用的。

  

  可以指定OP的设备类型,当执行计算图时,该OP会被分配到指定的设备上执行运算。

  

  默认图实例(Default Graph),OP命名的层次化(Name Scope),指派设备(device)等机制,实际是由Context Manager管理,保证在某一个时刻,存在唯一的默认图实例,及其当前的Scope,及其当前的Device等等。

  

  总结一下,TensorFlow是一种基于符号的编程模式,前端完成计算图的构造,后端完成计算图的执行。

  

  这里举一个简单的例子,x表示模型的输入,y_表示模型的输出(Labels);定义了W, b两个训练参数,然后使用matmul的OP,及其add的OP完成权重的线性求和,最后使用ReLU的激活函数,搭建了第一层网络模型。 其中C代表后续的网络层次。

  

  上述代码实现,构造了如上图所示的计算图实例。

  

  通过建立一个Session,使用Mini-Batch算法实现该模型的训练。很显然,计算图被构造依次,但被执行了多次(一次一个Batch)。

  

  这是使用Protobuf描述计算图的领域模型。

  

  这是前端(Python)的领域模型。

  

  这是后端的领域模型。

  

  Session是Client与计算服务的桥梁,是一种资源,使用完成后保证被关闭;session.run建立了一个瞬时的闭包,该闭包针对于该次Batch,依次传递Tensor,完成整个计算的过程,然后再将梯度反传,最后完成参数的更新。 每个子图只会构造依次,但可能被执行多次。Tensor在OP之间传递,其生命周期仅对当前批次有效,对下一个Mini-Batch无效。

  

  其中,Feed代表模型的输入,Fetch代表模型的输出。

  

  变量是一种特殊的OP,它维持一个Tensor的句柄,变相地延长了该Tensor的生命周期。

  

  变量在使用之前,都需要使用初始化的OP进行初始化。例如,W使用tf.zeros的初始化OP进行初始化为0值。

  

  存在一些语法糖,可以方便地对变量进行初始化(组合模式)。

  

  犹如C++全局变量初始化的依赖关系,TensorFlow变量之间的初始化依赖关系需要特殊的处理。

  

  可以使用Stateful的OP操作变量,完成变量状态的变更。

  

  通过变量分组,可以方便对变量进行分组管理。例如,可以快速获取出所有训练参数的集合。

  

  接下来,通过Mnist的实战,加深 理解TensorFlow的编程模型。实战包括两种网络模型的实践:

1. 单层网络(Softmax)

2. 多层网络(2层网络)

  

  特征提取,因为只是Demo示例,这里简单地按照像素进行特征的提取。

  

  训练样本集的示意图,它是一个二维的Tensor。

  

  这是训练样本的标签集合(Labels),采用One-hot形式的特征描述 。

  

  首先描述模型的输入和输出,其中None表示batch_size,待seesion.run的Feed提供。

  

  然后定义模型的训练参数集合,并定义变量初始化OP,用于在执行阶段完成变量的初始化。

  

  这里定义了Mnist的Softmax单层网络模型。

  

  然后定义交叉熵的损失函数,并使用随机梯度下降算法优化该损失函数,使得损失函数最小化。

  

  然后建立一个会话,使用Mini-Batch算法,完成模型的训练。 」

  

  当完成模型的驯良后,可以使用测试数据集对模型进行测试,输出模型的精度。

  

  接下来,通过搭建两层网络模型实现Mnist。其中,通过计算图的4个基本子图,显式地增强模型设计的可理解性。

- Inference:仅完成推理,仅仅包括前向计算过程;

- Loss:构建损失函数,计算损失;

- Training:根据损失,反向传递梯度,然后更新权重,直到模型收敛;

- Evaluation:评估模型的精度

  

架构图还是构架图?架构图  第1张

  这里搭建了两层的网络模型: 第一层:ReLU 第二层:Softmax

  

  这是推理的主要逻辑,定义了两层网络。

  

  使用交叉熵定义损失函数。

  

  使用随机梯度下降算法最小化损失函数 。

  

  使用evaluation评估网络模型的精度。

  感谢大家的耐心阅读,如果您对TensorFlow的架构与设计感兴趣,请持续关注我后续关于TensorFlow源代码的剖析,谢谢。

  

  参考资料,网络上已经很丰富了,在此不在重述了。当然,阅读源代码,是获取最权威的知识的最佳途径。

  

  最后,欢迎大家关注我的「简书」,直接搜索「刘光聪」,我主要关注敏捷软件开发,机器学习算法,也欢迎大家给我更多的指点,谢谢。

问答环节

  Q1. 对TensorFlow的集群化搭建有何建议?

  A1. TensorFlow的分布式架构已经超过本次分享的内容,希望争取下次机会再组织一次关于分布式架构与工作机制,实践应用的分享。

  其中,在讲义的最后一节,有一个关于TensorFlow分布式的简单介绍,请查阅:

  http://www.jianshu.com/p/a857743c7095

  TensorFlow分布式的简单介绍

  识别二维码直达光聪的简书地址

  Q2. 我可以理解为TensorFlow是一个张量为具体参数的数值计算框架吗?有没有张量为闭包的数值计算框架?我对TensorFlow感兴趣主要是因为它底层是C++实现,我认为可能会比较高效。

  A2. TensorFlow是一个通用的,分布式的数值计算框架,是业界关注最为广泛的深度学习框架;其中,Tensor是TensorFlow的一个重要数据结构,它是一个特定类型,任意维度,且每个维度任意大小的高维数组。

  TensorFlow的前端支持多语言编程,而后端使用C++实现,直接操作CPU/GPU硬件,性能是其考虑的重要因素。

  Q3. 请问机器学习是不是必须是数学专业?

  A3. 机器学习是一个多学科交叉的领域,它是人工智能的一个重要分支。当然,机器学习的确需要一定的数学基础,例如线性代数,微积分,概率论与数理统计。

  推荐https://github.com/exacity/deeplearningbook-chinese第一部分关于数学基础的概括性介绍。

  Github上链接,第一部分关于数学基础的概括性介绍。

  识别二维码直达

  Q4. 请问中兴通讯在机器学习在哪些领域上应用?

  A4. 智能运维,终端,IoT,智能家居等方面都要相关应用。

  Q5. 训练过程能否将状态持久化到硬盘…

  A5. TensorFlow支持Checkpoint的特性,请参阅https://www.tensorflow.org/versions/master/how_tos/variables/#checkpoint_files

  Checkpoint官网介绍

  识别二维码直达

致谢为知识赞赏的朋友

  —

  —

  

  

  鸣谢

  致谢为知识打赏的以上群友,祝鸡年大吉,更上层楼

  —

  —

  为庆祝中生代成立一周年,也为了答谢长期支持的朋友们,中生代技术联合iTechPlus在上海举行年度大会

  

  

  戳原文,查看光聪简书!

发表评论