TensorFlow没有改变世界。但是,它显然是最棒的,也是现有最便利的深度学习库。本文作者Zachary Chase Lipton是来自加利福尼亚大学计算机科学工程学院的博士生,接受生物医学信息部的资助。他对机器学习的理论基础和实际应用都非常感兴趣。除了大学的研究工作,他还是微软研发实验室的实习生,亚马逊的机器学习科学家,同时还是KDnuggets杂志的特约编辑,以及曼宁出版公司的签约作者。
11月9日,谷歌宣布TensorFlow开源,这是一个在GPU上进行快速梯度式机器学习的巨大数据库。人工智能领域最新的发展也让这个网站散发出神奇的魅力。
一些文章推测TensorFlow会带来一场人工智能革命。许多文章称谷歌的这一举动很大胆,因为Torch(由Facebook人工智能实验室的Ronan Collobert维护)已经提供了相似的深度学习开放资源,同时Yoshua Bengio教授的实验室对Theano(深度学习领域的先驱,一个适合普通大众的革命性软件)已经进行了长期的维护开发。在Wired的一篇文章中,Cade Metz把TensorFlow描述成谷歌的「人工智能引擎」。这篇文章讲的是进行线性代数和求导计算的开源数据库,甚至标题也十分夸张。许多其他新闻报道中,却对谷歌把代码设为公开资源感到惊诧。
从更加技术的一方来看,从夸张的赞扬到泼冷水,各种反响都有。Soumith Chintala发布了一套应对所有竞争软件包的标准,为人们提供了一种定量的评价,它显示TensorFlow的首个版本落后于Torch和Caffe,特别在卷积神经网络方面。正如Jeff Dean 和Oriol Vinyals在2015年的NIPS(Neural Information Processing Systems)会议上披露的,跑分让人失望主要是因为英伟达(NVIDIA) 的CUDA深层神经网络库( CUDA Deep Neural Network library )底层版本和对其他工具底层调用的uDNN库版上有区别,如果采取类似的cuDNN版本,则TensorFlow的跑分会是很有竞争力。
Matt Mayo,一名研究生、KDnuggests网站成员,写过一篇著名文章,表达了对TensorFLow失望。文中隐晦提到,他本人并不是深度学习领域的专家,他的意见是,TensorFlow作为资源太简单了,他哀叹,分布式计算的大部分功能没有发挥出来。2015年年初的蒙特利尔NIPS会议上,Dean和Vinyal也指出,TensorFlow应该具有一部分能够支持大型分布式系统的功能。Mayo正确的指出,TensorFlow和Theano或Torch并没有本质的区别。
对TensorFlow评价总体是失望的,但是,我对此并不苟同。就像特斯拉仍是另一个有顶、有方向盘、有四扇门、四个轮子的交通工具,TensorFLow是最好、最便捷的深度学习库,更值得被拣选。TensorFlow, Torch和Theano 都不能代表人工智能的革命。它们都只是简单的库,用来建立和完善梯度式机器学习模型。
如果你以训练模型是为生,那么,能力和可靠性之间的微妙区别仍然会对你的生活质量产生显著影响。在这篇文章里,我将会解释这些库的功能,TensorFlow在哪些微妙而重要的方面看起来很赞,以及它被设计成开放资源的显而易见的原因。我还会进一步解释,为什么我们需要对媒体以及工业界过分狂热的反应保持警醒。
为什么是快速数学?
深度学习通常意味着建立具有很多层的大规模的神经网络。简单地说,这些神经网络都是简单的函数,输入X就会产生输出Y。除了输入X,函数还使用一系列参数(被称为权重),其中包括标量值、向量以及最昂贵的矩阵和高阶张量。
张量是向量的泛化以及更高维度的矩阵。如今流行的特殊函数包括数目庞大、昂贵、可计算的线性代数操作,以及矩阵乘积和卷积操作。在能够训练网络之前,我们定义一个代价函数,常见的代价函数包括回归问题的方差以及分类时候的交叉熵。为了达到网络训练的目的,我们需要连续的将多批的(many batches)新输入投入网络。当每批输入被传递进去,我们根据我们所有的参数来求导得出代价函数值,从而更新整个网络模型。
故而这里马上就出现了一点明显的问题,首先,较大的数字或者张量在一起相乘百万次的处理过程尽管只是一个中等体量的数据集,整个模型代价也是非常大的。其次,手动对一个巨大而丑陋的函数求导本身是一个很痛苦而且耗时非常久的过程,数天甚至数周的求导过程还不如来进行新实验设计。这就是我们为什么需要诸如Theano,Caffe,Torch,以及TensorFlow等库的原因。在Theano事先给出的范式之下,我们可以很简单的使用符号将所有基础操作组成起来定义需要的函数,而导入的Theano库知道如何进行求导。这样的库之后就可以接受符号函数并且在任何可以进行编译的后端下执行编译操作。这些操作可以用于CPU,GPU,或是异构计算的平台。这样的方便之处就在于首先任意一个库你都可以只写预测代码实现前向传播过程,同时框架替你找出如何求导的方法,也就是我们说的后向传播过程。
为何选择TensorFlow?
正如Matt在他的文章中准确指出的那样,TensorFlow不是这个大家庭中的第一位成员,Theano在2010年发表,就在伯克利发布Caffe之后不久,Caffe是一个在C++框架下主要用于卷积神经网络的高性能深度学习库。在这个时期Torch,另一个相似的库,使用自动分化并且有GPU编译能力。更近一步,TensorFlow紧紧跟随着Theano为先驱的界面问世了,TensorFlow的变量行为比较像Theano的共享变量。TensorFlow的占位符也和Theano的符号变量类似。所以究竟关键在哪儿?
首先,TensorFlow选择了正确的语言,正合我意。我喜欢用Python编程。Python写的很快并且具有可读性。在之前提到过的所有的库中,性能相关的代码都是用C++或者Cuda来写的,我则更愿意一门语言提供给我高级的接口方便我容易地进行剩下的工作的集成。使用Python,我能够使用相同的语言来处理数据,访问最强大的开源科学计算工具,并且建立一个网络服务器来为我的工作做个小demo。如果我正在做除了深度许恶习之外绝大部分其他科学计算的工作,我大脑中第一时间迸现的就是寻找一个合适的Python库,我一度很喜欢我曾经从Torch学到的一切并且对Facebook的人工智能研究项目有很深入的了解,但是我对于学习Lua并不感兴趣,并且不喜欢过度学习,比如让学习一门编程语言占据了我绝大部分的研究时间。进一步说,我已经在使用Python的Numpy库上投入了很多精力,使用一个python架构使我的工作变得简单方便。这是只有Python和Theano拥有的属性。(Caffe拥有Python绑定进行模型运行的接口,但是你不可以定义任意的新模型,同时在没写够C++代码的情况下也无法定义自己的神经网络层次。)
第二,TensorFlow在多GPU系统上的运行更为顺畅。虽然之前在Kdnuggets刊登的文章曾称其他人工智能框架也可以在类似环境下运行,但这并不属实。在多个设备间实现间歇或模型的并行工作是比较复杂的。而且,你用Theano工作时仅仅是在一个设备上进行编译。在释译过程改变配置要么无法完成,至少并不是那么容易。相较之下,TensorFlow可以在各类型设备上保证代码运算速度,并且不会发生重启或退出的情况。
第三,TensorFlow的代码编译效率似乎非常令人欣喜。 如果你曾经痴痴地面对Theano框架好几分钟来等它完成代码调整,你就知道我说的是什么了。
第四,TensorFlow社区发展的非常迅速并且异常活跃。我开始观察GitHub上的项目并对此决定深感遗憾。世界上各个角落随时都有不下十人在完善TensorFlow框架。相较之下,尽管我深爱Theano,但时常会被它的不确定性吓到:搞不清是我的代码出了Bug还是Theano的bug。举个栗子。Theano有一个似乎广为人知的bug,每当在调用Scan函数时在函数调用语句里做了生成随机数的操作。函数返回的错误信息并不特别有用,我也没办法知道这个bug啥时能被解决掉,或者能不能被解决。
第五,TensorFlow的组件做的不是一般漂亮,可以生成非常强大的显示网络拓扑结构和性能的可视化图。
简而言之,Theano创造了一种流派。它之于深度学习的代码编译功能就像是福特汽车的发动机。然而TensorFlow的出现无疑像是汽车行业的特斯拉,自成一派。Theano有很多优点,欣慰的是TensorFlow也取其精华。我认为这非常宝贵。TensorFlow在代码编译上有着更快的速度和更好的交互体验。Caffe给卷积神经网络训练提供了非常棒的库,然而它并不能算是模拟和训练神经网络的工具。Torch似乎要推出类似的系统,可以预见未来几年库的竞争会相当激烈。眼下,我还是非常满意Python和Numpy的陪伴。
开源的公认案例
关于谷歌为何开源其深度学习框架TensorFlow的各种猜测甚嚣尘上,然而如果冷静地对库的用途进行分析,那谷歌的意图就显而易见了。实际谷歌仅仅开放了库并不是算法。谷歌不会透露其搜索算法的细节,正如Facebook不会把Torch框架中的训练模型分享出来。为了实力均衡,不论研究人员是否在Theano,Caffe,TensorFlow中做过,都或多或少需要进行重复性工作。目前,谷歌,脸书,微软都在机器学习的领域抢夺人才,对于下一代博士生们而言,带着技术嫁到脸书的Torch平台可能会比在谷歌创造更多生产力和价值。因此,谷歌开放TensorFlow,无疑是为了在这场比赛中扳回一局。
机器学习就像是网页开发
另一些人认为,很多不论是正面还是负面的报道都夸大其词的认为机器学习和网页开发一样依赖库的使用。一些网页开发社区已经导致了库套库的库。这很讨人厌,不仅没必要还造成浪费,更令人担心的是,这种情况导致了一种环境,在该环境中,很多最有用的技术还依赖于瞬息万变的函数库之上。可悲的是,当机器学习从小范围的学术界向商业公司发展时,有些是难以避免的。我希望TensorFlow可以成为最后的机器学习库,毕竟我还需要时间来熟悉它。
本文选自kdnuggets,作者:Zachary Chase Lipton,机器之心编译出品,编译: 小樱、Angulia、妞妞姐姐、柒柒、微胖。