一、Caffe(Convolutional Architecture for Fast Feature Embedding) BVLC
Caffe的优势:
一方面是调参,改网络很方便,开源做得很好,另一方面CNN在CV里用的很多,这也是Caffe的优势。
上手快:配置文件简单,易上手,文档齐全,模型与相应优化都是以文本形式而非代码形式给出。
Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手。
速度快:Google Protocol Buffer数据标准为Caffe提升了效率,能够运行最棒的模型与海量的数据。Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只需要1.17ms.
模块化:允许对新数据格式、网络层和损失函数进行扩展,方便扩展到新的任务和设置上。
可以使用Caffe提供的各层类型来定义自己的模型。
开放性:公开的代码和参考模型用于再现。
社区好:可以通过BSD-2参与开发与讨论。
学术论文采用此模型较多。不少论文都与Caffe有关(R-CNN,DSN,最近还有人用Caffe实现LSTM)
缺点:灵活性差,不同版本接口不兼容, 可定制性较低,不能很方便得扩展到其它模型。
Caffe可能是第一个主流的工业级深度学习工具,它开始于2013年底,具有出色的卷积神经网络实现。在计算机视觉领域Caffe依然是最流行的工具包,它有很多扩展,但是由于一些遗留的架构问题,它对递归网络和语言建模的支持很差。
二、MXNet
内存优化做得好
MXNet结合命令式和声明式编程的优点,既可以对系统做大量的优化,又可以方便调试。资源和计算的调度、内存分配资源管理、数据的表示、计算优化等都很值得学习的,原生支持分布式训练的。
这两种方式各有利弊,总结如下
命令式编程:
如何执行 a=b+1: 需要b已经被赋值。立即执行加法,将结果保存在a中。
优点: 语义上容易理解,灵活,可以精确控制行为。通常可以无缝地和主语言交互,方便地利用主语言的各类算法,工具包,debug和性能调试器。
缺点: 实现统一的辅助函数和提供整体优化都很困难。
声明式编程:
如何执行 a=b+1: 返回对应的计算图(computation graph),我们可以之后对b进行赋值,然后再执行加法运算
优点: 在真正开始计算的时候已经拿到了整个计算图,所以我们可以做一系列优化来提升性能。实现辅助函数也容易,例如对任何计算图都提供forward和backward函数,对计算图进行可视化,将图保存到硬盘和从硬盘读取。
缺点: 很多主语言的特性都用不上。某些在主语言中实现简单,但在这里却经常麻烦,例如if-else语句 。debug也不容易,例如监视一个复杂的计算图中的某个节点的中间结果并不简单。
下表我们比较MXNet和其他流行的深度学习系统
框架
主语言
从语言
硬件
分布式
命令式
声明式
Symbol: 声明式的符号表达式
MXNet使用多值输出的符号表达式来声明计算图。符号是由操作子构建而来。一个操作子可以是一个简单的矩阵运算“+”,也可以是一个复杂的神经网络里面的层,例如卷积层。一个操作子可以有多个输入变量和多个输出变量,还可以有内部状态变量。一个变量既可以是自由的,我们可以之后对其赋值;也可以是某个操作子的输出。在执行一个符号表达式前,我们需要对所有的自由变量进行赋值。
NDArray:命令式的张量计算
MXNet提供命令式的张量计算来桥接主语言的和符号表达式。另一方面,NDArray可以无缝和符号表达式进行对接。
KVStore:多设备间的数据交互
MXNet提供一个分布式的key-value存储来进行数据交换。它主要有两个函数,push: 将key-value对从一个设备push进存储,pull:将某个key上的值从存储中pull出来此外,KVStore还接受自定义的更新函数来控制收到的值如何写入到存储中。最后KVStore提供数种包含最终一致性模型和顺序一致性模型在内的数据一致性模型。
读入数据模块
数据读取在整体系统性能上占重要地位。MXNet提供工具能将任意大小的样本压缩打包成单个或者数个文件来加速顺序和随机读取。
训练模块
MXNet实现了常用的优化算法来训练模型。用户只需要提供数据数据迭代器和神经网络的Symbol便可。此外,用户可以提供额外的KVStore来进行分布式的训练。
过去,现状,和未来
大半年数个优秀的C++机器学习系统的开发人员成立了DMLC,本意是更方便共享各自项目的代码,并给用户提供一致的体验。当时我们有两个深度学习的项目,一个是CXXNet,其通过配置来定义和训练神经网络。另一个是Minerva,提供类似numpy一样的张量计算接口。前者在图片分类等使用卷积网络上很方便,而后者更灵活。那时候我们想能不能做一个两者功能都具备的系统,于是这样就有了MXNet。其名字来自Minerva的M和CXXNet的XNet。其中Symbol的想法来自CXXNet,而NDArray的想法来自Minerva。我们也常把MXNet叫“mix net”。
MXNet的目的是做一个有意思的系统,能够让大家用着方便的系统,一个轻量的和可以快速测试系统和算法想法的系统。未来主要关注下面四个方向:
支持更多的硬件,目前在积极考虑支持AMD GPU,高通GPU,Intel Phi,FPGA,和更多智能设备。相信MXNet的轻量和内存节省可以在这些上大有作为。
更加完善的操作子。目前不论是Symbol还是NDArray支持的操作还是有限,我们希望能够尽快的扩充他们。
更多编程语言。除了C++,目前MXNet对Python,R和Julia的支持比较完善。但我们希望还能有很多的语言,例如javascript。
更多的应用。我们之前花了很多精力在图片分类上,下面我们会考虑很多的应用。
三、Torch
核心的计算单元使用C或者cuda做了很好的优化。在此基础之上,使用lua构建了常见的模型。另外,torch7构建的是一个生态系统,安装新的模型实现模块只需要luarocks install package. 比如:luarocks install rnn。之后就可以欢乐地使用rnn模型了。torch7的缺点可能就是1. wrapper是lua语言,需要一点时间来学习。2. 优化新的计算单元可能会比较麻烦,backend修改起来会比较麻烦.
核心特征的总结:
1. 一个强大的n维数组
2. 很多实现索引,切片,移调transposing的例程
3.惊人的通过LuaJIT的C接口
4.线性代数例程
5.神经网络,并基于能量的模型
6.数值优化例程
7.快速高效的GPU支持
8.可嵌入,可移植到iOS,Android和FPGA的后台
优势:
1. 构建模型简单,一层层搭积木即可。
2. 高度模块化,一层就是一个模块,写新模块也方便,套用接口就行,用tensor运算不必写cuda也能用GPU。
3. 底层的tensor由C和cuda实现,速度不会比caffe差,甚至某些运算可能更快。
4. 使用GPU方便,把tensor数据送到GPU只要简单的 "tensor:cuda()"。
5. lua入门快,堪比python。
6. 很重要的一点,nngraph,理论上可以用nn里的模块实现任何DAG构造的网络,当然也包括RNN、LSTM之类的。
劣势:
1. 对于不少人来说,lua要新学。
2. 除了deep learning方面,其他好用的机器学习library较少。
3. 数据文件格式比较麻烦,一般原始数据没有torch专用的t7格式文件,需要通过mat等格式中转转换。
四、Theano
Theano是一个Python库,用来定义、优化和计算数学表达式,用于高效的解决多维数组的计算问题。
优点:
集成NumPy-使用numpy.ndarray
使用GPU加速计算-比CPU快140倍(只针对32位float类型)
有效的符号微分-计算一元或多元函数的导数
速度和稳定性优化-比如能计算很小的x的函数log(1+x)的值
动态地生成C代码-更快地计算
广泛地单元测试和自我验证-检测和诊断多种错误
灵活性好
缺点:
1.scan 中糟糕参数的传递限制,immutable 机制导致 function compile 时候的时间过长。
3.困难的调试方法
五、TensorFlow
TensorFlow的优点:
1、TensorFlow则是功能很齐全,能够搭建的网络更丰富而不是像caffe仅仅局限在CNN。
2、 TensorFlow的深度学习部分能够在一个模型中堆积了许多不同的模型和转换,你能够在一个模型中方便地处理文本 图片和规则分类以及连续变量,同时实现多目标和多损失工作;
3、TensorFlow的管道部分能够将数据处理和机器学习放在一个框架中,TensorFlow指引了方向。
TensorFlow是一个理想的RNN(递归神经网络) API和实现,TensorFlow使用了向量运算的符号图方法,使得新网络的指定变得相当容易,但TensorFlow并不支持双向RNN和3D卷积,同时公共版本的图定义也不支持循环和条件控制,这使得RNN的实现并不理想,因为必须要使用Python循环且无法进行图编译优化。
六、CNTK
微软将人工智能成果 CNTK 开源放上 GitHub,称是运算速度最快的 Toolkit |
是一个统一的深度学习工具包,它将神经网络描述成在有向图上的一系列计算步骤。在这个有向图中,叶子结点表示输入层或网络参数,其它的结点表示成在输入层上的矩阵操作。在CNTK上可以很容易的实现及结合当今流行的模型,例如前馈神经网络DNNs, 卷积神经网络(CNNs), 循环神经网络 (RNNs/LSTMs)。在实现随机梯度下降学习时能够自动计算梯度,而且还能通过多个GPUs或服务器实现并行计算。CNTK是微软在Cortana 数字助理和Skype 翻译应用中使用的语音识别的系统框架。
CNTK最大的优点是可以并行多个GPU或服务器。微软首席科学家黄学东说“谷歌公开的TensorFlow并没有这个功能”。
CNTK的另外一个优点是支持Microsoft Windows。但是这个开源工具是用C++写的。微软计划将尽快公开对应的Python和C#版本。