多任务学习优化面临的问题与解法
今天跟大家聊一聊多任务学习。多任务学习目前已经成为很多场景的基础模型结构,从最开始谷歌提出的MMoE,到后续腾讯提出的PLE等,多任务学习网络结构的发展非常迅速。
模型结构的不断创新,解决的是多个任务之间如何最高效的实现参数的共享与分离,让模型既能融合不同任务之间的共性,又能给每个任务提供独立的空间防止干扰。除了模型结构上的优化外,另一个角度是如何优化多任务学习的训练过程。
1
多任务学习优化面临的问题
多任务学习经常会出现跷跷板现象,即两个任务联合学习的时候,可能一个任务效果变好,另一个任务效果变差。究其本质,核心是训练过程中存在以下3个方面问题:
- 多任务梯度方向不一致:同一组参数,不同的任务更新方向不一致,导致模型参数出现震荡,任务之间出现负迁移的现象,一般出现在多个任务之间差异较大的场景;
- 多任务收敛速度不一致:不同的任务收敛速度不一样,有的任务比较简单收敛速度快,有的任务比较困难收敛速度慢,导致模型训练一定轮数后,有的任务已经overfitting,有的任务还是underfitting的状态;
- 多任务loss取值量级差异大:不同的任务loss取值范围差异大,模型被loss比较大的任务主导,这种情况在两个任务使用不同损失函数,或者拟合值的取值差异大等情况下最为常见。
针对上述多任务学习优化过程中的问题,业内有一系列的工作进行解决。今天给大家介绍4篇通过梯度优化提升多任务学习效果的方法。
2
UncetaintyWeight
Multi-task learning using uncertainty to weigh losses for scene geometry and semantics(CVPR 2018)中提出一种根据任务loss的不确定性设定各个任务loss权重的方法。本文提出的loss采用了如下形式:
其中每个loss前面权重的分母,代表任务的不确定性。不确定性大的任务,loss的权重就会对应缩小。
3
GradNorm
GradNorm是在GradNorm: Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks(ICML 2018)中提出的一种缓解不同loss量级差异影响的方法。不同任务的量级差异大会导致训练过程中每个任务的梯度大小差异大,造成某个任务主导的问题。为了缓解这个问题,文中给每个任务的loss设定了一个可学习的权重,用来自动控制每个任务loss的强度,进而影响每个任务更新梯度的大小。
如何确定这个权重呢?首先计算出每个任务的梯度L2范数,求所有任务梯度范数的均值,得到一个平均的梯度取值范围。这个取值范围可以视为一个标准范围。此外,计算出每个任务的学习速度,使用更新t步后的loss和最开始的loss求比例。这两项相乘,可以得到一个目标的梯度,公式如下:
这个公式确定目标梯度范数的含义是,希望在所有任务平均的梯度大小基础上,考虑各个任务的更新速度,更新开的梯度就小一点,更新慢的梯度大一点。在训练过程中,让这个目标梯度是一个常量,每个任务的梯度和目标梯度的差异作为一个loss(如下),这个loss用来更新每个任务的loss权重,实现每个任务loss权重的自动化学习。
4
DWA
End-to-End Multi-Task Learning with Attention(CVPR 2018)在文中的实验部分提出了DWA方法,用来动态调整多任务的权重。DWA借鉴了GradNorm的思路,利用loss的变化情况来衡量任务的学习速度,每个任务的权重可以表示为如下的计算公式:
上面的公式计算每个任务连续两个step的loss变化情况,作为这个任务的学习速度,归一化后得到每个任务的权重。如果一个任务loss下降的很快,对应的w就比较小,得到的归一化权重比较小,就减小了学习比较快的任务的loss权重。
5
PCGrad
Gradient Surgery for Multi-Task Learning(NIPS 2020)提出了PCGrad方法,用来解决多个任务之间的梯度更新出现冲突,导致模型参数更新出现震荡和负迁移的情况。如果两个任务的梯度夹角余弦小于,说明这两个任务的梯度更新存在冲突。当出现这种情况的时候,会将另个任务的梯度在对方的法向量上做投影,以此来消除两个任务梯度的冲突。而当两个任务梯度之间没有冲突的时候,则正常进行更新。PCGrad的算法逻辑和示意图如下所示:
6
GradVec
GradVec是在PCGrad基础上的改进,出自论文GRADIENT VACCINE: INVESTIGATING AND IMPROVING MULTI-TASK OPTIMIZATION IN MASSIVELY MULTILINGUAL MODELS(ICLR 2020)。在PCGrad中,只有当两个任务的梯度夹角余弦为负数,才会进行梯度纠正。而本文指出指出,并不是所有任务都只要求两个任务的夹角余弦不比0小,需要根据任务个性化的设定这个夹角余弦可接受的最小值。例如,有的任务可能希望夹角余弦要大于一个阈值。因此本文的核心就是,根据不同任务之间的关系,设定个性化的夹角余弦最小值。GradVec和PCGrad的区别如下图,GradVec对梯度的矫正范围和矫正幅度更大。
7
总结
本文介绍了多任务学习模型在优化中经常遇到的问题,并列举了5个比较经典的解决方案,核心是通过梯度或者各个任务损失函数的权重,调节多任务学习过程的平衡性,减小不同任务之间的冲突,进而提升多任务学习的效果。
END
相关文章
- 开发者必看,面试官心中的最佳数据库人才模型是什么样?
- 从相识到相惜:Redis与计算存储分离四部曲
- 面对key数量多和区间查询低效问题:Hash索引趴窝,LSM树申请出场
- 大数据处理黑科技:揭秘PB级数仓GaussDB(DWS) 并行计算技术
- 1秒启动Web Server
- 中心化交易所如何用Merkle Tree实现资产储备证明
- 揭秘GaussDB(for Redis):全面对比Codis
- 梦幻联动!金蝶&华为云面向大企业发布数据库联合解决方案
- 面对锁等待难题,数仓如何实现问题的秒级定位和分析
- 技术生态两手抓,打造面向未来的企业级领先数据库
- 看我如何连夜自建网站背刺我的求职对手们
- GaussDB拿下的安全认证CC EAL4+究竟有多难?
- 华为云开发者官网首页焕新升级,赋能开发者云上成长
- 从元宇宙、地产数字化到呼叫中心,华为云携手伙伴共创新价值
- 云享·人物丨造梦、探梦、筑梦,三位开发者在华为云上的寻梦之旅
- 华为云区块链三大核心技术国际标准立项通过
- 云小课|帮您高效快速上传组件至私有依赖库
- 一文详解GaussDB(DWS) 的并发管控和内存管控
- MemArts :高效解决存算分离架构中数据访问的组件
- 论文复现|Panoptic Deeplab(全景分割PyTorch)