多任务模型融合如何平衡?

平衡目标

  • 不同任务loss量级相近
  • 不同任务相近速率学习
  • 不同任务数据量级接近
  • 不同任务重要性程度近似评估
  • 不同任务不确定性估计

废话少说 上图个球的


image.png

1. 加权融合

1.1 手动加权

image.png

人肉调权重。

1.2 动态加权平均

核心思想:利用loss变化率,平衡多任务学习速度。
[End-to-End Multi-Task Learning with Attention],CVPR 2019,Cites:107
https://arxiv.org/pdf/1803.10704v1.pdf
实现:
https://github.com/lorenmt/mtan
本文提出了一种新的多任务学习体系结构,允许学习特定任务的特征级注意力。提出了MTAN(Multi-Task Attention Netwrok)网络,由一个包含全局特征池化的共享网络和基于特定任务的soft-attention模块组成。这些模块从全局共享特征中学习特定任务的特征,同时允许特征在不同任务间共享。
MTAN结构主要包括两大部分,一个任务共享的主网络和K个特定任务的子网络,共享网络可以根据特定的任务进行设计,而每个特定于任务的子网络由一组注意力模块组成,这些模块与共享网络相连接。每个注意力模块对共享网络的特定层应用一个soft attention mask,以学习特定于任务的特征。基于这种设计,共享主网络可以看做是一个跨任务的特征表示,每一个attention mask都可以被看作是对主网络的特征选择器,决定哪些共享特征被用到自己的子任务中去。

image.png

最后损失函数:
image.png

作者尝试了不同的权重方案对模型效果的影响
image.png

DWA,使每个子任务首先计算前个epoch对应损失的比值,然后除以一个固定的值T,进行exp映射后,计算各个损失所占比。
image.png

K代表任务的数量;T是一个常数,T=1时,w等同于softmax的结果;T足够大时,w趋近1,各个任务的loss权重相同。该方法,只需要记录不同阶段的loss值,从而避免了为了获取不同任务的梯度,运算较快。

2. loss梯度数量级差异

loss值的大小不重要,重要的是每一个loss产生的梯度的数量级不能差的特别大。如果梯度数量级差的很多的,可以给loss加权重。

2.1 梯度正则化

《Gradnorm: Gradient normalization for adaptive loss balancing in deep multitask networks》,ICML 2018,Cites:177
https://arxiv.org/abs/1711.02257
核心思想:
同时考虑标签损失与梯度损失,同时将梯度表示为权重的函数,进行全局标准化优化。
实现:
https://github.com/brianlan/pytorch-grad-norm
与静态加权不同,我们认为多任务的w是对于参数t的函数,且有不同的wi(t)对多任务分配loss权重。

image.png

本文定义了两种类型的损失:标签损失和梯度损失,独立优化,不进行叠加。Label Loss即多任务学习中,每个任务的真实的数据标签与网络预测标签计算的loss。Gradient Loss,用来衡量每个任务的loss的权重 wi(t)的好坏,Gradient Loss是关于权重wi(t)的函数。t表示网络训练中的第t步,权重为关于t的一个变量。
image.png

  • W是整个多任务学习网络参数的子集,在文章中的实验,作者选择了网络share bottom部分最后一层的参数;
  • Giw(t)是任务i梯度标准化的值,是任务i的权重与loss 的乘积对参数W求梯度的L2范数, 可以衡量某个任务loss的量级;
  • G---w(t)是全局梯度标准化的值(即所有任务梯度标准化值的期望值),通过所有求均值实现。
  • Li(0)与Li(t)分别代表子任务i的第0步和第t步的loss,L ~ i(t)在一定程度上衡量了任务i的反向的训练速度,L~~i(t)越大,表示网络训练越慢。
  • image.png

    表示了各个任务反向训练速度的期望;

  • 反向训练速率除以反向训练期望,得到相对反向训练速率r,r是任务的相对反向训练速度,r越大,表示任务i在所有任务中训练越慢。
    从而:


    image.png

    计算完Gradient Loss后,通过以下函数对wi(t)进行更新:


    image.png

    image.png

2.2差异化学习率

对于多任务损失减小速度不一致的情况,需要自适应多任务的学习率,在 Adagrad, RMSProp, Adam 等等优化算法中,自适应学习率主要针对高维空间模型参数变化不同的方向,使用不同的学习率。
对更新快的任务,使用小一点的学习率,对更新慢的任务,使用大一点的学习率。


image.png

trick:


image.png

3. 引入Bayesian框架下的平衡

3.1 确定性平衡

尤其针对于多任务指标提升有跷跷板现象的模型,如ESSM模型在做CTR、CVR目标时,引入pCTR与pCTCVR,可以基于先验任务的估计可以作为下游任务的一个特征,从而组合loss。

3.2 动态任务优先级

[Dynamic task prioritization for multitask learning],ECCV 2018,Cites:53
https://openaccess.thecvf.com/content_ECCV_2018/papers/Michelle_Guo_Focus_on_the_ECCV_2018_paper.pdf
本文提出了多任务学习的动态任务优先级。这允许模型在训练过程中动态的对困难任务进行优先级排序,其中困难任务与性能成反比,并且困难随着时间的推移而变化。与传统认知上优先学习简单任务相反,本文通过多个实验证明了优先学习困难任务的重要性。
核心思想:DTP以为更难的任务对模型影响程度更高,希望让更难学的任务具有更高的权重。
引入几个概念:

image.png

  • 任务困难程度D,且D与性能指标k成反比,即


    image.png
  • 基础公式:


    image.png
  • 任务难易程度降序排列:


    image.png

    image.png
  • 性能指标KPIs:
    对于每一个任务Tt,用Kt代表关键性能指标,也就是我们常听到的KPI,其中 Kt∈[0,1]。那么什么样的标准可以用来当做KPI呢?Kt必须是一个有意义的度量标准,比如准确率或者AP等。此外,还借鉴tensorflow上的知识,通过Kt计算一个滑动平均模型,公式如下:


    image.png

    阿尔法代表衰减因子,取[0,1],决定了模型更新的速度,越大任务越趋于稳定。
    权重公式:


    image.png

    需要获取不同step的KPI值,从而避免了为了获取不同任务的梯度,运算较快。但是DTP没有考虑不同任务的loss的量级,需要额外的操作把各个任务的量级调整到差不多,且需要额外计算KPI。
    猜想:
    是否可以结合梯度正则化,来平衡任务量级+考量KPI指标来进行多任务融合。

3.3不确定性平衡

本文希望让“简单”的任务有更高的权重。
贝叶斯建模中存在的两类不确定性:

  • 认知不确定性(Epistemic uncertainty): 由于缺少训练数据而引起的不确定性。

  • 偶然不确定性(Aleatoric uncertainty): 由于训练数据无法解释信息而引起的不确定性。
    对于偶然不确定性,又可以分为如下两个子类:

  • 数据依赖(Data-dependant)或异方差(Heteroscedastic)不确定性,简单的说就是对于不同的输入,网络输出的噪声大小不同。

  • 任务依赖(Task-dependant)或同方差(Homoscedastic)不确定性,是一个对所有输入数据保持不变的量,并且在不同任务之间变化。

对每个task,受限于任务数据与模型刻画能力,都存在task相关的不确定性,不确定性被量化为模型输出与样本标签之间的噪声。
[Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics]
https://arxiv.org/abs/1705.07115v3
实现: https://github.com/yaringal/multi-task-learning-example/blob/master/multi-task-learning-example.ipynb
基础假设:

  1. 回归任务,噪声服从高斯分布,噪声强弱衡量指标高斯分布方差。
  2. 分类任务,噪声服从玻尔兹曼分布,衡量标准为热力学温度。(这个在原文中没有展开)
    // 回归任务不确定性


    image.png

    // 分类任务不确定性


    image.png

    组合loss:
    image.png

    image.png
image.png

取log类似于正则项,防止不确定性估计过大,能够将不确定性压缩在一定数值范围内,不确定性估计越大,任务的不确定性越大,则任务的权重越小,即噪声大且难学的任务权重会变小。
猜想:
与梯度正则化不同的是,不确定性估计


image.png

收敛受到初始化的影响较小,是否可以在梯度正则化中L(0)初始化时引入对不确定性的估计。

4. 梯度冲突系列方法

之前的有关梯度的多任务融合方式,主要针对任务loss梯度量级差异、不同任务学习速度差异而做研究,更进一步,讨论梯度更新方向与梯度更新冲突的方法,正high起来。

从帕累托解集的角度来看

其实,从梯度角度出发的MTL平衡研究主要在讨论,梯度从量化差异上升到多维空间离散解集,再到连续解集的过程。


image.png

从梯度冲突问题角度来看

1. 不同任务梯度之间的更新方向不同引起的梯度冲突,引出了本模块要讲的内容
2. 非方向性冲突,由于梯度大小不同,如果一个梯度特别大,另一个梯度特别小,那么较大的梯度会形成主导从而影响较小梯度。
3. 在曲率很大的位置,高梯度值的任务的改进可能被高估,而高梯度值的任务的性能下降可能被低估

4.1 PCGrad

https://arxiv.org/pdf/2001.06782.pdf
实现:
https://github.com/tianheyu927/PCGrad

  • 核心思想:
    将任务的梯度投影到具有冲突梯度的任何其他任务的梯度的法线平面上。


    image.png
  1. 首先,计算任务i梯度和随机一个其他任务j梯度之间的余弦相似度,如果为负值表示是相互冲突的梯度,如上图(a)
  2. 如果余弦相似度为负值,则通过下式计算任务i梯度在任务j梯度的法线平面上的投影(如上图(b)):


    image.png
  3. 如果梯度没有冲突,即余弦相似度为非负,则直接使用原始梯度即可,如上图d。
  4. 选择另外一个任务,作为任务i,重复上述流程,直到所有任务的梯度都修正过一遍。
  5. 将各任务修正后的梯度相加,得到最终的梯度。
  • 更新规则:


    image.png

4.2 MGDA 帕累托单解

Multiple-gradient descent algorithm (mgda) for multiobjective optimization. Comptes Rendus Mathematique, 350:313–318, 2012.
实现:
在MMOE模型里增加MGDA的玩法。
https://github.com/king821221/tf-mmoe-mgda

image.png

  • 核心思想:
    ref:https://zh.wikipedia.org/wiki/%E5%8D%A1%E9%B2%81%E4%BB%80-%E5%BA%93%E6%81%A9-%E5%A1%94%E5%85%8B%E6%9D%A1%E4%BB%B6
    利用KKT条件,针对任务共享和任务专属权值进行优化求解。
  • 分析解


    image.png

    image.png
  • 优化求解
    将任务权重优化问题,转化为以共享表示Z与共享网络权重二范数来表示的上界优化问题。


    image.png

4.3 CAGrad多梯度优化

https://papers.nips.cc/paper/2021/file/9d27fdf2477ffbff837d73ef7ae23db9-Paper.pdf
实现:
https://github.com/Cranial-XIX/CAGrad
核心思想:
通过构造新的梯度更新方向来避免梯度冲突,但之前出现的梯度修正算法往往偏离了最小化平均loss的目标,导致最终结果无法收敛到全局最优。文章在平均梯度方向邻域内求解梯度更新方向,最大化所有子目标中最小的局部提升。

  • 多任务学习与梯度冲突:


    image.png
  • 算法


    image.png

    image.png

5. 帕累托平衡

多目标优化的解通常是一组均衡解(即一组由众多 Pareto最优解组成的最优解集合 ,集合中的各个元素称为 Pareto最优解或非劣最优解)。

5.1 几个概念:

  • 什么是Pareto?
    上wiki:
    https://en.wikipedia.org/wiki/Pareto_efficiency
    (自己看去吧,三五三十五,三五太难了)
    Pareto optimality,即帕累托最优。一个 Pareto 最优解指的是在优化任务有多个目标时,在这些目标中权衡得最好的解。如下图所示,两个目标的误差值越小越好。由于模型能力的限制,其最左下角是理论上无法得到的不可行区域,所以最接近不可行区域的解即为 Pareto 最优解。绿色的解由于能够找到在两个任务上都比它表现更好的解,所以它不是 Pareto 最优解。所有的 Pareto 最优解所组成的面就是 Pareto 前沿(Pareto front)。
    image.png
  • 为什么要有Pareto最优?之前的MTL方法不香么?
    之前的MTL平衡方法主要关注的是如何在有多个任务时找到一个能够权衡利弊的解,但由于 Pareto 的存在,一个独立解是难以满足多种偏好的,Pareto旨在找到多个Pareto解,进而利用 Pareto 前沿的连续性质,连续地从一个 Pareto 解出发找到其他的解。
  • 非劣解——多目标优化问题并不存在一个最优解,所有可能的解都称为非劣解,也称为Pareto解。
  • Pareto最优解——无法在改进任何目标函数的同时不削弱至少一个其他目标函数。这种解称作非支配解或Pareto最优解。
    通俗的讲,帕累托最优解即不存在一个在任意子目标均不弱于它且至少在一个子目标上强于它的解,优化帕累托最优解的任意子目标必然弱化至少一个其他子目标。帕累托稳定解即存在所有子目标上梯度的凸组合为零的可行解。

5.2 方法论

多目标优化问题不存在唯一的全局最优解 ,过多的非劣解是无法直接应用的 ,所以在求解时就是要寻找一个最终解。

  • 求最终解主要有三类方法:
  1. 生成法,即先求出大量的非劣解,构成非劣解的一个子集,然后按照决策者的意图找出最终解;(生成法主要有加权法﹑约束法﹑加权法和约束法结合的混合法以及多目标遗传算法)。
  2. 交互法,不先求出很多的非劣解,而是通过分析者与决策者对话的方式,逐步求出最终解。
    3.目标重要度,算法以此为依据,将多目标问题转化为单目标问题进行求解。
  • 多目标优化算法归结起来有传统优化算法和智能优化算法两大类:
  1. 传统优化算法包括加权法、约束法和线性规划法等,实质上就是将多目标函数转化为单目标函数,通过采用单目标优化的方法达到对多目标函数的求解。
  2. 智能优化算法包括进化算法(Evolutionary Algorithm, 简称EA)、粒子群算法(Particle Swarm Optimization, PSO)等。
    两者的区别——传统优化技术一般每次能得到Pareo解集中的一个,而用智能算法来求解,可以得到更多的Pareto解,这些解构成了一个最优解集,称为Pareto最优解(任一个目标函数值的提高都必须以牺牲其他目标函数值为代价的解集)。

5.3 帕累托多解

https://proceedings.neurips.cc/paper/2019/file/685bfde03eb646c27ed565881917c71c-Paper.pdf
该文章提出多个 Pareto 解的重要性,但由于没有利用 Pareto 前沿的性质,该方法生成的每一个解都是从头训练的,并且无法形成连续的 Pareto 前沿。

image.png

5.4 连续帕累托优化

paper:
https://arxiv.org/pdf/2006.16434.pdf
视频:
https://icml.cc/virtual/2020/poster/5856

  • 核心思想:
  1. 利用 Hessian 矩阵对多目标问题的 Pareto 集(权衡多目标的理论最优集)进行一阶近似,并实验说明沿该近似方向更新可以使已有的 Pareto 解保持其性质。
  2. 提出使用 Hessian 向量积(Hessian-Vector Product)和 Krylov 子空间迭代法(共轭梯度法就是其中的一种)来高效解决上述近似问题,并将该方法应用于深度学习。
  3. 对生成的 Pareto 集进行线性插值,并由此得到无穷多的连续一阶近似解,以满足多目标问题下的不同偏好。
  • Pareto一阶近似
    当一个解已经到达 Pareto 最优,其各目标的梯度一定共面(当任务数为2时为共线)。从另一个角度说,这些梯度一定可以找到一组正权重使其加权和为0,写为公式:


    image.png

    论文在参数空间寻找一个更新方向的参数表示:


    image.png

    v即参数更新方向,t为参数化变量,H为线性变化矩阵,目的将v表示为梯度加权的线性表示。
    下面介绍H这个鬼东西。
  • Hessian是什么鬼?Hessian 向量积又是什么鬼?
    H是加权过的各个目标函数的 Hessian 矩阵,这个矩阵的每个元素都是一个二阶导数,形式为:


    image.png

    就是为了避免直接计算H求H而做的一种方法,n为参数量,平方搞一搞,算死球了个喵的,哎,但是Hessian 和一个向量的点乘可以算,这个就是Hessian 向量积。


    image.png
  • Krylov 子空间迭代法求解v:
  1. MINRES
  2. 无需显式构造左侧矩阵,只需要调用它和一个向量的点积。
  3. 迭代求解,可以 early-stopping 加快求解速度。
  • 如何保证连续?
    虽然我们已经得到了更新方向,但基于这些更新方向生成的解依旧是离散的。幸运的是,由于我们是基于 Pareto 前沿在局部上是连续的这一假设,我们可以认为从同一解更新出的解都在同一连续曲面上,这也就意味着我们可以对其进行线性插值来生成连续曲面。如果我们有很多不同的初始 Pareto 解,我们就可以对它们分别进行更新获得多个相交的 Pareto 前沿,然后筛选出最后的大片连续曲面。
  • Pareto 连续性方法总结
  1. 计算复杂度高,任务数量无法过度扩展,但这个面对一般工程3-4task其实还好。
  2. 在 Pareto 局部连续性的假设上进行的操作,但深度过参数化网络往往高度非线性,难以从一个局部 Pareto 曲面跳到另一个局部 Pareto 曲面,容易陷入某 Pareto 曲面的局部最优解。

仅供学习 无关利益 大论灌水 宝刀屠龙

REF:
https://www.zhihu.com/question/359962155/answer/928941168
https://zhuanlan.zhihu.com/p/362860026
https://www.zhihu.com/question/293188597/answer/1183278070
https://zhuanlan.zhihu.com/p/425672909
https://zhuanlan.zhihu.com/p/56613537
https://www.yanxishe.com/columnDetail/26367
https://www.zhihu.com/question/294635686/answer/606259229
https://www.zhihu.com/question/375794498/answer/1052779937
https://zhuanlan.zhihu.com/p/269492239
https://zhuanlan.zhihu.com/p/56986840
https://blog.csdn.net/Leon_winter/article/details/105014677
https://zhuanlan.zhihu.com/p/82234448
https://zhuanlan.zhihu.com/p/71012037
https://zhuanlan.zhihu.com/p/159000150
https://blog.csdn.net/weixin_43202635/article/details/82700342
https://www.zhihu.com/search?type=content&q=Pareto%20Multi-Task%20Learning
https://zhuanlan.zhihu.com/p/442858141
https://zhuanlan.zhihu.com/p/395220852
https://zhuanlan.zhihu.com/p/258327403
https://www.zhihu.com/column/c_1360363335737843712

你可能感兴趣的:(多任务模型融合如何平衡?)