写点什么

深度学习框架:2016 年的大盘点

  • 2017-04-06
  • 本文字数:4724 字

    阅读完需:约 15 分钟

引言

刚刚过去的 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 编程。如果你要做较小的改进,你可以使用它的PythonMatlab接口来达到。

另外它的文档很贫乏,你需要大量时间检查代码才能理解它。

它最大缺点之一是安装方式。它有很多大量的依赖包才能解决,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 )关注我们。

2017-04-06 17:334779
用户头像

发布了 375 篇内容, 共 189.1 次阅读, 收获喜欢 945 次。

关注

评论

发布
暂无评论
发现更多内容

如何设计BI平台

奔向架构师

数据仓库 商业智能 6月月更

Navicat Premium 15 永久破解激活工具及安装教程(亲测可用)

Geek甜甜

数据库 程序员 工具 navicat

JASON

Jason199

json js math 6月月更

SeekTiger迎多重利好,旗下生态NFT、DAO VC平台将陆续上线

鳄鱼视界

【Spring 学习笔记(十二)】Spring AOP 切入点表达式

倔强的牛角

Java spring spring aop Java EE 6月月更

「 2022 精益软件工程大会」圆满闭幕,观测云奉献精彩主题演讲

观测云

Android 自定义View之展开收起的Layout

yechaoa

android 自定义view 6月月更

百度团队CSS编码规范

sean77

flutter系列之:深入理解布局的基础constraints

程序那些事

flutter 程序那些事 6月月更

数据库每日一题---第15天:未消费的顾客

知心宝贝

数据库 程序员 前端 后端 6月月更

如何往 Kafka 发送大消息?

Se7en

InfoQ 极客传媒 15 周年庆征文|海王的鱼塘是怎样炼成的

知心宝贝

人工智能 大数据 运维 前端 InfoQ极客传媒15周年庆

倒计时1天,龙蜥社区走进Intel MeetUp 即将开播!直播大奖等你来拿

OpenAnolis小助手

开源 intel Meetup 龙蜥社区 线上直播

跟着官方文档学 Python 之:3.12 新变化

甜甜的白桃

Python python3.x 6月月更

关于微服务通信的一些Tips

阿泽🧸

微服务 6月月更

Java Core 「10」J.U.C 同步工具类-2

Samson

学习笔记 Java core 6月月更

leetcode 413. Arithmetic Slices 等差数列划分

okokabcd

LeetCode 算法与数据结构

5分钟了解红队如何搜索网络情报

穿过生命散发芬芳

6月月更 攻防演练

【愚公系列】2022年06月 通用职责分配原则(五)-控制器原则

愚公搬代码

6月月更

配置swagger

卢卡多多

swagger 6月月更

LabVIEW Arduino ZigBee无线气象站(项目篇—3)

不脱发的程序猿

物联网 LabVIEW Arduino ZigBee无线气象站 无线传感器

JVM调优简要思想及简单案例-代码执行与内存区域

zarmnosaj

6月月更

考试试卷存储方案

极客土豆

Java—JVM

武师叔

6月月更

依图在实时音视频中语音处理的挑战丨RTC Dev Meetup

声网

音视频 RTC Dev Meetup 语音处理

在 Pisa-Proxy 中,如何利用 Rust 实现 MySQL 代理

SphereEx

MySQL 数据库 rust

python程序设计思想

左手の明天

Python 面向对象

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

不脱发的程序猿

LabVIEW Arduino VISA 无线遥控智能小车 无线蓝牙遥控智能车

Docker 实用技巧二

Nick

Docker 容器 实用技巧 6月月更 实操

GTID详解

乌龟哥哥

6月月更

远程办公三部曲 - 如何提高沟通效率| 社区征文

耳东@Erdong

沟通 远程办公 6月月更 初夏征文

深度学习框架:2016年的大盘点_语言 & 开发_刘志勇_InfoQ精选文章