市里最气派的饭店接了十桌满汉全席的单。总厨老周面临两个选择:要么给每道菜都配一个独立小厨房和专属厨师——口味最稳,但成本翻十倍,而且每间厨房都要从切葱开始学起;要么保留一个中央厨房,让所有厨师共享台面、共用高汤、切磋刀工——十道菜一起做,边做边互相成全。第二个选择,就是大模型里的多任务微调(Multi-Task Fine-tuning)。 但共享厨房没那么简单。老周得盘算:每道菜备多少料才不被大菜抢了风头(数据配比与采样);两道菜同时抢一口锅、一个要大火一个要小火怎么办(任务冲突的检测与缓解);最后还得给每道菜配专属调料包,不改变大锅底味又能让每桌客人吃出特色(LoRA 多任务适配器路由)。这一整套“厨房管理学”,决定了一桌宴席能不能既省成本又比单做更好吃。这篇文章,就是带你走进老周的中央厨房,看看多任务微调这桌大菜是怎么端出来的。

岗位关联

对 AI 从业者而言,掌握多任务微调意味着能用一份算力让模型同时精通翻译、摘要、问答等多个技能,用 LoRA 路由按需切换专长——这是训练通用智能体、降低部署与推理成本的核心基本功。

目录
  1. 可视化演示
  2. 多任务微调基础:中央厨房的一桌宴席
  3. 数据配比策略:备料不能只按“谁食材多”
  4. 采样策略:每步先抽哪一道菜
  5. 冲突检测方法:谁在给模型“倒油”
  6. 冲突缓解策略:把拉扯力分解开
  7. LoRA 适配器路由:一锅底味,一菜一味
  8. 效果对比评估:中央厨房赢了没有
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示多任务数据配比采样、任务冲突检测与LoRA适配器路由,含单任务vs多任务效果对比与知识共享机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

多任务数据配比策略 不同任务数据量差异大需配比平衡 温度采样和混合比例控制训练分布 P(task) ∝ N_task^α 合理的数据配比是多任务训练的基础

多任务微调基础:中央厨房的一桌宴席

中央厨房拿到了十桌宴席的单。老周心里算了笔账:每道菜各开一家独门小店,是“单任务微调”——一个模型只学一个技能,部署十个模型,成本高、知识不流通;而让所有厨师共用一间厨房,菜式之间的刀工、火候、高汤能互相借鉴,这就是“多任务微调”。共享,是这间厨房的立身之本。

技术上,多任务微调把 K 个任务的数据放进同一次训练,让模型的同一组参数 θ 同时把 K 件事都做好。每个任务有一个自己的损失函数 $L_k$,模型的“总成绩”就是各科成绩的加权平均。你可能会问:凭什么让参数同时迁就这么多任务?答案很简单——因为我们相信这些任务在底层有共同的语言理解、常识和推理结构,就像不同菜系都离不开刀工和吊汤。

总损失的形式如下:

L(θ)=∑k=1Kλk Lk(θ)\displaystyle L(\theta)=\sum_{k=1}^{K}\lambda_k\,L_k(\theta)

其中 λ_k 是任务 k 的权重,λ 越大,训练时越优先照顾这个任务。这个公式看起来平淡无奇,但整篇多任务策略都围绕它展开——权重怎么定、损失怎么算、冲突怎么化解,全在“加权和”这三个字里。

1. 任务损失 $L_k(\theta)$:第 k 个任务用它自己的数据算出模型当前的误差,相当于每道菜当下的“火候偏差评分”。

Lk(θ)=1Nk∑i=1Nkℓ(fθ(xi(k)),yi(k))\displaystyle L_k(\theta)=\frac{1}{N_k}\sum_{i=1}^{N_k}\ell\big(f_\theta(x_i^{(k)}),y_i^{(k)}\big)

2. 任务权重 λ_k:每个任务在总分数里的分量,权重越大,这道菜在总厨心中的优先级越高。

λk≥0,∑k=1Kλk=1\displaystyle \lambda_k\ge 0,\quad \sum_{k=1}^{K}\lambda_k=1

3. 加权求和:把 K 道菜的火候偏差按各自分量加总,得到一次训练的“总评分”,梯度下降就是让这个总分不断降低。

\displaystyle \theta^{\*}=\arg\min_{\theta}\sum_{k=1}^{K}\lambda_k\,L_k(\theta)

中央厨房的好处在于知识共享,但“总评分”的设计也有陷阱:如果某道菜的权重压过了其他菜,整桌宴席就会变成“独菜秀”。权重怎么定、每道菜喂多少数据,正是下一节要解决的备料问题。

数据配比策略:备料不能只按“谁食材多”

备菜是晚宴成败的第一关。老周看着仓库:蒜蓉虾有 500 份食材,松露豆腐只有 10 份。如果“谁食材多就多备谁”,后厨一晚上都在做虾,松露豆腐还没轮到就收档了。数据配比面临的正是这个局面:大任务的数据动辄百万条,小任务可能只有几千条,直接按数据量比例来,小任务在每一轮训练中根本“吃不到几口”。

数据配比就是决定每个任务的数据在每一轮训练中占多大比例。最朴素的做法是按数据量自然比例——但大任务会刷屏,小任务“吃不饱”。业界常用的手段是给配比加一个“温度系数 α”,在自然比例和完全均分之间滑动:

pi=Niα∑j=1KNjα,α≥0\displaystyle p_i=\frac{N_i^{\alpha}}{\sum_{j=1}^{K}N_j^{\alpha}},\qquad \alpha\ge 0

α=1 就是自然比例;α=0 就是完全均分;α 取 0.2~0.5 时,可以人为把“小任务”的备料权重抬上来,同时保留大数据集的一点点规模优势。

1. 样本数 $N_i$:任务 i 拥有的数据条数,对应第 i 道菜的食材总量。

Ni=∣Di∣\displaystyle N_i=|\mathcal{D}_i|

2. 配比温度 α:控制配比在大户倾斜和完全均分之间滑动;α=0 时每个任务等权,α=1 时恢复自然比例。

α=0⇒pi=1K,α=1⇒pi=Ni∑j=1KNj\displaystyle \alpha=0\Rightarrow p_i=\dfrac{1}{K},\qquad \alpha=1\Rightarrow p_i=\dfrac{N_i}{\sum_{j=1}^{K}N_j}

3. 归一化分母:把各任务 α 次方后的规模加总,保证所有 p_i 加起来等于 1,成为一个合法的采样概率。

pi∈(0,1),∑i=1Kpi=1\displaystyle p_i\in(0,1),\quad \sum_{i=1}^{K}p_i=1

老周给松露豆腐偷偷加大了备料权重——数据少不要紧,只要配比照顾到位,小任务也能学到足够的火候。不过配比是“静态计划”,真到开火时,还得靠采样策略决定先炒哪锅。

采样策略:每步先抽哪一道菜

备料只是计划。晚上 6 点开火,灶只有两口,老周必须决定此刻先炒哪道菜。如果永远只炒备料最多的虾,炖了两个小时的佛跳墙就砸了;如果每道菜轮着来但不管熟没熟,菜又都是夹生的。采样策略解决的就是这个“顺序与频率”的问题。

采样策略决定每个训练 batch 从哪个任务取数据。常见做法是“按配比随机采样”——每步丢一次骰子,骰子面大小就是配比。进阶做法是“动态困难度采样”:哪个任务当前损失最大(学得最差),就临时提高它的抽取概率,相当于哪道菜生疏就多上几次灶:

Ri(t+1)∝Ri(t)⋅(Li(t)Lˉ(t))γ,γ≥0\displaystyle R_i(t+1)\propto R_i(t)\cdot\left(\frac{\mathcal{L}_i(t)}{\bar{\mathcal{L}}(t)}\right)^{\gamma},\qquad \gamma\ge 0

1. 当前采样权重 $R_i(t)$:第 t 轮时任务 i 被抽中的权重,相当于总厨此刻对每道菜的“关注度”。

Ri(t)≥0\displaystyle R_i(t)\ge 0

2. 相对困难度:任务 i 的当前损失除以所有任务的平均损失;大于 1 说明这道菜目前最没做好,小于 1 说明已经比较稳了。

Li(t)Lˉ(t)>1\displaystyle \frac{\mathcal{L}_i(t)}{\bar{\mathcal{L}}(t)}>1

3. γ 与归一化更新:γ 控制补偿力度,γ=0 表示维持原配比不补偿,γ 越大越向难任务倾斜;最后除以总和做归一化。

Ri(t+1)=Ri(t)(Li(t)/Lˉ(t))γ∑j=1KRj(t)(Lj(t)/Lˉ(t))γ\displaystyle R_i(t+1)=\frac{R_i(t)\left(\mathcal{L}_i(t)/\bar{\mathcal{L}}(t)\right)^{\gamma}}{\sum_{j=1}^{K}R_j(t)\left(\mathcal{L}_j(t)/\bar{\mathcal{L}}(t)\right)^{\gamma}}

动态采样让模型把“力气”花在最需要的地方。但就算配比和顺序都合理,两道菜同时抢锅时火候方向相反,还是会打架——这就是任务冲突。

冲突检测方法:谁在给模型“倒油”

后厨最怕两件事同时要做相反的火候:糖醋排骨要小火收汁,麻辣香锅要大火爆炒——同一个灶台却要推往两个方向。在模型里,这个“推力方向”叫梯度:每个任务都会算出自己希望参数往哪个方向调整,如果两个方向几乎相反,参数就会被拉扯在原地。

任务冲突的实质:更新同一组参数时,任务 i 想让参数往东偏,任务 j 想让参数往西偏。最常用的检测手段是计算两个任务梯度的余弦相似度——它衡量两个方向夹角的余弦值,跟“力度大小”无关,只关心方向是否一致:

cos⁡θij=gi⋅gj∥gi∥2 ∥gj∥2∈[−1,1]\displaystyle \cos\theta_{ij}=\frac{\mathbf{g}_i\cdot\mathbf{g}_j}{\|\mathbf{g}_i\|_2\,\|\mathbf{g}_j\|_2}\in[-1,1]

1. 梯度向量 $g_i$:任务 i 的损失对模型参数的偏导,表示“想让参数往哪个方向调”,就像主厨推灶火的力。

gi=∇θLi(θ)\displaystyle \mathbf{g}_i=\nabla_{\theta}L_i(\theta)

2. 内积 $g_i\cdot g_j$:两个方向在同一条线上的投影乘积;同向为正、反向为负、垂直为零。

gi⋅gj=∑dgi,d gj,d\displaystyle \mathbf{g}_i\cdot\mathbf{g}_j=\sum_{d}g_{i,d}\,g_{j,d}

3. L2 范数归一化:除以两个向量的模长,把“方向夹角”与“力度大小”解耦。余弦接近 -1 表示两个方向几乎相反,冲突严重;接近 1 表示方向一致,是理想的正迁移。

cos⁡θij≈−1,cos⁡θij≈1\displaystyle \cos\theta_{ij}\approx -1,\quad \cos\theta_{ij}\approx 1

检测到余弦为负只是第一步。老周知道问题的本质:不是菜不能做,而是两股力在互相抵消。化解要靠“分力”的技巧。

冲突缓解策略:把拉扯力分解开

老周的化解方法很高明:不是让两边各让一半(那就两道菜都不熟了),而是把其中一股力分解——保留它和自己垂直的分量,把与对方相反的分量卸掉。你推你的,我推我的,互不干扰。这就是梯度投影思想(PCGrad 的核心)。

若 $g_i$ 与 $g_j$ 的余弦为负,就把 $g_i$ 中与 $g_j$ 共线且相反的分量剔除,让更新只在与 $g_j$ 正交的方向进行:

gi′=gi−gi⋅gj∥gj∥22 gj\displaystyle \mathbf{g}_i'=\mathbf{g}_i-\frac{\mathbf{g}_i\cdot\mathbf{g}_j}{\|\mathbf{g}_j\|_2^2}\,\mathbf{g}_j

1. 投影分量提取:用 $g_i$ 在 $g_j$ 方向上的投影长度(带符号)得到一个系数,乘上 $g_j$ 就是“对方对我的拉扯分量”。

projgj(gi)=gi⋅gj∥gj∥22 gj\displaystyle \mathrm{proj}_{\mathbf{g}_j}(\mathbf{g}_i)=\frac{\mathbf{g}_i\cdot\mathbf{g}_j}{\|\mathbf{g}_j\|_2^2}\,\mathbf{g}_j

2. 正交化剔除:从 $g_i$ 中减去这个拉扯分量,剩下的 $g_i'$ 与 $g_j$ 正交,不再逆向干扰任务 j。

gi′⊥gj\displaystyle \mathbf{g}_i'\perp\mathbf{g}_j

3. 配套缓解手段:除梯度投影外,还可以用动态任务加权、任务分组、分阶段训练来减少冲突。动态加权是让权重随损失波动:学得差的任务权重自动变大。

wk(t)=λk eβ Lk(t)∑j=1Kλj eβ Lj(t)\displaystyle w_k(t)=\frac{\lambda_k\,e^{\beta\,\mathcal{L}_k(t)}}{\sum_{j=1}^{K}\lambda_j\,e^{\beta\,\mathcal{L}_j(t)}}

有了“错峰用力”的功夫,同一锅也能容纳几十道菜。但有些菜的味道实在太个性,老周不想为它重开厨房,只想要一个“专属调料包”——这就是 LoRA。

LoRA 适配器路由:一锅底味,一菜一味

中央厨房的底汤、刀工是共享资产,但松露汤的松露油、藤椒鸡的藤椒油各是各的。LoRA 就是这个“专属调料包”:基础大模型(共享底味)冻结不动,只为每个任务加一条极小的可训练旁路。这样既不影响其他任务,又能让每个任务拥有自己的独特风味。

LoRA 把权重的增量 $\Delta W$ 分解成低秩矩阵 A 与 B 的乘积,训练时只更新这条旁路,参数量从亿级降到百万级。多任务场景下,每个任务挂一个适配器,再用一个轻量路由按输入决定激活哪一包调料:

h=(W0+αr B A)x\displaystyle h=\left(W_0+\frac{\alpha}{r}\,B\,A\right)x

1. 冻结的基座权重 $W_0$:预训练得到的共享模型参数,训练时不更新,相当于不换底汤。

ΔW0=0\displaystyle \Delta W_0=0

2. 低秩旁路 $B\cdot A$:A 先把输入压到 r 维,B 再升回原维度,乘积表达的增量空间秩不超过 r,参数量约 2·d·r,只有全量微调的零头。

A∈Rr×d,B∈Rd×r,rank(BA)≤r\displaystyle A\in\mathbb{R}^{r\times d},\quad B\in\mathbb{R}^{d\times r},\quad \mathrm{rank}(BA)\le r

3. 缩放系数 α/r:控制调料包“浓度”,r 决定表达能力,α 决定加入多少增量。

ΔW=αr B A\displaystyle \Delta W=\frac{\alpha}{r}\,B\,A

4. 路由混合推理:推理时根据输入学一个轻量路由权重 π(x),把各适配器加权叠加,实现“按单取料”。

h=(W0+∑k=1Kπk(x) αkrk BkAk)x\displaystyle h=\left(W_0+\sum_{k=1}^{K}\pi_k(x)\,\frac{\alpha_k}{r_k}\,B_kA_k\right)x

老周终于实现了“一锅共用、一菜一味”:基座共享、调料独立、按单取料。最后,他得面对一个更根本的问题——中央厨房到底比独门小店强在哪?答案要看效果。

效果对比评估:中央厨房赢了没有

宴席散场,客人打分。老周不靠感觉下结论,而是把每道菜分别端到“独门小店”和“中央厨房”两组场景里对比——同样的食材、同样多的功夫,看哪边得分高。模型评估也是一样:不能只看多任务模型的绝对分数,必须和单任务基线比。

评估多任务微调的标准做法:在每个任务自己的测试集上,把多任务模型的分数与单任务基线分数比较,计算“相对提升”。提升为正叫正迁移,为负叫负迁移——负迁移意味着合起来练反而变差了。

Δk=Mkmulti−MksingleMksingle×100%\displaystyle \Delta_k=\frac{M_k^{\text{multi}}-M_k^{\text{single}}}{M_k^{\text{single}}}\times 100\%

1. 单任务基线 $M_k^{\text{single}}$:只用一个任务的数据、同样算力预算单独微调出来的模型在该任务上的分数。

Mksingle=Score(fθksingle)\displaystyle M_k^{\text{single}}=\mathrm{Score}\big(f_{\theta_k^{\text{single}}}\big)

2. 多任务分数 $M_k^{\text{multi}}$:中央厨房联合训练出的模型在该任务测试集上的分数。

Mkmulti=Score(fθmulti)\displaystyle M_k^{\text{multi}}=\mathrm{Score}\big(f_{\theta^{\text{multi}}}\big)

3. 平均提升:把所有任务相对提升取平均,判断整体是赚是亏。

Δˉ=1K∑k=1KΔk\displaystyle \bar{\Delta}=\frac{1}{K}\sum_{k=1}^{K}\Delta_k

4. 最差任务检查:再看提升最小的那个任务,防止为了平均分牺牲个别任务。

Δmin⁡=min⁡kΔk\displaystyle \Delta_{\min}=\min_{k}\Delta_k

经验规律:任务相关时,小样本任务受益最大——共享表示让它在“没见过的菜”上也能借力;任务八竿子打不着时,硬凑一桌反而互相拖累。老周的中央厨房,只有备料、顺序、分力、调料包都管好,才能端出比十家独门小店更好的一桌菜。

AI 应用场景

场景 1:银行智能客服的“一桌菜”

阶段:监督微调 SFT / 模型训练

解决的问题:传统做法是意图识别、槽位抽取、情感分析各训一个模型,部署三套服务、维护三份数据,共享的语义理解被白白浪费;多任务微调把 12 个子任务放进同一桌,用配比和冲突缓解让它们互相借力,就像中央厨房一次备十道菜。

具体案例:某银行把 12 个客服子任务合并成一次 SFT。新增的“信用卡挂失”意图只有 200 条样本,按自然配比几乎学不到;工程师把 α 调到 0.3 保护小任务,并对与旧意图冲突的新任务做梯度投影,最终小样本意图准确率比单任务微调高 18 个百分点。

场景 2:代码大模型的“补全 + 修复 + 解释”

阶段:训练数据组织 / 多任务联合训练

解决的问题:代码补全、缺陷修复、代码解释三个技能数据量悬殊(补全 500 万条、解释 30 万条),直接拼接会让模型只会补全;采用配比 + 动态困难度采样,让解释任务的抽取概率随其损失自动上调,解决“大户刷屏、小户挨饿”。

具体案例:某 AI 编程助手的迭代中,工程师为三个技能各挂一个 LoRA 适配器,用路由按用户指令类型切换。结果:解释任务的 BLEU 提升 12%,补全任务几乎不掉点,而整个模型只比原来多占 5% 显存——这正是“一锅底味、一菜一味”的工程实现。

场景 3:金融文档理解的“小样本救星”

阶段:模型微调与对齐

解决的问题:金融文档里,文档分类有 10 万条标注,关键实体抽取只有 1000 条——小任务极容易被淹没。多任务配比 + LoRA 路由让共享的文本表示帮小任务“借力”。

具体案例:某资管团队在研报理解模型上做多任务微调,把实体抽取的采样权重静态抬到 0.2,并为它挂独立 LoRA 适配器;实体抽取的 F1 比单任务微调高 9 个点,分类任务仅下降 0.3 个点(在噪声范围内),算是相当划算的一桌菜。

Python 演示

python44 行
import numpy as np np.random.seed(7)D = 4# 任务1与任务2在前两维方向一致, 后两维方向相反, 制造梯度冲突w1 = np.array([2.0, -1.0, 1.0, -0.8])w2 = np.array([1.8, -1.2, -1.0, 0.8])w3 = np.array([0.5, 0.6, 0.7, 0.9])sizes = [2000, 1500, 120]   # 任务3是小样本任务 def make_data(w, n):    X = np.random.randn(n, D)    return X, X @ w data = [make_data(w1, sizes[0]), make_data(w2, sizes[1]), make_data(w3, sizes[2])] def loss(w, X, y):    return float(np.mean((X @ w - y) ** 2)) def grad(w, X, y):    return 2 * X.T @ (X @ w - y) / len(X) # 1) 检测冲突: 在初始参数处比较任务1与任务2的梯度方向w0 = np.zeros(D)g1, g2 = grad(w0, *data[0]), grad(w0, *data[1])cos12 = float(g1 @ g2 / (np.linalg.norm(g1) * np.linalg.norm(g2) + 1e-8))print("任务1与任务2的梯度余弦相似度:", round(cos12, 3)) # 2) 多任务训练: 每步按配比随机抽一个任务, 相当于采样策略def train(ratios, epochs=800, lr=0.05):    w = np.zeros(D)    for _ in range(epochs):        i = int(np.random.choice(3, p=ratios))        X, y = data[i]        w -= lr * grad(w, X, y)    return w natural = np.array(sizes, dtype=float) / sum(sizes)   # 小任务几乎不被抽到balanced = np.array([0.34, 0.32, 0.34])               # 均衡配比保护任务3 for name, ratios in [("自然配比", natural), ("均衡配比", balanced)]:    w = train(ratios)    m = [loss(w, *data[i]) for i in range(3)]    print(f"{name}: 任务1={m[0]:.3f} 任务2={m[1]:.3f} 任务3={m[2]:.3f}")
目的:用 3 个合成线性任务演示两个核心知识——用梯度余弦相似度检测任务冲突,以及配比/采样策略对小样本任务的保护作用。
  1. g1, g2 = grad(w0, *data[0]), grad(w0, *data[1])在初始参数处分别计算两个任务的梯度,方向对比才有意义
  2. cos12 = float(g1 @ g2 / (np.linalg.norm(g1) * np.linalg.norm(g2) + 1e-8))余弦相似度公式的实现,结果接近 -1 说明冲突明显
  3. i = int(np.random.choice(3, p=ratios))每个训练步按配比随机抽一个任务,这就是采样策略
  4. w -= lr * grad(w, X, y)只更新一套共享参数 w,体现多任务共享模型
  5. natural = np.array(sizes, dtype=float) / sum(sizes)自然配比下任务 3 仅占约 3%,会被淹没
  6. balanced = np.array([0.34, 0.32, 0.34])人为抬升小任务配比,对应 α<1 的均分化思路
  7. print(f"{name}: ...")对比输出三个任务最终损失,看小任务是否被“救回来”

常见误区

误区总以为多任务微调就是把能加的任务全塞进去,10 个任务比 5 个任务一定强,反正共享知识嘛。

正解任务之间若方向相反(梯度余弦为负且无法投影化解),就会互拖后腿,出现“负迁移”——就像把糖醋排骨和麻辣香锅塞进同一口锅,两个都做不好。多任务的关键不是任务数量,而是任务相关性和冲突管理。无关任务宁可拆出去用 LoRA 单独挂。

为何常见:因为“共享知识”听起来只有好处没有坏处,初学者容易忽略共享是有条件的:方向一致才叫共享,方向相反就是干扰。

误区以为把多个任务的数据集直接 concat 成一个文件,丢给模型训练就是多任务微调。

正解直接拼接的采样频率由数据量决定,大任务刷屏、小任务饿死——这正是配比和采样策略要解决的问题。好比备菜只按仓库食材量决定,松露豆腐永远轮不上灶台。正确的做法是显式设计采样权重,并动态按困难度调整。

为何常见:单任务微调时代“数据全丢进去”的习惯深入人心,很难意识到任务之间还有“话语权”分配问题。

误区检测到梯度冲突后,第一反应就是把某个任务的 λ 调小,认为权重是唯一旋钮。

正解调权重只是“让一方让路”,本质冲突还在;梯度投影(PCGrad)把相反分量直接卸掉、任务分组把无关任务分开、分阶段训练让每道菜错峰上灶,都比单纯调 λ 更精细。就像抢锅时不只是让一道菜“少做点”,而是把翻炒方向错开。

为何常见:因为大多数人接触的第一个多任务公式就是加权损失和,自然以为只有权重可调。

误区以为挂 N 个 LoRA 适配器等于微调了 N 个模型,只是“省一点点”而已。

正解LoRA 只新增约 2·d·r 个可训练参数(通常是整体参数的 0.1%~1%),基座共享、旁路独立,路由只是按输入选“调料包”,不是复制整套厨房。部署时还能把多个适配器动态加载、按需切换,这正是它适合多任务的原因。

为何常见:习惯了“一个任务一个完整模型”的单任务思维,低估了低秩旁路 + 路由组合的工程价值。

面试题

Q1. 多任务微调的核心思想是什么?

单选题 · easy

  • A.每个任务单独训练一个模型
  • B.多任务联合训练共享知识← 正确答案
  • C.只用单个任务数据微调
  • D.推理时随机选择模型

答案:B。多任务微调让一个模型同时学习多个任务,通过共享参数和表示互相借力,就像中央厨房共用刀工和高汤。A 是单任务微调,C 只学一个任务,D 是随机路由的无意义做法。

Q2. 多任务微调中“负迁移”指的是什么?

单选题 · easy

  • A.梯度消失导致模型不学习
  • B.无关任务互相干扰效果退化← 正确答案
  • C.学习率过大导致损失发散
  • D.数据增强过度导致过拟合

答案:B。负迁移指相关度低的任务混在一起训练,梯度方向相反互相抵消,使某些任务效果比单任务还差,相当于把麻辣香锅和糖醋排骨放一口锅。A、C、D 分别是梯度消失、学习率过大、过拟合问题,与多任务特性无关。

Q3. 关于多任务数据配比,以下说法正确的是?

单选题 · mid

  • A.配比必须与各任务数据量完全一致
  • B.小数据任务应提高配比给予补偿← 正确答案
  • C.所有任务配比必须完全相同
  • D.配比设一次后训练中无需调整

答案:B。配比不是“按数据量照抄”,小样本任务容易被淹没,应人为抬升(α<1)或用动态困难度采样补偿。A、C 把配比固化成单一规则,D 忽略了动态调整的可能性。

Q4. 梯度余弦相似度主要用来检测什么?

单选题 · mid

  • A.模型参数量的大小差异
  • B.两个任务梯度的冲突程度← 正确答案
  • C.各任务数据规模的差异
  • D.模型推理速度的快慢

答案:B。余弦相似度把两个梯度向量归一化后衡量方向夹角:接近 1 同向互利,接近 -1 方向相反即任务冲突。它不关心参数量、数据规模或推理时延。

Q5. PCGrad 的核心操作是什么?

单选题 · hard

  • A.把冲突梯度投影到正交方向← 正确答案
  • B.把冲突梯度直接置为零
  • C.把两个任务的梯度简单相加
  • D.用随机梯度替代原梯度

答案:A。PCGrad 把 g_i 中与 g_j 共线且相反的分量剔除,只保留正交分量,类似把“拉扯力”分解掉。直接置零会丢失学习信息,简单相加正是冲突的来源,随机替代会破坏训练。

Q6. 某任务权重 λ 很大且损失居高不下,最可能的结果是?

单选题 · mid

  • A.宣告训练完成不再更新
  • B.主导梯度方向挤压其他任务← 正确答案
  • C.其他任务自动获得更高权重
  • D.模型立即进入欠拟合状态

答案:B。权重高且损失大,意味着该任务梯度在总梯度中占比很大,参数更新主要迁就它,其他任务被“挤出台面”——正是加权损失公式的直观推论。其他选项都没有依据。

Q7. LoRA 的秩 r 越小,意味着什么?

单选题 · hard

  • A.低秩增量参数量越多
  • B.增量表达空间越小← 正确答案
  • C.基础模型质量要求越高
  • D.路由系统的速度越快

答案:B。r 是旁路矩阵 A、B 的中间维度,r 越小,B·A 的低秩约束越强,表达能力越小(参数量约 2·d·r 也变小)。它不直接影响基座质量和路由速度。

Q8. 以下哪些手段可以用于检测任务冲突?

多选题 · mid

  • A.计算任务间梯度余弦相似度← 正确答案
  • B.观察各任务损失的变化趋势← 正确答案
  • C.检测梯度投影后的残留方向← 正确答案
  • D.统计模型的推理时延高低

答案:ABC。冲突检测围绕“梯度方向”展开:余弦相似度、损失趋势(损失反升常是冲突信号)、投影后残留方向都能揭示任务间干扰。推理时延是工程指标,与训练冲突无关。

Q9. 缓解多任务冲突的有效策略包括?

多选题 · hard

  • A.用梯度投影去除冲突分量← 正确答案
  • B.将无关任务划分到不同分组← 正确答案
  • C.分阶段依次训练不同任务← 正确答案
  • D.无条件调大学习率加速收敛

答案:ABC。PCGrad 投影、任务分组、分阶段训练都是从“方向/时间/空间”上错开冲突。调大学习率只会放大冲突梯度的破坏力,与缓解方向相反。

Q10. 与单任务微调相比,多任务微调的典型优势是?

单选题 · easy

  • A.推理速度必然大幅提升
  • B.参数规模必定显著减少
  • C.相关任务间共享知识提升← 正确答案
  • D.训练迭代步数必定更少

答案:C。多任务的核心价值是相关任务共享表示,尤其让小样本任务借力。推理速度、参数规模、训练步数都不保证必然更优,只取决于任务选择与工程实现。