随笔分类 - 分布式机器学习
摘要:
同步算法的共性是所有的节点会以一定的频率进行全局同步。然而,当工作节点的计算性能存在差异,或者某些工作节点无法正常工作(比如死机)的时候,分布式系统的整体运行效率不好,甚至无法完成训练任务。为了解决此问题,人们提出了异步的并行算法。在异步的通信模式下,各个工作节点不需要互相等待,而是以一个或多个全局服务器做为中介,实现对全局模型的更新和读取。这样可以显著减少通信时间,从而获得更好的多机扩展性。
阅读全文

摘要:
SSGD算法由于通信比较频繁,在通信与计算比较大时(不同节点位于不同的地理位置),难以取得理想的加速效果。模型平均方法(MA)中,每个工作节点会根据本地数据对本地模型进行多轮的迭代更新,直到本地模型收敛说本地迭代轮数超过一个预设的阈值,再进行一次全局的模型平均,并以此均值做为最新的全局模型继续训练。但是MA算法通常会带来精度损失,实践中需要仔细调整参数设置,或者通过增加数据块粒度的动量来获取更好的效果。EASGD方法则不强求全局模型的一致性,而是为每个工作节点保持了独立的探索能力。
阅读全文

摘要:
其中,SSGD算法每次依据来自 𝐾个不同的工作节点上的样本的梯度来更新模型,设每个工作节点上的小批量大小为 𝑏,则该算法等价于批量大小为 𝑏𝐾 的小批量随机梯度下降法。尽管梯度的计算可以被分摊到个计算节点上,然而梯度下降的迭代是串行的。每轮迭代中,Spark会执行同步屏障(synchronization barrier)来确保在各worker开始下一轮迭代前w已被更新完毕。如果存在掉队者(stragglers),其它worker就会空闲(idle)等待,直到下一轮迭代。
阅读全文

摘要:
目前对图算法进行并行化的主要思想是将大图切分为多个子图,然后将这些子图分布到不同的机器上进行并行计算,在必要时进行跨机器通信同步计算得出结果。学术界和工业界提出了多种将大图切分为子图的划分方法,主要包括两种,边划分(Edge Cut)和点划分(Vertex Cut)。总而言之,边划分将节点分布到不同机器中(可能划分不平衡),而点划分将边分布到不同机器中(划分较为平衡)。接下来我们使用的算法为边划分。我们下面的算法是简化版,没有处理悬挂节点的问题。
阅读全文

摘要:
逻辑回归的目标函数常采用梯度下降法求解,该算法的并行化可以采用Map-Reduce架构。先将第𝑡t轮迭代的权重广播到各worker,各worker计算一个局部梯度(map过程),然后再将每个节点的梯度聚合(reduce过程),最终对参数进行更新。在Spark中每个task对应一个分区,决定了计算的并行度。在Spark的实现过程中,map阶段各task运行map()函数对每个样本(𝑥𝑖,𝑦𝑖)计算梯度𝑔𝑖, 然后对每个样本对应的梯度运行进行本地聚合,以减少后面的数据传输量。
阅读全文

摘要:
做为最后一篇分布式多任务学习的论文阅读记录,我决定对我目前为止粗读和精读的论文进行一次总结,然后陈述一些个人对该研究领域的见解和想法。目前已经有许多论文对多任务学习提出了并行化策略,我们可以大致概括如下几类:(1) 基于近端梯度的同步算法 (2) 基于近端梯度的异步算法 (3) 基于分解代理损失函数的算法 (4) 基于本地去偏估计的算法。⽬前关于不同的损失函数和不同的正则项已经有很多学者做过了,不过⽬前基于任务簇/层次化的多任务学习⽅法还没有⼈对专门其并⾏化。
阅读全文

摘要:
在分布式的环境中,已有的基于近端梯度的同步/异步优化算法需要多轮的通信,时间开销较大。这样,如何实现机器间的有效通信是我们必须要想办法解决该问题。论文《distributed multitask learning》提出的算法介于传统的近端梯度优化算法和local lasso之间,其计算只需要一轮通信,但仍然保证了使用group regularization所带来的统计学效益。
阅读全文

摘要:
实现多任务学习的一种典型的方法为增加一个正则项,写为f(W)+g(W)形式,目标函数中的f(W)很容易并行化,但是一般g(W)就很难并行化了,那么如何解决这个问题呢?答案是运用一个可以分解的代理损失函数来替换掉原始的目标函数。我们接下来就以论文《Parallel Multi-Task Learning》[4](zhang 2015c等人)为例来介绍该思想。该论文MTLR模型[5](zhang 2015a)的基础上利用FISTA算法设计代理损失函数,该代理函数可以依据学习任务进行分解,从而并行计算。
阅读全文

摘要:
对于多任务学习,当任务数量很大时,其计算复杂度很高,此时需要用多CPU/多GPU对学习算法进行加速,尽量使𝐾个任务的梯度的计算分摊到𝐾个不同的工作节点(worker)上。但实际上由于正则项的存在和损失函数的复杂性,想做到这个需要我们仔细地设计并行多任务学习算法,在保证算法加速的同时而尽量不影响优化算法最终的收敛,并保证优化算法结果的一致性。我们将会从MTL的单机优化方法开始,逐步说明分布式优化的必要性并先后介绍它的两种主要实现手段——同步分布式优化算法和异步分布式优化算法。
阅读全文
