我喜欢参加在西班牙马德里举办的机器学习见面会,也算是西班牙马德里TensorFlow小组和机器学习(Machine Learning)小组的常客,在自动无人驾驶车(Self-Driving Car)课程开设以前就经常参加这里的见面会,不过那是另一回事了。在闲暇之余,我经常听到人们谈论深度学习,比如“我该从哪里开始呢?TensorFlow是现在最流行的吧?”、“我听说Caffe很常用,但感觉有点难了”等。
由于在BEEVA Labs的缘故,我们常常需要应对许多不同的深度学习库,我觉得把我们的发现和感想分享出来,帮助那些刚刚进入深度学习这个美丽世界的人,将会十分有意思。
让我们开始吧!
TensorFlow
对于那些对深度学习有一定的了解、尚不专业的人来说,TensorFlow无疑是他们的最爱。但是在此,我要揭开深度学习的神秘面纱。
在官网上,TensorFlow被定义为“一个用于机器智能的开源软件库”。但是我觉得更应该这么定义:TensorFlow是一个使用数据流图进行数值计算的开源软件库。在这里,TensorFlow并没有包含于“深度学习框架”内,而是和Theano一起被归纳为“图编译器”的类别。
在结束了优达学城(Udacity)的深度学习课程之后,我感觉TensorFlow虽然是一个非常好的框架,但是却很低层。使用TensorFlow需要写大量的代码,你必须一遍又一遍的重复不必要的工作。而且我并不是唯一一个这么想的人。安德烈·卡帕西( Andrej Karpathy )就曾在Twitter上多次吐槽:
Andrej Karpathy: 我希望TensorFlow能够使我们的代码走向标准化,但TensorFlow的水平很低,所以我们在其上层分离出了:Slim、PrettyTensor、Keras、TFLearn...
Andrej Karpathy: 例如:我们虽然在OpenAI上使用了TensorFlow,但是我们都似乎更喜欢基于TensorFlow的其它框架,有些甚至自定义代码。唉!
几个月前,我去参加了“Google Experts Summit: TensorFlow,Machine Learning for everyone, with Sergio Guadarrama”。塞里戈(Serigo)是开发TensorFlow的一位工程师,但是他在会上并没有展示TensorFlow,而是展示了一个在TensorFlow基础上工作的更高层的库tf.contrib。这给我的感觉是:他们内部已经意识到,如果想要让更多的人使用TensorFlow,就需要以更高更抽象的水平在其基础上创建更多的层级,从而简化TensorFlow的使用。
TensorFlow支持Python和C++,也允许在CPU和GPU(多数情况下是同步的)上进行布式计算,甚至也支持使用gRPC进行水平扩展。
总结:TensorFlow 非常好,但你必须知道它好在哪里。如果你不想什么事都自己手动去做,也不想重复某些不必要的劳动,可以使用更简单的库(推荐 Keras)。
Theano
Theano是最老牌和最稳定的库之一。据我所知,深度学习库的开端不是Theano就是Caffe。
和TensorFlow的风格类似,Theano也是一个低层库。也正因为如此,它并不适合深度学习,而是更适合数值计算优化。它支持自动的函数梯度计算,带有Python接口,并集成了Numpy,这让它从一开始就成为了深度学习领域最通用的库之一。
现在,虽然Theano的性能依然不错,但是由于它不支持多GPU和水平扩展,在TensorFlow的浪潮下已经开始渐渐被遗忘了。
Keras
“You have just foundKeras.”
你打开文档页面时看到的第一句话就是上面这句。我记得我第一次发现Keras的时候,正在柏林解决Data Science Retreat的最后一个项目。刚起步时,我就已经具备了足够的深度学习的知识,但是我没有时间手动编写东西,也没有时间探索和学习一个新的库(截止时间不到两个月,同时我还要上课)。接着,我发现了Keras。
我真的很喜欢Keras,因为它的语法相当清晰,文档也非常好(尽管相对比较新),而且它支持我已经掌握的语言(Python)。它的使用方法非常简单,我们能非常直观的了解它的命令、函数和模块之间的连接方式。
Keras是个非常高层的库,可以工作在Theano和TensorFlow(可配置)之上。另外,Keras强调极简主义,只需几行代码就能够搭建起一个网络。这里(https://gist.github.com/ricgu8086/0ba44ce3aab19ec50425383a4d778b50)你可以比较一下Keras和TensorFlow在实现相同功能时所需的代码量。
Lasagne
Lasagne库的工作位于Theano上层。它的任务是简化深度学习算法之下的复杂计算,同时也能提供一个更加友好的界面(也是用Python)。Lasagne是一个老牌的库,很长时间以来都是一个扩展能力很强的工具。但在我看来,它的发展速度赶不上Keras。虽然他们的适用领域相似,但是Keras的文档更好用,也更完整。
Caffe
Caffe不仅是老牌框架之一,更是老牌中的老牌。
在我看来,Caffe有着非常好的性能,但也不排除一些小缺点。最初它并不是一个通用框架,只是聚焦于计算机视觉领域,并且性能很好。在我们实验室的实验中,CaffeNet架构的训练时间比在Keras(使用了Theano后端)中少了5倍。Caffe的缺点是不够灵活。如果你想要给它带来一些新变化,就需要使用C++和CUDA编程,或者也可以利用Python或Matlab接口做少量新颖的改变。
Caffe的文档比较匮乏。你需要花费大量的时间检查代码才能完全理解它(Xavier初始化有什么用?Glorot是什么?)。
Caffe的最大缺点之一便是它的安装。安装过程需要处理大量的依赖包...我曾经安装过两次,真是太痛苦了。
但要清楚,Caffe并非一无是处。作为一个生产计算机视觉系统的工具,它是无可争议的领头羊。它不仅稳定而且快速。我的建议是:先用Keras进行实验和测试,然后挪到Caffe中进行生产。
DSSTNE
DSSTNE的发音同Destiny,是一个非常酷的框架,却总是被忽略。为什么?抛开其他因素不谈,原因在于它不具有普适性。DSSTNE只做一件事情——推荐系统,并且做到了极致。既不是为了研究,也不是为了测试想法(官网标语),DSSTNE是为了生产而设计的框架。
根据我们在BEEVA实验室所做的相关实验,我们认为这是一个运行非常快的工具,并且运行结果也非常不错(很高的平均准确率均值——mAP)。但是为了达到这一速度,DSSTNE需要使用GPU,这也成了它的其中一个缺点:不同于前面分析的其他框架或者库,DSSTNE不允许用户在CPU和GPU之间切换。CPU和GPU之间的切换可能会对某些实验有用,但在DSSTNE里面是不被允许的。
其他的结论就是,目前DSSTNE还不是一个足够成熟的项目,而且封装过于严密(black box)。如果我们想要深入了解它的运行机制,就必须去阅读它的源码,同时还需要完成很多重要设置。我们发现,关于DSSTNE的网上教程并不多,而能指导人们实验的就更少了。我的观点是,我们可以再等4个月,看看DSSTNE的最新版本。DSSTNE确实是一个很有意思的项目,但还需要空间来成长。
顺便说一下,这个框架对编程能力没有要求。DSSTNE框架时通过其终端命令来完成相关操作的。
从这里开始,很多现今十分流行的框架和库,我虽然知道但都还没用过,所以不能给出很多具体的细节。
Torch
当今世界上,每天仍然有很多战争,但是一名优秀的Guerrero(西班牙勇士)必须清楚的了解哪些战争是需要去参加的,哪些是可以不参加的。Torch是一个特别著名的框架,因为Facebook的研究所用框架就是Torch,并且DeepMind在被谷歌收购之前也是用的Torch(收购之后,转向了TensorFlow)。Torch的编程语言是Lua,也就是我刚才谈到的战争含义。目前绝大多数深度学习的编程语言均以Python为主,鉴于此,以Lua为编程语言的框架劣势尤为突出。我从未使用过Lua编程语言,所以如果我想使用Torch的话,必须先学习Lua,然后才能学习Torch。这虽然是一个很合理的过程,但是就我个人情况而言,我更喜欢利用Python、Matlab或者C++实现。
mxnet
mxnet是支持大多数编程语言的框架之一,包括Python、R、C++、Julia等等。我觉得使用R语言的人会很喜欢mxnet,因为至今为止Python在该领域的地位仍然十分稳固。(Python Vs R,猜猜我会站在哪边?)
说实话,不久之前,我并没有很关注mxnet,但是亚马逊AWS宣布选择将mxnet放进其深度学习AMI(Amazon Machine Image)的消息引起了我的关注。我必须去了解一下。到后来我发现,亚马逊将mxnet列为其深度学习的参考库,并且在谈论着它巨大的水平扩展能力,我感觉这里会发生一些事情,因此我必须去深入了解。2017年的BEEVA技术测试名单里会有mxnet,就是这个原因。
我对多GPU的扩展能力有点怀疑,我愿意去了解实验的更多细节,但是目前我还是对mxnet持怀疑态度。
DL4J
我接触这个库,是因为它的文档。当时我正在寻找受限玻尔兹曼机和自动编码器,最终在DL4J中找到了。DL4J的文档非常清晰,有理论也有代码示例。我必须得说,D4LJ的文档简直是艺术品,其他库在记录代码的时候应该向它学习。
DL4J背后的公司Skymind意识到,虽然在深度学习圈内,Python是老大,但是有大量程序员擅长Java,所以需要找到某种解决方案。DLsJ兼容JVM,支持Java、Clojure和Scala。伴随着Scala的起起落落,DL4J也逐渐被一些很有潜力的创业公司所使用。接下来我会继续关注这个库。
此外,Skymind的twitter账户非常活跃,一直在发布最新的科研论文、案例和教程。极其推荐大家关注。
Cognitive Toolkit
CognitiveToolkit之前被大家所熟知的缩写形式是CNTK,但是最近又重新命名回来,可能是想沾沾微软认知服务(Microsoft Cognitiveservices)的光。从它公开的基准测试上的表现来看,Cognitive Toolkit似乎很强大,支持纵向和横向的扩展。
目前为止,Cognitive Toolkit似乎还不是很流行。我并没有看到很多关于使用这个库的博客、在线实验案例或者在Kaggle里面的相关评论。但是对我来说,看起来有点奇怪,因为Cognitive Toolkit是一个基于微软研究院的框架,但是却特别注重扩展能力,毕竟这个研究团队曾在语音识别领域打破了世界纪录,直逼人类水平。
在查看他们在工程百科中的一个案例时,我了解到,Cognitive Toolkit(也支持C++)在Python上的语法和Keras是非常相似的。这不禁让我想到(并不是确认),Keras才是正确的选择。
结论
我的结论是:如果你想进入深度学习的领域,你应该首先学习Python。尽管深度学习的领域还支持很多其他语言,但Python是应用范围最广而且最简单的一门语言。说到底,为什么要选择Python这门速度非常慢的语言呢?因为大多数的库使用符号语言、而不是命令式语言的方式。解释一下:它不是一条接一条的执行你的指令,而是等到你给出所有的指令,创建一个计算图。这个图在内部进行优化,并编译成可执行的C++代码。这样你就能同时利用Python和C++的优点,也就是Python的开发速度和C++的执行速度。
目前,大家对深度学习的兴趣越来越浓,但却又不愿意等待算法训练所需要的大量计算时间(而且我说的是GPU,最好不要考虑只使用CPU)。这也是支持多GPU、多机器的水平扩展和硬件定制的引进开始得势的原因。
深度学习领域十分活跃,变化也很快。我现在告诉你的东西,到了2017年中期很可能就变了。
如果你是一个初学者,用Keras,如果你不是,也用它。
Keras非常酷。如果你参加了Kaggle,你就会发现Kaggle的两大巨星:Keras和XGBoost。
我的理论:框架的游戏
为什么谷歌向大众公开了TensorFlow?为了共同的利益?为了得到他们天天在谷歌用到的优秀的训练技术?至少这是他们的官方解释。我的看法是并非如此,可以说完全不是。在我的理论中,这是公司内部的一个战略性决策,关系到谷歌云服务和他们的新型TPUs(还没有公开,但我已经获悉将于2017年公开)。不同于通用的CPUs,也不同于在诸多限制条件下也很通用的GPUs,TPUs是具有特定用途的定制硬件,其目的就是为加速TensorFlow的计算。那么,如果我已经习惯了TensorFlow并且喜欢TensorFlow,我会在哪里运行较大的实验呢?在AWS?在Azure?或许在谷歌云更好,它将只花费一半的时间,但我真的会少花时间吗?
我记得,在亚马逊宣布选择mxnet作为其深度学习的参考库之后,一些开发者曾向我谈到,亚马逊没有选择TensorFlow是一件非常奇怪的事情。然而,我并不为此感到惊讶。甚至是对一段时间后,亚马逊将在re:Invent 大会上宣布扩展云服务,增加FPGA案例这件事,我更加感到不足为奇。与此同时,他们还为mxnet创建了特定的硬件。
译:看起来,深度学习的云计算战争将会在框架的战场上打响。学习的云计算战争将会在框架的战场上打响。
作者:里卡多·格雷罗·戈麦斯(Ricardo Guerrero Gomez-Ol )
编译: AI100
原文地址: https://medium.com/@ricardo.guerrero/deep-learning-frameworks-a-review-before-finishing-2016-5b3ab4010b06#.nb12dog5e