GradNorm 与 manual loss 权重
检测+分割+深度多任务共享 backbone 时,某一 loss 量级大会主导梯度——uncertainty weighting 或 grad norm 平衡比 hand-tune 0.1/0.9 更可持续。

1. 某一 loss 主导,其他 task 学不动
检测加分割加深度估计共享 backbone,hand-tune loss = 1.0*seg + 0.5*depth + 0.1*det 训两周——det mAP 涨,depth 几乎不动。查 gradient norm:seg loss 梯度是 depth 的八倍。多任务不是简单加 loss,是梯度竞争;量级差一个数量级时 manual weight 是猜,不是工程。
2. Manual weight 的局限
, 是超参。不同 task loss 尺度、梯度范数、收敛速度都不同——det 用 CE+reg,depth 用 L1,尺度不可比。调 本质是手动平衡梯度,trial-and-error 不可持续。
loss = 1.0 * seg_loss + 0.5 * depth_loss + 0.1 * det_loss至少 log 每个 task 的 loss 和 backward 后该 task 对 shared layer 的 grad norm——谁主导一目了然。
3. Uncertainty weighting
Kendall 等学每个 task 的 homoscedastic uncertainty ,loss 变为 。 为可学习参数,大 loss task 自动降权。注意 项防 逃避所有 task。
4. GradNorm
GradNorm 直接平衡各 task 对 shared 层梯度的范数——让训练速度(loss 下降率)相近的 task 获得相近 grad norm。比 uncertainty weighting 多一层「目标 grad norm」设计,调参稍多,但对梯度主导问题更直接。
小 task 数据少时易过拟合——除 balance loss,还可 task-specific lr、freeze 部分 head、或 data resampling 平衡各 task 样本数。
5. 失败模式
某 task 梯度范数大十倍压其他 task → manual weight 不够,需自动 balance。数据量差太多 → 小 task 过拟合,大 task 欠拟合。只报 aggregate metric → 某 task silently fail。
6. 案例:深度分支被 silently 牺牲
某多任务模型总 loss 下降但深度估计指标不变——shared layer 梯度几乎全来自检测。加 GradNorm 后深度 RMSE 降百分之十五,检测 mAP 仅掉 0.2。per-task grad norm 日志是诊断关键。
7. 验收
- 各 task val metric 独立报,不只看 weighted sum。
- log per-task loss 与 shared layer grad norm。
- manual weight 有 ablation;自动 balance 有对比。
- 小 task 过拟合有监控(train/val gap per task)。
- 最终 checkpoint 各 task 均达标,无 single-task sacrifice。
8. 落地与衔接
多任务配置里为每个任务固定验证指标与损失权重初值,并记录共享层各任务梯度范数。自动平衡方案与手工权重基线同预算对比,发版门槛要求无任务被悄然牺牲。小任务数据少时单独监控训练验证差距,必要时冻结部分头或重采样。检查点选择按主任务与次任务打破平局规则文档化,避免口头看总损失。合并请求必须附各任务指标表,不能只有加权总和。
9. 案例复盘
某检测加深度多任务模型总损失降但深度均方根误差不动,梯度范数显示检测占共享层九成以上。加梯度范数平衡后深度改善百分之十五,检测平均精度仅掉零点二。复盘把各任务梯度范数图写进合并模板,手工零点一零点九权重不再默认上线。后续改骨干时先跑三 epoch 梯度诊断,再决定平衡策略,省掉两周盲目调参。该流程已成为多任务项目标准启动步骤。
10. 与训练监控的衔接
多任务训练日志应把各任务损失与共享骨干梯度范数绑在同一 step 轴上,方便与 dl-monitor-train 的切片告警联动。某一任务验证指标连续恶化时,先查该任务梯度是否被压制,再查数据采样是否失衡。发版前对照单任务基线:若多任务某分支不如单独训练,应评估是否减少共享深度或改为部分共享。
多任务训练是梯度分配问题。Manual weight 是起点;uncertainty weighting 或 GradNorm 让 balance 可学习。eval 必须 per-task,否则牺牲藏在 aggregate 里。合并请求须附各任务验证表,任何单任务不达标默认否决。共享层改动后先用短程训练记录各任务梯度范数,再决定手工权重或自动平衡方案。
相关
也可以看看
- ·16 分钟阅读
KV cache 分页与前缀复用:吞吐上去后正确性怎么验
沿 block table、前缀哈希与抢占回收拆开缓存一致性风险,说明错页复用为何表现为「偶发胡话」;用确定性前缀集、强制抢占和逐 token 对照验收。
- ·18 分钟阅读
混合精度下的梯度累积:loss 缩放、裁剪与 step 顺序
沿 autocast、GradScaler、unscale_、裁剪与 optimizer.step 的数据流说明静默错误;区分 micro-batch 平均与求和,并用等价性测试验收。
- ·9 分钟阅读
torch.compile 图断裂:先定位重编译,再谈模式选择
从 Dynamo guard、graph break 与动态形状入手,建立可复现的编译诊断和冷启动、稳态验收方法。
johan's blog