进入战斗姿态:如何选择机器学习库
选择机器学习库的时候最需要考虑的五个特性
编者注:更多人工智能内容请关注2018年4月10-13日人工智能北京大会

选择一个机器学习(ML)库来解决预测问题,是个说起来容易做起来难的事情。

选择太多了。每一个库对于它擅长的特定问题都有着良好的特性与优势。 即使对于在机器学习和数据科学领域具有相当经验的人来说,逐个检查所有不同的方案也是一种煎熬。你该从哪里开始? 在Salesforce Einstein,我们必须不断地研究市场以保持领先地位。 关于机器学习库的前五重要的特征,以下是我们的一些观察,开发者在决定使用哪个库时可以参考。

1.编程范式

大多数机器学习库,在高级设计模式中分为两个模式:符号式(symbolic)和命令式(imperative)。

在符号式程序中,您可以从功能上定义复杂的数学计算,而无需实际执行。它通常采用计算图的形式。你把所有的东西放在一起,并用抽象的方式把它们连接起来,当把真值作为输入数据传进去时,它才会真正实现计算。这种模式的最大优点是可组合性和抽象性,从而使开发人员能够专注于更高层次的问题。效率是另外一大优势,因为将这些函数并行化执行相对来说容易一些。

Apache Spark的ML库,Spark MLlib以及任何基于Spark的库,比如Microsoft的MMLSpark和Intel的BigDL,都遵循这种模式。有向无环图(DAG)是计算图的表示形式。符号式编程机器学习库的其他例子有CNTK,具备静态计算图;Caffe2,使用网络结构类Net(操作符operator的计算图);H2O.ai;以及Keras

在命令式编程中,一切都是先执行的。你写下一行代码,当编译器读取这行并执行它时,就会发生真实的数值计算,然后移到下一行代码。这种风格使得创建模型原型更容易,因为它往往更灵活,更容易调试,易于排除故障。 Scikit-learn是一个流行的Python库,属于这个类别。其他库,如auto sklearnTPOT是Scikit-learn的高阶抽象层,也遵循这种范式。 PyTorch是另一种支持动态计算图的主流选择,动态计算图让整个计算流程是命令式的。

显然,这两种方法互有胜负,究竟选择哪种好,是随着用例不同而不同的。命令式编程非常适合研究,因为它天然支持更快速的原型设计 —— 允许重复迭代,试错和和快速反馈循环 —— 而符号式编程更适合于生产环境的应用。

有一些库结合了这两种方法,创建了一种混合风格。最好的例子是MXNet,它允许符号式编程中的回调函数中插入命令式代码,或者把符号式编程作为命令式程序的一部分。另一个更新的发展是来自Google的TensorFlowEager Execution。尽管最初,它只是一个具备符号式计算范式的Python库(一个张量的静态计算图),但是Eager Execution并不需要一个图,而且可以立即执行。

• 符号式:Spark MLlibMMLSparkBigDLCNTKH2O.aiKerasCaffe2

• 命令式:scikit-learnauto sklearnTPOTPyTorch

• 混合式:MXNetTensorFlow

2.机器学习算法

监督学习,无监督学习,推荐系统和深度学习是我们所采用的机器学习算法中常见的分类。我们需要再次强调,应用场景(用例)将决定使用哪个库最好。例如,如果您正在进行大量自定义的图像处理,如果其他条件相同的话,Caffe2将是一个不错的选择。它是Caffe的进化版,Caffe一开始把CNN应用于图像分类。 CNTK将是自然语言处理的一个合理选择,因为CNTK框架诞生于微软的语言服务部门。另一方面,如果大多数用例是监督学习和非监督学习,Spark MLlib,scikit-learn,H2O.ai和MMLSpark也都是很好的选择,因为它们支持大量的监督和非监督算法。除此之外, Spark MLlib,H2O.ai和Mahout还通过提供协作过滤算法对推荐系统提供支持。

随着深度学习(DL)的兴起,许多较老的库现在已经显得力不从心。 TensorFlow是首批向数据科学家提供深度学习的计算库之一。今天,我们还有很多其他的专注于深度学习的框架可以选择,其中包括PyTorch,Keras,MXNet,Caffe2,CNTK和BigDL。还有其他一些算法库支持DL算法,但DL不是它们的主要功能,比如MMLSpark(用于图像和文本学习)和H2O.ai(通过deepwater插件提供对DL的支持)。

  • 有监督和无监督:Spark MLlib,scikit-learn,H2O.ai,MMLSpark,Mahout
  • 深度学习:TensorFlow,PyTorch,Caffe2(用于处理图片),Keras,MXNet,CNTK,BigDL,MMLSpark(用于处理图片和文字),H2O.ai(通过deepwater插件提供支持)
  • 推荐系统:Spark MLlib,H2O.ai(通过Sparkling Water插件提供支持),Mahout

3.硬件和性能

计算性能是为您的项目选择合适的库的关键标准之一。这一项对于专精于DL算法的库更为重要,因为它们往往是计算密集型的。

推动DL开发的最大趋势之一是GPU的进步,以及GPU提供了对大型矩阵运算的支持。所有DL库(如TensorFlow,Keras,PyTorch和Caffe2)都支持GPU,不过许多通用库(如MMLSpark,H2O.ai和Apache Mahout)也提供了对GPU的支持。CNTK和MXNet拥有自动化多GPU和多服务器支持,允许用户进行快速地进行跨多个GPU的分布式训练,而且无需任何配置。然而,TensorFlow由于比其他的DL平台计算速度,而得到了一些负面评价。作为一种弥补,TensorFlow在其新的定制AI芯片Tensor Processing Unit(TPU)上大肆宣传。其缺点是,TPU是非商品化的硬件,只能与TensorFlow一起工作,这导致了供应商锁定的现象。

Caffe2,MXNet和TensorFlow同时也因对移动计算支持而脱颖而出。所以,如果您的使用案例需要在移动设备上进行机器学习训练,那它们就会是你最好的选择。

关于性能方面值得一提的是,大部分基于Spark构建的库都能够依靠内存缓存中间数据,靠这一点利用Spark进行并行集群计算,使本质上需要『迭代』的机器学习算法运行得更快。 Apache Mahout是一个例外,它直到最近才支持Hadoop MapReduce,并且要进行对计算而言开销很大的磁盘I / O操作,因此它对于迭代算法来说速度较慢。 Mahout现在在Spark,H2O.ai和Apache Flink上增加了对Scala语言的支持。 BigDL在Spark的生态系统中使用CPU实现DL的方法是一种新颖的方式,与传统的利用GPU加速的DL库有所不同,BigDL使用英特尔的MKL和多线程编程。

  • CPU:Spark MLlib,scikit-learn,auto sklearn,TPOT,BigDL
  • GPU:Keras,PyTorch,Caffe2,MMLSpark,H2O.ai,Mahout,CNTK,MXNet,TensorFlow
  • 移动计算:MXNet,TensorFlow,Caffe2

4.可解释性

ML软件与传统软件的区别在于,其预测行为本身或产出的结果不是那么可预期的。与基于规则的引擎不同,这种软件能不断学习到新的规则。我们在Salesforce Einstein面临的最大挑战之一,是如何持续不断地建立对机器学习应用的信任和信心。为什么预测影响因子X有更高的可能性转化客户,而影响因子Y在转化率方面引入的可能性较低?数据集中驱动算法进行某些预测的数据模式是什么?我们能否将机器学习模型的这种洞察力转化为商业行动?

对这个问题的其他衍生问题包括,计算图执行时对算法评价指标的可视化,观察数据流并对它们进行优化,手工模型和/或调试模型质量。

这是一个在机器学习中相对不成熟的领域,只有少数库试图解决这个问题。 H2O.ai推出了机器学习可解释性,解决了这个问题的某些方面。 TensorFlow有一个称为TensorBoard的可视化工具,它帮助数据科学家理解、优化和调试大量的深度神经网络。Keras也通过其自身的模型可视化解决了这个问题。

虽然这些都是朝着正确方向的很好的步骤,但是为了鼓励ML被更广泛的接纳,可解释性领域还需要我们投注更多的新学,让机器学习更加透明,减少它的黑盒性。

  • 可解释性:TensorFlow(TensorBoard),H2O.ai(机器学习可解释性),Keras(模型可视化)

5.自动化机器学习

可以这样说:机器学习中最大的创新领域之一,就是自动化的机器学习。真实世界中的机器学习不仅仅是构建模型,还涉及到构造数据管线,其中包括ETL,特征工程,特征选择,模型选择(包括超参数调优),模型更新和模型部署。

工作流程中的许多步骤在各种应用和数据集处理中都是通用的,并且往往有重复的倾向,这就意味着存在对流程进行优化和自动化的机会。除此以外,某些工作流程特别需要数据科学和机器学习方面的直觉和领域知识,比如特征工程或深度模型调优。这些领域对于无法获得博士学位的人来说难以进入。实现许多步骤的自动化,可以加快数据科学家的工作效率,能够帮助他们在几个小时而不是几个月内帮助构建机器学习应用。

Auto sklearn,TPOT和H2O.ai就是建立在这个前提下的,而且针对的是有监督分类问题。Auto sklearn使用了贝叶斯优化进行自动化模型选择和超参调整。 TPOT正在使用遗传算法编程进行超参调整。 TPOT和H2O.ai都包含了几种不同级别的特征工程自动化。 MMLSpark针对图像和文本的特征,具备自动化模型选择,以及一定程度的自动化特征工程。

无论是从广度(数据管线中的不同阶段自动化)还是深度(单一一个数据处理阶段上的智能自动化)上,这类工具可以说是供不应求。

  • 超参数调整:auto sklearn(贝叶斯优化),TPOT(遗传编程)
  • 有限的自动特征工程:TPOT,H2O.ai,MMLSpark

其他注意事项

尽管机器学习模型在可用前需要在数据集上进行训练,但是在某些情况下,我们可以访问全球通用的数据集。比如,像ImageNet这种通用图像数据集,完全足够用于建立一个通用的图像分类模型,这也被称为预训练的模型。这样的模型可以作为插件来引入,这意味着不需要数据或者训练。 MMLSpark,CNTK,TensorFlow,PyTorch,Keras和BigDL都为通用分类任务提供预训练的模型。值得注意的是,这样的模型对于定制化用例是没有用的。例如,一个通用的图像分类模型,如果需要从作物田地的航拍图像中对农作物的类型进行分类的话,效果就会很差,但是它能很好地将猫与狗分类。这是因为,尽管ImageNet中存在农作物相关的图像,但是对于特定种类的作物,以及患上不同疾病的作物的训练数据是不足的,而那些数据可能刚好是化肥公司所关心的。

CNTK附带一些方便的功能,如数据集自动化随机提取,以及实时在线训练。尽管MMLSpark是一个Scala库,但它支持自动生成其他语言,也就是Python和R的接口。

  • 预训练模型:MMLSpark,CNTK,TensorFlow,PyTorch,Keras,BigDL
  • 实时培训:CNTK
  • 多语言支持:MMLSpark支持从Scala自动生成Python / R的接口

抉择时刻

当您将ML构建到产品中时,有多种ML库供您选择。尽管可能没有一个完美的选择,但考虑上述因素,有助于确保您为您的特定需求选择最佳解决方案。对于拥有数千家企业客户的企业公司来说,还有许多市场尚未涉足的其他挑战。标签泄漏,也被称为数据泄漏,一直是ML库的致命弱点。这一点的发生是由于存在未知的业务流程,导致用于模型训练的数据集具有代表实际标签的字段。检查数据是否存在泄漏,并将泄露的字段从数据中删除是得到理想模型的关键。

多租户是另一个关键点 —— 我们如何共享机器学习平台和资源,为多个用户提供服务,每个用户都有自己独特的数据集,并导致完全不同的模型被训练?随着数据/模型规模的不同,这个问题也不同。随着行业继续面临这样的挑战,一个完整、详尽开发的自动ML解决方案,虽然现在暂时不存在,在将来可能被证明是成功的关键。

Mayukh Bhaowal

Mayukh Bhaowal是Salesforce Einstein的产品管理总监,负责自动化机器学习。 Mayukh从斯坦福大学毕业,获计算机科学硕士学位。 在加入Salesforce之前,Mayukh在机器学习和分析领域的初创公司工作。 他担任过机器学习平台初创公司Scaled Inference的产品总监,该公司获得Khosla Ventures的投资,曾在获得Accel投资的电子商务创业公司Narvar担任产品负责人。 他还曾经担任过雅虎和甲骨文的首席产品经理。

国会图书馆的主阅读室(来源: Flickr上的国会图书馆照片)