想象你是“全能 AI 科技公司”的 CEO,旗下有三个业务部门:语音助手部、人脸识别部、智能推荐部。它们共用一支技术中台团队——这相当于多任务模型最底层的共享网络。然而每个季度做综合绩效评估时,你遇到了一个棘手难题:语音助手的 KPI 数字小得可怜(识别错误率零点几),推荐部的 KPI 动辄上百。三个部门的指标直接相加,推荐部永远主导得分,语音助手部怎么努力都被淹没。这就是多任务学习里最经典的“损失权重”困境:一个模型同时学多个任务,怎么给每个任务定权重,才能让它们都被公平且充分地训练? 本文介绍两种主流解法。第一种叫“不确定性加权”——像 HR 根据部门业务固有波动性调整 KPI 门槛:本身波动大的业务,不该用僵化的高权重去苛求。第二种叫“GradNorm“——像 CEO 每季度给各部门做”成长速度体检”:谁进步慢,下季度就把资源倾斜给谁,让各部门的账面改善幅度基本同步。读完你会明白,多任务学习的失衡不是玄学,而是一套可以量化、可以自动化的资源调度艺术。

岗位关联

对 AI 从业者:多任务学习是工业界主流范式,损失权重决定一个模型能否同时做稳多个目标。掌握 GradNorm 与不确定性加权,是从“会调单任务 Loss”进阶到“会设计多任务训练系统”的关键一步。

目录
  1. 可视化演示
  2. 问题缘起:为什么权重会失衡
  3. 不确定性加权:按业务固有波动分配
  4. GradNorm机制:季度动态体检与资源重分配
  5. 梯度竞争协调:共享层上的话语权之争
  6. 实现流程:从公式到工程的完整步骤
  7. 评估指标:如何判断调整好不好
  8. 前沿展望:从多任务到多模态与通用智能
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

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

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

问题缘起:为什么权重会失衡

三个部门的 KPI 量纲完全不同:语音助手部看“识别错误率”,数字小得可怜;人脸识别部看“准确率”,介于 0 和 1 之间;智能推荐部看“转化率”,又是另一个数量级。如果 CEO 直接把三个原始数字相加作为综合绩效,错误率这项几乎不会影响总分——它在数学上被“吃掉”了。这正是多任务学习失衡的起点:损失的数值大,不代表任务重要,只是它的“计量单位”恰好更大。

多任务学习把每个任务各自的损失求和,得到总损失,目标就是让总损失最小化。但不同任务的损失天然处于不同尺度,这导致在梯度下降中,损失数值大的任务会贡献更大的梯度,从而主导共享网络的更新方向。这不是某个任务的“性格问题”,而是多任务结构里的系统性问题。

用 T 表示任务数量,第 i 个任务的损失记为 L_i,权重 w_i 表示它在总损失中的占比。总损失是所有任务加权损失的和。权重怎么定?早期做法是手动网格搜索:不断试权重组合直到验证集满意。这就像 CEO 年初拍脑袋定完 KPI 权重后一整年不管,市场变化了也毫不调整。

所以,传统“拍脑袋”定下来的静态权重,相当于一份全年不动的 KPI 合同。行业季节变了、竞品出新品了,权重却纹丝不动,结果一定是嗓门大、基数高的部门独揽公司资源。要解决这个问题,我们需要“会自动调整”的权重机制——这就是接下来要介绍的不确定性加权与 GradNorm。

Ltotal=∑i=1TwiLi\displaystyle \mathcal{L}_{\text{total}} = \sum_{i=1}^{T} w_i \mathcal{L}_i
总损失相当于公司的综合绩效分,每个任务的损失乘上自己的权重后汇总成一个数字。权重就是分配话语权的“投资比例”。
  1. 总损失多任务模型要优化的综合目标,相当于公司的综合绩效分。
    Ltotal\mathcal{L}_{\text{total}}
  2. 任务损失第 i 个任务自己的损失,如分类交叉熵、回归均方误差。
    Li\mathcal{L}_i
  3. 任务权重第 i 个任务的权重系数,控制它在总损失里的发言权。
    wiw_i
  4. 加权求和把各个任务按权重合并成单一标量,反向传播时各自梯度按此比例合成。
    ∑i=1TwiLi\sum_{i=1}^{T} w_i \mathcal{L}_i

不确定性加权:按业务固有波动分配

有些部门的 KPI 天然波动大:销售部受大盘影响,每月销售额上下浮动 30% 是常态;质检部按标准流程检测,合格率波动极小。若给销售部定一个刚性指标,再努力也必然频繁偏离——因为波动来自业务本身,不是团队不努力。聪明的 CEO 会把“波动大的部门”的考核权重调低一些,让它们轻装上阵。

2018 年,Kendall 等人把这种直觉带进了多任务学习,提出不确定性加权(Uncertainty Weighting)。其核心假设是:每个任务的损失自带一个“同方差不确定性”σ²,它刻画了任务标签和度量本身固有的噪声水平。任务不确定性是模型的可学习参数,在训练中和网络权重一起被优化。

不确定性加权的总损失写成下面的形式:每个任务损失前乘上 1/(2σᵢ²),并加上 log σᵢ。当任务不确定性 σᵢ² 很大时,权重 1/(2σᵢ²) 自动变小,模型不会拼命去拟合那些不可预测的细节;log σᵢ 是正则项,防止 σᵢ 无限增大导致权重退化到零。

这就像 HR 部门为市场波动大的业务线量身定制弹性 KPI:让波动大的部门“轻装上阵”,让稳定部门“精益求精”。不确定性加权不需要人手动调权重,σ 是跟着网络一起梯度下降的可学习参数——模型在训练过程中自己摸索出每个任务的“脾气”。

Ltotal=∑i=1T(12σi2Li+log⁡σi)\displaystyle \mathcal{L}_{\text{total}} = \sum_{i=1}^{T} \left( \frac{1}{2\sigma_i^2} \mathcal{L}_i + \log \sigma_i \right)
不确定性大的任务,权重自动变小;不确定性小的任务,权重自动变大。模型自己从数据中学会“每项业务该被多大程度信任”。
  1. 同方差不确定性假设每个任务的噪声标准差是固定常数,不随输入变化。
    σi\sigma_i
  2. 不确定性权重σᵢ² 越大,权重越小,波动大的任务不被过度强求。
    12σi2\frac{1}{2\sigma_i^2}
  3. 对数正则项当 σ 趋向无穷时惩罚随之增长,避免权重退化成零。
    log⁡σi\log \sigma_i
  4. 加权求和对所有任务的不确定性加权损失做累加,得到总目标。
    ∑i=1T(⋯ )\sum_{i=1}^{T} \left( \cdots \right)

GradNorm机制:季度动态体检与资源重分配

如果说不确定性加权是“年初根据业务波动定 KPI”,GradNorm 则是“每个季度做一次全员体检”。体检项目只有一个:过去这段时间,哪个部门进步最慢?进步慢的部门,下季度获得更多资源倾斜;进步快的部门,适当减少资源。几个季度拉齐后,所有部门的“改善幅度”大致同步。

GradNorm(Chen et al., 2018)把“进步幅度”具体化为“共享层上的梯度范数”。它每隔固定步数,计算每个任务在共享网络参数 W 上的梯度范数 Gᵢ,并将这些梯度范数拉向一个“平均基准 × 相对训练速度的 α 次幂”的目标。α 是一个超参数,控制拉齐的力度——α 越大,任务被拉向平均线的力度越强。

具体地,Gᵢ(t) 是第 i 个任务在共享层 W 上的梯度二范数;平均梯度范数 Ḡ(t) 是所有任务的均值;相对训练速度 rᵢ(t) 由“当前损失相对初始损失的下降比例”计算得到。GradNorm 的目标是让每个任务的梯度范数向 Ḡ × rᵢ^α 收敛:

GradNorm 的神奇之处在于,它不直接操作损失数值,而是操作梯度——就像 CEO 不看部门的绝对利润,而是看“这个季度比上个季度进步了多少”,以此决定资源分配。这避免了不同部门初始规模不同带来的偏差,是真正的“按需分配”。

GW(i)(t)⟶GˉW(t)×[ri(t)]α\displaystyle G_W^{(i)}(t) \longrightarrow \bar{G}_W(t) \times \left[ r_i(t) \right]^{\alpha}
训练越慢的任务,rᵢ 越大,目标梯度范数越高,权重被自动调高去追赶;训练快的任务则让出资源。这就是“向慢任务倾斜”的数学表达。
  1. 任务梯度范数任务 i 在共享层 W 上加权损失的梯度二范数,衡量该任务“发力大小”。
    GW(i)(t)=∥∇W(wiLi)∥2G_W^{(i)}(t) = \left\| \nabla_W \left( w_i \mathcal{L}_i \right) \right\|_2
  2. 平均梯度范数所有任务梯度范数的均值,作为“全员平均进步水平”的基准。
    GˉW(t)=1T∑i=1TGW(i)(t)\bar{G}_W(t) = \frac{1}{T} \sum_{i=1}^{T} G_W^{(i)}(t)
  3. 相对训练速度任务损失相对自身初始值的下降比例再归一化,rᵢ>1 表示该任务比平均慢。
    ri(t)=Li(t)/Li(0)Etask[Li(t)/Li(0)]r_i(t) = \frac{\mathcal{L}_i(t)/\mathcal{L}_i(0)}{\mathbb{E}_{\mathrm{task}}\left[\mathcal{L}_i(t)/\mathcal{L}_i(0)\right]}
  4. 对齐目标梯度范数向“平均基准 × 相对速度的 α 次幂”收敛,α 控制回拉强度。
    GˉW(t)×[ri(t)]α\bar{G}_W(t) \times \left[ r_i(t) \right]^{\alpha}

梯度竞争协调:共享层上的话语权之争

公司共享技术中台的排期有限。销售部提的需求总是最急、改动量最大,中台就总是优先满足销售部,人脸识别部的小需求排到下个月。时间一长,中台的能力越来越偏科,人脸识别业务几乎得不到中台的滋养。这就是多任务学习中的“梯度竞争”:各个任务都在争夺共享层的更新方向。

在多任务网络里,共享层参数 θ 是所有任务共享的“中台”。每个任务都会产生一个梯度方向 ∇Lᵢ,而共享层实际的更新方向是各任务梯度的加权和。如果某个任务的梯度范数长期占据主导,共享层就被它“私有化”,其他任务在共享表示上的收益会持续减弱——这就是梯度竞争失衡的根源。

总梯度由各任务梯度的加权和决定。权重是各任务的“兵力人数”,梯度方向是“进攻方向”。当某个任务的权重过大,总梯度方向就会偏向它。GradNorm 所做的协调,本质上是把兵力人数调到相近水平,让各路方向都能在总方向中发声。需要说明的是,方向冲突(比如两个任务梯度的夹角大于 90 度)单靠 GradNorm 无法彻底解决,但尺度平衡是方向公平的前提。

就像 CEO 给中台定规矩:“任何部门的需求改动量,不得长期超出其他部门的平均水平太多。”这条规矩不是要消灭部门差异,而是要保证每个部门都能在共享平台上发出自己的声音。GradNorm 调控的正是这条“声音大小”的红线。

∇θLtotal=∑i=1Twi∇θLi\displaystyle \nabla_{\theta} \mathcal{L}_{\text{total}} = \sum_{i=1}^{T} w_i \nabla_{\theta} \mathcal{L}_i
共享层参数的实际更新方向,是各任务梯度方向的加权合成。谁的权重高,谁的“声音”就大。
  1. 共享层参数各任务共用的底层表示参数,是实现迁移学习的核心。
    θ\theta
  2. 总梯度方向共享层参数实际沿此方向更新,决定所有任务共享表示的演化。
    ∇θLtotal\nabla_{\theta} \mathcal{L}_{\text{total}}
  3. 任务加权梯度每个任务都试图按自己的方向修改共享层,贡献大小为 wᵢ × 梯度。
    wi∇θLiw_i \nabla_{\theta} \mathcal{L}_i
  4. 向量求和总方向是多个任务“拉力”的合成,权重失衡时大权重任务主导方向。
    ∑i=1Twi∇θLi\sum_{i=1}^{T} w_i \nabla_{\theta} \mathcal{L}_i

实现流程:从公式到工程的完整步骤

GradNorm 落地不是一次性改革,而是一套季度循环:季度初各部门权重均为 1;每个季度末做体检,重新分配预算;重新分配后各权重之和保持不变,整体预算不因分配产生膨胀或萎缩。理解了这个循环,工程实现就水到渠成了。

工程上,GradNorm 的操作对象是共享层参数 W 与任务权重 wᵢ。共享层通常是网络的前几层,任务头则是各家业务线专属的后置层。实现时只需在常规训练循环中插入一个周期性函数调用。

具体步骤:先把所有 wᵢ 初始化为 1;每个前向过程照常计算各任务损失;每隔 T_grad 步,用自动求导计算各任务在共享层上的梯度范数;计算平均梯度范数和相对训练速度;对权重做一步梯度下降,使其梯度范数向目标对齐;最后做权重重新归一化——把所有权重的和重新缩放为任务数 T:

这个“预算平衡”步骤看似简单,却是 GradNorm 能稳定训练的关键。它保证权重调整只改变任务间的相对关系,不改变全局优化步长的总体大小——就像公司内部重新分配预算,但总预算不增不减。

wi(t+1)⟵wi(t)×T∑j=1Twj(t)\displaystyle w_i(t+1) \longleftarrow w_i(t) \times \frac{T}{\sum_{j=1}^{T} w_j(t)}
权重重新归一化相当于“总预算平衡”:不管内部怎么调剂,预算总和始终等于部门数,全局学习率因此不会漂移。
  1. 当前权重任务 i 在本轮更新前的权重。
    wi(t)w_i(t)
  2. 归一化系数把所有权重之和重新拉回任务数 T 的缩放因子。
    T∑j=1Twj(t)\frac{T}{\sum_{j=1}^{T} w_j(t)}
  3. 更新后权重缩放后权重和恒为 T,避免权重整体变大或变小影响学习率。
    wi(t+1)w_i(t+1)
  4. 完整更新规则先按 GradNorm 梯度调整权重比例,再统一缩放回到预算约束内。
    wi(t)×T∑jwj(t)w_i(t) \times \frac{T}{\sum_{j} w_j(t)}

评估指标:如何判断调整好不好

公司年度股东大会要评估调权方案好不好,不能只看总利润,还要看每个部门相对“独立运营时”是否有增长——这才是共享资源的价值证明。如果某个部门比单干时还差很多,说明共享不仅没有带来知识增益,反而因为失衡产生了负迁移。

多任务模型的效果评估也需要对比“单任务模型”基线。理想情况下,每个任务在多任务模型里都应接近甚至超过单任务水平。若某个任务在多任务模型里显著退化,说明共享表示被其他任务挤占了。对此,业界常使用 Δ 指标来衡量多任务学习的整体净增益。

Δ 指标的做法是:对每个任务,计算多任务模型表现相对单任务模型表现的相对变化率,然后对所有任务取平均。正值表示大多数任务获得了正向迁移;负值表示共享带来了净损失。除了 Δ 指标,还需要考察各任务的收敛速度——好的权重方法应该让所有任务同步收敛,以及权重在训练中的稳定性(鲁棒性)。

好的多任务权重方法,应当像一份合格的董事会报告:既能看到整体利润上升,也能看到每个部门都因共享中台而变得更强,而不是“一个部门吃撑、其余部门饿倒”。评估权重方法,核心就是看这份“共享收益账本”是否每个部门都为正。

Δ=1T∑i=1Tai−aˉiaˉi\displaystyle \Delta = \frac{1}{T} \sum_{i=1}^{T} \frac{a_{i} - \bar{a}_{i}}{\bar{a}_{i}}
Δ 指标像是“多任务共享收益体检表”:逐任务对比多任务模型和单任务模型,平均后的正负值反映资源共享到底赚了还是亏了。
  1. 多任务指标值任务 i 在多任务模型上的性能指标。
    aia_{i}
  2. 单任务基准值同一任务在单任务模型上的性能指标。
    aˉi\bar{a}_{i}
  3. 相对变化率多任务相对单任务的涨跌百分比;指标越小越好时需取反向。
    ai−aˉiaˉi\frac{a_{i} - \bar{a}_{i}}{\bar{a}_{i}}
  4. 逐任务平均综合所有任务的相对增益,得到多任务学习的整体净效应。
    1T∑i=1T(⋯ )\frac{1}{T} \sum_{i=1}^{T} \left( \cdots \right)

前沿展望:从多任务到多模态与通用智能

当公司从 3 条业务线扩张到 30 条、300 条,靠 HR 手工做季度体检就太累了。未来趋势是让调权自动化,让每个业务部门的声音按自身状态自动加权。多任务学习正沿着这条路,从几个任务走向多模态大模型中成百上千个子任务。

研究前沿上,损失权重正从“手工 / 半自动”走向“全自动化”。一种常见做法是 softmax 式动态权重——把每个任务的信号映射成一个和为 1 的分布,权重自然满足归一化约束。此外,元学习可以学习“权重更新的规则”,让模型自己发现最优的调权策略;不确定性建模也在与更大的模型结合。

softmax 形式的动态权重可以写成下面的形式:αᵢ(t) 是任务 i 在时刻 t 的权重,sᵢ(t) 是任务信号强度(例如损失或负不确定性)。信号越强的任务,权重会被指数压缩;所有任务的权重自动形成和为 1 的概率分布。

从一个 CEO 的三部门 KPI 困境,到通用人工智能动辄上百个子任务的自动平衡,核心依然是那个朴素的道理:让每个任务被公平看见、按需取资源。多任务损失权重,就是这套“公司治理智慧”在神经网络中的投影——它离“通用智能”的距离,恰好等于我们距离“自动而优雅地平衡所有目标”的距离。

αi(t)=exp⁡(−si(t))∑j=1Texp⁡(−sj(t))\displaystyle \alpha_i(t) = \frac{\exp(-s_i(t))}{\sum_{j=1}^{T} \exp(-s_j(t))}
这是一个自动归一化的权重分配器:每个任务的权重在 0 到 1 之间,且所有任务权重之和恰好为 1,无需手动重缩放。
  1. 任务信号强度sᵢ(t) 可理解为当前任务损失或负不确定性,数值越大代表该任务越“需要被弱化”。
    si(t)s_i(t)
  2. 指数映射exp 将信号强度映射为正值,负号让强信号获得小权重。
    exp⁡(−si(t))\exp(-s_i(t))
  3. 分母归一化对所有任务的指数值求和,使权重形成和为 1 的分布。
    ∑j=1Texp⁡(−sj(t))\sum_{j=1}^{T} \exp(-s_j(t))
  4. Softmax 权重自动满足归一化约束的动态权重,无需额外重缩放步骤。
    αi(t)\alpha_i(t)

AI 应用场景

自动驾驶多任务感知模型

阶段:模型训练与调优

解决的问题:自动驾驶感知模型需同时完成目标检测、车道线分割、深度估计。传统做法是三个独立模型或手动设定固定损失权重,导致检测任务梯度范数远大于分割任务,分割质量长期不佳。用 GradNorm 动态调权后,各任务在共享骨干网络上公平竞争,分割与深度估计精度显著回升。

具体案例:某自动驾驶团队的感知模型使用 ResNet 骨干加三个任务头。训练发现检测 Loss 主导,语义分割 mIoU 比单任务模型低 12 个点。引入 GradNorm 后,分割 mIoU 回升 9 个点,检测精度仅损失 1 个点,综合指标明显提升。

推荐系统多目标不确定性加权

阶段:多目标模型训练

解决的问题:推荐系统同时优化点击率、转化率、停留时长,三者噪声水平差异大。点击率预测相对稳定,转化率受用户决策随机性影响剧烈(不确定性高)。固定权重会让模型强行拟合噪声高的转化率,导致 CTR 下降。不确定性加权自动给高噪声目标较小权重,让模型把容量留给稳定目标。

具体案例:某短视频平台用不确定性加权训练多目标精排模型,在线 A/B 实验中人均时长提升 3.1%,转化率保持稳定,模型训练收敛速度也明显加快。

多模态大模型的对齐训练

阶段:多模态预训练与对齐

解决的问题:文生图模型需同时优化文本对齐、图像质量、美学评分等多个目标,任务数量从个位数增长到上百个。手动权重无法扩展,softmax 式动态权重与不确定性加权结合,让模型自动平衡各模态任务,减少灾难性遗忘。

具体案例:某大模型团队在图文多模态微调阶段,用不确定性加权处理标题生成、图像描述、视觉问答三个目标。相比均匀权重,灾难性遗忘减少 23%,多任务平均分提升 6.8%。

Python 演示

python65 行
import torchimport torch.nn as nn torch.manual_seed(0) N, D = 128, 8X = torch.randn(N, D)Y1 = (X.sum(dim=1) > 0).long()Y2 = ((X[:, 0] * X[:, 1]) > 0).long()  class Net(nn.Module):    def __init__(self):        super().__init__()        self.shared = nn.Sequential(nn.Linear(D, 16), nn.ReLU())        self.head1 = nn.Linear(16, 2)        self.head2 = nn.Linear(16, 2)     def forward(self, x):        h = self.shared(x)        return self.head1(h), self.head2(h)  net = Net()loss_fn = nn.CrossEntropyLoss()opt = torch.optim.Adam(net.parameters(), lr=0.01) w = torch.ones(2)alpha = 0.6lr_w = 0.01init_l = [0.0, 0.0]  def grad_norm_step(ws, alpha, shared_params, losses, init_l):    gs = []    for i in range(2):        g = torch.autograd.grad(ws[i] * losses[i], shared_params, retain_graph=True)        g_vec = torch.cat([gi.reshape(-1) for gi in g])        gs.append(g_vec.norm())    G = torch.stack(gs)    gbar = G.mean()    raw = torch.tensor([losses[i].item() / init_l[i] for i in range(2)])    r = raw / raw.mean()    target = gbar * (r ** alpha)    with torch.no_grad():        new_w = ws - lr_w * (G - target)        new_w = new_w * (2.0 / new_w.sum())        ws.copy_(new_w)    return G.detach()  for step in range(200):    logits1, logits2 = net(X)    loss1 = loss_fn(logits1, Y1)    loss2 = loss_fn(logits2, Y2)    if step == 0:        init_l = [loss1.item(), loss2.item()]    if step % 20 == 0:        G = grad_norm_step(w, alpha, list(net.shared.parameters()), [loss1, loss2], init_l)        print(f"step {step:3d} | w1={w[0].item():.3f} w2={w[1].item():.3f} | "              f"G1={G[0].item():.3f} G2={G[1].item():.3f}")    total_loss = w[0] * loss1 + w[1] * loss2    opt.zero_grad()    total_loss.backward()    opt.step()
目的:用 PyTorch 实现一个简化版 GradNorm,两个任务共享同一个底层网络,每 20 步动态调整任务权重并打印梯度范数。
  1. g = torch.autograd.grad(ws[i] * losses[i], shared_params, retain_graph=True)单独求任务 i 在共享层上的梯度,不污染总损失的后续反向传播。
  2. g_vec = torch.cat([gi.reshape(-1) for gi in g])把共享层所有参数的梯度拼接成一维向量,方便计算统一范数。
  3. gs.append(g_vec.norm())计算该任务梯度向量的 L2 范数,代表任务当前的“发力大小”。
  4. raw = torch.tensor([losses[i].item() / init_l[i] for i in range(2)])各任务相对初始损失的剩余比例,衡量“还有多少没降下来”。
  5. r = raw / raw.mean()相对训练速度:比值大于 1 说明该任务比平均任务学得慢,需要倾斜资源。
  6. target = gbar * (r ** alpha)慢任务的目标梯度范数被放大,快任务被缩小,形成差异化目标。
  7. new_w = ws - lr_w * (G - target)把当前梯度范数与目标之间的差距折算成权重的步进更新。
  8. new_w = new_w * (2.0 / new_w.sum())权重重新归一化,让权重和恒等于任务数 2,稳定全局学习率。

常见误区

误区我刚做多任务学习时,以为 wᵢ 就是任务的“重要性”,把核心任务权重设为 10,辅助任务设为 0.1,结果核心任务过拟合,辅助任务完全不学。

正解在总损失公式中,权重的主要角色是“尺度对齐”。不同任务损失量纲不同、梯度范数差异巨大,权重是在数据分布间平衡贡献的工具,而非重要性声明。设得过大,该任务会主导共享层更新,反而损害它自己的泛化能力——因为共享表示被它拽向单一方向。就像给销售部 90% 的奖金权重,销售部短期好看,但中台全偏科,长期公司整体崩坏。

为何常见:单任务思维惯性让大家觉得“损失大就要大力优化”,忽略了多任务里任务是共生关系,不是独立项目。

误区以为 GradNorm 会把各任务梯度范数拉成完全相等的常数,像一根水平线。

正解GradNorm 的目标不是相等,而是向“平均梯度范数 × 相对训练速度的 α 次幂”对齐。训练慢的任务 rᵢ>1,目标梯度范数更高,获得更大权重以追赶;训练快的任务目标更低,让出资源。目标是随训练动态漂移的“动态平衡”,不是死板的相等。

为何常见:“平衡”这个词很容易被直观理解成“平均”,忘了公式中还有相对速度这个调节因子。

误区看到公式里的 σ 就以为要手动搜索设置,像调学习率一样逐个试。

正解σ 是同方差不确定性的可学习参数,与网络权重一起通过梯度下降优化。模型自己从数据噪声中学习每个任务的固有波动程度,训练完成后 σ 自动收敛到合适值。我们只需要决定初始值,不需要在每个数据集上手动网格搜索。

为何常见:公式里的希腊字母经常被默认当成手调超参数,“可学习参数”与“超参数”的边界需要经验才能分清。

误区以为“动态调权”就是每个迭代都要重新计算并更新权重。

正解GradNorm 每隔固定步数(如 100-1000 步)才更新一次权重。单次迭代的梯度范数噪声很大,每一步都调整会导致权重剧烈震荡、训练不稳定。周期越长,更新越平滑;周期太短,模型会把优化器的更新与权重更新的抖动耦合在一起。

为何常见:看到“动态”就联想到“实时”,忽略了工程上噪声平滑与稳定性的权衡。

误区以为只要 GradNorm 把梯度范数调平,任务间的相互干扰就消失了。

正解GradNorm 只解决梯度“大小”的不平衡,不解决方向冲突。当两个任务在共享层上的梯度夹角大于 90 度时,即使范数相同,它们的方向仍会相互抵消。方向冲突需要 PCGrad(投影)、GradVac(方向对齐)等方法单独处理。尺度平衡是必要不充分条件。

为何常见:多任务优化有两个维度——尺度(大小)与方向,初学者只关注一个维度时会误以为调平尺度就万事大吉。

面试题

Q1. 多任务学习总损失中,任务权重 wᵢ 的主要作用是什么?

单选题 · easy

  • A.决定任务损失量纲换算关系← 正确答案
  • B.决定模型推理时延高低
  • C.决定网络参数量大小
  • D.决定数据增强比例高低

答案:A。权重把不同量纲的任务损失换算到同一尺度并加权求和,类似公司把销售额和满意度折算成统一 KPI。权重不改变网络结构、推理速度或数据,只影响损失合并方式。

Q2. 静态损失权重的主要局限是什么?

单选题 · easy

  • A.权重过大让模型无法收敛
  • B.权重不能随训练动态变化← 正确答案
  • C.权重会让所有任务同时变差
  • D.权重会导致梯度消失爆炸

答案:B。静态权重是训练前定死的常数,而任务的损失尺度和训练速度在训练中不断变化。就像一张全年不变的 KPI 合同,市场变了也不调整,最终必然失衡。

Q3. 同方差不确定性衡量的核心是什么?

单选题 · easy

  • A.任务标签噪声的固有波动水平← 正确答案
  • B.不同任务梯度的余弦相似度
  • C.模型在验证集上的过拟合程度
  • D.训练样本总量的多少程度

答案:A。同方差不确定性假设每个任务有一个固定的噪声标准差,它刻画的是任务本身的波动水平,而非梯度方向或数据量。波动大的任务应获得更小权重。

Q4. 不确定性加权公式中 log σ 项的作用包括?

多选题 · mid

  • A.防止 σ 无限增大导致权重消失← 正确答案
  • B.作为正则项平衡不确定性学习← 正确答案
  • C.提高梯度下降的收敛速度
  • D.使权重总和保持恒定不变

答案:AB。log σ 是正则项,σ 增大时会受到惩罚,从而防止不确定性被过度放大、权重退化为零。它不直接加速收敛,也不负责权重归一化。

Q5. GradNorm 中 Gᵢ 表示什么?

单选题 · mid

  • A.任务 i 在共享层上的梯度范数← 正确答案
  • B.任务 i 的损失函数值
  • C.任务 i 的输出通道数量
  • D.任务 i 的样本数量多少

答案:A。Gᵢ 是任务 i 在共享层权重上的梯度二范数,代表该任务当前“发力大小”。GradNorm 正是通过对齐这个范数来调节资源分配。

Q6. GradNorm 的训练流程包含哪些关键步骤?

多选题 · mid

  • A.计算各任务共享层梯度范数← 正确答案
  • B.计算每个任务的相对训练速度← 正确答案
  • C.按目标拉齐梯度范数调整权重← 正确答案
  • D.每次迭代都无条件增大学习率

答案:ABC。GradNorm 流程为:计算梯度范数→计算相对训练速度→向目标对齐更新权重→重新归一化。它不修改学习率,更不会无条件增大学习率。

Q7. GradNorm 的 α 超参数控制什么?

单选题 · mid

  • A.任务被拉回平均训练速度的强度← 正确答案
  • B.共享层网络的宽度大小
  • C.损失函数的平滑程度高低
  • D.优化器的动量大小数值

答案:A。α 控制相对训练速度对目标梯度范数的影响强度。α 越大,慢任务被拉高、快任务被拉低的力度越强,任务间的梯度范数越趋近“按速度分层”。

Q8. 权重重新归一化 wᵢ ← T×wᵢ/Σwⱼ 的根本目的是什么?

单选题 · mid

  • A.保持权重和不变以稳定学习率← 正确答案
  • B.让所有任务权重完全均匀分布
  • C.最小化梯度方向上的冲突
  • D.等价于对权重做 L2 正则化

答案:A。归一化把所有权重之和拉回任务数 T,避免权重整体放大或缩小导致全局学习率漂移。它不追求均匀分布,不解决方向冲突,也不做正则化。

Q9. 缓解多任务梯度方向冲突的有效手段包括?

多选题 · hard

  • A.PCGrad 梯度投影策略← 正确答案
  • B.GradVac 方向对齐方法← 正确答案
  • C.大幅增大训练学习率
  • D.彻底关闭共享层梯度

答案:AB。PCGrad 把冲突任务的梯度投影到正交方向,GradVac 显式对齐任务梯度方向,都是缓解方向冲突的手段。增大学习率会放大震荡,关闭共享层梯度则直接切断迁移通路。

Q10. 设任务 A 的 L̃ₐ=0.2,任务 B 的 L̃_b=0.8,α=1,平均梯度范数为 2.1,任务 A 的 GradNorm 目标梯度范数是多少?

单选题 · extreme

  • A.0.42
  • B.0.84← 正确答案
  • C.2.10
  • D.3.36

答案:B。rₐ = 0.2 / [(0.2+0.8)/2] = 0.4。目标 = 平均梯度范数 × rₐ^α = 2.1 × 0.4 = 0.84。rₐ<1 表示任务 A 训练较快,目标被调低以让出资源。