假设一次更新能让任务 A 变好,另一次更新能让任务 B 变好。一个很自然的问题随之出现:
同一组参数怎样既让 A 达标,也让 B 达标,甚至继续容纳 C、D 和更多任务?训练究竟能保证到什么程度?
直觉最容易卡在这里:一个数字如果为了 A 应该变大、为了 B 又应该变小,它不就只能二选一吗?
先给结论:普通优化器不能保证任意多个任务同时达到各自的单任务最优。工程上真正能争取并验收的是:让任务可区分,为它们提供足够容量,并在逐任务验证集上达到事先定义的门槛;如果共同达标区域不存在,就必须改变目标、增加容量或减少共享。
神经网络并不是把“任务答案”直接存进某个参数坐标。它学的是一个带条件的计算系统:不同任务条件会让同一组权重产生不同的中间状态;训练信号有时共享结构,有时近似互不干扰,有时则局部冲突。局部冲突不自动意味着必须拆模型,只有负迁移在验证集上稳定存在时,才需要进一步折中、扩容或隔离参数。
上一篇文章解释了单项训练信号怎样经由 loss、梯度和优化器进入权重。这一篇只追问:许多任务的训练信号进入同一系统后,为什么没有必然互相覆盖?
本文主体讨论 A、B 数据在同一训练过程中都可访问的联合多任务训练;“先学 A、再只见 B”属于持续学习,后文单独区分。
1. 先看一个根本无解的训练集
设模型每次看到的输入都完全一样:
输入 x → 标签 A (70 次)
输入 x → 标签 B (30 次)
没有 task token,没有不同 prompt,没有额外上下文,也没有隐藏样本编号。模型只能对这个 x 输出同一组概率:
q = p(A | x)
1 - q = p(B | x)
交叉熵的直觉是:模型分给真实标签的概率越低,惩罚越大。这里把 100 次样本的惩罚加起来:
L(q) = -70 log q - 30 log(1-q)
求导并令其为零:
L'(q) = -70/q + 30/(1-q) = 0
q* = 70 / (70+30) = 0.7
二阶导数始终大于零,所以这不是随便找出的折中,而是该目标唯一的内部最优解。模型最后会预测:
p(A | x) = 0.7
p(B | x) = 0.3
它没有“同时知道 A 和 B 两个答案”,只是学会了条件缺失后的标签频率。单次请求到来时,它仍然不知道用户这次想要哪一个。
这揭示了多任务学习的第一道门槛:如果同一份可见信息对应互斥要求,而任务身份完全不可辨识,那么再大的模型、再好的优化器也不能凭空知道该选哪一个。 PCGrad 不能补出缺失信息,MoE 也不能。
还要补一个与“真实答案”有关的边界:优化器看到的是被写进数据、标签、奖励和评测的目标。它能让模型更符合这些操作化标准,却不会仅凭 loss 下降就证明标签等于现实真相。
2. 关键的第一步:从 p(y|x) 变成 p(y|x,c)
现在给两个任务加上条件:
[任务=A] x → A
[任务=B] x → B
模型要学习的就不再是一个矛盾的 p(y|x),而是:
p(y | x, c=A)
p(y | x, c=B)
这里的 c 首先指本次前向计算可见的条件,例如:
- 自然语言指令,例如“翻译成英文”或“判断情感”;
- 对话里的角色、格式要求与示例;
- 控制 token、语言 token 或工具状态;
- 能让模型推断当前任务的其他上下文线索。
这些条件不修改模型文件,却会改变本次 activations。工程系统还可以让条件进一步选择 task-specific head、expert 或 adapter;此时改变的不只是输入,还包括本次启用的参数子集或有效映射。这是更强的参数隔离方案,不能与“完全相同的活跃参数”混为一谈。
FLAN 提供了语言模型中的行为证据。作者用 62 个数据集、12 个任务簇对 137B 模型做 instruction tuning,并整簇留出测试迁移;它在 25 个数据集中的 20 个超过 zero-shot 175B GPT-3。在 4 个 held-out task clusters 的消融中,去掉自然语言模板或只给任务与数据集名称都明显更差。
这说明任务条件有用,却不证明内部形成了整齐模块,也不能替代容量分析。同一设置下,422M、2B、8B 模型的 held-out task 表现反而下降;作者把容量饱和列为一种可能解释,并未证明它是唯一原因。
所以,加条件只解决了第一层问题:模型有没有信息区分 A 与 B。 后面仍有三问:网络能否表达两种映射?优化能否找到它们?未见样本上是否仍然成立?
3. 权重相同,不代表每次运行的计算相同
普通推理时,模型权重固定;改变的是输入条件和由此产生的 activations。一个极简网络可以写成:
h = f(Wx + Uc)
y = Vh
W、U、V 都不变,但 c_A 与 c_B 会产生不同的 h_A、h_B。后续层接收到不同 hidden state,注意力分配、非线性门控、最终 token 概率便都可能不同。
flowchart TB
X[共同输入 x] --> CA[条件 c=A]
X --> CB[条件 c=B]
T[(共享权重 θ)] --> RA[第 A 次前向]
T --> RB[第 B 次前向]
CA --> RA
CB --> RB
RA --> HA[激活路径 h_A]
RB --> HB[激活路径 h_B]
HA --> YA[输出 A]
HB --> YB[输出 B]
图里是两次前向运行,共同读取同一组权重,不是两份权重副本。
条件还会从推理侧一路影响训练侧。不同 c 产生不同中间状态,同一项误差反向传播时,对共享参数的敏感度也不同;因此任务条件不仅改变输出,也改变 A、B 分别送给权重的梯度。
4. 把每项任务的要求画成一个梯度向量
先把模型想成只有两个参数 θ=(θ₁,θ₂)。梯度记录“每个参数向正方向微调时,loss 会怎样变化、变化多快”;例如 g_A=(1,2) 表示在当前位置附近,θ₁ 增大一点会让 L_A 上升约一份,θ₂ 增大一点会让它上升约两份。梯度指向 loss 局部上升最快的方向,SGD 通常沿反方向更新。
两个向量的点积就是对应位置相乘再相加:
(1,2)·(2,1) = 1×2 + 2×1 = 4
点积为正表示两个方向总体同侧,为负表示总体相反,为零表示这一步的一阶影响近似正交。∇ 读作梯度,η 表示一个很小的学习率。
设两项 loss 为 L_A(θ)、L_B(θ),当前位置的梯度是:
g_A = ∇L_A
g_B = ∇L_B
先取最简单的等权总目标:
L = L_A + L_B
g = g_A + g_B
普通 SGD 的一步为:
Δθ = -ηg
在步长足够小时,任务 i 的 loss 变化近似为:
ΔL_i ≈ g_i · Δθ
= -η g_i · g
因此判断一次合成更新是否改善任务 i,真正要看的不是一句笼统的“梯度冲不冲突”,而是:
g_i · g > 0 → L_i 一阶下降
g_i · g < 0 → L_i 一阶上升
这是局部的一阶显微镜。有限步长还会受到曲率影响;AdamW 之类的预条件优化器,真实更新也不一定平行于原始负梯度。更严格时应直接检查 g_i·Δθ,而不是机械套用原始梯度夹角。
5. 三种局部关系:协作、近似分离、冲突
把参数空间缩成二维,就能亲手算清三种情况。
5.1 协作:一次更新让两边都受益
g_A = (1, 0)
g_B = (1, 1)
g = (2, 1)
两项梯度点积为 1,大体同向。于是:
ΔL_A ≈ -η (1,0)·(2,1) = -2η
ΔL_B ≈ -η (1,1)·(2,1) = -3η
两项都下降。现实中,句法理解可能同时服务于翻译、摘要和问答;边缘、形状等视觉特征也可能被多个视觉任务复用。多任务数据还可能充当正则化,迫使网络学习更普适、较少依赖单一数据集偶然性的表示。
Ruder 的多任务学习综述把可能收益归纳为隐式数据增强、注意力聚焦、从其他任务“窃听”特征、表示偏置和正则化等机制。这些是解释框架,不是共享一定有益的定理。
5.2 近似分离:共享参数,但局部少干扰
g_A = (1, 0)
g_B = (0, 1)
g = (1, 1)
两者点积为零。只执行 B 的小更新时,A 的一阶变化近似为零;一起更新时:
ΔL_A ≈ -η
ΔL_B ≈ -η
这可以来自不同任务主要使用不同特征方向、不同 attention patterns、不同 heads、不同 adapter 或不同 experts。但“点积为零”只能说明当前位置、当前 batch、当前参数选择下的一阶关系。更新一次后夹角会变;它也不证明网络里真的存在两套永久独立的神经元。
Toy Models of Superposition在稀疏合成特征和小型 ReLU 网络中展示了“以 interference 换表示容量”。它只提供有限维度可复用的机制直觉,不是完整 LLM 的多任务解释。
5.3 冲突:总目标下降,一项任务却变差
g_A = ( 1, 0)
g_B = (-2, 1)
g = (-1, 1)
两项梯度点积为 -2。对 A:
g_A·g = -1
ΔL_A ≈ +η
对 B:
g_B·g = 3
ΔL_B ≈ -3η
总 loss 仍约下降 2η,但 A 被牺牲了。这是最值得记住的一步:
优化器可以完全正确地优化你写下的总目标,同时让其中一个任务退步。
不过,g_A·g_B<0 不等于某项一定变差。对 A 来说:
g_A·(g_A+g_B) = ||g_A||² + g_A·g_B
负交叉项必须压过 A 自己的梯度平方,合成更新才会伤害 A。在一阶、小步判断中,loss 权重和梯度尺度会改变这个阈值;有限步长时,曲率会进一步改变实际 loss 变化,mini-batch 噪声也会让观测到的夹角波动。PCGrad 论文也明确说,冲突本身未必有害;冲突、梯度大小失衡和高曲率同时出现时更危险。
6. 一组权重容纳许多任务,靠的不是一个机关
把前面的机制合起来,可以看到三层容量来源。
第一层:共享表示
多个任务复用词法、句法、世界知识、对象边界或因果结构。一个共享特征一旦被学好,可以同时降低多项 loss。任务越多不代表每项都需要一整套全新参数,因为它们并非彼此信息独立。
第二层:条件化或稀疏计算
指令、task token、上下文和路由状态让相同权重产生不同 activations;MoE 进一步让每个 token 只调用一部分专家。这里增加的是“同一系统按条件执行不同计算”的自由度。
Switch Transformers 把稀疏计算做得更显式:路由器根据 token representation 选择 expert,Switch 使用 top-1 路由,让每个 token 只调用一个 expert 的参数。不要把它误读成“每项任务固定分到一个专家”:它是 token-based routing,并且还要处理负载均衡、通信、专家容量、溢出 token 跳过本层专家计算与训练稳定性等问题。
第三层:专用容量
共享 backbone 之外,可以增加 task-specific head、adapter、LoRA 增量、expert,直至独立模型。隔离越强,冲突越容易控制;代价是参数、训练、部署、版本和路由管理更复杂。
Hard sharing 可共享隐藏层、保留任务专属 head;soft sharing 可保留各自网络,再用正则鼓励接近。设计问题不是“共享或不共享”二选一,而是共享到什么程度。
Standley 等人的任务分组研究提醒我们不能只凭任务名字判断。在 Taskonomy 视觉任务中,任务亲和随容量与数据量改变;语义相似的任务不一定更适合联合训练,多任务亲和也不能由 transfer-learning affinity 可靠预测。更大网络让更多组合受益,但仍有组合互相伤害。
这是视觉任务上的实证,不是跨领域定律;它足以否定“相似任务天然相容”这个偷懒假设。
7. 总目标收敛,不等于每项最优
训练日志显示总 loss 变平,至多说明这个标量目标近期不再明显下降,不能据此断定梯度或参数已经收敛。多任务场景至少要区分:
- 总目标趋稳:
λ_A L_A + λ_B L_B + …不再明显下降; - 逐任务达标:A、B、C 各自在验证集超过预定门槛;
- 分布外泛化:换表达、换领域、换任务组合后仍然可靠。
第一项不能推出后两项。甚至总目标到达全局最小值,也不代表每项达到自己的单任务最优。
看一个一维反例:
L_A(w) = 1/2 (w-1)²
L_B(w) = 1/2 (w+1)²
在 w=0:
g_A = -1
g_B = 1
g_A + g_B = 0
而且:
L_A + L_B = w² + 1
所以 w=0 真的是等权总目标的全局最小值。可 A 单独最喜欢 w=1,B 单独最喜欢 w=-1;总目标没有优化失败,失败的是我们把一个加权折中误称为“每项都达到自己的最好”。
7.1 当共同最优不存在,就进入 Pareto 世界
从 -1 到 1 的每一点都是 Pareto 有效的。在 [-1,1] 内比较任意两个不同点,较右的点有更低的 A loss、却有更高的 B loss;较左则相反。区间外的点会被相应端点支配。
但 Pareto 有效只表示“没有免费的整体改进”,不表示:
- 每项都达到单任务最优;
- 这个点公平;
- 它满足业务底线;
- 用户会接受这个折中。
取非负且不同时为零的权重 λ_A、λ_B,给两项加权:
L = λ_A L_A + λ_B L_B
可以手算出:
w* = (λ_A - λ_B) / (λ_A + λ_B)
等权得到 w=0;增大 A 的权重,就把解推向 1。如果两项权重都严格为正,解位于开区间 (-1,1)。因此 loss weighting 常常是在选择折中点,不是消除客观矛盾。
Multi-Task Learning as Multi-Objective Optimization把这件事显式写成多目标优化。在当前参数点,若目标可微并精确求得任务梯度的最小范数凸组合,那么组合为零表示 Pareto stationary;否则其反方向是所有目标的共同一阶下降方向。论文还为 encoder-decoder 提出使用共享表示梯度的 MGDA-UB,并给出共享表示 Jacobian 满秩等假设。
这些都是带前提的局部结论:对随机 mini-batch、近似求解和非凸网络,不构成训练全程或全局最优保证。Stationary 也不保证公平或每项最优;论文实验主要是 MultiMNIST、CelebA 和 Cityscapes 等视觉问题,并非 LLM 的直接证据。一般非凸前沿上,简单加权和还可能找不到所有 Pareto 解。
8. 工程上怎样提高“多项都达标”的概率
最有效的顺序不是先挑一个流行算法,而是沿着四层诊断。
| 层级 | 先观察什么 | 常用手段 | 它不能保证什么 |
|---|---|---|---|
| 任务与数据 | 输入是否可区分、标签是否自洽、各任务覆盖是否失衡 | 明确 instruction/task id;清洗冲突标签;分层采样;补难例 | 不能凭数据格式制造缺失容量 |
| 标量目标 | 各项 loss 尺度、训练速度、业务优先级 | loss weighting;动态采样;GradNorm;阈值约束 | 权重不能消灭真实目标冲突 |
| 梯度几何 | 共享参数上谁与谁负点积、谁主导范数 | PCGrad;MGDA;分层处理梯度 | 局部修正不等于全局泛化保证 |
| 参数与路由 | 负迁移是否长期、是否集中在某些层或任务组 | task head;adapter/LoRA;MoE;任务分组;独立模型 | 容量越专用,部署治理越复杂 |
8.1 先修输入、标签和采样
若同一个 prompt 在不同数据源里对应互斥格式,却没有来源或任务条件,问题首先是不可辨识,不是梯度技巧。若任务 A 占 95% batch,B 的信号则可能只是被采样频率淹没。先检查:
每个任务是否可从输入识别?
标签政策是否一致?
每项任务在一个 epoch / token budget 中出现多少次?
困难样本与长序列是否让某项任务贡献异常大?
8.2 再决定总目标怎样代表业务
固定权重 λ_i 是最透明的起点,但不同 loss 的数值尺度不等于业务重要性。可以根据逐任务验证曲线、学习速度和最低门槛调整采样与权重。
GradNorm动态调节任务权重,使共享层上的梯度范数追随相对逆训练速率:学得过慢的任务获得更强信号,过快的任务被抑制。它主要处理范数和学习速度失衡,不是消除反向梯度。原论文证据来自合成与 NYUv2 视觉任务;其约 5% 额外开销也是特定设置,不是通用常数。
更重要的是,把“关键任务不可低于 95%”只翻译成一个随意权重,往往不够直接。可以把它视为约束:先守住安全、召回或延迟底线,再优化平均质量。最终仍需逐任务验证,而不是只看训练总 loss。
8.3 有明确局部冲突,再做梯度手术
PCGrad 在 g_A·g_B<0 时,从一个任务梯度中投影掉沿另一个任务梯度的冲突分量:
g_A' = g_A - (g_A·g_B / ||g_B||²) g_B
对前面的冲突例:
g_A = ( 1,0)
g_B = (-2,1)
为了手算,分别用对方的原始梯度投影:
g_A' = (1/5, 2/5)
g_B' = (0, 1)
g_PC = g_A' + g_B' = (1/5, 7/5)
再用原始任务梯度检查更新:
ΔL_A ≈ -η g_A·g_PC = -η/5
ΔL_B ≈ -η g_B·g_PC = -η
在这个点,原始合成方向会伤害 A,投影后的方向则让两项都在一阶上下降。这正是 PCGrad 的价值,也是它的边界:两任务、单点、小步的演示不是全局定理。多于两个任务时投影顺序会影响结果;严格反向时可用方向可能被消掉;下一个 batch 又会出现新的几何关系。
8.4 冲突稳定存在,就减少共享
如果调过数据、采样和目标后,A 与 B 仍持续负迁移,最朴素的答案可能是:不要强迫它们共享全部参数。
- 输出空间不同:先用 task-specific heads;
- 领域或客户差异稳定:用 adapter / LoRA 隔离增量;
- 输入内部存在可路由的稀疏模式:评估 MoE;
- 只有部分任务互相帮助:按实测 affinity 分组;
- 安全、合规、延迟或回滚要求完全不同:拆成独立模型。
LoRA 的原理与训练链已在上一篇展开,这里只把它看成一种可分离的参数增量。专用参数不是免费午餐:adapter 组合、专家负载、模型版本和线上路由都会成为新系统成本。
9. 别把三类“多任务”问题混在一起
| 场景 | 数据怎样到来 | 主要风险 | 典型思路 |
|---|---|---|---|
| 联合多任务训练 | A、B、C 在同一训练过程可访问 | 负迁移、尺度失衡、折中 | 采样/权重、GradNorm、PCGrad、MGDA、参数隔离 |
| 持续学习 | 先 A,之后主要只见 B、C | 灾难性遗忘 | rehearsal、约束、正则、专用参数 |
| 模型合并 | 已有分别训练的 A/B 权重或增量 | 参数对齐与合并干扰 | merge、task arithmetic、adapter composition,再逐任务验证 |
Gradient Episodic Memory研究的是第二类。GEM 为过去任务保存 episodic memory;若当前梯度会在一阶上增加旧任务记忆样本的 loss,就通过二次规划投影更新。它依赖小步近似和记忆样本的代表性,不是对完整旧分布的绝对保证。
所以,“先把 A 训好,再只拿 B 数据继续训,A 忘了”不能只用联合 batch 的梯度夹角解释;旧任务根本没有出现在当前数据里,首先要检查 replay、约束或参数隔离。模型合并又是另一种几何问题,不能直接套用联合训练的收敛结论。
10. 到底能“确保”什么
对一般非凸神经网络,不存在一个优化器开关,能保证任意数量、任意矛盾的任务同时达到各自全局最优。能建立的不是这种数学承诺,而是一条可审计的工程控制链:
1. 可辨识性:验证模型能从输入或路由信息判断当前任务
2. 数据条件:检查标签政策、自洽性、覆盖与任务采样
3. 训练诊断:分别监控 loss、梯度范数、夹角与验证集负迁移
4. 验收条件:为每项任务和关键切片预先定义独立门槛
5. 运行护栏:持续监控;越界时回滚、降级或路由到专用模型
这里真正可以“确保”的,是按约定执行检查、验收与回滚;模型能否同时达标,仍取决于共同可接受解是否存在,以及训练是否找到了它。
如果 A 和 B 存在共同低损失区域,共享表示和条件化计算能让它们一起改善;如果只是局部干扰,可以靠采样、权重或梯度方法缓解;如果共同可接受解在当前容量里不存在,就只能扩容、隔离或公开选择 Pareto 折中。
因此,对最初问题最准确的回答是:
一组权重能学习很多任务,不是因为每个参数同时“等于 A 又等于 B”,而是因为权重定义了一个受条件控制的高维计算系统。不同任务可激活不同状态,共享可复用结构,并在部分方向上近似分离。真正冲突时,没有算法能承诺同时得到所有单任务最优;可靠工程靠的是明确条件、逐任务目标与验证、冲突诊断,以及必要时减少参数共享。
11. 六道自测题
- 同一输入无任务条件地出现 70% A 标签与 30% B 标签,交叉熵最优预测是什么?这表示学会两个任务了吗?
g_A=(1,0)、g_B=(1,1),等权合成更新会怎样影响两项 loss?g_A=(1,0)、g_B=(-1,0),总梯度为零。能否推出 A、B 都达到各自最优,或这个折中一定满足业务门槛?- 加入
c_A、c_B后,普通推理中变化的是权重还是 activations? - PCGrad 消除了当前 batch 的一次负点积,是否保证两项验证指标以后都单调提高?
- 先训 A,再只用 B 数据训练后 A 退化,优先按哪类问题排查?
展开答案
p(A|x)=0.7、p(B|x)=0.3;没有,只学到缺失条件后的混合分布。- 合成梯度
(2,1);一阶近似下L_A降2η、L_B降3η。 - 都不能。两个非零分项梯度可能正好抵消;即使该点 Pareto stationary,也不表示公平、单任务最优或已经达到预设门槛。
- 权重通常固定,变化的是输入条件和本次 activations。
- 不保证;它是局部梯度处理方法,后续参数、batch、曲率和泛化都可能变化。
- 按持续学习与灾难性遗忘排查,先看 rehearsal、旧任务约束和参数隔离。