故而这里马上就出现了一点明显的问题,首先,较大的数字或者张量在一起相乘百万次的处理过程尽管只是一个中等体量的数据集,整个模型代价也是非常大的。其次,手动对一个巨大而丑陋的函数求导本身是一个很痛苦而且耗时非常久的过程,数天甚至数周的求导过程还不如来进行新实验设计。这就是我们为什么需要诸如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、妞妞姐姐、柒柒、微胖。