同一条用户反馈里,可能同时有情绪、产品名、问题类型和紧急程度。为每个目标各训练一套完整模型当然可以,但它会重复学习大量相同的语言规律。多任务学习给出另一种选择:让几个任务在训练时共享一部分表示,同时保留各自的预测目标。
这句话听起来像“多放几个输出头”那么简单,真正落地却有三道关:任务是否值得共享、各任务如何获得训练机会、它们的梯度发生冲突时怎么办。如果这三道关没有分别检查,联合训练很容易变成“大数据任务牵着小任务走”,或者平均分上涨但核心任务悄悄退化。
这篇内容从一个可验证的工程视角展开。我们会建立单任务基线,比较硬共享、软共享和共享—私有结构,拆开任务采样与损失权重,推导不确定性加权、GradNorm 和 PCGrad,再用真实数值实验观察梯度冲突。最后给出数据切分、消融和停止共享的决策清单。
设有 个任务,第 个任务的数据是 ,损失是 。多任务训练最常见的形式是优化加权和:
其中 是共享参数, 是第 个任务的私有参数。以文本分类为例, 可以是编码器, 可以是情感分类头、意图分类头或实体标注头。

如果两个任务依赖相似的潜在规律,它们会从不同角度约束共享表示。情感判断要求模型识别“失望”“终于修好了”这样的态度线索;投诉类型分类要求它识别“电池”“退款”“物流”等问题对象。二者联合时,共享编码器不能只记住某个任务训练集里的偶然词频,而要找到能同时解释两套标签的表示。
可以把这种效果理解成一种数据驱动的归纳偏置。单任务模型在许多都能拟合训练集的参数中做选择;辅助任务又增加一组约束,迫使模型偏向能够解释多种监督信号的参数。它有时像正则化:减少模型围绕一个小数据集过拟合的自由度。但它不是普通的 正则,因为辅助任务会定向改变表示,而不是统一把参数往零拉。
共享还可能带来三种工程收益:
“都处理中文”不等于任务相关,“都叫情感分析”也不等于数据分布相同。电影评论里的“不可预测”常是褒义,车辆操控里的“不可预测”却是危险信号。若共享层把这种领域特有规律当成通用规律,另一个任务会被误导。
任务关系还可能不对称。实体识别学到的边界信息也许能帮助关系抽取,但关系抽取的数据未必能同等帮助实体识别。数据量、标签噪声和任务难度也会改变这种关系。于是,多任务学习的正确起点不是直接联合,而是先回答三个问题:
单任务基线不是“旧方案”,而是判断正迁移与负迁移的测量尺。没有相同数据切分、相近调参预算和可比训练步数的单任务基线,就不能把联合模型的变化归因给任务共享。
架构决定任务之间能交换什么,也决定冲突会传播到哪里。没有一种结构在所有任务组合上最好,合适的选择取决于任务关系、参数预算和部署目标。

上面的实验台把“参数节省”“任务隔离”和“负迁移风险”放在一起。它的分数只是直觉演示,真正的判断仍来自验证集和逐任务消融。
硬共享让所有任务使用同一个编码器:
它最省参数,也最容易实现。一个批次属于哪个任务,就运行对应的任务头并反向传播;梯度会更新该任务头和公共编码器,其他任务头保持不变。
硬共享适合输入形式相近、底层规律确实共通的任务。例如,同一领域客服文本上的意图分类与情感分类通常都需要识别否定、实体和话题。它也适合推理成本受限的场景,因为共享编码器只运行一次。
代价是耦合强。若两个任务需要相反特征,所有冲突都会进入同一组参数;若一个任务有百万样本、另一个只有几千样本,前者还可能通过更多批次重塑编码器。硬共享的首个调节旋钮往往不是复杂优化算法,而是减少共享深度:共享底层词法和句法表示,把高层语义表示留给各任务。
软共享给每个任务一套参数 ,再加入相似性约束:
当 时,各任务完全独立; 越大,参数越被拉近。实际系统还可以只约束某几层、低秩子空间或适配器,而不要求整套模型逐元素接近。
软共享适合任务相关但不够相似、又能接受额外参数的情况。它让每个任务保留自己的容量,冲突不必全部写进同一组权重。不过,“参数距离小”不必然等于“功能相似”,不同神经网络参数排列可能实现相近函数,因此距离正则需要通过实验选层与选强度。
共享—私有结构同时计算公共表示与任务私有表示:
共享分支学习跨任务稳定的规律,私有分支保留标签口径、领域词义和任务特有推理。文本领域常见做法是把两种表示拼接后送入任务头,或用门控决定当前样本更依赖哪一边。
它比硬共享灵活,却会引出一个新问题:模型可能把所有信息都塞进私有分支,让共享分支形同虚设;也可能把领域特征污染到共享空间。可以加入任务判别器,让共享表示难以预测任务来源,或加入正交约束减少共享与私有表示的冗余。但这些约束也会增加训练难度,所以应先从简单结构开始,通过表示探针与消融确认问题确实存在。
多任务训练常被写成一个损失和,但工程里通常一次只取某个任务的一个批次。于是,一个任务对共享参数的影响至少由三件事共同决定:
把三者混为一谈会产生误判。某任务的损失值大,不代表它一定主导;真正更新参数的是梯度。某任务权重小,也不代表它影响小;如果它被抽到的次数多、梯度范数又大,累计影响仍然可观。
最常见的三种基线是:
若第 个任务有 个样本,可以定义:
时接近任务均匀, 时接近按样本量采样。这个公式没有自动给出“正确”答案,它只是把配比变成可记录、可搜索的超参数。核心任务通常还需要最小采样下限,避免随机波动造成长时间断档。
task_names = ["sentiment", "ner", "nli"]
task_probs = make_probs(dataset_sizes, alpha=0.7)
for step in range(max_steps):
task = random_choice(task_names, p=task_probs)
batch = next(task_loaders[task])
loss = loss_weights[task] * forward_loss(task, batch)
optimizer.zero_grad()
loss.backward()
optimizer.step()这里每一步只更新当前任务头,但共享编码器每一步都会收到梯度。若某任务耗尽数据,可以循环其数据加载器;此时必须记录每个样本实际被看过几次,因为“训练 10 个 epoch”对不同大小的数据集并不具有同样含义。更稳妥的日志是每任务累计样本数、累计更新数和验证指标曲线。
同一文本有多层标注时,可以在一个前向过程中计算多个损失;不同语料上的任务则通常交错取批次。二者的统计条件不同。如果同一篇文档的不同句子分别进入训练集和测试集,联合模型可能通过共享编码器记住文档模板,这会造成跨任务泄漏。
因此,切分应优先按最强关联单元分组:同一用户、同一对话、同一文档、同一模板生成族或同一事件不能跨集合。先切分再构造各任务视图,通常比每个任务独立随机切分安全。

任务采样决定“谁上场”,损失权重决定“这次发言音量多大”。最简单的静态加权是:
静态权重并不落后。若只有两三个任务、业务优先级明确、损失尺度稳定,围绕少量候选值做验证集搜索往往最透明。比如核心任务固定 ,辅助任务尝试 ,同时报告所有任务指标和梯度范数。
对带同方差观测噪声的回归任务,可以从高斯似然得到:
是随任务变化、但不随单个输入变化的可学习量。第一项让较大不确定性的任务权重变小, 阻止模型把所有 推到无穷大来逃避学习。实现时通常优化 ,避免方差变成负数:
这套方法的价值在于给“自动权重”一个概率解释,特别适合不同单位或不同噪声水平的目标。但要避免两个误解:
GradNorm 不直接比较损失数值,而是在某个共享层 上测量第 个加权损失的梯度范数:
再用损失相对初值衡量训练速度:
表示该任务下降得比平均慢。GradNorm 希望它获得更大的目标梯度范数:
随后最小化实际范数与目标范数的距离来更新 ,并把所有权重重新归一化。 控制追平训练速度的力度; 只追求梯度范数接近,不区分谁学得快慢。
GradNorm 解决的是“任务训练速度和梯度尺度失衡”,不是“任务语义是否相容”。两个任务即使范数相同,方向仍可能相反。因此,损失平衡与梯度冲突处理是两层问题,不能互相替代。
两个任务对共享参数的梯度分别是 和 。它们的余弦相似度为:
若余弦为正,一阶近似下两个任务倾向于朝相近方向更新;若为负,沿一个任务下降的方向可能抬高另一个任务的损失,这称为梯度冲突。

PCGrad 在 时,移除 沿 的冲突分量:
投影后 。如果点积非负,就保留原梯度,让可能的正向协同继续存在。任务多于两个时,算法通常随机排列其他任务,逐一做投影,最后合成修正后的梯度。
负余弦只描述当前参数点的一阶局部关系。它没有告诉我们:
PCGrad 的动机还涉及范数差异和优化曲率:当一个冲突梯度远大于另一个,且损失面沿更新方向曲率较高,简单求和容易让大梯度支配更新并高估收益。投影切断冲突条件,但不会自动解决数据偏差、标签矛盾、任务选择或业务权重。
因此更稳妥的使用顺序是:先画每任务验证曲线和梯度余弦分布,再判断冲突是否稳定关联到性能退化;随后把 PCGrad 与简单求和、静态加权和减少共享层做同预算比较。若改变任务组合比梯度投影更有效,应优先修正组合。
为了只观察优化机制,我们构造两个共享同一二维参数 的二次任务。任务 A 希望参数靠近 ;任务 B 希望参数靠近 ,并把损失尺度放大 4 倍:
这个例子故意让两个任务的最优点不一致。这样我们可以区分三件事:等权求和会被大尺度任务牵引,静态权重能校正尺度,PCGrad 会直接改变冲突方向。它是机制实验,不代表任何真实 NLP 数据集的收益。
from math import acos, degrees, sqrt
def dot(a, b):
return sum(x * y for x, y in zip(a, b))
def norm(a):
return sqrt(dot(a, a))
def project(source, other):
inner = dot(source, other)
if inner >= 0:
return source
scale = inner /
在初始点 ,实际计算得到:
投影精度也被直接检查:, 在浮点误差内为 0。这说明公式确实移除了冲突分量,而不是只改变了图示。
以学习率 做一步更新,三种策略得到:
继续运行 40 步时,等权策略落在偏向 B 的折中点,损失约为 ;静态降权策略约为 ;PCGrad 约为 。没有一行能单独宣布“最好”,因为选哪一个取决于任务优先级和验证指标。这个结果恰好说明:优化策略改变的是折中方式,业务目标仍需显式给出。
真实模型里,采样、标签噪声、深层非线性和优化器状态同时变化,很难仅凭最终分数定位原因。二维实验把其余因素固定,只留下梯度尺度和方向,让我们可以验证公式、日志与实现是否一致。等到机制正确,再把同样的监控加到共享编码器最后一层,才不容易把实现错误误判为任务冲突。
辅助任务的价值不在于数量,而在于它向共享表示提供了什么额外约束。一个好问题是:主任务的哪种错误,理论上能被这个辅助监督纠正? 如果说不出路径,就不应先上复杂联合训练。
任务名称相近不是帮助路径。判断候选辅助任务时,可以先做三项低成本检查:
低层任务常被安排在浅层、高层任务接在深层,这是有用的起点,但不是自然法则。词性标注可能依赖上下文语义,情感判断也可能被局部词汇解决。更稳妥的方法是让多个候选层连接任务头,或者逐层冻结/分支做消融,观察共享位置。
如果辅助标签是从主标签确定性派生的,它往往没有增加信息,只是改变优化路径。它仍可能帮助训练,但必须与相同计算预算的正则化、数据增强或更简单中间损失比较,避免把“多一个损失”误认为“多一份知识”。
MT-DNN 把预训练文本编码器放在底部共享,上层按任务保留不同输出模块。它联合了单句分类、句对分类、语义相似度回归和相关性排序等不同目标。训练时以任务批次为单位交错更新:当前批次使用当前任务的损失,近似优化所有任务目标之和。
这里真正值得复用的是三点:
对今天的预训练模型而言,多任务也不一定要更新全部参数。共享底座加任务适配器、低秩分支或路由模块,常能降低任务互相覆盖的风险。是否值得这样做,仍取决于性能、存储和在线推理成本的联合预算。
定义第 个任务的单任务指标为 ,多任务指标为 。若指标越高越好,可以定义相对变化:
表示该任务出现负迁移。真正的报告不能只写宏平均 ,还应列出最差任务、核心任务和置信区间。一个大幅提高的辅助任务,完全可能遮住核心任务的小幅退化。

有多个候选任务时,可以先训练小模型或短周期模型,记录“加入任务 后任务 的变化”:
矩阵通常不对称: 不必等于 。它也会随训练阶段、模型容量和数据配比变化,所以不能把一次测量当成永恒的任务关系。它更适合用来筛选明显冲突组合、形成任务分组候选,再通过完整训练验证。
如果部署需要一次推理完成许多任务,任务分组还有成本维度。把合作任务放入同一网络,把竞争任务拆到少量不同网络,可能比“一个模型全包”或“每任务一个模型”更合理。此时应同时报告准确率、吞吐、显存和最差任务,而不是只优化单一平均分。
先确认比较公平。固定数据切分、预训练初始化、训练预算、早停规则和调参预算;多任务模型若看到更多总样本或跑更多步,需要单独说明。
再看数据。检查任务领域、标签口径、类别比例和标注噪声;同源样本按文档、用户或模板族分组切分,避免共享编码器记住近重复内容。
然后看训练机会。记录每任务采样数、损失权重、共享层梯度范数与余弦分布,判断问题来自大任务垄断、尺度失衡还是稳定方向冲突。
最后做结构和任务消融。逐个移除辅助任务、改变共享层数、冻结共享编码器或换成共享—私有结构;只有这些实验能定位“谁在伤害谁”。
多任务数据常来自同一原始语料的不同标签视图。若任务 A 的训练集含某篇文档,任务 B 的测试集含同文档的另一段,联合模型已经通过共享参数看过该文档风格。更隐蔽的情况包括:同一用户多轮对话被拆开、同一模板生成样本跨集合、辅助任务标签由测试文本预计算、对完整数据做词表或归一化后再切分。
防线是先建立全局样本谱系,再按关联组切分,最后为各任务生成训练视图。特征统计、词表适配、难例挖掘和伪标签也必须只使用训练侧信息。若跨任务无法构造同一测试边界,就应分别报告“域内联合效果”和“严格隔离效果”。
多任务学习不是项目成熟度的标志。任务不合适时,独立模型、共享底座但分开微调,或者训练后再蒸馏,往往更可控。下面这份清单把“继续共享”和“停止共享”放在同等位置。
我建议按下面的顺序推进,而不是一开始同时上动态加权、梯度投影和复杂路由:
这个顺序的好处是每一步都回答一个明确问题。若简单方案已经达到目标,复杂机制只会增加维护成本;若简单方案失败,日志也能告诉我们下一步该改采样、权重、梯度还是架构。
| , |
| 与范数 | , |
| 点积、余弦与夹角 | ,, |
| 投影后的 |
| 投影后的 |
| 校正尺度后更平缓,但 A 仍略退化 |
| 双向 PCGrad | 在这个参数点上两项都小幅下降 |