给出基于 GradNorm 的动态加权公式,并解释如何初始化初始权重。
解读
在国内大模型落地场景中,多任务学习(MTL)是提升百亿/千亿参数模型业务效果的核心手段。面试官通过 GradNorm 问题,考察候选人是否具备“把数学公式变成线上收益”的能力:既要写出严谨的动态加权公式,又要说明初始权重对首轮微调收敛速度与任务稳定性的影响,最终落到 LLMOps 里“可监控、可回滚”的实战要求。
知识点
- GradNorm(Gradient Normalization)(Chen et al., 2018)通过平衡不同任务的梯度范数,自动调整损失权重,缓解任务梯度量级差异导致的“跷跷板”现象。
- 公式里出现的 W_i(t) 是第 i 个任务在 t 步的动态权重,G_i(t) 是任务 i 的梯度L2范数,Ḡ(t) 是全部任务梯度范数的平均值,r_i(t) 是相对训练速率,α 是恢复强度超参。
- 初始权重直接影响首轮反向传播的梯度分布,在国内 GPU 资源紧张、大模型实验成本高的背景下,零初始化或均等初始化可以显著降低调参轮次,减少千卡级 A100 预算浪费。
- LLMOps 视角:把 GradNorm 权重写入 TensorBoard/MLflow 的 scalar 指标,配合告警阈值,实现“权重漂移>15% 自动回滚”。
答案
-
动态加权公式
设共有 K 个任务,第 i 个任务在 t 步的损失为 L_i(t),则总损失
L_total(t) = Σ_{i=1}^K w_i(t) · L_i(t)
GradNorm 通过最小化下列目标更新权重 w_i(t):
GradNorm Loss = Σ_{i=1}^K |G_i(t) – Ḡ(t) · [r_i(t)]^α|₁
其中
G_i(t) = ‖ ∇{θ_shared} [w_i(t)·L_i(t)] ‖₂
Ḡ(t) = (1/K) Σ{j=1}^K G_j(t)
r_i(t) = [L_i(t)/L_i(0)] / [(1/K) Σ_{j=1}^K L_j(t)/L_j(0)]
权重更新采用一步梯度下降:
w_i(t+1) = w_i(t) – η · ∂GradNorm Loss/∂w_i(t)
之后做归一化:
w_i(t+1) = K · w_i(t+1) / Σ_{j=1}^K w_j(t+1)
保证 Σ w_i ≡ K,避免量级漂移。 -
初始权重初始化策略
线上百亿模型微调时,首轮实验统一设 w_i(0)=1.0(均等初始化),原因:
- 业务方通常先跑 1k step 小批量实验验证数据 pipeline,均等权重能最快暴露任务冲突;
- 若某任务数据量极少(如<5%),可warm-start 将其 w_i(0) 设为 0.5,其余保持 1.0,防止梯度被大任务淹没;
- 在 LLMOps 配置里把 w_i(0) 写进 YAML 版本化文件,与 checkpoint 一起入库,实现权重可追溯。
拓展思考
- 当 GradNorm 权重在 200 step 内单调偏离初始值 3 倍以上时,应触发自动降级策略:回退到上一轮 checkpoint,并临时冻结该任务的权重更新,避免灾难性遗忘主任务。
- 在千亿 MoE 结构中,共享参数量巨大,直接计算 G_i(t) 开销高,可采样 10% expert 通道估算梯度范数,把 GradNorm 计算耗时从 8 min 降到 40 s,满足国内夜间窗口 2 小时内完成一轮微调的 SLA。
- 结合国产芯片(如华为昇腾 910B)的混合精度特性,需把 GradNorm 的 L2 范数计算放到 FP32 master weights 上,避免下溢导致权重更新失效,这一条可写入**《国产算力大模型适配规范》**的 checklist。