当前位置: 首页 > 科技观察

机器学习和深度学习的最佳框架

时间:2023-03-17 20:19:55 科技观察

在过去的一年里,我们讨论了六种开源机器学习和/或深度学习框架:Caffe、MicrosoftCognitiveToolkit(又名CNTK2)、MXNet、Scikit-learn、SparkMLlib,和张量流。如果你把网撒得更广一些,你可能还会涵盖其他几个流行的框架,包括Theano(一个有10年历史的Python深度学习和机器学习框架)、Keras(Theano和TensorFlow深度学习的前端)、DeepLearning4j(基于Hadoop和Spark的Java和Scala深度学习软件)。如果您对使用机器学习和神经网络感兴趣,那么您将有更多选择。机器学习框架和深度学习框架之间存在差异。本质上,机器学习框架涵盖了分类、回归、聚类、异常检测和数据准备等各种学习方法,可能包括也可能不包括神经网络方法。深度学习或深度神经网络(DNN)框架涵盖具有许多隐藏层的各种神经网络拓扑结构。这些层包括模式识别的多步骤过程。网络中的层越多,可以提取的用于聚类和分类的特征就越复杂。Caffe、CNTK、DeepLearning4j、Keras、MXNet和TensorFlow是深度学习框架。Scikit-learning和SparkMLlib是机器学习框架。Theano跨越了这两个类别。一般来说,深度神经网络计算在GPU(特别是NvidiaCUDA通用GPU,大多数框架)上的运行速度比CPU快一个数量级。一般来说,更简单的机器学习方法不需要GPU加速。虽然您可以在一个或多个CPU上训练DNN,但训练往往很慢,我所说的慢并不是指秒或分钟。需要训练的神经元和层数越多,可供训练的数据就越多,需要的时间也就越长。当谷歌大脑团队在2016年针对新版谷歌翻译训练语言翻译模型时,他们在多个GPU上同时运行了一周的训练时间。如果没有GPU,每个模型训练实验都需要几个月的时间。这些框架中的每一个都至少有一个显着特征。Caffe的强项是用于图像识别的卷积DNN。CognitiveToolkit有一个单独的评估库,用于部署在ASP.Net网站上运行的预测模型。MXNet具有良好的可扩展性,可用于多GPU和多机配置的训练。Scikit-learn拥有范围广泛且易于学习和使用的强大机器学习方法。SparkMLlib与Hadoop集成以获得良好的机器学习可扩展性。TensorFlow为其网络图TensorBoard提供了独特的诊断工具。另一方面,所有深度学习框架在GPU上的训练速度几乎相同。这是因为训练内循环在NvidiaCuDNN包中占用了大部分时间。但是,每个框架都采用不同的方法来描述神经网络,主要有两个阵营:使用图形描述文件的阵营和执行代码来创建描述的阵营。考虑到这一点,让我们来看看每个框架的特性。Caffe(咖啡)Caffe深度学习项目,原本是一个强大的图像分类框架,由于其持续存在的错误,以及在1.0RC3版本上卡了一年多,创始人离开的事实,似乎已经停滞不前项目。它仍然具有良好的卷积网络图像识别和对NvidiaCUDAGPUs的良好支持,以及简单的网络描述格式。另一方面,它的模型通常需要大量GPU内存(超过1GB)才能运行,它的文档参差不齐且有错误,很难获得支持,安装也很困难,尤其是它的Pythonnotebook支持。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网络上的“手术”。MicrosoftCognitiveToolkit(微软认知工具包)MicrosoftCognitiveToolkit是一个快速、易用的深度学习软件包,但与TensorFlow相比,其适用范围有限。它拥有广泛的模型和算法,对Python和Jupyter笔记本、BrainScript这种有趣的声明式神经网络配置语言的出色支持,以及在Windows和UbuntuLinux环境上的自动部署。不利的一面是,当我审查Beta1时,文档尚未完全更新到CNTK2,并且该软件包不支持MacOS。虽然自Beta1以来CNTK2有许多改进,包括新的内存压缩模式以减少GPU上的内存使用和新的Nuget包,但仍然缺少对MacOS的支持。将PythonAPI添加到Beta1有助于将认知工具包带给主流的Python编码深度学习研究人员。API包括模型定义和计算、学习算法、数据读取和分布式训练的抽象。作为对PythonAPI的补充,CNTK2具有新的Python示例和教程,以及对GoogleProtocolBuffer序列化的支持。教程以Jupyter笔记本的形式实现。CNTK2组件可以处理来自Python、C++或BrainScript的多维密集或稀疏数据。CognitiveToolkit包括多种神经网络类型:FFN(前馈)、CNN(卷积)、RNN/LSTM(循环/长短期记忆)、批量归一化和序列注意。它支持强化学习、生成对抗网络、监督和非监督学习、自动超参数调整以及从Python添加新的、用户定义的核心组件以在GPU上运行的能力。它能够跨多个GPU和机器进行精确的并行处理,并且(微软声称)它甚至可以将最新模型放入GPU内存中。CNTK2API支持从Python、C++和BrainScript定义网络、学习器、阅读器、训练和评估。它们还支持在C#中进行评估。PythonAPI与NumPy互操作,并包含一个高级层库以精确定义包括递归在内的高级神经网络。该工具包支持将循环模型的符号表示为神经网络中的循环,而无需静态展开循环步骤。您可以在Azure网络和GPU上训练CNTK2模型。带有GPU的Azure虚拟机的N系列产品线在我查看Beta1时受到限制,现在已普遍可用并可从Azure控制台进行完全管理。多个CNTK2/Microsoft认知工具包教程作为Jupyter笔记本提供。该图显示了逻辑回归训练的绘图可视化。MXNetMXNet是一个可移植、可扩展的深度学习库,是Amazon的首选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提供的API的超集,尽管具有更好的可移植性和对GPU集群的支持。在许多方面,MXNet与TensorFlow相似,但增加了嵌入命令张量操作的能力。除了实际执行的MNIST数字分类之外,MXNet计算机视觉教程还涵盖了使用卷积神经网络(CNN)进行图像分类和分割、使用FasterR-CNN进行对象检测、神经艺术以及大规模图像分类和ImageNet数据集。还有其他关于自然语言处理、语音识别、对抗网络以及有监督和无监督机器学习的教程。亚马逊在P2.16xlarge实例上测试了MXNet中实施的Inceptionv3算法,发现它的扩展效率高达85%。Scikit-learnScikit-learnPython框架具有广泛的可靠机器学习算法,但没有深度学习算法。如果您是Python爱好者,Scikit-learn可能是通用机器学习库中的最佳选择。Scikit-learn是一个功能强大、成熟的机器学习Python库,包含各种成熟的算法和集成图。它的安装、学习和使用相对容易,有很好的示例和教程。另一方面,Scikit-learn不包括深度学习或强化学习,缺乏图形模型和序列预测,无法真正用于Python以外的语言。它不支持PyPy、Python即时编译器或GPU。也就是说,除了少量进入神经网络之外,它不会真正有速度问题。它使用Cython(Python到C编译器)来处理需要快速的函数,例如内部循环。Scikit-learn有很多用于分类、回归、聚类、降维、模型选择和预处理的算法。它对所有这些都有很好的文档和示例,但没有任何类型的指导工作流来完成这些任务。Scikit-learn在易于开发方面获得10分,这主要是因为算法都按照宣传和记录的方式工作,API一致且设计良好,数据结构之间几乎没有“阻抗不匹配”。函数库中的函数得到了充分的丰富,错误也得到了彻底的消除,开发使用非常愉快。此示例使用Scikit-learn的小型手写数字数据集来演示使用标签传播模型的半监督学习。总共1,797个样本中只有30个被标记。另一方面,该库不涵盖深度学习或强化学习,这隐藏了当前困难但重要的问题,例如准确的图像分类和可靠的实时语言解析和翻译。显然,如果您对深度学习感兴趣,您应该看看其他地方。然而,存在很多问题,从建立连接不同观测值的预测函数到对观测值进行分类,再到学习未标记数据集的结构,这使得它们适用于不需要数十层神经元的普通旧机器学习,对于这些领域,Scikit-learn是一个很好的选择。SparkMLlibSparkMLlib是Spark的开源机器学习库,提供了分类、回归、聚类、协同过滤(不包括DNN)等通用机器学习算法,以及特征提取、变换、降维工具,以及构建、评估和计算。调整机器学习管道选择和工具。SparkMLlib还包括用于保存和加载算法、模型和管道、数据操作以及进行线性代数和统计的实用程序。SparkMLlib是用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是最容易与Jupyternotebook一起使用的,但如果你驯服了冗长的Spark状态消息,你绝对可以在控制台中运行它。SparkMLlib提供了基本机器学习、特征选择、管道和持久性所需的一切。它在分类、回归、聚类和过滤方面做得很好。鉴于它是Spark的一部分,它具有对数据库、流和其他数据源的强大访问权限。另一方面,SparkMLlib并不像TensorFlow、MXNet、Caffe和MicrosoftCognitiveToolkit那样真正地建模和训练深度神经网络。SparkMLlibPython示例(朴素贝叶斯)作为Databricks笔记本。注意解释、代码和输出是如何展开的。TensorFlowTensorFlow是Google的便携式机器学习和神经网络库,性能和扩展性都很好,尽管它有点难学。TensorFlow有各种各样的模型和算法,非常强调深度学习和在带有GPU(用于训练)或GoogleTPU(用于生产规模预测)的硬件上的出色性能。它还具有对Python的良好支持、良好的文档以及用于显示和理解TensorBoard的良好软件,TensorBoard是描述其计算的数据流图。数据流图中的节点表示数学运算,而图边表示在它们之间流动的多维数据数组(张量)。这种灵活的架构允许您将计算部署到桌面、服务器或移动设备中的一个或多个CPU或GPU,而无需重写代码。使用TensorFlow的主要语言是Python,尽管对C++的支持有限。TensorFlow提供的教程涵盖了手写数字的分类。图像识别、词嵌入、递归神经网络、用于机器翻译的序列到序列模型、自然语言处理和基于PDE(偏微分方程)的模拟的应用。TensorFlow可以轻松处理各种神经网络,包括快速变化的图像识别和语言处理领域中的深度CNN和LSTM递归模型。用于定义层的代码可能很繁琐,但在您方便但不详细的情况下,您可以使用三个可选的深度学习接口中的任何一个来修复它。虽然调试异步网络求解器可能很平常,但TensorBoard软件可以帮助您可视化图形。TensorBoard显示由TensorFlow计算的图形。我们放大了几个部分来检查图表的细节。总结您应该为任何给定的预测任务使用哪种机器学习或深度学习包取决于机器学习的复杂性、用于训练的数据量和形式、您的计算资源以及您的编程语言偏好和技能。它还可能取决于您是否喜欢在代码或配置文件中定义模型。然而,在开始您自己的模型训练之旅之前,您可能想看看来自Google、HPE和MicrosoftAzure云的预训练应用机器学习服务是否能够处理您的数据,无论是语音、文本、或图像。如果它们对您的数据效果不佳,您可能还想在尝试基本的机器学习训练(***,如果没有其他效果)深度学习训练收益之前,先看看使用简单的统计方法可以获得多少收益。这里的原则是让分析尽可能简单,但不能更简单。在我对两个基本机器学习包的讨论中,我推荐Scala和SparkMLlib之类的工具,它们的数据都在Hadoop中。我向喜欢Python的人推荐Scikit-learn。对于那些喜欢Scala(和Java)并将其数据存储在Hadoop中的人,我应该提到的另一个选择是Deeplearning4j。然而,我没有对此发表评论,因为顾名思义它是一个深度学习包。为Caffe、MicrosoftCognitiveToolkit、MXNet和TensorFlow选择深度学习包是一个更困难的决定。我不再推荐使用Caffe,因为它的发展已经停滞。但是,从其他三个中选择一个仍然很棘手,因为它们都是具有相似功能的绝佳选择。CognitiveToolkit现在有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,它对于可视化和理解数据流图非常有用。文章来源:网络冷眼|翻译