多任务学习:Multi-Task Learning as Multi-Objective Optimization

article/2025/11/8 13:42:08

前言

        最近在写一篇文章,是一篇深度学习与安全相结合的文章,模型的输出会交给两个损失函数(availability & security)进行损失计算,进而反向传播。起初的想法是直接将两项损失进行加权平均,共同进行反向传播,后面又尝试了先A后B和先B后A的方式。发现模型训练的效果不是很好,因为这两个损失在进行下降时是一种相互制约的关系,如图1所示(侧面也反映了自己设计的连个损失方向是对的)。在epoch到达30w次之后,两者分道扬镳。

        考虑到多任务之间的制约,尝试使用多目标优化的方法对两个损失函数进行优化,以获得使两种损失同时较小的一种嵌入,然后再将此满足条件的嵌入作为模型的训练目标,分步完成模型的训练。但是在研究了多目标优化的算法之后,打消了这个念头,因为我模型的输出维度很高,他是一张图的邻接矩阵的一维展开(adj.view(-1)),是百万维级别的,所以使用传统多目标优化的方法(例如遗传算法)过于复杂,所以就发现了这一篇名为Multi-Task Learning as Multi-Objective Optimization的文章。下面简单的介绍一下这篇文章。

Multi-Task Learning as Multi-Objective Optimization

作者在文章的摘要中说:“多任务学习本质上是一个多目标的问题,因为不同的任务可能会发生冲突,需要进行权衡。一个常见的折衷办法是优化一个代理目标,使每个任务损失的加权线性组合最小。然而,这种变通方法只有在任务不竞争的情况下才有效,而这种情况很少发生。在本文中,我们明确地将多任务学习作为多目标优化,其总体目标是找到一个帕累托最优解。”

这个是文章为何能够适用于我的问题的原因。细节不做过多介绍,在阅读过程中发现网上有不少对于这篇文章原理的解释,大家有疑问可以自行查看。

对Multi-Task Learning as Multi-Objective Optimization方法进行尝试

Solving the Optimization Problem

        这是文章中的一段话。在处理一般情况之前,先处理只有两个优化目标的一般情况。此时的优化目标是一个一元二次函数:  min_{\alpha\in[0,1]}||\alpha\bigtriangledown_{\theta^{sh}}\hat{\mathcal{L}}^1+(1-\alpha)\bigtriangledown_{\theta^{sh}}\hat{\mathcal{L}}^2||^2_2 ,其解为:

\alpha = \left [ \frac{(\bigtriangledown_{\theta^{sh}}\hat{L}^2-\bigtriangledown_{\theta^{sh}}\hat{L}^1)^T\bigtriangledown_{\theta^{sh}}\hat{L}^2}{||\bigtriangledown_{\theta^{sh}}\hat{L}^1-\bigtriangledown_{\theta^{sh}}\hat{L}^2||_2^2} \right ]_+

        同时,作者又介绍道,对于每一个任务t,都需要计算\bigtriangledown_{\theta^{sh}}\mathcal{\hat{L}}(\theta^{sh},\theta^t),而参数\theta^{sh}在反向传播阶段恰好是多任务共享的参数,所以在反向传播阶段需要计算T次。因此作者为了降低计算复杂度,确定了优化问题的上界。

 其中Z为表示层的输出,也就是共享参数的各层最后的输出。 

又因为\left | \frac{\partial Z }{\partial \theta^{sh}}\right |^2 与\alpha无关,所以在优化中会被移除。因此使用以下上界来优化目标。

 

 应用

        根据以上分析,我对自己的模型进行了改进,先分享一下源代码:

grads = {}#这个函数是为了获取中间变量的梯度,我方案中的Z不是一个叶子结点,所以其梯度在反向传播之后不会被保存
def save_grad(name):def hook(grad):grads[name] = gradreturn hookdef MTL(loss, Floss):'''使用多任务学习的多个梯度来决定最终梯度:param loss: 损失1:param Floss: 损失2:return:'''Z.register_hook(save_grad('Z'))#对loss进行反向传播,获取各层的梯度loss.backward(retain_graph = True)theta1 = grads['Z'].view(-1)#将计算图中的梯度清零,准备对第二种loss进行反向传播optimizer.zero_grad(retain_graph = True)Floss.backward()theta2 = grads['Z'].view(-1)#alpha解的分子部分part1 = torch.mm((theta2 - theta1), theta2.T)#alpha解的分母部分part2 = torch.norm(theta1 - theta2, p = 2)#二范数的平方part2.pow(2)alpha = torch.div(part1, part2)min = torch.ones_like(alpha)alpha = torch.where(alpha > 1, min, alpha)min = torch.zeros_like(alpha)alpha = torch.where(alpha < 0, min, alpha)#alpha theta1 & (1 - alpha) theta2#将alpha等维度拓展alpha1 = alphaalpha2 = (1 - alpha)#将各层梯度清零optimizer.zero_grad()#根据比率alpha1 & alpha2分配Loss1和Loss2的比率MTLoss = alpha1 * loss + alpha2 * FlossMTLoss.backward()

在我自己的方案中,其实也是进行了三次反向传播,其实可以只计算出表示层的输出Z的梯度,然后根据梯度计算alpha,直接将两种Loss分配权重,但是这里的操作我并没有实现,因为每次backward()之后,其实是进行了一次完整的反向传播,如果不进行backward()又没有办法快速求出Z的梯度。所以我还没研究清楚如何进行控制,如果大家有解决的方法,也希望能够不吝赐教。

        在这里我为何还要使用Z而不是表示层的梯度,是因为我的表示层的权重矩阵是一个多维的变换矩阵,所以在进行帕累托最优求解的时候比较麻烦,而表示层的输出Z,是一个一维的向量,进行帕累托最优解寻找的过程比较简单,方便计算。当然这也只是我在阅读完文献后的第一次尝试,可能在理解上还有很多错误,后面会不断进行改进。

结果

 这个是使用文章中方法改进之后的梯度下降损失的变化,其中AP_loss是Loss1,F_loss是Loss2,可以看出两者都在进行下降,同时与我之前使用的手动调参(Loss1 & Loss2全程按照一种比例进行梯度下降)相比,损失函数的震荡情况获得了十分明显的改善。


http://chatgpt.dhexx.cn/article/ROd4wG2L.shtml

相关文章

深度学习中的多任务学习(一)

任务学习-Multitask Learning概述 Reference https://blog.csdn.net/u010417185/article/details/83065506 1、单任务学习VS多任务学习 单任务学习&#xff1a;一次只学习一个任务&#xff08;task&#xff09;&#xff0c;大部分的机器学习任务都属于单任务学习。多任务学习…

C# 多线程八 任务Task的简单理解与运用二

目录 一.Task 1.AsyncState 2.CompletedTask 3.CreationOptions 4.CurrentId 5.Exception 6.Factory 7.Id 8.IsCanceled 9.IsCompleted 10.IsFaulted 11.Status 二.Task<TResult> 1.Result 上篇&#xff1a; C#…

多任务学习(一)

多任务学习 单任务学习 样本之间没有关联性。 缺点&#xff1a;训练出来的模型不具有泛化性&#xff1b;不共享信息使得学习能力下降。 多任务学习 多任务学习的构建原则 建模任务之间的相关性同时对多个任务的模型参数进行联合学习&#xff0c;挖掘其中的共享信息&#…

多任务学习-Multitask Learning概述

2020-02-22 09:59:48 1、单任务学习VS多任务学习 单任务学习&#xff1a;一次只学习一个任务&#xff08;task&#xff09;&#xff0c;大部分的机器学习任务都属于单任务学习。 多任务学习&#xff1a;把多个相关&#xff08;related&#xff09;的任务放在一起学习&#x…

深度学习之----多任务学习

介绍 在机器学习&#xff08;ML&#xff09;中&#xff0c;通常的关注点是对特定度量进行优化&#xff0c;度量有很多种&#xff0c;例如特定基准或商业 KPI 的分数。为了做到这一点&#xff0c;我们通常训练一个模型或模型组合来执行目标任务。然后&#xff0c;我们微调这些模…

深度学习中的多任务学习介绍

在2017年有一篇关于在深度神经网络中多任务学习概述的论文&#xff1a;《An Overview of Multi-Task Learning in Deep Neural Networks》&#xff0c;论文链接为&#xff1a;https://arxiv.org/pdf/1706.05098.pdf&#xff0c;它介绍了在深度学习中多任务学习(Multi-task Lear…

C# 多线程七 任务Task的简单理解与运用一

目录 一.Task 二.Task中的全局队列和本地队列 三.TaskCreationOptions 枚举 四.CancellationTokenSource/CancellationToken 1.延时取消线程 2.立即取消&#xff1a; 五.Task的三种调用方式 为了防止大家被标题误导 写在前面&#xff1a; Task并不是线程 Task的执行需要…

整理学习之多任务学习

如果有n个任务&#xff08;传统的深度学习方法旨在使用一种特定模型仅解决一项任务&#xff09;&#xff0c;而这n个任务或它们的一个子集彼此相关但不完全相同&#xff0c;则称为多任务学习&#xff08;MTL&#xff09; 通过使用所有n个任务中包含的知识&#xff0c;将有助于改…

多任务学习优化总结 Multi-task learning(附代码)

目录 一、多重梯度下降multiple gradient descent algorithm (MGDA) 二、Gradient Normalization (GradNorm) 三、Uncertainty 多任务学习的优势不用说了&#xff0c;主要是可以合并模型&#xff0c;减小模型体积&#xff0c;只用一次推理也可以加快速度。对于任务表现的提升…

经验 | 训练多任务学习(Multi-task Learning)方法总结

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 转载于&#xff1a;知乎Anticoder https://zhuanlan.zhihu.com/p/59413549 背景&#xff1a;只专注于单个模型可能会忽略一些相关任务中可能提升目标任务的潜在信息&…

多任务学习(Multi-Task Learning)

转自&#xff1a;https://www.cnblogs.com/zeze/p/8244357.html 1. 前言 多任务学习&#xff08;Multi-task learning&#xff09;是和单任务学习&#xff08;single-task learning&#xff09;相对的一种机器学习方法。在机器学习领域&#xff0c;标准的算法理论是一次学习一…

多任务学习 | YOLOP,一个网络同时完成三大任务

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 paper: https://arxiv.org/abs/2108.11250 code: https://github.com/hustvl/YOLOP 计算机视觉研究院专栏 作者&#xff1a;Edison_G YOLOP: You Onl…

多任务学习概述

文章目录 前言1 文章信息2 背景、目的、结论2.1 背景2.1.1 多任务的类型分类2.1.1.1 相关任务的分类2.1.1.2 将输入变输出的逆多任务学习2.1.1.3 对抗性多任务学习2.1.1.4 辅助任务提供注意力特征的多任务学习2.1.1.5 附加预测性辅助任务的多任务学习 3 内容与讨论3.1 多任务学…

多任务学习(Multi-task Learning)方法总结

多任务学习&#xff08;multi task learning&#xff09;简称为MTL。简单来说有多个目标函数loss同时学习的就算多任务学习。多任务既可以每个任务都搞一个模型来学&#xff0c;也可以一个模型多任务学习来一次全搞定的。 作者丨Anticoder知乎 链接丨https://zhuanlan.zhihu.co…

浅谈多任务学习

目录 一、前言及定义 二、多任务学习&#xff08;MTL&#xff09;的两种方法 2.1 参数的硬共享机制&#xff08;hard parameter sharing&#xff09; 2.2 参数的软共享机制&#xff08;soft parameter sharing&#xff09; 三、多任务学习模型 3.1 MT-DNN 3.2 ERNIE 2.0…

多任务学习

一、单任务学习和多任务学习 多任务学习是和单任务学习对应的一种机器学习方法。 单任务学习 在单任务学习中&#xff0c;认为不同任务之间是不具有关联性的。因此&#xff0c;每个模型的参数都是独立训练的。这样的学习方法有两个缺陷&#xff1a; 由于每个任务中的训练数据有…

多任务学习 (Multitask Learning) 汇总

1 前言 多任务学习&#xff08;Multi-task learning&#xff09;是和单任务学习&#xff08;single-task learning&#xff09;相对的一种机器学习方法。在机器学习领域&#xff0c;标准的算法理论是一次学习一个任务&#xff0c;也就是系统的输出为实数的情况。复杂的学习问题…

【GANs学习笔记】(十八)LAPGAN、ProGAN、SRGAN

完整笔记&#xff1a;http://www.gwylab.com/note-gans.html ——————————————————————— 4. LapGAN 4.1 LapGAN基本思路 如果我们希望生成高分辨率图像&#xff0c;还有一种GANs可以考虑&#xff0c;那就是LapGAN。LapGAN与StackGAN有着非常类似的思路&…

GAN网络

目录 GAN生成网络G&#xff08;Generative&#xff09;对抗网络D&#xff08;Discriminative&#xff09;两分布之间差异性评价KL散度JS散度 损失函数一次代码实验 WGANWGAN-GPConditional GAN GAN 生成式对抗网络&#xff08;GAN, Generative Adversarial Networks&#xff0…

基于pytorch的SRGAN实现(全网最细!!!)

基于pytorch的SRGAN实现 前言SRGAN论文概要(贡献)网络结构和损失函数pytorch代码实现1. 准备工作1.1 数据下载并放到合适位置 2. 开始训练和测试 源码详解1. 数据集的加载: data_utils.py2. 网络模型&#xff1a; model.py2.1 生成器: Generator2.2 判别器&#xff1a;Discrimi…