机器学习和深度学习的最佳框架大比拼
在过去的一年里,我们探讨了六个开源机器学习和/或深度学习框架:Caffe,Microsoft CognitiveToolkit(又名CNTK 2),MXNet,Scikit-learn,SparkMLlib和TensorFlow。假设把网撒得大些,或许还会笼罩其余几个盛行的框架,包括Theano(一个10年之久的Python深度学习和机器学习框架),Keras(一个Theano和TensorFlow深度学习的前端),DeepLearning4j(Java和Scala在Hadoop和Spark之上的深度学习软件)。假设你有兴味经常使用机器学习和神经网络,你素来没有像如今这样多的选用。
机器学习框架和深度学习框架之间有区别。实质上,机器学习框架涵盖用于分类,回归,聚类,意外检测和数据预备的各种学习方法,并且其可以或可以不包括神经网络方法。深度学习或深度神经网络(DNN)框架涵盖具有许多暗藏层的各种神经网络拓扑。这些层包括形式识别的多步骤环节。网络中的层越多,可以提取用于聚类和分类的特色越复杂。
Caffe,CNTK,DeepLearning4j,Keras,MXNet和TensorFlow是深度学习框架。 Scikit-learning和Spark MLlib是机器学习框架。 Theano超越了这两个类别。
普通来说,深层神经网络计算在GPU(特意是Nvidia CUDA通用GPU,大少数框架)上运转的速度要比CPU快一个数量级。普通来说,更繁难的机器学习方法不须要GPU的减速。
虽然你可以在一个或多个CPU上训练DNN,训练往往是缓慢的,缓缓我不是说秒或分钟。须要训练的神经元和层数越多,可用于训练的数据越多,须要的期间就越长。当GoogleBrain小组在2016年针对新版Google翻译训练言语翻译模型时,他们在多个GPU上同时运转了一周的训练期间。没有GPU,每个模型训练试验将须要几个月。
这些框架中每一个框架具有至少一个清楚特色。 Caffe的强项是用于图像识别的卷积DNN。 CognitiveToolkit有一个独自的评价库,用于部署在ASP.Net网站上上班的预测模型。MXNet具有良好的可裁减性,可用于多GPU和多机器性能的训练。 Scikit-learn具有宽泛的弱小的机器学习方法,易学已用。 SparkMLlib与Hadoop集成,具有良好的机器学习可伸缩性。 TensorFlow为其网络图TensorBoard提供了一个共同的诊断工具。
另一方面,一切深度学习框架在GPU上的训练速度简直相反。这是由于训练内循环在Nvidia CuDNN包中破费大局部期间。但是,每个框架驳回一种不同的方法来形容神经网络,具有两个关键的营垒:经常使用图形形容文件的营垒,以及经过口头代码来创立它们的形容的营垒。
思考到这一点,让我们来看看每一个框架的个性。
Caffe(咖啡)
Caffe深度学习名目,最后是一个弱小的图像分类框架,仿佛停滞不前,基于它的继续的bug,以及它已被卡住1.0版RC3一年多的理想,并且开创人已分开名目。它依然有良好的卷积网络图像识别和良好的支持NvidiaCUDAGPU,以及一个繁难的网络形容格局。另一方面,它的模型通常须要少量的GPU内存(超越1GB)运转,它的文档是多斑点和疑问,支持很难取得,装置是iffy,特意是关于它的Python笔记本支持。
Caffe有命令行,Python和Matlab接口,它依托ProtoText文件来定义它的模型和求解器。Caffe在其自己的模型形式中逐层定义网络。网络定义从输入数据到失落的整个模型。当数据和派生数据在前向和后向遍历网络时,Caffe存储,通讯和操作信息为blob(二进制大对象),外部是以C延续方式存储的N维数组(示意行该数组被存储在延续的存储器块中,如在C言语中)。Blob之于Caffe如Tensor之于TensorFlow。
图层对blob口头操作,并导致Caffe模型的组件。层卷积滤波器,口头池,取外部乘积,运行非线性(诸如整流线性和S形以及其余元素方面的变换),归一化,加载数据和计算诸如softmax和铰链的损失。
Caffe曾经证实其在图像分类中的有效性,但它的时辰仿佛曾经过去了。除非现有的Caffe模型合乎您的须要,或许可以依据您的目标启动微调,我倡导经常使用TensorFlow,MXNet或CNTK。
在NBViewer中显示的预先计算的CaffeJupyter笔记本。这本笔记本解释了经常使用一只可恶的小猫在Caffe网络上做“手术”。
Microsoft Cognitive Toolkit(Microsoft认知工具包)
Microsoft CognitiveToolkit是一个极速,易用的深度学习软件包,但与TensorFlow相比,其范围有限。它有各种各样的模型和算法,极好的支持Python和Jupyter笔记本,一个幽默的申明性神经网络性能言语BrainScript,以及在Windows和UbuntuLinux环境下智能部署。
在缺陷方面,当我审查Beta 1的文档还没有齐全降级到CNTK 2,并且包没有对MacOS支持。虽然自Beta 1以来,CNTK 2有许多改良,包括新的内存紧缩形式,以缩小GPU和新的Nuget装置包的内存经常使用,但对MacOS支持依然缺失。
为Beta 1参与的PythonAPI有助于将认知工具包带入干流的、用Python码的、深度学习钻研人员当中。API蕴含模型定义和计算、学习算法、数据读取和散布式训练的形象。作为PythonAPI的补充,CNTK 2具有新的Python示例和教程,以及对Google Protocol Buffer序列化的支持。教程以Jupyter笔记本成功。
CNTK 2组件可以处置来自Python,C++或BrainScript的多维密集或稠密数据。认知工具包包括各种各样的神经网络类型:FFN(前馈),CNN(卷积),RNN/LSTM(递归/常年短期记忆),批次规范化和序列留意序列。它支持强化学习,生成反抗网络,监视和非监视学习,智能超参数调整,以及从Python参与新的,用户定义的外围组件在GPU上运转的才干。它能够在多个GPU和机器上做到准确的并行性,而且(微软宣称)它甚至可以顺应***的模型到GPU内存。
CNTK 2 API支持从Python,C ++和BrainScript定义网络,学习者,读者,培训和评价。他们还支持经常使用C#启动评价。PythonAPI与NumPy互操作,并包括一个初级层级库,可以准确定义包括复如今内的初级神经网络。该工具包支持以符号方式示意循环模型作为神经网络中的循环,而不须要静态展开循环步骤。
您可以在Azure网络和GPU上训练CNTK 2模型。装备GPU的N系列Azure虚构机系列,在我审核Beta 1时遭到限度,如今通常可以从Azure控制台取得并齐全治理。
几个CNTK 2 / Microsoft Cognitive Toolkit教程以Jupyter笔记本提供。该图显示了Logistic回归训练的绘制的可视化。
MXNet是一个可移植的、可伸缩的 深度学习库 ,是亚马逊的DNN框架的选用,联合了神经网络几何的意味性申明与张量操作的命令性编程。MXNet可跨多个主机裁减到多个GPU,凑近线性裁减效率为85%,具有杰出的开发速度、可编程性和可移植性。它支持Python,R,Scala,Julia和C++,支持水平各不相反,它准许你混合符号和命令式 编程格调 。
在我***次评论MXNet时,文档觉得还没有成功,除Python之外,我发现很少有其它言语的例子。自从我评论,这两种状况都有所改善。
MXNet平台是建设在一个灵活依赖调度器上的,它可以智能并行化符号和命令式操作,但是你必需通知MXNet要经常使用哪些GPU和CPU外围。在调度器顶部的图提升层使符号口头极速和内存高效。
MXNet目前支持用Python,R,Scala,Julia和C ++构建和训练模型;训练的MXNet模型也可以用于Matlab和JavaScript中的预测。无论您选用哪种言语来构建模型,MXNet都会调用提升的C ++后端引擎。
MXNet作者以为他们的API是Torch、Theano、Chainer和Caffe提供的一个超集,虽然对GPU集群有更多的可移植性和支持。在许多方面MXNet相似于TensorFlow,但参与了嵌入命令张量操作的才干。
除了实践强迫的MNIST数字分类之外,MXNet教程的计算机视觉蕴含经常使用卷积神经网络(CNN)的图像分类和宰割,经常使用更快的R-CNN的对象检测,神经艺术和经常使用深度CNN的大规模图像分类和ImageNet数据集。还有人造言语处置、语音识别、反抗网络以及监视和非监视机器学习的其余教程。
亚马逊测试了在P2.16xlarge实例上的MXNet中成功的Inception v3算法,发现其伸缩效率为85%。
Scikit-learn
Scikit-learn Python框架具有宽泛的牢靠的机器学习算法,但没有深度学习算法。假设你是一个Python粉丝,Scikit-learn或许是普通机器学习库中***选用。
Scikit-learn是一个弱小的,成熟的机器学习Python库,蕴含各种各样成熟的算法和集成图。它相对容易装置、学习和经常使用,带有很好的例子和教程。
在另一方面,Scikit-learn不包括深度学习或强化学习,缺少图模型和序列预测,并且除Python之外,不能真正经常使用其它言语。它不支持PyPy,Python即时编译器或GPU。也就是说,除了它的大批进入神经网络,它不会真的有速度疑问。它经常使用Cython(Python到C编译器)来处置须要极速的函数,例如内循环。
Scikit-learn对分类、回归、聚类、降维、模型选用和预处置算法具有很好的选用。它有一切这些的良好的文档和示例,但没有任何种类的指点上班流以成功这些义务。
Scikit-learn赢得了易于开发的***分,关键是由于算法都像广告和文档一样上班,API是分歧的,设计良好,数据结构之间简直没有“阻抗不婚配”。函数库其中的性能已彻底空虚,失误彻底消弭,用来开发十分欢快。
本示例经常使用Scikit-learn的小手写数字数据集来演示经常使用Label Spreading模型的半监视学习。在1,797总样本中只要30个被标志。
另一方面,函数库没有涵盖深度学习或强化学习,这暗藏了艰巨但关键的疑问,例如准确的图像分类和牢靠的实时言语解析和翻译。显然,假设你对深度学习感兴味,你应该另觅他处。
但是,存在许多疑问,从建设链接不同观察值的预测函数到分类观察值到学习未标志数据集的结构,这使得它们顺应于普通的老的机器学习,而不须要数十层的神经元,关于这些畛域 Scikit-learn 是十分好的选用。
Spark MLlib
SparkMLlib是Spark的开源机器学习库,提供了通用的机器学习算法,如分类、回归、聚类和协同过滤(但不包括DNN)以及特色提取、转换、维数降落工具,以及构建、评价和调零件器学习管道选用和工具。SparkMLlib还包括用于保留和加载算法、模型和管线、用于数据处置以及启动线性代数和统计的适用程序。
Spark MLlib是用Scala编写的,并经常使用线性代数包Breeze。Breeze依托netlib-java来提升数值处置,虽然在开源散布中意味着提升经常使用CPU。Databricks提供与GPU配合经常使用的定制Spark集群,这有或许为您带来另一个10倍的速度改良,用于训练具有大数据的复杂机器学习模型。
MLlib成功了少量的分类和回归的罕用算法和模型,新手或许变得凌乱不堪,无可适从,但专家最终或许会为剖析数据找到一个很好的模型的数据。关于这么多的模型Spark2.x参与了超参数调优的关键个性,也称为模型选用。超参数t准许调优剖析人员设置参数网格、预计器和评价器,并且它准许交叉验证方法(耗时但准确)或训练验证宰割方法(更快但不太准确)找到***数据模型。
SparkMLlib领有针对Scala和Java的完整API,关键是针对Python的完整API以及针对R的粗略局部API。您可以经过计算示例来取得良好的笼罩率:54个Java和60个Scala机器学习示例,52个Python机器学习示例,只要五个R示例。在我的阅历中,SparkMLlib是最容易经常使用Jupyter笔记本,但你可以必需地在控制台运转它,假设你征服具体的Spark形态信息。
SparkMLlib提供了你想要的基本机器学习、个性选用、管道和耐久性的任何物品。它在分类、回归、聚类和过滤方面做得相当不错。鉴于它是Spark的一局部,它具有访问数据库、流和其余数据源的弱小访问权限。另一方面,SparkMLlib并不真正驳回与TensorFlow,MXNet,Caffe和MicrosoftCognitive Toolkit相反的方式建模和训练深层神经网络。
Spark MLlibPython示例(Naive Bayes)作为Databricks笔记本。留意解释,代码和输入如何散布。
TensorFlow
TensorFlow,Google的可移植机器学习和神经网络库,口头和伸缩性很好,虽然它有点难学。TensorFlow领有各种各样的模型和算法,它们对深度学习十分注重,并且在具有GPU(用于训练)或GoogleTPU(用于消费规模预测)的配件上具有杰出的性能。它还具有对Python的良好支持,良好的文档和良好的软件,用于显示和了解形容其计算的数据流图TensorBoard。
数据流图中的节点示意数学运算,而图的边示意在它们之间流动的多维数据数组(张量)。这种灵敏的架构准许您将计算部署到桌面、主机或移动设施中的一个或多个CPU或GPU,而无需重写代码。
经常使用TensorFlow的关键言语是Python,虽然对C ++有限的支持。TensorFlow提供的教程包括手写数字分类。图像识别、字嵌入、递归神经网络,用于机器翻译的序列到序列模型、人造言语处置和基于PDE(偏微分方程)的模拟的运行。
TensorFlow可以繁难地处置各种神经网络,包括目前正在急巨变动的图像识别和言语处置畛域的深度CNN和LSTM递归模型。用于定义图层的代码或许fan,但是您繁难但不具体,可以经常使用三个可选的深度学习界面中的任何一个来修复它。虽然调试异步网络求解器可以是平庸的,但TensorBoard软件可以协助您可视化图。
TensorBoard显示TensorFlow计算的图形。我们加大了几个局部来审核图形的细节。
总结
关于任何给定的预测义务,您应该经常使用哪种机器学习或深度学习包取决于机器学习的复杂性,用于训练的数据量和方式,您的计算资源以及您的编程言语偏好和技艺。它也或许取决于您能否青睐经常使用代码或性能文件定义模型。
但是,在开局自己的模型训练调查之前,您或许宿愿了解来自Google,HPE和MicrosoftAzure云的任何预先训练的运行机器学习服务能否能够处置您的数据,无论是语音、文本或图像。假设他们对你的数据不能很好地上班,你或许还想在尝试基本的机器学习训练(***,假设没有其余上班)深度学习训练之前,看看你能用繁难的统计方法取得多大的好处。这里的准则是坚持剖析尽或许繁难,但不是更繁难。
在我探讨的两个基本的机器学习包,我倡导青睐Scala和在Hadoop中有他们的数据的经常使用Spark MLlib 。我倡导青睐Python的人Scikit-learn。
我应该提到那些青睐Scala(和Java)的人和在Hadoop中有他们的数据的人的另一个选用事Deeplearning4j。我没有评论他,但是,由于其称号意味着它是一个学习深度包。
选用Caffe,Microsoft CognitiveToolkit,MXNet和TensorFlow的深度学习包是一个更艰巨的选择。我不再倡导经常使用Caffe,由于它的开展停滞不前。但是,选用其余三个中的一个依然是辣手,由于关于具有相似性能,它们都是***的选用。
Cognitive Toolkit如今有Python和C ++API以及网络性能言语BrainScript。假设您青睐经常使用性能文件而不是编程网络拓扑,那么CognitiveToolkit或许是一个不错的选用。另一方面,它仿佛不像TensorFlow一样成熟,它不能在MacOS上运转。
MXNet支持Python、R、Scala、Julia和C ++,但其支持***的API是用Python开发的。 MXNet在多个主机上的多个GPU上展现出良好的伸缩性(85%的线性)。当我评论MXNet的文档和示例是悭吝的,但他们曾经改良了。
TensorFlow或许是三个包中最成熟的,并且它是一个很好的选用,只需你青睐编写Python,并可以克制学习曲线。TensorFlow具有你可以经常使用基本的构建块,它给你细粒度的控制,但也须要你编写少量的代码来形容一个神经网络。有三个简化的API与TensorFlow一同上班来处置这个疑问:tf.contrib.learn,TF-Slim和Keras。支持TensorFlow的最终思考是TensorBoard,它关于可视化和了解您的数据流图十分有用。