最近,TensorFlow 2.0正式发布,各大公众号和网站纷纷推出了一系列文章,仿佛机器学习领域即将迎来翻天覆地的变化。然而,从我个人的角度来看,当前阶段TensorFlow 2.0对工业界开发者的影响并不是那么显著。
首先,我们回顾一下TensorFlow 2.0的发展历程:
整个发布过程历时近一年,期间经历了大量的版本更新和技术改进。主要原因包括版本功能变化较大、生态系统复杂(例如,tf-lite至今仍有许多算子不被支持)、以及代码迁移工作量巨大等。但更为重要的原因是,TensorFlow的设计理念发生了根本性的变化。
接下来,我将分享一下我对TensorFlow 1.x和2.x设计理念的理解。
学习TensorFlow 1.x版本时,接触最多的是张量图的概念。实际上,TensorFlow之所以被称为TensorFlow,是因为张量在图中的流动和转换。各种神经网络模型最终都可以抽象成一张具有输入和输出的张量图,然后通过定义损失函数和优化器进行训练。这种设计理念与神经网络建模高度契合。
在学习过程中,张量图的设计理念显得尤为重要。很多人认为TensorFlow 1.x难学且使用不便,如placeholder和session等概念。但我认为,这些对程序员而言并不是问题。至于使用不便的说法,我觉得并非完全如此。对于简单的模型,Keras确实能更快地进行建模和训练;但对于复杂的模型,如多个输入和多个嵌入特征的情况,TensorFlow则更加方便。总体而言,TensorFlow牺牲了一定的易用性,但保证了其通用性。
同时,TensorFlow设计之初便旨在成为一种功能强大的工具,拥有丰富的功能,如循环、条件语句甚至字符串处理等。
TensorFlow 2.0特别推崇Keras接口和Estimator的使用。对于经典和简单的模型,使用Keras接口可以快速实现模型的构建和训练,只需几行代码即可完成。这是因为框架本身已经做了大量工作,减轻了开发者的负担。但对于稍微复杂一些的模型,如果需要在官网示例基础上进行修改,则可能会遇到各种问题。
Keras接口和Estimator形式将是TensorFlow未来发展的重点,但目前看来还不够稳定。
我个人认为,TensorFlow 2.0的设计理念可以概括为“Layer Flow”,即层与层之间的流动。面向开发者时,模型被抽象为一层一层的神经网络,这在一定程度上隐去了张量的概念,使得开发者难以理解神经网络的本质。然而,从本质上讲,框架外部仍然是张量图,其目的是使框架更易用,减少开发者的负担。但这样做可能在某种程度上“误导”了开发者。
在Alpha版发布后,我们尝试将TensorFlow 1.x下的实体识别模型训练代码迁移到TensorFlow 2.0,并进行了初步调研。在此过程中,遇到了两个主要问题:
因此,我们当时放弃了迁移工作。目前,第一个问题尚未解决。我们仍然将继续使用TensorFlow 1.x版本,但从长远来看,Google可能会逐渐减少对1.x版本的支持,届时我们将转向PyTorch的学习和使用。