@sambodhi
2017-03-08T10:09:23.000000Z
字数 5325
阅读 3214
机器学习
深度学习
刚刚过去的2016年,回顾这一年,深度学习无疑是2016年最热的词。包括Google、Amazon、Facebook、Microsoft等各大巨头都在不遗余力地推进深度学习的研发和应用。
与前几代人工智能不同,应用深度学习能力的人工智能是一项重大突破,机器开始可以模仿人类的神经系统进行有效学习并且进步神速,也就有了最近的神秘高手“Master”横扫中日韩顶级棋手,碾压人类的神话,它不是别人,正是2016年战胜李世石的AlphaGo的升级版!
深度学习的概念由加拿大多伦多大学教授 Geoffrey Hinton等人于2006年提出,它本质上是一种神经网络算法,算法训练时可以不用人工干预,因此它也属于一种无监督式机器学习算法。
可以毫不夸张的说,深度学习正在重塑Google、Facebook、Microsoft和Amazon。
BEEVA Labs数据分析师Ricardo Guerrero Gomez-Ol在他的博客上发表了一篇博文,盘点了目前最流行的深度学习框架。他在博文中表示,他写此文的初衷是,他常常听到人们谈论深度学习时,总是问:“我应该从哪里开始呢?”“我听说TensorFlow是最流行的,对吧?”“Caffe很常用,但是我觉得它学起来有点困难。”
因为Ricardo所在的BEEVA实验室,经常和深度学习的许多库打交道,所以他想分享有趣的发现和感想,帮助那些刚进入深度学习这一迷人世界的人们。
InfoQ整理、结合了Ricardo关于深度学习框架的盘点,写成此文,以飨广大有志于深度学习领域的读者们。
TensorFlow是Google开源的一款深度学习工具,使用C++语言开发,上层提供Python API。在开源之后,在工业界和学术界引起了极大的震动,因为TensorFlow曾经是著名的Google Brain计划中的一部分,Google Brain项目的成功曾经吸引了众多科学家和研究人员往深度学习这个“坑”里面跳,这也是当今深度学习如此繁荣的重要原因。
TensorFlow在官网被定义为“用于机器智能的开源软件库”,但Ricardo认为下面的定义更为准确:“TensorFlow™是使用数据流图进行数值计算的开源软件库。”此处,TensorFlow并未归类为“深度学习框架”,而是与Theano一起,归到“图编译器(Graph compilers)”的类别。
在Ricardo完成Udacity的深度学习课程后,他对TensorFlow的印象是,它一个非常好的框架,但是它非常底层。用TensorFlow的话,有很多代码要编写,你必须重新一遍又一遍的发明轮子。不止他有这样的抱怨,其他人亦如此,比如下图所示:
Andrej Karpathy在Twitter发推文抱怨TensorFlow。Andrej是OpenAI的科学家,斯坦福大学的计算机科学博士。
几个月前,Ricardo参加了“Google Experts Summit: TensorFlow, Machine Learning for everyone, with Sergio Guadarrama”。Sergio是开发Tensorflow的一名工程师,在会上,他没有展示Tensorflow,而是展示了一个运行在TensorFlow上的更高层的库tf.contrib。Ricardo的印象是,他们内部已经意识到,如果想让更多的人使用Tensorflow,他们需要通过在更高的抽象层上创建一些层来简化使用。
Tensorflow支持Python和C ++,允许在CPU、GPU,甚至支持使用gRPC进行水平扩展进行计算分布。
综上所述:Tensorflow非常好,但你必须知道好在哪里。如果你不想以手动编程和重新发明轮子来完成大部分事情,你可以使用更容易的库。
Theano是老牌、稳定的库之一。它是深度学习开源工具的鼻祖,由蒙特利尔理工学院时间开发于2008年并将其开源,框架使用Python语言开发。它是深度学习库的发轫,许多在学术界和工业界有影响力的深度学习框架都构建在Theano之上,并逐步形成了自身的生态系统,这其中就包含了著名的Keras、Lasagne和Blocks。
Theano是底层库,遵循Tensorflow风格。因此不适合深度学习,而更合适数值计算优化。它支持自动函数梯度计算,它有Python接口,集成了Numpy,使得这个库从一开始就成为通用深度学习最常用的库之一。
今天,它依然健壮可用,但事实上,由于没有多GPU支持和水平扩展,加之TensorFlow的如天花乱坠的大肆宣传之下(它们都是针对同一个领域),结果,Theano逐渐被世人遗忘了。
Ricardo表示他很喜欢Keras,因为它的句法相当清晰,文档也非常好的(尽管相对较新),它还支持Ricardo所熟知的Python语言。它如此易用,它的指令、函数和每个模块直接的连接方式都可以直观地了解。
Keras是一个非常高层的库,工作在Theano或Tensorflow(可配置)之上。此外,Keras强调极简主义,你可以用寥寥可数的几行代码来构建神经网络。在这里,您可以看到一个Keras代码示例,与在Tensorflow中实现相同功能所需的代码相比较。
Lasagne是一个工作在Theano之上的库。它的任务是将深度学习算法的复杂计算予以简单地抽象化,并提供一个更友好的Python接口。这是一个老牌的库,长久以来,它是一个具备高扩展性的工具。在Ricardo看来,它的发展速度跟不上Keras。它们适用的领域相同,但是,Keras有更好的、更完善的文档。
Caffe是最老的框架之一,比老牌还要老牌。 Caffe 是加州大学伯克利分校视觉与学习中心(Berkeley Vision and Learning Center ,BVLC)贡献出来的一套深度学习工具,使用C/C++开发,上层提供Python API。Caffe同样也在走分布式路线,例如著名的Caffe On Spark项目。
Ricardo认为,它有非常好的特点,但也有一些小缺点。最初,它不是一个通用的框架,只专注于计算机视觉,但它确实很好。在实验室的实验中,CaffeNet架构的训练时间在Caffe比在Keras(使用Theano后端)少5倍。缺点是它缺乏灵活。如果你想引入新的改进,你需要在C ++和CUDA编程。如果你要做较小的改进,你可以使用它的Python或Matlab接口来达到。
另外它的文档很贫乏,你需要大量时间检查代码才能理解它。
它最大缺点之一是安装方式。它有很多大量的依赖包才能解决,Ricardo曾经安装过两次,他表示这一过程痛苦不堪。
但要注意的是,它并非一无是处。它作为投入生产的计算机视觉系统的工具,是无可争议的领导者。它非常健壮、非常快速。Ricardo建议使用Keras进行实验和测试,然后迁移到Caffe进行生产。
DSSTNE(Deep Scalable Sparse Tensor Network Engine,DSSTNE)是Amazon开源的一个非常酷的框架,由C++语言实现。但它经常被忽视。为什么?因为,撇开其他因素不谈,它并不是为一般用途设计的。DSSTNE只做一件事,但它做得很好:推荐系统。正如它的官网所言,它不是作为研究用途,也不是用于测试想法,而是为了用于生产的框架。
Ricardo测试DSSTNE后得到的印象是,它是一个非常快的工具,能得到一个非常好的结果(平均精度mAP很高)。为了达到这种速度,它使用了GPU,然而这也是它的一个不利之处:不同于本文提到的其他框架或库,它不允许你在CPU和GPU切换,这点对一些尝试可能有用,但他们在DSSTNE试图这样做的时候,被告知不允许。
Ricardo认为目前DSSTNE不算是一个成熟的项目,它过于像“黑盒子”。为了了解它的工作原理和运行机制,不得不去看它的源代码,发现了很多重要的待办事项(//TODO)。他们还发现,在互联网上没有足够的教程,也没有什么人做相关实验。他的意见是,最好等待4个月,看看DSSTNE的最新版本。这是一个非常有趣的项目,它只是需要一点成熟的时间。
顺便说一句,DSSTNE不需要编程技能。与DSSTNE的交互都是通过终端中的命令完成的。
Torch是Facebook和Twitter主推的一个特别知名的深度学习框架,Facebook Reseach和DeepMind所使用的框架,正是Torch(DeepMind被Google收购之后才转向TensorFlow)。出于性能的考虑,它使用了一种比较小众的编程语言Lua,目前在音频、图像及视频处理方面有着大量的应用。
在目前深度学习大部分以Python为编程语言的大环境之下,一个以Lua为编程语言的框架只有更多的劣势,而不是优势。Ricardo没有Lua的使用经验,他表示,如果他要用Torch的话,就必须先学习Lua语言才能使用Torch。就他个人来说,更倾向于熟悉的Python、Matlab或者C++来实现。
mxnet是支持大多数编程语言的库之一,它支持Python、R、C++、Julia等编程语言。Ricardo觉得使用R语言的人们会特别喜欢mxnet,因为直到现在,在深度学习的编程语言领域中,Python是卫冕之王。
Ricardo以前并没有过多关注mxnet,直到Amazon AWS宣布将mxnet作为其深度学习AMI中的参考库时,提到了它巨大的水平扩展能力,他才开始关注。这就是为什么mxnet会出现在我们2017年的BEEVA技术测试名单之中。
Ricardo表示他对多GPU的扩展能力有点怀疑,但仍然很愿意去了解实验更多的细节。但目前还是对mxnet的能力抱有怀疑的态度。
DL4J,全名是Deep Learning for Java。正如其名,它支持Java。Ricardo说,他之所以能接触到这个库,是因为它的文档。当时,他在寻找限制波尔兹曼机(Restricted Boltzman Machines)、自编码器(Autoencoders),在DL4J找到这两个文档,文档写得很清楚,有理论,也有代码示例。Ricardo表示D4LJ的文档真的是一个艺术品,其他库的文档应该向它学习。
DL4J背后的公司Skymind意识到,虽然在深度学习世界中,Python是王,但大部分程序员都是Java起步的,因此,DL4J兼容JVM,也适用于Java、Clojure和Scala。随着Scala的潮起潮落,它也被很多有前途的初创公司使用。
Skymind曾发布过一篇文章《DL4J vs. Torch vs. Theano vs. Caffe vs. TensorFlow》,对这些主流的深度学习框架的优劣势进行了详细的分析比较。
顺便说一句,Skymind有一个非常活跃的Twitter帐户,他们发布新的科学论文、示例和教程。非常推荐去看看。
认知工具包(Cognitive Toolkit),就是之前被大家所熟知的缩略名CNTK,但最近刚更改为现在这个名字,可能利用Microsoft认知服务(Microsoft Cognitive services)的影响力。在发布的基准测试中,它似乎是非常强大的工具,支持垂直和水平推移。
到目前为止,认知工具包似乎不太流行。关于这个库,还没有看到有很多相关的博客、网络示例,或者在Kaggle里的相关评论。Ricardo表示这看起来有点奇怪,因为这是一个背靠微软研究的框架,特别强调自己的推移能力。而且这个研究团队在语音识别上打破了世界纪录并逼近了人类水平。
你可以在他们的项目Wiki中的示例,了解到认知工具包在Python的语法和Keras非常相似。
Ricardo的结论是,如果你想进入深度学习的领域,必须首先就要学习Python。尽管这一领域支持其他很多语言,但Python是应用最广泛也最简单的一个。至于为什么非Python莫属?它运行速度太慢了。因为大多数库都是用符号式语言方法,而不是命令式语言方法。也就是说,并不是逐行执行你的指令,而是根据你给出的所有指令,生成一个计算图(computing graph)。这个图在内部被优化、编译成可执行的C++代码。这样你就可以享受世界上最好的特点:Python的开发速度和C++的执行速度。
关于深度学习的讨论越来越火爆了。但是人们并不愿意为了算法训练耗费大量时间,因此,多GPU支持、多机器的水平扩展甚至硬件定制开始占上上风,你不要考虑CPU,它的效能远低于GPU。
Ricardo建议,如果是初学者,就用Keras;如果已经入门,也可以用它。
深度学习作为AI领域的一个重要分支,我们可以预见,随着以后大数据和深度学习技术的不断发展,今后越来越难的问题,将会被深度学习算法成功解决。我们也非常期待深度学习算法可应用于商业产品中,就像过去10年中人脸识别器被整合到消费级相机中那样。