返回专辑
·Johan·4 分钟阅读

GradNorm 与 manual loss 权重

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

GradNorm 与 manual loss 权重

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 不可持续。

python
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 里。合并请求须附各任务验证表,任何单任务不达标默认否决。共享层改动后先用短程训练记录各任务梯度范数,再决定手工权重或自动平衡方案。

← 全部文章

johan's blog