回顾2016深度学习十大框架

我喜欢参加在西班牙马德里举办的机器学习见面会,也算是西班牙马德里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编程,或者也可以利用PythonMatlab接口做少量新颖的改变。

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


原文发布于微信公众号 - AI科技大本营(rgznai100)

原文发表时间:2017-01-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能

DeepMind的小窍门,究竟如何给AI提的速?

人工智能里一直以人类为学习榜样。而在面部识别、电子游戏、甚至围棋等领域,深度学习都已经超越了人类,以至于造成人类已经失败了的感觉。

231100
来自专栏大数据文摘

学习AI可能不需要那么多数学知识:20小时进阶计划

23050
来自专栏达观数据

技术干货 | 达观数据新用户推荐的三大利器

推荐系统需要根据用户的历史行为和兴趣预测用户未来的行为和兴趣。但对于新用户而言,没有任何的用户行为,如何进行最有效的推荐呢?这就衍生了用户冷启动问题。 在当下...

34630
来自专栏AI科技评论

学界 | 超大规模图计算在阿里巴巴的应用都有哪些?四篇KDD oral论文抢先看(附论文下载)| KDD 2018

AI 科技评论按:本文为阿里巴巴提供的 KDD 2018 解读稿件。这一事件在雷锋网学术频道 AI 科技评论旗下数据库项目「AI 影响因子」中有相应加分。

17020
来自专栏美团技术团队

【沙龙干货】主题四:美团外卖中的单量预估及列表优化

分享内容 ---- 相对于团购,外卖有三个特点:移动化、本地化、场景化。 移动化,从2011年开始到2015年移动战略是逐渐上升的。对应外卖2014年移动占比一...

37030
来自专栏PPV课数据科学社区

提前想好答案 数据分析师面试常见的77个问题

随着大数据概念的火热,数据科学家这一职位应时而出,那么成为数据科学家要满足什么条件?或许我们可以从国外的数据科学家面试问题中得到一些参考,下面是77个关于数据分...

47460
来自专栏机器学习人工学weekly

机器学习人工学2018/1/7

新年快乐! 注意下面很多链接需要科学上网,无奈国情如此 1. Berkeley AI Research blog上发了篇文章讲physical advers...

40190
来自专栏FD的专栏

人工智能与自然语言处理概述:AI三大阶段、NLP关键应用领域

AI 指代「人工智能」,是让机器能够像人类一样完成智能任务的技术。AI 使用智能完成自动化任务。

12730
来自专栏人人都是极客

嵌入式机器学习处理器的技术挑战和机会

2016年12月,Vivienne Sze,Yu-Hsin Chen等(Eyeriss的作者)在arXiv上发表的文章“Hardware for Machine...

44780
来自专栏量子位

Google把机器学习算法装进移动设备,让智能手表自动回消息

量子位 李林 | 参考Google Research Blog ? 你和小冰聊天,把各位好朋友的照片放进FaceApp改个性别加个灿烂笑容,靠的都是深度神经网络...

397110

扫码关注云+社区

领取腾讯云代金券