深度一篇文讲清什么是大规模机器学习

来源:本文经授权转自知乎

作者:白刚、杨军

海量数据场景下,通过大规模机器学习方法来充分挖掘数据集中的价值已经在很多公司里都有着非常多的应用了,相关的资料也已经很多,但仍谈不上非常的系统。

将门经本人许可,转载了大规模机器学习领域2位优秀的从业者——

白刚、

杨军的回答。希望可以把这个方向的知识体系梳理得更为清晰系统化,为这个领域的从业者提供一些导引性的帮助。

白刚

机器学习研究的是从数据中自动的归纳逻辑或规则,并根据这个归纳的结果与新数据来进行预测的算法。这个方向是与数据相关的,而从前数据的收集过程效率往往很低成本很高,很少有大规模的问题需要解决。直到互联网发展起来,web服务器可以记录和收集大量的用户访问、交互信息,这类数据的收集成本非常低,并且有一定的价值。由此开始,“大规模机器学习”变得可行,并且越来越重要。

机器学习的应用上,我们接触到的各种问题、算法、技术看似复杂,但主要可以看成两个方面:

根据要建模的问题和应用的数据,确定模型的representation方案

在representation的无限种可能中去寻找最优的模型的optimization方法

“大规模机器学习”所涉及的就是从模型的representation和optimization这两个方面,去解决应用大规模的数据时的理论和工程上的问题。

为什么“大规模”是有益的,比“小规模”优势在哪里?

技术工作要以经世致用为则,而不是以fancy为则。

——WhoWho

模型训练的目标是使得模型应用到新数据上时效果最好,也就是使得generalizationerror最小。而这个generalizationerror,对于supervisedlearning,理论上有两个来源:bias和variance。

Highbias可以看做模型的建模能力不足,在训练集上的错误较大--并且在新数据上往往会更差,也就是under-fitting;

Highvariance则可以看做模型过于拟合训练集,而对新数据会效果很差,也就是over-fitting。

所以对于模型效果上,除了特征工程这类trick之外,“调得一手好参”——解决好bias和variance的tradeoff,也是部分算法工程师的核心竞争力。但“大规模机器学习”可以一定程度上同时解决这两个问题:

解决highvariance/over-fitting:增大样本集。Variance的引入可以理解成样本集不够全面,训练样本的分布与实际数据的分布不一致造成的。扩大样本集,甚至使用全量的数据,可以尽量使得训练集与应用模型的数据集的分布一致,减少variance的影响。

解决highbias/under-fitting:提升模型的复杂性。通过引入更多的特征、更复杂的结构,模型可以更全面的描述概率分布/分界面/规则逻辑,从而有更好的效果。

所以当老板/技术委员会/隔壁团队的挑刺小能手/无知的围观群众提出几十上百计算节点/几TB数据吞吐不够绿色环保不要老想着搞个大新闻时,要以深邃的理论基础兼可观的业务收益说服众人:经世致用,而不是追求fancy。

模型的表示和优化

从模型的representation和optimization这两个方面,更形式化的定义机器学习的求解问题,learning的过程大概可以这么描述:

其中就是representation,或者说模型参数;D是数据;Σ(·)和Ω(·)分别是loss/risk/objective和prior/regularization/structuralknowledge。

的过程即前面说的optimization,往往是迭代优化的过程。有些可以转化为最优化问题,通过数值优化的方法,比如batch的LBFGS,或者online的SGD/FTRL等等来进行参数估计;有些是无法构造成可解的最优化问题时,转化为概率分布的估计问题,通过probabilisticinference来解决--比如用Gibbssampling来训练latentDirichletallocation模型。

无论是数值优化,还是sampling,都是不断迭代优化的过程:

每一步迭代做两件事。第一个是当前的模型在数据集上D的evaluation,得到一个“与好的模型相比可能存在的偏差”这个量;第二个是根据这个偏差量,去修正模型的过程。

大规模机器学习就是解决D和的规模非常大的时候所引入的理论上和工程上的问题。“知识体系”可以两个方面来整理,一方面是宏观上的架构,另一方面是无数微观上的trick。迭代中的那两个步骤决定了宏观上的架构应该是什么样子。两个步骤内的计算和之间的数据交互引入了解决多个特定问题的技术和trick。

首先,D和需要分布在多个计算节点上。

假设数据分布在n个datanode节点上;模型分布在m个modelnode节点上。数据/样本集只与第一步有关,这部分计算应该在数据所在的节点上进行;第二部是对模型的更新,这一步应该在模型所在的结点上进行。也就是说,这个架构中有两个角色,每个都有自己的计算逻辑。并且在分布式的系统中,需要有一套replica的机制来容错。

几乎所有的大规模机器学习的平台、系统都可以看做这由这两个角色构成。在SparkMLLib里边,driverprogram是modelnode,executor所在的workernode是datanode;在VowpalWabbit里边,mapperid为0的节点扮演了modelnode的角色,所有的mapper扮演了datanode的角色;在ParameterServer里,server是modelnode,worker是datanode。其中MLLib和VW的modelnode都是单个结点,而PS可以把模型扩展到多个结点。

其次,节点间需要传输数据。datanode需要在计算前先获取当前的模型,modelnode需要得到更新量。

MLLib通过RDD的treeAggregate接口,VW通过allReduce,这两者其实是相同的方式。结点被分配在一个树状的结构中,每个节点在计算好自己的这部分更新量后,汇总它的子节点的结果,传递给它的父节点。最终根节点(modelnode)获取到总的更新量。DMLC中的Rabit对这类aggregation数据传输提供了更简洁的接口和更鲁棒的实现。我们应用Rabit实现了一套multi-tasklearning去训练不同广告位上的广告点击率模型的方案。

而PS则是通过worker(datanode)去pull其需要的那部分,计算更新量并把自己的那部分去push给server(modelnode),server去做对应的模型的更新。这个似乎比前边的aggregation要简单,但当每个datanode进度差别太大时,又引入了新的问题。

所以第三点问题涉及到并行和一致性。分布式的系统中每个节点的状态都不相同,计算的进度也会不一样。当某个datanode计算的更新量对应的是若干轮迭代之前的时,它对优化不一定有贡献,甚至可能影响到收敛。

VW和MLLib上的迭代计算,可以看做是同步的。所有的modelnode获取了所有的datanode的汇总起来,再更新,并广播给所有的datanode。每次迭代modelnode获取的是完整的更新量,datanode拿到的是一致的模型。所以这里相当于设置了barrier,等大家都到达这一轮的终点时,再放大家开启下一轮。

这里的tradeoff是:完全不设置barrier,也就是纯asynchronousprocessing,会让系统尽快的推进下去,但节点间进展程度差异太大会造成优化求解的收敛性不稳定;每一轮迭代都设置barrier,也就是bulksynchronousprocessing,会保证数据的一致,但是会在每一轮都等待慢的节点,造成效率不足的问题。

所以一个折衷的方案就是设置barrier,当不是每一轮都设置,而是限定一个时间窗口长度。计算的最快的节点也要等到所有的都被应用到的更新之后再开始下一轮pull







































白癜风能治好吗
专治白癜风医院



转载请注明:http://www.nydjfy.com/xxzl/2899.html

  • 上一篇文章:
  •   
  • 下一篇文章: