引言
刚刚过去的 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
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
Theano 是老牌、稳定的库之一。它是深度学习开源工具的鼻祖,由蒙特利尔理工学院时间开发于 2008 年并将其开源,框架使用 Python 语言开发。它是深度学习库的发轫,许多在学术界和工业界有影响力的深度学习框架都构建在 Theano 之上,并逐步形成了自身的生态系统,这其中就包含了著名的 Keras、Lasagne 和 Blocks。
Theano 是底层库,遵循 Tensorflow 风格。因此不适合深度学习,而更合适数值计算优化。它支持自动函数梯度计算,它有Python 接口,集成了 Numpy,使得这个库从一开始就成为通用深度学习最常用的库之一。
今天,它依然健壮可用,但事实上,由于没有多 GPU 支持和水平扩展,加之 TensorFlow 的如天花乱坠的大肆宣传之下(它们都是针对同一个领域),结果,Theano 逐渐被世人遗忘了。
Keras
Ricardo 表示他很喜欢 Keras,因为它的句法相当清晰,文档也非常好的(尽管相对较新),它还支持 Ricardo 所熟知的Python语言。它如此易用,它的指令、函数和每个模块直接的连接方式都可以直观地了解。
Keras 是一个非常高层的库,工作在 Theano 或 Tensorflow(可配置)之上。此外,Keras 强调极简主义,你可以用寥寥可数的几行代码来构建神经网络。在这里,您可以看到一个Keras 代码示例,与在Tensorflow 中实现相同功能所需的代码相比较。
Lasagne
Lasagne 是一个工作在 Theano 之上的库。它的任务是将深度学习算法的复杂计算予以简单地抽象化,并提供一个更友好的Python接口。这是一个老牌的库,长久以来,它是一个具备高扩展性的工具。在 Ricardo 看来,它的发展速度跟不上 Keras。它们适用的领域相同,但是,Keras 有更好的、更完善的文档。
Caffe
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
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
Torch 是 Facebook 和 Twitter 主推的一个特别知名的深度学习框架,Facebook Reseach 和 DeepMind 所使用的框架,正是 Torch(DeepMind 被 Google 收购之后才转向 TensorFlow)。出于性能的考虑,它使用了一种比较小众的编程语言 Lua,目前在音频、图像及视频处理方面有着大量的应用。
在目前深度学习大部分以 Python 为编程语言的大环境之下,一个以 Lua 为编程语言的框架只有更多的劣势,而不是优势。Ricardo 没有 Lua 的使用经验,他表示,如果他要用 Torch 的话,就必须先学习 Lua 语言才能使用 Torch。就他个人来说,更倾向于熟悉的 Python、Matlab 或者 C++ 来实现。
mxnet
mxnet 是支持大多数编程语言的库之一,它支持 Python、R、C++、Julia 等编程语言。Ricardo 觉得使用 R 语言的人们会特别喜欢 mxnet,因为直到现在,在深度学习的编程语言领域中,Python 是卫冕之王。
Ricardo 以前并没有过多关注 mxnet,直到 Amazon AWS 宣布将 mxnet 作为其深度学习AMI 中的参考库时,提到了它巨大的水平扩展能力,他才开始关注。这就是为什么mxnet 会出现在我们2017 年的BEEVA 技术测试名单之中。
Ricardo 表示他对多 GPU 的扩展能力有点怀疑,但仍然很愿意去了解实验更多的细节。但目前还是对 mxnet 的能力抱有怀疑的态度。
DL4J
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
认知工具包(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 年中人脸识别器被整合到消费级相机中那样。
感谢杜小芳对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论