深度学习多个 loss 如何平衡

loss balance 的第一步是 scale baseline,不是网格搜索

多 loss 训练要先确认每个 loss 的数值量级,否则权重搜索没有意义。分类 CE 可能在 0 到 1 附近,回归 MSE 可能是几十甚至上百,直接相加会让数值大的任务主导共享参数更新。原帖给出的第一步是看各个单独 loss 收敛后的绝对数值,再用粗略固定系数把它们拉到同一量级。这个步骤不是为了找到最终最优权重,而是建立一个所有任务都能参与训练的 baseline。没有这个 baseline,后面的自适应权重或梯度方法都可能只是给错误尺度打补丁。

固定权重只能处理初始尺度,训练阶段变化要交给 uncertainty weighting

固定系数不能适应训练过程中的阶段变化。某个任务早期可能噪声大、梯度乱,后期才真正有用;另一个任务可能很快收敛,但继续给高权重会压制其他任务。同方差不确定性加权通过可学习的 sigma 自动调整每个任务的有效权重:高噪声任务会被暂时降权,log(sigma) 项又防止模型把某个任务无限压低。它解决的是“不同任务难度和噪声随训练变化”的问题,而不是单纯替代人工调参。

validation 指标此消彼长时,要从权重问题转向梯度冲突问题

如果任务之间出现跷跷板,例如分类指标提升但回归指标下降,继续调 a, b, c 往往只是在决定哪个任务暂时占上风。此时问题不再只是 loss 数值大小,而是共享层上的梯度方向可能互相冲突。GradNorm 适合处理不同任务梯度范数差异过大的情况,让各任务在共享层上的更新强度更均衡。PCGrad 适合处理梯度方向冲突,两个任务梯度点积小于 0 时,把互相抵消的分量投影掉。两者对应不同病因,不能简单混成“多 loss trick”。

做减法也是 balance 的一部分

不是每个辅助 loss 都值得被平衡。边缘 loss、感知 loss、额外分类头、对齐项等辅助目标,可能在结构图里显得完整,但真实训练中会抢共享表示或引入噪声。如果删掉某个辅助 loss 后主任务更稳、收敛更快、验证指标更好,说明它原本就是干扰项。多 loss balance 不是要让每一项都活下来,而是要让最终训练目标更干净。保留一个 loss 的理由应该是它确实改善主任务,而不是它看起来“更全面”。

如果一直靠 loss 权重救火,应该回到任务建模本身

大模型训练提供了另一种思路:很多任务可以通过统一目标或数据配比解决,而不是堆多个 loss。LLM 预训练把翻译、摘要、问答、代码统一成 next-token prediction;想增强代码能力,可以提高代码数据比例,而不是额外加一个 code loss。RLHF 中 DPO 也把 PPO 里的 policy loss、value loss、KL、entropy 等多项博弈,改写成更直接的偏好分类目标。多 loss 有时不是更高级,而是任务还没有被统一好。能用 data mixture、preference pair、constraint 或 verifier 表达的目标,不一定要塞进一个加权和。