Large Scale Machine Learning--An Engineering Perspective--1. 大规模机器学习平台的构成

云啸
2023-12-01

机器学习/数据挖掘在各种业务场景中的应用已经非常之多了,在线广告/搜索/商品推荐/风险建模/图像处理/语音识别/机器翻译都是机器学习成功应用的典型case。

有效应用机器学习解决业务问题,在我看来依赖于三个维度:
1. 对Domain相关的business knowledge的深入理解[1]
2. 对机器学习技能知识本身的深入理解
3. 高效的工具平台[2][3][4][5][6]
这三个维度我是刻意按照心目中的优先级从高到低排序出来的。

也就是说,当我们讨论从无到有build up一个large-scale ML platform的时候,应该先问问自己,我们是不是真得需要这个东西?
因为在我看来,对业务的深入理解 >> 机器学习技能知识的深度理解 >> 工具平台。有好的工具平台,可以让我们事倍功半,提升效率。但是对业务和ML知识的深入理解,可以让我们在解决方案的设计空间里有效地进行妥协,在很多场景下用看起来不那么graceful的工具,获得相距不多的产出[7]。所以说,当我们想要build up一个large-scale ML platform的时候,应该先问一下自己,我们真得需要这个东西吗?本质上,所有健康的公司都是result-driven,要从市场上获得相应的回报。脱离业务需要,对技术大平台的追求,会带来灾难性的后果[8]。当我们真得发现large-scale ML platoform的缺乏影响到了业务的迭代效率以后,我们还应该问另一个问题,是不是一定要从头build up这样一个platform?现有的工具平台(基于开源系统搭建private platform,以及基于Cloud的public 机器学习平台[9][10])是不是已经能够满足业务上对large-scale ML的需求?

对这些问题都作完审慎的思考之后,我们才应该回到原始问题上面——从无到有build up一个large-scale ML platform具体需要做什么?

个人理解,一个五脏俱全的large-scale ML platform应该包括这样几个组件:
1.  Mandatory部分
1.1. 算法逻辑模块
1.1.1. 有监督学习
1.1.1.1. 线性模型
1.1.1.2. 非线性模型
1.1.2. 无监督学习
1.1.2.1. 聚类算法
1.1.2.2. 主题模型
1.2. platform交互模块
1.2.1. 用于提交算法任务的client
1.2.2. 用于tracking任务进度的portal
1.2.3. 数据交互
1.2.4. 资源调度模块
1.3. 算法效果评估模块                  
1.3.1. Business-independent metrics(mandatory)
Precision/Recall/F1 Score/AUC/Confusion Matrix
1.3.2. Business-dependent metrics(optional)
金融领域的KS/Lift/SWAP SET  Analysis
机器翻译领域的BLEU score 
2. Optional部分 
2.1. 数学统计模块
2.2. 特征提取模块

整个大规模机器学习平台中,工作量最大,也是最核心的就是1.1的算法逻辑模块了。所以在我们的系列文章中也会花费比较多的功夫来阐述在这个部分要做的细节工作。

大体上来说,我们会分别介绍有监督学习和无监督学习算法的大规模并行化实施所需关注的技术问题。
有监督学习算法中,我们会分别介绍线性模型和非线性模型。
线性模型中,考虑到Logistic Regression模型在互联网业务领域中的popularity (广告CTR预估[11],新闻分类,相关性打分,险费计算,等等。抽象来说,所有能够formulate成二分类问题的业务场景都可以使用LR这个模型),我们选择了这个模型来进行介绍。
在LR模型之外,我们也会对SVM模型进行介绍,因为SVM这个模型有着非常优雅的数学结构,而且kernel函数的引入,使得SVM的建模能力也变得非常的powerful,这使得SVM模型具备比较典型的代表性,这是我们选择介绍这个模型的原因。 
非线性模型中, 我们会先对经典的决策树模型进行介绍,并探究其并行化的套路。不过在实际的工业界应用中,因为决策树模型本身固有的overfit的缺点,通常应用不多,实际上更多使用的是其ensemble变种GBDT或Random Forest。所以在介绍完基础的决策树模型之后,我们会探讨
GBDT和Random Forest这两个模型,并分别讨论这两个模型的分布式并行化实施的相关tricks。非线性模型的并行化与线性模型相比,难度略有增加,不过捅破一层窗户纸后,也还是能够看到跟线性模型的分布式实施的核心共通之处。

无监督学习算法中,我们分别选择了两个硬聚类算法(K-Means和层次聚类),两个软聚类算法(PLSA和LDA)。K-Means是非常经典的聚类算法了,在业务场景中也有着大量的应用case。不过在我们的实际业务经验中,当数据规模没有达到非常庞大的规模情形下,层次聚类其实也是一个非常好用易调的算法,这是我们选择层次聚类算法进行介绍的原因。而PLSA和LDA作为非常经典的两个主题模型,在文本潜层语义挖掘领域也有着非常广泛的应用,虽然在我有限的业务经验中,坦率说,亲自操作过的成功完整应用PLSA/LDA带来业务指标提升的case并不算多,但从身边朋友提供的一些case来说,主题模型还是能够带来不少字面语意所不能表征的信息,进而带来业务效果的改善的,所以我们将这两个主题模型选入进行介绍。
关于无监督学习模型,我们还补充了两个基于神经网络的模型,一个是word2vec,另一个是神经网络语言模型,这两个模型实际上是比较相似的,但是在建模细节上存在一些差异,一个适用于特征embedding,另一个则更适用于建立language model,在实际的业务场景中,已经能够看到越来越多的应用案例,再加上神经网络派系模型这两年的火爆,所以我们选择了两个神经模络模型进行介绍。值得一提的是,这两个模型跟目前备受关注的深度学习模型还是有所不同,不能随便混为一谈。客观来说,word2vec只能算是shallow model,神经网络语言模型倒是大体可以算是一个简易的深度神经网络了,只是网络层级仍然较少罢了。

在算法逻辑的介绍中,除了阐述几个具体算法的分布式实施之外,我们还会探讨一些方法论层面的东西,这也是我们试图从一个个具体的算法中期望抽离出来,更具普适性,不易变的那个事物了。首先我会讨论几种数据并行编程的范式,包括BSP、SSP以及异步更新,对这些编程范式的讨论其实在不少文献中都有所提及,比如[12][13][14],只不过我们把这些方法论结合一个个具体的算法一起讲述,更容易形成呼应效果一些。另外在数据并行的编程范式之外,我们也会讨论模型并行的一些技术要点,虽然模型并行目前主要应用在深度学习的个别领域,但实际上在一些常规机器学习模型中,已经可以观照到模型并行的潜力,比如超大规模LR和超大规模主题模型,所以了解模型并行的思想原理,对我们可能的设计决策还是有着比较重要的参考意义的。

上述基本上就是算法逻辑相关的内容,刨开算法逻辑相关模块以外,算法效果评估的指标也是非常重要的构成要件。无论是有监督学习算法还是无监督学习算法,无论是shallow model还是deep model,本质上所有的机器学习算法都可以认为是一种迭代式的求解过程,所以都会涉及到收敛条件的设定以及目标效果的衡量。这个环节看起来不经意,但是从业务应用的角度,其实是至关重要的,所以我们会分别介绍一些业务无关的效果度量指标,以及一些业务相关的效果度量指标。这个部分,我们没有能力也不打算大而全地覆盖,更多是希望引起读者们对目标效果衡量这个环节的关注,再结合自己具体的业务场景进行定制,就算达到我们的目的了。

有了算法逻辑和效果评估模块,如果不考虑易用性的话,一个大规模机器学习平台实际上就已经具备基本的使用功能了,可以满足业务需求了。

接下来,我们会介绍特征工程的一些常用技术,包括一元特征的处理-----归一化以及离散化,这些看起来straightforward的主题背后其实还是蕴含着一定的知识密度,比如离散化就可能通过标签制导的方式,完成更具弹性的离散处理。另外,我们也会讨论二元特征的生成,以及其物理意义。在这个部分,我们还会讨论线性模型与非线性模型下,特征处理的差异化以及原因的分析。期望通过这个部分的章节介绍,能够让读者们对常规的特征处理技术建立起比较清晰的认识,具备将这些认识工具化,流程化,以应用于自身业务场景的可能。

上面所提及的大抵是一些比较主流常用的大规模机器学习平台会涉及的内容,接下来,我们会试图探讨一些这个领域相对前沿的技术点,包括参数服务器,GPU计算。这些较新技术的出现,是为了解决哪些问题?又是怎样解决这些问题的?我们会在这个部分进行一定的探讨。此外,我们会对一些比较popular的开源的分布式机器学习平台进行介绍,他山之玉,正可用作借鉴。

最后会是一个总结,在总结部分我们会探讨一下对于大规模机器学习的从业人员所需素养的思考,同时会结合我们的从业经验谈一下对一些互联网公司内部大规模机器学习平台演化历程的观察和思考,最后会以我们对于大规模机器学习这个领域的一些展望作为结语。

以上即是对大规模机器学习平台构成的一个导引式介绍。


[1] [Xavier Amatriain@Quora] In machine learning, is more data always better than better algorithms? https://www.quora.com/In-machine-learning-is-more-data-always-better-than-better-algorithms
[2] [Hadoop Mahout]  http://mahout.apache.org/
[3] [Spark MLLib]  http://spark.apache.org/mllib/
[4] [深盟开源的DMLC]  https://github.com/dmlc
[5] [Hadoop Vowpal Wabbit]  http://hunch.net/~vw/ ,  http://hunch.net/?p=2094
[7] 电风扇与空皂盒和宇航员与铅笔的故事.  http://www.douban.com/note/251143203/
[8] [Scott Rosenberg 2008] 梦断代码.  http://book.douban.com/subject/3142280/
[9] Amazon Machine Learning.   https://aws.amazon.com/cn/machine-learning/
[10] Microsoft Azure  Predictive Analytics.   https://azure.microsoft.com/en-us/services/machine-learning/?b=16.36
[11] [H. Brendan KDD2014] Ad Click Prediction: a View from the Trenches.  http://research.google.com/pubs/pub41159.html
[12] [Valiant1994] Direct Bulk-Synchronous Parallel Algorithms.  http://www.sciencedirect.com/science/article/pii/S0743731584710859
[13] [Qirong NIPS2013] More Effective Distributed ML via a Stale Synchronous Parallel Parameter Server.  http://papers.nips.cc/paper/4894-more-effective-distributed-ml-via-a-s
[14] [Benjamin NIPS2011] Hogwild: A Lock-Free Approach to Parallelizing Stochastic Gradient Descent.  http://papers.nips.cc/paper/4390-hogwild-a-lock-free-approach-to-parallelizing-stochastic-gradient-descent
 类似资料: