浅析Google人工智能系统TensorFlow

2016年3月份,Google的围棋人工智能程序AlphaGo以4比1的大比分,战胜人类选手李世石,在全球成功引起广泛关注,引起了一波人工智能的热潮。从智能手机的语音助手,到相机的人脸识别,人工智能技术已经进入到我们生活的方方面面,在未来将深刻的影响我们的生活。为了加速深度学习领域的发展,2015年11月9日,Google发布深度学习框架TensorFlow并宣布开源。在短短的一年时间内,在GitHub上,TensorFlow就成为了最流行的深度学习项目。

背景及概述

关于TensorFlow,截至今天,短短的两年内,其 GitHub 库大约 845 个贡献者共提交超过 17000 次。

详细的来说,TensorFlow 是一个开源的、基于 Python 的机器学习框架,由 Google Brain 团队为深度神经网络(DNN)开发的功能强大的开源软件库,在 Apache 2.x 协议许可下可用,并在图形分类、音频处理、推荐系统和自然语言处理等场景下有着丰富的应用,是目前最热门的机器学习框架。

Google在很多年前就已经开始把深度学习的技术应用到很多产品当中,在这个过程当中,Google也迭代、开发了好几代支持深度学习的软件系统, TensorFlow现在已经演化成一个相当完整的深度学习软件开放平台。

TensorFlow的应用场景

TensorFlow有诸多应用场景,例如: TensorFlow支持多种硬件的平台, 比如说,它支持CPU、GPU混合搭建的数据中心的训练平台,它也支持将数据中心训练好的模型,相对便捷地部署到不同的移动端应用上,可以支持类似Google自主研发的TPU处理器; TensorFlow支持多种开发环境: 支持多种硬件的平台是基础,TensorFlow一直以来的一个目标,就是能够帮助尽量多的开发者,能够把深度学习的技术利用起来,最终使得广大的用户从中能力得到益处,基于这个想法,TensorFlow一直很重视多种程序员开发环境的支持。比如说,开发者可以在主要的开发环境中使用TensorFlow。TensorFlow在Google内部的应用推广是非常全面和彻底的,比如说TensorFlow很早就帮助Google的核心业务(搜索和广告),实施了深度学习的模型,并且在核心业务上体现了它的性能。在垃圾邮件过滤中,Google也使用了TensorFlow训练的模型,同时在安卓的应用程序推荐上,也上线了TensorFlow的模型等等。TensorFlow深入移动端,

任何曾经试图在 Python 中只利用 NumPy 编写神经网络代码的人都知道那是多么麻烦。编写一个简单的一层前馈网络的代码尚且需要 40 多行代码,当增加层数时,编写代码将会更加困难,执行时间也会更长。TensorFlow 使这一切变得更加简单快捷,从而缩短了想法到部署之间的实现时间。

就TensorFlow的原理而言 ,TensorFlow 允许将深度神经网络的计算部署到任意数量的 CPU 或 GPU 的服务器、PC 或移动设备上,且只利用一个 TensorFlow API。相较于其他的深度学习库而言,如 Torch、Theano、Caffe 和 MxNet,包括 TensorFlow 在内的大多数深度学习库能够自动求导、开源、支持多种 CPU/GPU、拥有预训练模型,并支持常用的NN架构,如递归神经网络(RNN)、卷积神经网络(CNN)和深度置信网络(DBN)。

TensorFlow 则还有更多的特点,如下:支持所有流行语言,如 Python、C++、Java、R和Go;可以在多种平台上工作,甚至是移动平台和分布式平台;它受到大多数主流云计算服务平台(AWS、Google和Azure)的支持;Keras——高级神经网络 API,已经与 TensorFlow 整合;与 Torch/Theano 比较,TensorFlow 拥有更好的计算图表可视化;允许模型部署到工业生产中,并且容易使用;有非常好的社区支持;TensorFlow 不仅仅是一个软件库,它是一套包括 TensorFlow,TensorBoard 和 TensorServing 的软件。

谷歌 research 博客列出了全球一些使用 TensorFlow 开发的有趣项目:Google 翻译运用了 TensorFlow 和 TPU(Tensor Processing Units);Project Magenta 能够使用强化学习模型生成音乐,运用了 TensorFlow;澳大利亚海洋生物学家与来自昆士兰大学(Queensland University)的计算机科学家合作,使用了 TensorFlow 来发现和理解濒临灭绝的海牛;一位日本农民运用 TensorFlow 开发了一个应用程序,使用大小和形状等物理特性对黄瓜进行分类;在医学领域,发射科的医生通过采用TensorFlow,使其在医学扫描中能够识别帕金森病的迹象。湾区的数据科学家在树莓派上使用TensorFlow来追踪记录加州火车的动态。

为了更好地理解TensorFLow,首先要明白Tensorflow 不是一个普通的 Python 库,大多数 Python 库被编写为 Python 的自然扩展形式。当开发者导入一个库时,开发者得到的是一组变量、函数和类,它们补充并扩展了代码“工具箱”。 Python 和 Tensorflow 之间的联系,可以类比 Javascript 和 HTML 之间的关系。Javascript 是一种全功能的编程语言,可以实现各种出色的效果。HTML 是用于表示某种类型的实用计算抽象(这里指的是可由 Web 浏览器呈现的内容)的框架。Javascript 在交互式网页中的作用是组装浏览器看到的 HTML 对象,然后在需要时通过将其更新为新的 HTML 来与其交互。与 HTML 类似,Tensorflow 是用于表示某种类型的计算抽象(称为“计算图”)的框架。当开发者用 Python 操作 Tensorflow 时,开发者用 Python 代码做的第一件事是组装计算图。之后第二个任务就是与它进行交互(使用 Tensorflow 的“会话”)。但重要的是,要记住计算图不在变量内部,它处在全局命名空间内。莎士比亚曾经说过:“所有的 RAM 都是一个阶段,所有的变量都只不过是指针。”

TensorFlow的技术细节

Tensorflow的第一个关键抽象:计算图。计算图实质上是一个全局数据结构:计算图是一个有向图,捕获有关计算方法的指令。第二个关键抽象:会话。会话的作用是处理内存分配和优化,使开发者能够实际执行由图形指定的计算。可以将计算图想象为我们想要执行的计算的“模板”:它列出了所有的步骤。为了使用这个图表,开发者还需要发起一个会话,它使开发者能够实际地完成任务。例如,遍历模板的所有节点来分配一组用于存储计算输出的存储器。为了使用 Tensorflow 进行各种计算,我们既需要图也需要会话。会话包含一个指向全局图的指针,该指针通过指向所有节点的指针不断更新。这意味着在创建节点之前还是之后创建会话都无所谓。创建会话对象后,可以使用 sess.run(node) 返回节点的值,并且 Tensorflow 将执行确定该值所需的所有计算。

Tensorflow 仅通过必需的节点自动路由计算这一事实是它的巨大优势。如果计算图非常大并且有许多不必要的节点,它就能节约大量运行时间。它允许我们构建大型的“多用途”图形,这些图形使用单个共享的核心节点集合根据采取的计算路径来做不同的任务。对于几乎所有应用程序而言,根据所采用的计算路径考虑 sess.run() 的调用方法是很重要的。关于变量和副作用,对Tensorflow而言,了解变量对于使用进行深度学习来说至关重要,因为模型的参数就是变量。在训练期间,你希望通过梯度下降在每个步骤更新参数,但在计算过程中,开发者希望保持参数不变,并将大量不同的测试输入集传入到模型中。模型所有的可训练参数很有可能都是变量。

为了进一步了解TensorFlow,下面进行对TensorFlow的一些简介:

张量和图:

TensorFlow 是一种采用数据流图(data flow graphs),用于数值计算的开源软件库。其中 Tensor 代表传递的数据为张量(多维数组),Flow 代表使用计算图进行运算。数据流图用「结点」(nodes)和「边」(edges)组成的有向图来描述数学运算。「结点」一般用来表示施加的数学操作,但也可以表示数据输入的起点和输出的终点,或者是读取/写入持久变量(persistent variable)的终点。边表示结点之间的输入/输出关系。这些数据边可以传送维度可动态调整的多维数据数组,即张量(tensor)。在 Tensorflow 中,所有不同的变量和运算都是储存在计算图。所以在我们构建完模型所需要的图之后,还需要打开一个会话(Session)来运行整个计算图。在会话中,我们可以将所有计算分配到可用的 CPU 和 GPU 资源中。

常量和变量:

TensorFlow 中最基本的单位是常量(Constant)、变量(Variable)和占位符(Placeholder)。常量定义后值和维度不可变,变量定义后值可变而维度不可变。在神经网络中,变量一般可作为储存权重和其他信息的矩阵,而常量可作为储存超参数或其他结构信息的变量。

占位符和feed_dict

我们已经创建了各种形式的常量和变量,但 TensorFlow 同样还支持占位符。占位符并没有初始值,它只会分配必要的内存。在会话中,占位符可以使用 feed_dict 馈送数据。feed_dict 是一个字典,在字典中需要给出每一个用到的占位符的取值。在训练神经网络时需要每次提供一个批量的训练样本,如果每次迭代选取的数据要通过常量表示,那么 TensorFlow 的计算图会非常大。因为每增加一个常量,TensorFlow 都会在计算图中增加一个结点。所以说拥有几百万次迭代的神经网络会拥有极其庞大的计算图,而占位符却可以解决这一点,它只会拥有占位符这一个结点。

TensorFlow中的神经网络:

输入数据集,数据集分为训练数据集和标注、测试数据集和标注(包括验证数据集和标注)。测试和验证集能赋值到constant() 中,而训练集可以导入 tf.placeholder() 中,训练集只有导入占位符我们才能在随机梯度下降中成批量地进行训练。确定神经网络模型,该模型可以是简单的一层全连接网络或 9 层、16 层的复杂卷积网络组成。网络定义的权重矩阵和偏置向量后需要执行初始化,每一层需要一个权重矩阵和一个偏置向量。构建损失函数,并计算训练损失。模型会输出一个预测向量,我们可以比较预测标签和真实标签并使用交叉熵函数和 softmax 回归来确定损失值。训练损失衡量预测值和真实值之间差距,并用于更新权重矩阵。优化器,优化器将使用计算的损失值和反向传播算法更新权重和偏置项参数。

TensorFlow中的深度神经网络:

LeNet5 由两个卷积层加上三个全连接层组成,因此它是一种浅层神经网络。卷积神经网络最出名的就是 2012 年所提出的 AlexNet、2013 年的 7 层 ZF-Net 和 2014 年提出的 16 层 VGGNet。到了 2015 年,谷歌通过 Inception 模块开发出 22 层的卷积神经网络 (GoogLeNet),而微软亚洲研究院创造出了 152 层的卷积神经网络:ResNet。

Google I/O上的TensorFlow

在2017年Google I/O开发者大会上,同时提出的还有Google Tensor Lite。TensorFlow Lite 是 TensorFlow 移动和嵌入式设备轻量级解决方案。它使设备机器学习具有低延迟和更小的二进制体积。TensorFlow Lite 同时支持 Android 神经网络 API的硬件加速。TensorFlow Lite 使用多项技术降低延迟,例如移动 app 内核优化、pre-fused 激活、允许更快更小(定点)模型的量化内核。关于TensorFlow Lite 所包含的内容,有以下几点:

  • 支持一系列量子和浮点的核心运算符,并针对移动平台进行了优化。它结合 pre-fused 激活和其他技术来进一步提高性能和量化精度。此外,TensorFlow Lite 还支持在模型中使用自定义操作。
  • TensorFlow Lite 基于FlatBuffers定义了一个新的模型文件格式。FlatBuffers 是一个开源的高效的跨平台序列化库。它与 protocol buffers类似,但主要区别是 FlatBuffers 常与 per-object 内存分配相结合在您直接访问数据时不需要再次解析包。此外,FlatBuffers 的代码体积比 protocol buffers 小很多。
  • TensorFlow Lite 拥有一个新的移动设备优化的解释器保证应用程序的精简和快速。解释器使用静态图形排序和自定义(less-dynamic)内存分配器来确保最小的负载,初始化和执行延迟。
  • TensorFlow Lite 针对支持的设备提供了一个利用硬件加速的接口。通过 Android 神经网络库,作为 Android O-MR1 的一部分发布。

结语

TensorFlow 是一个人人都触手可及的完全开源的机器学习框架,适用于众多领域,在研究工作以及实际产品开发中都能发挥重要的作用。Google还赋予了 TensorFlow 很快的运行速度,并使其能适应更多的应用领域。举例来说,清华大学自然语言处理实验室的研究人员已通过 TensorFlow 来加强他们对语言理解的研究工作;而像京东、小米等众多中国企业也在使用 TensorFlow。与此同时,在中国的初创公司当中,也有不少 TensorFlow 的使用者,CastBox就是其中之一。CastBox开发的播客应用程序利用 TensorFlow 对他们的用户偏好进行分析,并向听众提供个性化的推荐。

简而言之,TensorFlow 是一个端到端开源机器学习平台。它拥有一个包含各种工具、库和社区资源的全面灵活生态系统,可以让研究人员推动机器学习领域的先进技术的发展,并让开发者轻松地构建和部署由机器学习提供支持的应用。除此之外,TensorFlow可以轻松地构建模型,随时随地进行可靠的机器学习生产,以及实现强大的研究实验。

尽管人工智能已被越来越多的开发者们应用于前沿研究,或产品及服务的开发当中,但这仅仅是人工智能无限的潜力的冰山一角。人工智能的神奇之处,在于它能被应用在医疗保健、交通运输和环境保护等方方面面,为复杂的社会问题探寻解决方案。如今,在人工智能的协助下,人们得以探索全新的研究领域,开发创新的产品,让数以百万计的人类从中获益。