y1−fW(x)2+2σ221y2−fW(x)2+logσ1σ2=2σ121L1(W)+2σ221L2(W)+logσ1σ2对于分类任务,可作如下假设:
p(y∣fW(x))=Softmax(σ21fW(x))
从而通过近似可以得到相同的目标函数。回归和分类混合的多任务同样如此。
在实践中,其实就是将噪声方差σ2 也作为模型的可学习对象,从而使得模型可以自动地调整目标函数中各个损失项的权重,然后在目标函数末尾加上正则项log(σ) 防止参数σ 过大,权重为 0
。
同时具体到代码上,其实是参数化s:=logσ2 ,然后参与计算时在指数计算回去,即σ2=exp(s) . 因为这能够保证参数化时满足σ2>0 的约束,同时也保证了权重1/σ2 不会为 Nan
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| log_var_a = torch.zeros((1,), requires_grad=True) log_var_b = torch.zeros((1,), requires_grad=True)
params = ([p for p in model.parameters()] + [log_var_a] + [log_var_b]) optimizer = optim.Adam(params)
def criterion(y_pred, y_true, log_vars): loss = 0 for i in range(len(y_pred)): precision = torch.exp(-log_vars[i]) diff = (y_pred[i]-y_true[i])**2. loss += torch.sum(precision * diff + log_vars[i], -1) return torch.mean(loss)
|
值得注意的是,因为损失项的权重1/σ2 也是模型学习得到的,所以面对那些很难拟合的子任务L(W),模型会本能地/贪心地 抑制这一项所占的比例。所以该方法反而会使模型关注那些简单的任务。如果作业时目标是希望学习到应对难任务的模型,那么该方法反而可能会降点 23333。
帕累托最优
Sener O, Koltun V. Multi-task learning as multi-objective optimization[J]. Advances in neural information processing systems, 2018, 31.
处理多任务损失的另一个方法是最优化领域的视角。一个很直观的理解就是给多个损失项乘以或静态或动态的权重,其实就是将多目标优化问题转变为了优化加权后的单目标优化问题。但这种调权重的方法的问题是,如果多个任务间存在竞争关系——一个任务变好,其它任务就会变差,那么就很难找到一组有效的权重了。
帕累托最优(Pareto optimal)是经济学中的一种资源分配的理想状态,而在多目标优化领域,就代表在刚开始优化时,每个任务都能变好,直到优化到某一步时,发现一个任务变好但至少有一个其他任务会变差,那么我们就认为达到了帕累托最优(的这样一个临界状态),优化结束。
问题转换
应用帕累托最优策略,我们需要先将MTL原来的单目标优化恢复成多目标优化:
θshθ1,…,θTminL(θsh,θ1,…,θT)=θshθ1,…,θTmin(L^1(θsh,θ1),…,L^T(θsh,θT))⊤
根据优化方向的一篇数学论文里提出的 Multiple Gradient Descent Algorithm (MGDA),我们可以通过求其 KKT 条件来寻找满足帕累托最优的驻点。
- 对于所有的任务∀t,∇θtL^t(θsh,θt)=0;
- ∃α1,…,αT≥0 s.t. ∑t=1Tαt=1 使得∑t=1Tαt∇θshL^t(θsh,θt)=0.
对于第一个条件,因为是对子任务自己的网络参数θt 求梯度,要优化满足这个条件等同于平时正常地使用梯度下降来求解。
对于第二个条件,MGDA给出了证明,如果能最小化下面的目标函数为0,那么就得出了对应的驻点;如果没法为0,该目标函数的优化同样能得出可以改善性能的解。
α1,…,αTmin⎩⎨⎧t=1∑Tαt∇θshL^t(θsh,θt)22t=1∑Tαt=1,αt≥0∀t⎭⎬⎫
该优化问题,本质上就是在一个凸包里找一个点,使其距离所有的已知点都尽可能最近。这是在优化方向被广泛研究的问题。例如 Frank-Wolfe算法就是求解这类带约束的凸优化问题的一种算法。
参数更新算法
综上所述,我们可以得到一个完整的更新网络参数的算法:
先梯度下降更新 任务自己的网络参数θt ,然后使用Frank-Wolfe算法求解得到合适的α,通过加权更新共享网络参数θsh.
链式改进
上述算法虽然可以求解问题,但效率太低。直观表现就是每个任务都要计算针对共享参数的梯度∇θtL^t(θsh,θt),从而反向传播的计算量就和任务的数量成正比;当共享参数量很大时,非常低效。
作者专门针对 encoder-decoder的网络,提出了以encoder的输出Z 为界的优化方案,将反向传播的链条分成两部分:
ft(x;θsh,θt)zi=(ft(⋅;θt)∘g(⋅;θsh))(x)=ft(g(x;θsh);θt)=g(x;θsh)
将压缩层的表征向量记为Z ,从而可以得出原优化目标的理论上界,即:
t=1∑Tαt∇θshL^t(θsh,θt)22≤∂θsh∂Z22t=1∑Tαt∇ZL^t(θsh,θt)22
这样做的好处是,反向传播时每个任务的只需要计算对Z 的梯度即可,Z 的量级相比θsh 小很多,因此计算量会大大减小。此外,上界存在与α 无关系数∂θsh∂Z22 ,使用可以去掉。
用该上界替换原优化目标,优化问题就近似成:
α1,…,αTmin⎩⎨⎧t=1∑Tαt∇ZL^t(θsh,θt)22∣t=1∑Tαt=1,αt≥0∀t⎭⎬⎫
文章证明了这种近似依然能达到帕累托最优。
参考
- 当我们在谈论Multi-Task Learning(多任务/多目标学习) - 知乎
- 机器学习技术:多任务学习综述! - 知乎
- 多任务学习概述 - Harlin’s blog
- 论文讲解~CVPR2021跨领域多任务学习 Cross-Domain Multi-task Learning for Object Detection and Saliency Estimation - 知乎
Multi-Task Learning:一招鲜能否吃遍天?