Skip to main content

多任务损失函数设计策略

在多任务学习中,多个任务联合求解,共享归纳偏差。多任务学习本质上是一个多目标问题,因为不同的任务可能会发生冲突,需要进行权衡。一个常见的折衷办法是优化一个代理目标,使每个任务的加权线性组合损失最小化。但是,这种变通方法只有在任务没有竞争的情况下才有效,而这种情况很少发生。其实可以将多任务学习明确地定义为多目标优化问题,其总体目标是寻找一个帕累托最优解

多任务学习

大多数机器学习模型都是独立来进行学习的,即单任务学习(single-task learning)。也就是说,我们针对一个特定的任务,设计一个模型,然后进行迭代优化。对于稍复杂一点的任务,我们也习惯于通过进行拆解的方式,来对任务的每个部分进行建模。这样存在一个很明显的问题,在对每个子任务进行建模的时候,很容易忽略任务之间的关联、冲突和约束等关系,导致多个任务的整体效果无法更优。

多任务学习(multi-task learning),就是与单任务学习相对的一个概念。在多任务学习中,往往会将多个相关的任务放在一起来学习。例如在推荐系统中,排序模型同时预估候选的点击率和浏览时间。相对于单任务学习,多任务学习有以下优势:

  • 多个任务共享一个模型,占用内存量减少;
  • 多个任务一次前向计算得出结果,推理速度增加;
  • 关联任务通过共享信息,相互补充,可以提升彼此的表现。

多目标优化问题

统计学中最令人惊讶的结果之一是斯坦悖论。Stein (1956)指出:即使在高斯分布是独立的情况下,使用三个或三个以上的高斯随机变量的样本来估计它们的平均值比单独估计它们要好。斯坦悖论是多任务学习(MTL)的早期动机(Caruana,1997) ,这是一种学习范式,其中来自多个任务的数据被用于希望获得优于单独学习每个任务的性能。MTL 的潜在优势超越了斯坦悖论的直接含义,因为即使是看起来毫不相关的现实世界任务,由于产生数据的共享过程,也有很强的依赖性。例如,尽管自动驾驶和物体操纵看起来是不相关的,但是基础数据是由相同的光学定律,材料属性和动力学定律支配的。这激发了在学习系统中使用多任务作为归纳偏见。

一个典型的 MTL 系统是为每个点的各种任务提供一组输入点和目标集。在任务之间建立归纳偏差的一种常见方法是设计一个参数化假设类,在任务之间共享一些参数。通常,这些参数是通过求解一个最小化每个任务的损失和的最优化问题来学习的。然而,线性组合公式只有在参数设置对所有任务都有效时才是合理的。换句话说,经验风险的加权和最小化只有在任务没有竞争的情况下才有效,而这种情况很少发生。具有冲突目标的 MTL 需要在任务之间进行权衡的建模,这超出了线性组合的能力范围。

image-20210806093054045

两个任务共享了input层和share bottom层,然后两个tower分别拟合两个任务的输出。对于多任务的loss,最简单的方式是直接将这两个任务的loss直接相加,得到整体的loss,那么loss函数为:

L=LiL = \sum L_i

这种loss计算方式的不合理之处是显而易见的,不同任务loss的量级很有可能不一样,loss直接相加的方式有可能会导致多任务的学习被某个任务所主导或学偏。当模型倾向于去拟合某个任务时,其他任务的效果往往可能受到负面影响,效果会相对变差。(就像做跷跷板一样,某一项太重了点话游戏就无法进行下去了)

s

对于为了避免学习任务偏向于某一项的loss,我们可以通过对每个任务的loss配置一个固定的权重参数

公式如下:

L=iwi(t)LiL = \sum_i w_i(t) \cdot L_i

但是这样手动的划分权重也会有很大的问题,因为我们并不知道高纬度的特征到底是对于哪一项比较看重。对更新快的方向,使用小一点的权重,对更新慢的方向,使用大一点的权重。**想要确认合适的权重往往就需要大量的实验**。

20210806110917image-20210806093552503

梯度标准化

《Gradnorm: Gradient normalization for adaptive loss balancing in deep multitask networks》

主要目的:

  1. 希望不同的任务Loss量级接近;
  2. 不同的任务以相近的速度来进行学习。

实现:

本文定义了两种类型的Loss:Label LossGradient Loss注意:这两种Loss独立优化,不进行相加。

Label Loss即多任务学习中,每个任务的真实的数据标签与网络预测标签计算的loss。Label Loss由学习任务的性质决定,比如分类的loss或者回归的loss。Label Loss通过对不同任务的Loss进行加权求和来实现:

L=iwi(t)LiL = \sum_i w_i (t) \cdot L_i

Gradient Loss,用来衡量每个任务的loss的权重wi(t)w_i(t)的函数。

每个任务的权重wi(t)w_i(t)是一个变量(注意这里w与网络参数W是不同的),w也通过梯度下降进行更新,t表示当前处于网络训练的第t步。

Gradient Loss

用来衡量任务loss量级的变量

GW(i)(t)=Wwi(t)Li(t)2GˉW(t)=Etask[GW(i)(t)j^]\begin{array}{l} G_{W}^{(i)}(t)=\left\|\nabla_{W} w_{i}(t) L_{i}(t)\right\|_{2}\\ \bar{G}_{W}(t)=E_{\mathrm{task}}\left[G_{W}^{(i)}(t) \hat{j}\right] \end{array}

W是整个多任务学习网络参数的子集,在文章中的实验,作者选择了网络share bottom部分最后一层的参数;

GiW(t)G_{i}^{W}(t)求梯度实现。

用来衡量任务的学习速度的变量

L~i(t)=Li(t)/Li(0)ri(t)=L~i(t)/Etask[L~i(i)]\begin{aligned} \tilde{L}_{i}(t) &=L_{i}(t) / L_{i}(0) \\ r_{i}(t) &=\tilde{L}_{i}(t) / E_{\operatorname{task}}\left[\tilde{L}_{i}(i)\right] \end{aligned}
  1. Li(t)L_{i}(t)​​越大则表示网络训练的越慢(在一定程度上衡量了训练的速度)。
  2. Etask[L~i(t)]E_{t a s k}\left[\tilde{L}_{i}(t)\right]​​​表示了各个任务反向训练速度的期望;

其实这里我感觉处以Li(0)L_i(0)​​会根加合适一些。

最终的公式 Lgrad(t;wi(t))=iGW(i)(t)GˉW(t)×[ri(t)]α1L_{\mathrm{grad}}\left(t ; w_{i}(t)\right)=\sum_{i}\left|G_{W}^{(i)}(t)-\bar{G}_{W}(t) \times\left[r_{i}(t)\right]^{\alpha}\right|_{1} 计算完Gradient Loss后,通过以下函数对wi(t)w_{i}(t)进行更新(GL指Gradient Loss):

那么就可以看到:

ri(t)r_{i}(t)减小

GˉW(t)\bar{G}_{W}(t) 会变大,导致loss增加,从而促使loss量级接近;

Gradient loss的更新公式如下:

wi(t+1)=wi(t)+λGradient(GL,wi(t))w_{i}(t+1)=w_{i}(t)+\lambda * G \operatorname{radient}\left(G L, w_{i}(t)\right)

训练流程

image-20210806110855065

  1. 初始化各个loss的权重为1,初始化网络参数,配置 α\alpha 的值,选择参数W。
  2. 通过加权求和的方式计算网络的loss。
  3. 计算梯度标准化的值GiW(t)G_{i}^{W}(t)
  4. 计算全局梯度标准化的值wi(t)w_{i}(t) ;
  5. 计算Gradient Loss;
  6. 计算Gradient Loss对wi(t)w_{i}(t) ;求导的值;
  7. 通过第6步的结果更新wi(t)w_{i}(t)​ ;
  8. 通过第2步的结果更新整个网络的参数;
  9. 把第7步的结果renormalize一下,使得wi(t)w_{i}(t) ;的和等于任务数量。

优缺点

Gradient Normalization既考虑了loss的量级,又考虑了不同任务的训练速度。

  • 每一步迭代都需要额外计算梯度,当W选择的参数多的时候,会影响训练速度;
  • 此外,Li(0)L_i(0)C是类别数量。

动态平均加权

《End-to-End Multi-Task Learning with Attention》,CVPR 2019,Cites:107

主要思想

希望各个任务以相近的速度来进行学习

实现

wi(t)=Nexp(ri(t1)/T)nexp(rn(t1)/T),rn(t1)=Ln(t1)Ln(t2)w_{i}(t)=\frac{N \exp \left(r_{i}(t-1) / T\right)}{\sum_{n} \exp \left(r_{n}(t-1) / T\right)}, r_{n}(t-1)=\frac{L_{n}(t-1)}{L_{n}(t-2)}
  • wi(t)w_{i}(t)​代表了每个任务i的权重

  • Ln(t1),rn(t1)L_{n}(t-1), \quad r_{n}(t-1)​​。

  • NN​是任务的数量

  • T是一个常数,T=1时,w等同于softmax的结果;T足够大时,w趋近1,各个任务的loss权重相同。

直观来看,loss缩小快的任务,则权重会变小;反之权重会变大。

优缺点:

优点:只需要记录不同step的loss值,从而避免了为了获取不同任务的梯度,运算较快。

缺点:没有考虑不同任务的loss的量级,需要额外的操作把各个任务的量级调整到差不多。

动态任务优先级

《Dynamic task prioritization for multitask learning》,ECCV 2018,Cites:53

主要思路

让更难学的任务具有更高的权重;

实现

wi(t)=(1κi(t))γilogκi(t)w_{i}(t)=-\left(1-\kappa_{i}(t)\right)^{\gamma_{i}} \log \kappa_{i}(t)
  • wi(t)w_i(t)代表了每个任务i的权重;
  • ki(t)k_i(t);KPI与任务的训练难度成反比,即KPI越高,任务越好学;
  • γi\gamma_{i}允许为特定的任务i来调整权重(留了一些手动调整的空间)

直观来看,KPI高的任务,学习起来比较简单,则权重会变小;反之,难学的任务权重会变大。

评价

优点:需要获取不同step的KPI值,从而避免了为了获取不同任务的梯度,运算较快

缺点:DTP没有考虑不同任务的loss的量级,需要额外的操作把各个任务的量级调整到差不多;且需要经常计算KPI.

方法平衡loss量级平衡学习速度高权重任务需要计算梯度需要额外权重操作动机
GradNorm\checkmark平衡学习速度和loss量级
DWA\checkmark平衡学习速度
DTP\checkmark给难学的任务分配高权重