选择一个机器学习(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 sklearn和TPOT是Scikit-learn的高阶抽象层,也遵循这种范式。 PyTorch是另一种支持动态计算图的主流选择,动态计算图让整个计算流程是命令式的。
显然,这两种方法互有胜负,究竟选择哪种好,是随着用例不同而不同的。命令式编程非常适合研究,因为它天然支持更快速的原型设计 —— 允许重复迭代,试错和和快速反馈循环 —— 而符号式编程更适合于生产环境的应用。
有一些库结合了这两种方法,创建了一种混合风格。最好的例子是MXNet,它允许符号式编程中的回调函数中插入命令式代码,或者把符号式编程作为命令式程序的一部分。另一个更新的发展是来自Google的TensorFlow的Eager Execution。尽管最初,它只是一个具备符号式计算范式的Python库(一个张量的静态计算图),但是Eager Execution并不需要一个图,而且可以立即执行。
• 符号式:Spark MLlib,MMLSpark,BigDL,CNTK,H2O.ai,Keras,Caffe2
• 命令式:scikit-learn,auto sklearn,TPOT,PyTorch
• 混合式:MXNet,TensorFlow
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解决方案,虽然现在暂时不存在,在将来可能被证明是成功的关键。