1.5 何为 TensorFlow
下面以一种高层观点来介绍TensorFlow,以帮助读者理解它试图求解的问题。
1.5.1 解读来自官网的单句描述
在TensorFlow的官网上,针对访问者的第一句致辞便是下列(相当含糊的)声明:
TensorFlow is an Open Source Software Library for Machine Intelligence
这句话的下方,即“About TensorFlow”下的一段还有这样一句描述:
TensorFlowTM is an open source software library for numerical computation using data flow graphs.
比起前面的声明,第二个定义更为具体,但对那些数学或技术背景不强的人而言,这可能并非最全面的解释。下面我们对其进行解构。
1.Open Source(开源)
TensorFlow最初是作为谷歌的内部机器学习工具而创建的,但在2015年11月,它的一个实现被开源,所采用的开源协议是Apache 2.0。作为开源软件,任何人都可自由下载、修改和使用其代码。开源工程师可对代码添加功能和进行改进,并提议在未来版本中打算实施的修改。由于TensorFlow深受广大开发者欢迎,因此这个库每天都会得到来自谷歌和第三方开发者的改进。
注意,严格来说,我们只能称之为“一个实现”,而不能说“TensorFlow”被开源。从技术角度讲,TensorFlow是《TensorFlow白皮书》所描述的一个用于数值计算的内部接口,其内部实现仍然由谷歌维护。然而,开源实现与谷歌的内部实现之间的差异是由与其他内部软件的连接造成的,并非谷歌有意“将好东西藏着掖着”。谷歌始终都在不断将内部改进推送到公共代码库。总之,TensorFlow的开源版本包含了与谷歌的内部版本完全相同的功能。
在本书后续内容中,当提到“TensorFlow”时,笔者实际上指的是其开源实现。
2.Library for Numerical Computation(数值计算库)
官网的定义中并未将TensorFlow称为一个“机器学习库”,而是使用了更宽泛的短语“数值计算”。虽然TensorFlow中的确包含一个模仿了具有单行建模功能的机器学习库Scikit-Learn的名为“learn”(也称“Scikit Flow”)的包,但需要注意的是,TensorFlow的主要目标并非是提供现成的机器学习解决方案。相反,TensorFlow提供了一个可使用户用数学方法从零开始定义模型的函数和类的广泛套件。这使得具有一定技术背景的用户可迅速而直观地创建自定义的、具有较高灵活性的模型。此外,虽然TensorFlow为面向机器学习的功能提供了广泛支持,但它也非常适合做复杂的数学计算。然而,由于本书重点讨论机器学习(尤其是深度学习),因此下面主要讲述如何利用TensorFlow创建“机器学习模型”。
3.Data Flow Graphs(数据流图)
TensorFlow的计算模型是有向图(directed graph),其中每个节点(通常以圆圈或方框表示)代表了一些函数或计算,而边(通常以箭头或线段表示)代表了数值、矩阵或张量。
数据流图极为有用的原因如下。首先,许多常见的机器学习模型,如神经网络,本身就是以有向图的形式表示的,采用数据流图无疑将使机器学习实践者的实现更为自然。其次,通过将计算分解为一些小的、容易微分的环节,TensorFlow能够自动计算任意节点关于其他对第一个节点的输出产生影响的任意节点的导数(在TensorFlow中称为“Operation”)。计算任何节点(尤其是输出节点)的导数或梯度的能力对于搭建机器学习模型至关重要。最后,通过计算的分解,将计算分布在多个CPU、GPU以及其他计算设备上更加容易,即只需将完整的、较大的数据流图分解为一些较小的计算图,并让每台计算设备负责一个独立的计算子图(此外,还需一定的逻辑对不同设备间的共享信息进行调度)。
补充:何为张量?
简而言之,张量是一个n维矩阵。因此,2阶张量等价于标准矩阵。从可视化的角度,若将m×m的矩阵视为方形数组(m个数字高,m个数字宽),则可将m×m×m的张量视为立方数组(m个数字高,m个数字宽,m个数字深)。一般而言,如果读者更熟悉矩阵数学,完全可以按矩阵的方式来看待张量。
1.5.2 单句描述未体现的内容
虽然短语“open source software library for numerical computation using data flow graphs”的信息密度非常大,但并未涵盖那些真正使TensorFlow作为机器学习库脱颖而出的重要方面。下面列出一些成就TensorFlow的重要组成。
1.分布式功能
上文在介绍数据流图时间接提到,TensorFlow的设计目标之一是在多台计算机以及单机多CPU、单机多GPU环境中具有良好的可伸缩性。虽然,最初的开源实现在发布时并不具备分布式功能,但自0.8.0版本起,分布式运行时已成为TensorFlow内置库的一部分。虽然这个最初版本的分布式API有些臃肿,但它极其强大。大多数其他机器学习库尚不具备这样的功能,尤其值得注意的是,TensorFlow与特定集群管理器(如Kubernetes)的本地兼容性正在得到改善。
2.软件套件
虽然“TensorFlow”主要是指用于构建和训练机器学习模型的API,但TensorFlow实际上是一组需配合使用的软件:
TensorFlow是用于定义机器学习模型、用数据训练模型,并将模型导出供后续使用的API。虽然实际的计算是用C++编写的,但主要的API均可通过Python访问。这使得数据科学家和工程师可利用Python中对用户更为友好的环境,而将实际计算交给高效的、经过编译的C++代码。TensorFlow虽然也提供了一套可执行TensorFlow模型的C++API,但在本书编写之时它还具有较大的局限性,因此对大多数用户都是不推荐的。
TensorBoard是一个包含在任意标准TensorFlow安装中的图可视化软件。当用户在TensorFlow中引入某些TensorBoard的特定运算时,TensorBoard可读取由TensorFlow计算图导出的文件,并对分析模型的行为提供有价值的参考。它对概括统计量、分析训练过程以及调试TensorFlow代码都极有帮助。学会尽早并尽可能多地使用TensorBoard会为使用TensorFlow工作增添趣味性,并带来更高的生产效率。
TensorFlow Serving是一个可为部署预训练的TensorFlow模型带来便利的软件。利用内置的TensorFlow函数,用户可将自己的模型导出到可由TensorFlow Serving在本地读取的文件中。之后,它会启动一个简单的高性能服务器。该服务器可接收输入数据,并将之送入预训练的模型,然后将模型的输出结果返回。此外,TensorFlow Serving还可以在旧模型和新模型之间无缝切换,而不会给最终用户带来任何停机时间。虽然Serving可能是TensorFlow生态系统中认可度最低的组成,它却可能是使TensorFlow有别于其他竞争者的重要因素。将Serving纳入生产环境可避免用户重新实现自己的模型——他们只需使用TensorFlow导出的文件。TensorFlow Serving完全是用C++编写的,其API也只能通过C++访问。
笔者相信,只有深入了解上述所有软件之间的联系,并熟练掌握它们的联合使用方法,方可真正使TensorFlow物尽其用。因此,本书会涵盖上述三个软件的用法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论