最好的六个机器学习和深度学习库

最好的六个机器学习和深度学习库

如果您正在开始新的机器学习或深度学习项目,您可能会对选择哪个框架感到困惑。正如我们将要讨论的那样,这两种项目都有几个不错的选择。

机器学习框架和深度学习框架之间存在差异。本质上,机器学习框架涵盖了用于分类,回归,聚类,异常检测和数据准备的各种学习方法,并且可以包括或不包括神经网络方法。

深度学习或深度神经网络框架涵盖了具有许多隐藏层的各种神经网络拓扑。Keras,MXNet,PyTorch和TensorFlow是深度学习的框架。Scikit-learn和Spark MLlib是机器学习框架。(单击以前的任何链接以阅读我对产品的独立评论。)

通常,深度神经网络计算在GPU(特别是Nvidia CUDA通用GPU),TPU或FPGA 上运行得更快,而不是在CPU上运行。通常,更简单的机器学习方法不会受益于GPU。

虽然你可以在一个或多个CPU上训练深度神经网络,但训练往往很慢,而且我说的不是秒或分钟。需要训练的神经元和层越多,可用于训练的数据越多,所需的时间就越长。当Google Brain团队在2016年为新版Google翻译培训其语言翻译模型时,他们会在多个GPU上一次运行一周的培训课程。如果没有GPU,每个模型培训实验都需要数月时间。

从那时起,英特尔数学核心库(MKL)就可以在合理的时间内在CPU上训练一些神经网络。与此同时,GPU,TPU和FPGA的速度更快。

在相同GPU上运行的所有深度学习包的训练速度几乎相同。这是因为训练内循环将大部分时间花在Nvidia CuDNN包中。

除了训练速度之外,每个深度学习库都有自己的优点和缺点,Scikit-learn和Spark MLlib也是如此。让我们潜入。

Keras

Keras是一个用于构建神经网络模型的高级前端规范和实现,它支持三个后端深度学习框架:TensorFlow,CNTK和Theano。亚马逊目前正致力于为Keras开发MXNet后端。也可以使用PlaidML(一个独立项目)作为Keras的后端,以利用PlaidML对所有GPU的OpenCL支持。

TensorFlow是Keras的默认后端,也是推荐用于通过CUDA和cuDNN在Nvidia硬件上进行GPU加速的许多用例以及Google Cloud中的TPU加速的后端。TensorFlow还包含一个内部tf.keras类,与外部Keras安装分开。

Keras具有高级环境,使得在神经网络中添加一层像其顺序模型中的一行代码一样简单,并且每个只需要一个函数调用来编译和训练模型。Keras允许您根据需要使用其模型或功能API在较低级别工作。

Keras允许您通过子类化进一步下载到Python编码级别keras.Model,但在可能的情况下更喜欢功能API。Keras还有一个scikit-learnAPI,因此您可以使用Scikit-learn网格搜索在Keras模型中执行超参数优化。

MXNet

自从2017年初在Apache软件基金会的支持下移动以来,MXNet已经发展和改进了很多。虽然在Keras上有一个MXNet后端的工作,但是不同的高级接口变得更加重要:Gluon。在合并Gluon之前,您可以在MXNet中编写简单的命令式代码或快速符号代码,但不能同时编写两者。使用Gluon,您可以以与Keras和PyTorch竞争的方式结合两者中的优点。

Gluon的优势包括:

  • 简单易懂的代码:Gluon提供了一整套即插即用的神经网络构建块,包括预定义的层,优化器和初始化器。
  • 灵活,强制性的结构:Gluon不需要严格定义神经网络模型,而是将训练算法和模型更紧密地结合在一起,以便在开发过程中提供灵活性。
  • 动态图:Gluon使开发人员能够定义动态的神经网络模型,这意味着它们可以动态构建,使用任何结构,并使用Python的任何本机控制流。
  • 高性能:Gluon提供上述所有优点,而不会影响底层引擎提供的训练速度。

这四个优点,以及大量扩展的模型示例集,使Gluon / MXNet与Keras / TensorFlow和PyTorch大致相同,以便于开发和培训速度。您可以在Gluon主页面上查看每个代码示例,并在Gluon API的概述页面上重复。

Gluon API包括神经网络层,递归神经网络,损失函数,数据集方法和视觉数据集,模型动物园以及一组贡献的实验神经网络方法的功能。可以自由地与标准MXNet和NumPy的模块结合胶子,例如module,autograd,和ndarray,以及与Python控制流。

Gluon具有很好的层建筑模型选择,包括基本层(密集,辍学等),卷积层,池层和激活层。这些都是一线电话。这些可以在网络容器内部使用,例如gluon.nn.Sequential()。

PyTorch

PyTorch建立在旧的Torch和新的Caffe2框架之上。正如您可能从名称中猜到的那样,PyTorch使用Python作为其脚本语言,它使用了一个演进的Torch C / CUDA后端。Caffe2的生产功能正在纳入PyTorch项目。

PyTorch被称为“具有强大GPU加速功能的Python中的张量和动态神经网络。”这意味着什么?

张量是一种在物理学和工程学中大量使用的数学结构。二级张量是一种特殊的矩阵; 利用张量取向量的内积得到另一个具有新量值和新方向的向量。TensorFlow的名称来自张量(突触权重)在其网络模型中流动的方式。NumPy也使用张量,但称之为ndarray。

GPU加速是大多数现代深度神经网络框架的基础。甲动态神经网络是一个可以从迭代改变迭代中,例如允许PyTorch模型来添加和训练期间删除隐藏层以提高其精度和通用性。PyTorch在每个迭代步骤中即时重新创建图形。相比之下,TensorFlow默认创建单个数据流图,优化图代码以提高性能,然后训练模型。

虽然急切执行 模式在TensorFlow中是一个相当新的选项,但它是PyTorch运行的唯一方式:API调用在调用时执行,而不是添加到图形以便稍后运行。这可能看起来计算效率会低一些,但是PyTorch的设计就是以这种方式工作,而且在训练或预测速度方面并不吝啬。

PyTorch集成了加速库,如英特尔MKL和Nvidia cuDNN以及NCCL(Nvidia集体通信库),以最大限度地提高速度。其核心CPU和GPU Tensor和神经网络后端-TH(Torch),THC(Torch CUDA),THNN(Torch神经网络)和THCUNN(Torch CUDA神经网络) - 作为具有C99 API的独立库编写。同时,PyTorch不是Python绑定到单片C ++框架 - 其目的是与Python深度集成并允许使用其他Python库。

Scikit-learn

该Scikit学习 Python的框架有一个广泛的选择稳健的机器学习算法,但没有深度学习。如果您是Python粉丝,Scikit-learn可能是普通机器学习库中最好的选择。

Scikit-learn是一个功能强大且经过充分验证的Python机器学习库,具有各种成熟的算法和集成图形。它相对容易安装,学习和使用,并且它有很好的示例和教程。

另外,Scikit-learn不包括深度学习或强化学习,缺乏图形模型和序列预测,并且它不能真正用于Python以外的语言。它不支持PyPy,Python即时编译器或GPU。也就是说,除了对神经网络的轻微尝试之外,它并没有真正的速度问题。它使用Cython(Python到C编译器)来处理需要快速的函数,例如内部循环。

Scikit-learn有很好的算法选择,可用于分类,回归,聚类,降维,模型选择和预处理。它具有良好的文档和所有这些的示例,但缺乏任何类型的指导工作流程来完成这些任务。

Scikit-learn在易于开发方面获得了最高分,主要是因为算法都按照文档记录,API一致且设计良好,数据结构之间几乎没有“阻抗不匹配”。很高兴与一个图书馆合作,该图书馆的功能已经彻底充实,并且其漏洞已被彻底清除。

另一方面,图书馆不包括深度学习或强化学习,这省去了当前困难但重要的问题,例如准确的图像分类和可靠的实时语言解析和翻译。显然,如果你对深度学习感兴趣,你应该去别处看看。

然而,存在许多问题 - 从建立连接不同观察的预测功能,到分类观察,到学习未标记数据集的结构 - 这些都适用于简单的旧机器学习而不需要几十层神经元,以及这些区域Scikit-learn确实非常好。

Spark MLlib

Spark MLlib是Apache Spark的开源机器学习库,提供常见的机器学习算法,如分类,回归,聚类和协同过滤(但不是深度神经网络)。它还包括用于特征提取,转换,降维和选择的工具; 用于构建,评估和调整机器学习流程的工具; 用于保存和加载算法,模型和流水线,用于数据处理以及用于执行线性代数和统计的实用程序。

Spark MLlib是用Scala编写的,并使用线性代数包Breeze。Breeze依赖于netlib-java进行优化的数值处理,尽管在开源分发中意味着优化了CPU的使用。Databricks提供使用GPU的定制Spark集群,可以为您提供另外10倍的速度提升,以培训具有大数据的复杂机器学习模型。

Spark MLlib实现了大量用于分类和回归的常用算法和模型,以至于新手可能会感到困惑,但专家可能最终会为要分析的数据找到一个很好的模型选择。对于过多的模型,Spark 2.x增加了超参数调整的重要特征,也称为模型选择。超参数调整允许分析人员设置参数网格,估计器和评估器,并让交叉验证方法(耗时但准确)或列车验证拆分方法(更快但不太准确)找到最佳模型数据。

Spark MLlib拥有适用于Scala和Java的完整API,主要是用于Python的完整API,以及用于R的粗略部分API。通过计算样本可以很好地了解覆盖范围:54 Java和60 Scala机器学习示例,52 Python机器学习例子,只有五个R例子。根据我的经验,Spark MLlib最容易使用Jupyter笔记本,但如果你驯服详细的Spark状态消息,你当然可以在控制台中运行它。

Spark MLlib提供了基本的机器学习,功能选择,流水线和持久性方面的任何你想要的东西。它在分类,回归,聚类和过滤方面表现相当不错。鉴于它是Spark的一部分,它可以很好地访问数据库,流和其他数据源。另一方面,Spark MLlib并没有像TensorFlow,PyTorch,MXNet和Keras一样建立和训练深度神经网络。

TensorFlow

TensorFlow可能是深度神经网络开发的黄金标准,尽管它并非没有缺陷。TensorFlow历史上最大的两个问题是,它太难学,而且创建模型需要太多代码。这两个问题在过去几年都得到了解决。

为了使TensorFlow更易于学习,TensorFlow团队已经制作了更多的学习资料,并阐明了现有的“入门”教程。许多第三方已经制作了自己的教程材料(包括InfoWorld)。现在有多本TensorFlow书籍和几本在线TensorFlow课程。您甚至可以参加斯坦福大学的CS20课程,TensorFlow for Deep Learning Research,该课程在线发布所有幻灯片和讲义。

TensorFlow库有几个新的部分,它们提供的接口需要较少的编程来创建和训练模型。其中包括tf.keras,它提供了TensorFlow版本的其他引擎中立的Keras软件包,并tf.estimator提供了许多用于处理模型的高级设施。这些包括线性,深度神经网络的回归量和分类器,以及线性和深度神经网络的组合,以及可以构建自己的估算器的基类。此外,Dataset API使您能够从简单,可重用的部分构建复杂的输入管道。您不必只选择一个。作为本教程显示,可以有效地使tf.keras,tf.data.dataset和tf.estimator共同努力。

TensorFlow Lite是TensorFlow针对移动和嵌入式设备的轻量级解决方案,可实现低延迟和小二进制大小的设备内机器学习推理(但不是培训)。TensorFlow Lite还支持Android神经​​网络API的硬件加速。TensorFlow Lite模型足够小,可以在移动设备上运行,并可以为离线用例提供服务。

TensorFlow Lite的基本思想是训练一个完整的TensorFlow模型并将其转换为TensorFlow Lite模型格式。然后,您可以在Android或iOS上的移动应用程序中使用转换后的文件。

或者,您可以使用其中一个预先训练过的TensorFlow Lite模型进行图像分类或智能回复。智能回复是与上下文相关的消息,可作为响应选项提供; 这基本上提供了与Google的Gmail客户端相同的回复预测功能。

另一种选择是针对新的标记数据集重新训练现有的TensorFlow模型,这是一种称为转移学习的重要技术,可显着缩短训练时间。关于此过程的实践教程称为TensorFlow for Poets。

机器学习还是深度学习?

有时您知道您需要一个深度神经网络来有效地解决特定问题,例如对图像进行分类,识别语音或翻译语言。其他时候,您不知道是否有必要,例如预测下个月的销售数据或检测数据中的异常值。

如果你确实需要一个深度神经网络,那么Keras,MXNet与Gluon,PyTorch和TensorFlow与Keras或Estimators都是不错的选择。如果你不确定,那么先从Scikit-learn或Spark MLlib开始,然后尝试所有相关的算法。如果您从最佳模型或多个模型的集合中获得满意的结果,则可以停止。

如果您需要更好的结果,那么尝试在训练有素的深层神经网络上进行转移学习。如果您仍然无法获得所需,请尝试从头开始构建和训练深度神经网络。要优化模型,请尝试超参数调整。

无论您使用何种方法训练模型,请记住模型仅与您用于训练的数据一样好。记得清理它,使其标准化,并平衡训练课程的大小。


分享到:


相關文章: