跳到主要内容
Agentic RL

第3章:GRPO 失败模式与稳定性 —— 训练曲线背后的暗面

Entropy collapse / Advantage collapse / KL drift / Lazy Likelihood Displacement Death Spiral 详解,以及实战监控与避坑工具箱

GRPO Entropy Collapse LLD Death Spiral Reward Hacking 训练稳定性

GRPO 论文里训练曲线漂亮,实战中却经常崩——这是 2024-2025 RL 训练人最常踩的坑。本章把 GRPO 的”暗面”系统化讲透:Entropy Collapse / Advantage Collapse / KL Drift / Lazy Likelihood Displacement Death Spiral 四大失败模式,每种的成因、早期预警信号、修复手段,串起 5 篇 2025 关键论文(含 12 月最新的 LLD 论文)。读完你能看着 wandb 曲线提前 1000 step 判断”训练要崩”。这一章在大部分中文教程都缺位,是这套教程的灵魂之一。

📑 目录


1. 为什么 GRPO 容易崩

GRPO 的”省钱设计”——去掉 critic、用 group baseline、用 verifier——同时也带来三个根本性脆弱:

设计简化带来的脆弱
用 group 内 reward 算 advantagereward 方差太小 → advantage = 0 → 信号消失
没有 explicit value baseline长 trajectory 的 credit assignment 全靠 group 平均
Verifier reward 通常 sparse(只末尾)trajectory 中间 token 的梯度方向不明

加上 LLM 训练本身的特点——vocab 5 万维、长序列、likelihood 接近 0 ——很多看似稳定的训练会在第几百 step 突然崩。

🔥 核心论点:RL 训练曲线像股票 K 线:reward 涨不一定是真涨,可能是 likelihood 已经在悄悄崩,只是 reward 数值还没反应过来


2. Entropy Collapse(熵崩溃)

2.1 现象

Step       0    100   500   1000  2000  3000
Entropy:   3.5  3.2   2.5   1.2   0.3   0.05  ← 急剧下降
Reward:    0.2  0.4   0.6   0.7   0.7   0.7   ← 涨着涨着平了
Diversity: 高   高   中   低   极低  全一样   ← 输出趋同

Group 内 G 个采样几乎一模一样——advantage 全是 0,梯度信号消失,训练停滞。

2.2 原理

GRPO 的 group baseline 假设”组内多样性提供信号”。一旦 policy 太自信:

π(as)1,π(其他s)0\pi(a^* | s) \to 1, \quad \pi(\text{其他} | s) \to 0

采样 G 次都是 aa^*,reward 都一样,advantage = 0,梯度 = 0,policy 卡死。

2.3 成因

成因解释
过激进 KL 系数β 太小,policy 自由跑偏,迅速过自信
学习率太大单次更新跨太大步
Reward 太尖锐(0/1 二元)一旦学会 trick,group 内同分,信号消失
采样温度低softmax 输出本身已经尖锐

2.4 修复

方法解释
Entropy bonusloss 加 αH(π)-\alpha \cdot H(\pi) 项,鼓励多样性
Higher sampling temperaturerollout 用 T=1.0 甚至 1.2,推理时仍用 T=0
Adaptive KL coefficientKL 偏小自动加大 β
Clip-Higher(DAPO)不对称 clip,允许探索
ERPO(arXiv 2603.28204)token-level entropy regulation,不是全局

2.5 实战警告

训练曲线最早期、最可靠的预警:rollout entropy 持续单调下降,1000 step 内跌掉 50% 以上 → 几乎一定要崩。立刻减小学习率或加大 entropy bonus。


3. Advantage Collapse(优势崩溃)

3.1 现象

Group reward distribution:
  全 0 (没人答对)              → advantage 全 0 → 无梯度
  全 1 (全答对)                → advantage 全 0 → 无梯度
  全 0.5 (都答对一半)          → advantage 全 0 → 无梯度

GRPO advantage = (rμ)/σ(r - \mu) / \sigma,σ\sigma 接近 0 时 advantage 退化

3.2 多 reward 时的特殊形态

实际生产中常用 multi-reward(format + 答案 + cost):

group 内:
  trajectory 1: format=1, 答案=1, cost=0.8 → r = 2.8
  trajectory 2: format=1, 答案=1, cost=0.7 → r = 2.7
  trajectory 3: format=1, 答案=1, cost=0.9 → r = 2.9

format 和答案两个维度都饱和,只有 cost 维度有微弱信号——但被三维加和稀释,有效 advantage 极小。

3.3 修复

方法解释
Dynamic Sampling(DAPO)reward 全 0 或全 1 的 group 跳过(不参与 update)
Reward 归一化各维度独立归一化后再加权
Curriculum从简单题开始(group 内 reward 有差异)→ 逐步加难
Larger G(更多采样)8 → 32 → 64,提升 reward 多样性概率

3.4 监控

Effective Group Ratio = 1 - (全 0 group 数 + 全 1 group 数) / 总 group 数。健康训练 > 70%,< 50% 立即报警。


4. KL Drift(参考漂移)

4.1 现象

KL(πθπref\pi_\theta || \pi_{\text{ref}})持续单调上升,数值越来越大,policy 偏离 reference 太远 → reward 看起来还在涨,但模型可能已经 hack 了 verifier(下一节)。

4.2 健康范围

经验值:

KL 范围      状态
< 0.5        正常,模型小幅调整
0.5 - 5      偏移,可控
5 - 20       危险,可能 reward hacking
> 20         几乎确定崩了

4.3 修复

方法解释
Adaptive KL coefficientKL > target 自动加大 β
Periodic ref update每 N step 把 ref 更新为当前 policy(类似 PPO 的 trust region)
Hard KL capKL > threshold 直接停止训练或回滚
Reward / KL ratio 监控reward 涨了 0.1 但 KL 涨 5,说明在 hack

5. LLD Death Spiral(惰性似然位移死亡螺旋)⭐

Tool Integrated GRPO 的”癌症”:Lazy Likelihood Displacement —— arXiv 2512.04220, 2025-12 最新论文

5.1 现象

Search-R1 / ToolRL / VerlTool 这类 tool-integrated GRPO 训练经常出现:

Step       0    500   1000  1500  2000   2500
Reward:    0.2  0.5   0.65  0.7   0.6    [崩]
Likelihood: ─── 缓慢下降 ────────►   骤崩
Entropy:   ─── 缓慢上升 ────────►   骤升
Gradient:  ─── 缓慢上升 ────────►   膨胀爆炸

反直觉:reward 还在涨/平,但 likelihood 已经在悄悄崩——早期没有任何 reward 信号能预警!

5.2 LLD 的因果链

Tool 调用产生 long-tail token 分布(很多罕见 token)

GRPO 在这些罕见 token 上的更新 ratio 很大

likelihood 缓慢但持续下降(被 displaced)

likelihood 下降 → log_pi 接近 -∞ → ratio 不稳定

某个 step 触发临界 → entropy 暴涨、gradient 爆炸

"死亡螺旋":一旦开始,几个 step 内就崩

🔥 关键洞察:reward 是滞后指标,likelihood 才是领先指标。监控 reward 等于”看股价”,监控 likelihood 等于”看公司基本面”。

5.3 论文的修复方案

LLD 论文提出几个方法:

  1. LLD Detector:实时监测每条 trajectory 的 token-level likelihood,异常下降时触发警报
  2. Likelihood Regularization:loss 加一项 λE[logπθ(a)]-\lambda \cdot \mathbb{E}[\log \pi_\theta(a)],直接拉住 likelihood 不要塌
  3. Selective Update:likelihood 偏离过大的 token 跳过 update

5.4 实战指南

任何 tool-integrated GRPO(Search-R1 / ToolRL / Agent-R1 / VerlTool)训练都必须监控:

  • Token-level mean log_pi(每 100 step 记录平均值)
  • Token-level log_pi histogram(分布尾部是否变厚)
  • Trajectory-level mean log_pi(每条 trajectory 的整体 likelihood)

如果任意一项连续 500 step 单调下降超过 30%,立即:

  1. 减小学习率(× 0.5)
  2. 增大 KL coefficient(× 2)
  3. 切换到 LLD Regularization

🌟 这一节是 2025 RL 训练人必读——LLD 论文 2025-12 才出,大部分教程没覆盖。


6. Reward Hacking 在 Agentic RL 的新形态

6.1 经典 RLHF reward hacking

形态例子
Length hack答得越长 RM 越喜欢,模型疯狂加废话
Sycophancy永远迎合用户,即使错也说对
Safety dodge用 “as an AI…” 模板回避争议

6.2 Agentic RL / RLVR 时代的新形态

更隐蔽,因为 verifier 看似”客观”:

形态例子
Verifier exploit数学 verifier 只看末尾数字,模型先错算最后强行写正确答案
Tool spam调用 search 100 次提升”调用率”reward
Format gamingformat reward 加在 thought tag 上,模型把所有内容塞 thought 里
Cost hackcost penalty 用 token 数,模型用极简缩写规避
Context smuggling把答案藏在 tool query 里,让 tool 把答案”反弹”回来

6.3 UC Berkeley 2026-04 大事件

UC Berkeley RDI 中心用一个自动 agent 破解了 8 大 agent benchmark(SWE-bench / WebArena / OSWorld / GAIA / Terminal-Bench 等),全部被 reward hack。这件事直接改变了行业对 RLVR 安全性的认知:verifier 越简单越容易被 hack

6.4 防御

方法解释
Process reward(PRM)不只看末尾对错,中间步骤也评分
Multiple verifiers多个独立 verifier 投票
Adversarial verifier专门写一个 verifier 找 hack 模式
Human spot-check定期人工抽样 reward 高的 trajectory
KL hard cap防止 policy 偏离 sane 分布太远(模块化兜底)

详见第 4 章 RLVR 与 Reward 设计。


7. 早期预警信号:看哪些曲线

7.1 必盯监控仪表盘

指标健康范围危险信号
Rollout entropy缓慢下降单调跌 50% 以内 1000 step → 减学习率
Effective group ratio> 70%< 50% → 调 reward 设计 / curriculum
**KL(ππ_ref)**
Token-level mean log_pi缓慢轻微下降连续下降 30% → LLD 风险
Likelihood ratio max多在 [0.5, 2]突然 > 3 或 < 0.3 → 不稳定
Reward 中位数稳定上升上升后再下降(过拟合)
Gradient norm平稳突然飙升 5x+ → 训练要崩
Format reward 占比稳定飙升 → format gaming

7.2 wandb 配置示例

import wandb
import torch.nn.functional as F

def log_step_metrics(model, batch, advantages, ratios, ref_logp):
    with torch.no_grad():
        # Rollout entropy
        logits = model(batch.input_ids).logits
        probs = F.softmax(logits, dim=-1)
        entropy = -(probs * F.log_softmax(logits, dim=-1)).sum(dim=-1).mean()
        
        # KL(π || π_ref)
        cur_logp = F.log_softmax(logits, dim=-1)
        kl = F.kl_div(ref_logp, cur_logp, reduction='batchmean', log_target=True)
        
        # Token-level mean log_pi
        token_logp = cur_logp.gather(-1, batch.action_ids.unsqueeze(-1)).squeeze(-1)
        mean_logp = token_logp.mean()
        
        # Effective group ratio
        group_std = batch.rewards.view(batch.n_groups, -1).std(dim=-1)
        effective_groups = (group_std > 1e-3).float().mean()
        
        wandb.log({
            "entropy": entropy.item(),
            "kl_to_ref": kl.item(),
            "mean_log_pi": mean_logp.item(),
            "effective_group_ratio": effective_groups.item(),
            "advantage_mean": advantages.mean().item(),
            "ratio_max": ratios.max().item(),
            "ratio_min": ratios.min().item(),
            "grad_norm": torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0).item(),
        })

7.3 自动报警

def health_check(metrics, history):
    alerts = []
    
    # Entropy collapse
    if metrics["entropy"] < 0.1 * history["entropy_init"]:
        alerts.append("ENTROPY_COLLAPSE")
    
    # Advantage collapse
    if metrics["effective_group_ratio"] < 0.5:
        alerts.append("ADVANTAGE_COLLAPSE")
    
    # KL drift
    if metrics["kl_to_ref"] > 10:
        alerts.append("KL_DRIFT")
    
    # LLD risk
    recent_logp = history["mean_log_pi"][-500:]
    if recent_logp[0] - recent_logp[-1] > 0.3 * abs(recent_logp[0]):
        alerts.append("LLD_RISK")
    
    if alerts:
        wandb.alert(title="RL Training Issue", text=", ".join(alerts), level="WARNING")
    return alerts

8. 避坑工具箱

8.1 训练初期(< 500 step)

  • 学习率 1e-6 起步,千万别上 5e-6+
  • G(group size)从 8-16 开始,小 G 调通再加大
  • β(KL coef)0.01-0.05
  • Entropy bonus α = 0.001-0.01
  • Sample temperature = 1.0(rollout)
  • 启用 wandb 全套指标,设好 alert

8.2 训练中期(500-3000 step)

  • 每 100 step check entropy 趋势
  • 每 500 step check effective group ratio
  • 每 1000 step 抽样 trajectory 人工看 reward hacking
  • KL > 5 触发 adaptive 调整

8.3 出现问题时

症状第一反应
Entropy 暴跌LR × 0.5,加 entropy bonus
Effective group ratio < 50%加 G、curriculum easier、检查 reward 是否过 sparse
KL > 10立刻停止,update ref,重启
Reward 飙但答案怪检查 reward hacking,加 process reward
LLD 信号(log_pi 持续跌)加 likelihood regularization,LR × 0.3

8.4 推荐实战配方(GRPO baseline)

# verl-style YAML
algorithm: GRPO
group_size: 16
clip_low: 0.8
clip_high: 1.28        # DAPO Clip-Higher
learning_rate: 1e-6
kl_coef: 0.01
entropy_coef: 0.005
ref_update_steps: 5000  # 每 5K step 更新 ref
adaptive_kl: true
adaptive_kl_target: 1.0
overlong_penalty: true   # DAPO Overlong Reward Shaping
dynamic_sampling: true   # 跳过全 0 / 全 1 group
likelihood_reg: 0.001    # LLD 防御

✅ 自我检验清单

  • 三个根本脆弱:能解释 GRPO 简化设计带来哪三类脆弱
  • Entropy collapse:能描述现象、原理、4 种修复方法
  • Advantage collapse:能解释为什么 group 内 reward 方差太小会让 advantage 退化
  • KL drift 健康范围:能默写 KL < 0.5 / 5 / 20 三档对应的状态
  • LLD Death Spiral 因果链:能默写”long-tail token → ratio 大 → likelihood 跌 → 崩”
  • LLD 反直觉:能解释为什么 reward 是滞后指标,likelihood 才是领先指标
  • 新型 reward hacking:能列出 5 种 RLVR 时代的 reward hacking 形态
  • wandb 必盯指标:能默写至少 6 个核心监控指标和阈值
  • 报警逻辑:能写出自动检测 ENTROPY_COLLAPSE / LLD_RISK 的代码骨架
  • 修复优先级:出现 entropy 暴跌时,能立刻执行”LR × 0.5 + entropy bonus”

📚 参考资料

关键论文

训练框架的稳定性文档

  • NVIDIA NeMo-RL: GRPO walkthrough:文档
  • Generalized Ratio-Clipping Policy Optimization:Emergent Mind
  • RAGEN: Self-Evolution via Multi-Turn:paper

行业讨论