1、并行与分布式多任务学习(Multi-task Learning, MTL)简介
我们在上一篇文章《并行多任务学习论文阅读(一)多任务学习速览》(链接:https://www.cnblogs.com/lonelyprince7/p/15481054.html)中提到,实现多任务学习的一种典型的方法为增加一个正则项[1][2][3]:
其中\(g(\textbf{W})\)编码了任务的相关性(多任务学习的假定)并结合了\(T\)个任务;\(\lambda\)是一个正则化参数,用于控制有多少知识在任务间共享。在许多论文中,都假设了损失函数\(f(\textbf{W})\)是凸的,且是\(L\text{-Lipschitz}\)可导的(对\(L>0\)),然而正则项\(g(\textbf{W})\)虽然常常不满足凸性(比如采用矩阵的核范数),但是我们认为其实接近凸的,可以采用近端梯度算法(proximal gradient methods)[4]来求解。
不过任务数量很大时,多任务学习的计算复杂度很高,此时需要用多CPU/多GPU对学习算法进行加速,尽量使\(T\)个任务的梯度的计算分摊到\(T\)个不同的工作节点(worker)上。但实际上由于正则项的存在和损失函数的复杂性,想做到这个需要我们仔细地设计并行多任务学习算法,在保证算法加速的同时而尽量不影响优化算法最终的收敛。
2、MTL的同步(synchronized)分布式优化算法
我们将会从MTL的单机优化方法开始,逐步说明分布式优化的必要性并介绍它的一种主要实现手段——同步分布式优化算法。
我们先来看单机优化,由于\(g(\mathbf{W})\)正则项的不光滑性,MTL的目标函数常采用基于近端梯度的一阶优化方法进行求解,包括FISTA[5], SpaRSA[6]以及最近提出的二阶优化方法PNOPT[7]。下面我们简要回顾一下在这些方法中涉及到的两个关键计算步骤:
(1) 梯度计算(gradient computing) 设第\(k\)迭代步的参数矩阵为\(\mathbf{W}^{(k)}\),目标函数光滑部分\(f(\mathbf{W}^{(k)})\)的梯度由每个任务的损失函数单独计算梯度后拼接而得:
(2) 近端映射(proximal mapping) 在梯度更新后,我们会计算
此处\(\eta\)是迭代步长。不过请注意,此处的\(\hat{\mathbf{W}}\)并不是我们下一步的搜索点,下一步的搜索点会经过近端映射