返回 AICAP-180
B11 · Day 108GRPO/后训练机理 + 首跑

训练监控与诊断

B11 走到「全量首跑」这一步,是 B1→B18 能力曲线上「能训练 → 能诊断训练」的递进。昨天 Day 107 用 50 步冒烟确认管线不崩、拿到 step-0 起始 reward;今天 Day 108 把训练拉到 ≥300 步,第一次真正盯着曲线看模型有没有在学。明天 Day 109 才把训练产物(LoRA adapter)拉去严谨评测、Day 110 复盘固化。今天的核心是「训练健康三曲线

阶段: B11 · GRPO/后训练机理 + 首跑(Day 101-110) 标签: #GRPO #monitoring #KL-divergence #reward-curve

今日导引(由浅入深)

B11 走到「全量首跑」这一步,是 B1→B18 能力曲线上「能训练 → 能诊断训练」的递进。昨天 Day 107 用 50 步冒烟确认管线不崩、拿到 step-0 起始 reward;今天 Day 108 把训练拉到 ≥300 步,第一次真正盯着曲线看模型有没有在学。明天 Day 109 才把训练产物(LoRA adapter)拉去严谨评测、Day 110 复盘固化。今天的核心是「训练健康三曲线诊断法」——reward / KL / loss 一起看,单看任何一条都会被骗。最小可判定产出:一份 reward-vs-step 的原始数据 csv(GPU 侧),以及离线侧用本仓 summarizeLatency 同款分位汇总把训练指标分布讲清楚。

1. 机理精读

为什么需要诊断而不是只跑完看结果。 RL 后训练不像 SFT——SFT loss 几乎总会下降,跑完看一眼即可。GRPO 是在线优化一个会动的目标(采样 + grader + KL),中途任何一环失衡都可能让训练悄悄走偏(早平台、坍缩、空转),跑完才发现就浪费了整次 GPU 时间。所以「跑的过程中盯曲线、随时回调」是 GRPO 的必备纪律,而非可选项。

三曲线各管什么。

  • reward 应随 step 单调上升——这是「模型在变好」的直接信号。
  • KL(与参考策略的散度) 不应爆炸——KL 失控意味着策略偏离参考过远,往往伴随输出退化、即将崩盘。
  • loss 应与 reward 配合——loss 下降而 reward 上升才是健康,loss 抖而 reward 不动是另一种病。

三者要一起读:只看 reward 不看 KL,是 GRPO 首跑最常见的盲点。

reward 平台期的两种成因。 reward 上升后早早走平,常因:

  • grader 太松——verifier 一命中就给满分,模型很快学会「刚好命中」就不再进步(这正是 Day 106 提醒收紧 verifier、Day 112 reward-hacking 谱系要审计的)。处置:收紧 verifier,或叠加多条件 / 引入部分分。
  • G 太小——组内只有 2-4 个 rollout,组均值/std 估计方差高,advantage 噪声大,梯度方向不稳,学习慢。G 越大,组内 advantage 估计方差越低,曲线越平滑上升。处置:加大 G(算力允许时优先到 8-16)。
  • beta 太大——KL 缰绳太紧,策略动不了。处置:调小 beta 或改用 KL 调度。

三者在 reward 曲线上表现相似(都是早平台),靠叠 KL 曲线 + 抽样正确率来区分:KL≈0 多半是 beta 过大或温度过低;KL 正常但抽样正确率不涨多半是 grader 太松。

reward 崩溃的两种成因。 reward 突然掉头向下或锯齿剧烈,常因:(a) KL 系数失衡——beta 太小缰绳松,策略坍缩;(b) reward hacking——模型找到 grader 漏洞,短期奖励飙升后语义崩坏、再被其它信号拉低,曲线呈病态尖刺。诊断时把 KL 曲线叠上去:reward 崩的同时 KL 爆,基本就是缰绳问题。

为什么 loss 不能单独读。 GRPO 的 loss 把「优势加权对数概率」与「KL 惩罚」混在一起,loss 下降可能是「奖励学得好」也可能是「KL 项被压低(策略更贴近参考)」。所以 loss 必须与 reward 配对读:loss↓ + reward↑ 才是真健康;loss↓ + reward 平 = 可能只在缩 KL 不在学奖励。这正是「三曲线一起看」的根本原因——任何单一曲线都有歧义。

抽样正确率:训练外部信号的早期窗口。 每 20 步抽样在 tasks.ts 子集上跑一遍正确率,是在训练进行中偷看「下游能力」的窗口。它比 reward 更接近 Day 109 的最终评测,但分辨率低(抽样、子集)。若 reward 在涨而抽样正确率不涨,是 reward hacking 的强烈预警——奖励上去了但真实任务没变好。

三曲线健康/病态速查表。

现象rewardKLloss最可能成因处置
健康平滑上升稳在有界区间配合 reward继续跑
早平台升一点就走平很小不动grader 太松 / beta 太大 / G 太小收紧 verifier / 调小 beta / 加大 G
崩溃掉头/锯齿尖刺爆涨beta 太小坍缩 / reward hacking调大 beta 或上调度 / 审 grader 漏洞
空转几乎不动≈0不动温度太低 rollout 雷同升采样温度

G 与方差的定量直觉。 组内 advantage 用 (r−mean)/std 估计,mean/std 都是 G 个样本的统计量。统计学上,样本均值的方差 ∝ 1/G——G 从 4 加到 16,均值估计方差降到 1/4,advantage 噪声随之下降,reward 曲线更平滑。这就是「G 越大组内 advantage 估计方差越低」的来源,也是早平台时优先怀疑 G 的依据。

与相邻概念的边界。 与 Day 107 边界:107 配超参 + 冒烟验管线,108 看全量曲线判健康;超参错(如 beta 过大)会在 108 的曲线上现形(reward 平台),形成「配→跑→诊断→回调」闭环。与 Day 109 边界:108 看训练内部曲线(reward/KL/loss),109 看训练外部能力(同 harness 前后准确率 + κ 校准),两者不可互相替代——曲线好看不等于下游任务真的提升。资源:GRPO 论文(arXiv:2402.03300, 2024-02)。

2. 推导 / 手算 / 代码走读

本日训练指标汇总可复用 src/agent/eval/stats.tssummarizeLatency(同款分位法,把 reward/KL 采样序列的分布讲清楚)。走读要点:

  • summarizeLatency(samplesMs):先 [...samplesMs].sort((a,b)=>a-b) 拷贝排序(不破坏入参),返回 {n, p50, p95, p99, mean}。注释点明意图:「p95/p99 surface the tail that the mean hides」——均值会藏住尾部,分位数才暴露最坏情况。把 reward/KL 每 20 步采样序列喂进去,就能看到「平均 reward 0.x,但 p5(最差一批)卡在哪里」,比只报一个均值诚实得多。
  • percentile(sorted, p):线性插值分位——idx=(p/100)*(len-1),取 lo=floorhi=ceil,按权重 w=idx-lo 插值 sorted[lo]*(1-w)+sorted[hi]*w。单元素直接返回、空数组返回 NaN。这是 stats 模块里 p50/p95/p99 的统一实现。
  • mean(xs) / sd(xs):均值与样本标准差(sdn-1 分母,<2 个样本返回 0)。诊断 reward 曲线时,sd 跨窗口的变化能区分「平滑上升(sd 小)」与「锯齿震荡(sd 大)」。
  • 与 B10 监控复用同一模块summarizeLatency 原本为延迟 p95/p99 设计(B10 的 p95/cost 测量),这里直接复用到训练 reward/KL 序列——同一套分位代码服务「延迟尾部」和「奖励分布」两个场景,是「先建可复用纯函数、再多场景挂载」的工程红利。
  • 诚实边界stats.ts 是纯函数、RNG 可注入、无 API key,用于汇总,不产生训练数据本身;真正的 reward-vs-step 序列要 GPU 跑出来。本模块只保证「拿到序列后的分布刻画是对的」。

手算分位(验证 summarizeLatency 直觉,非新增测量):reward 采样 [0.2,0.3,0.4,0.5,0.9] 排序后,p50=0.4(中位),mean=0.46,p95≈0.82(靠近最高值)。若只报 mean=0.46 会掩盖「有一批冲到 0.9 也有一批只 0.2」的分布宽度——这正是为什么诊断要看分位而非单一均值。

手算 percentile 的线性插值(p95 over 5 点,非新增测量):idx=(95/100)*(5−1)=3.8lo=3, hi=4, w=0.8sorted[3]*(1−0.8)+sorted[4]*0.8 = 0.5*0.2 + 0.9*0.8 = 0.1+0.72 = 0.82。与上面 p95≈0.82 一致——这就是 stats.ts 里 p50/p95/p99 共用的同一段插值逻辑,训练监控与延迟监控(B10 的 p95/cost 测量)复用同一把尺。

sd() 区分平滑与锯齿(非新增测量):相邻 5 步 reward [0.40,0.42,0.44,0.46,0.48]sd≈0.032(平滑上升);而 [0.40,0.60,0.35,0.62,0.38]sd≈0.13(锯齿震荡)。同样的均值(≈0.44/0.47)下 sd 差 4 倍——跨窗口 sd 是「曲线形状」的量化指标,比肉眼看图更可判定。

3. 今日实战

  1. 全量跑训练 ≥300 步(接 Day 107 的 GRPOConfig 与数据/reward)。
  2. 20 步 抽样生成,与 Day 107 记录的 baseline 对比,统计抽样正确率提升序列。
  3. 同步采样 reward / KL / loss 三条曲线(每 20 步一个点)。具体记录:
    • step:训练步号(0, 20, 40, …)。
    • reward:该步组内平均奖励(多目标合成后)。
    • kl:当前策略与参考策略的 KL。
    • loss:GRPO 损失。
    • sample_acc:抽样生成在 tasks.ts 子集上的正确率。
  4. 导出 reward-vs-step 原始数据 csv(列含上述五项)。
  5. 离线侧:把 reward/KL 采样序列喂 summarizeLatency 得 p50/p95/p99/mean,刻画分布而非只报均值;用跨窗口 sd() 区分「平滑上升」与「锯齿震荡」。
  6. 对照「三曲线速查表」逐项判读:reward 是否单调?KL 是否有界?loss 是否配合?任一异常按表里的处置回调超参(回到 Day 107)。
  7. 交叉引用 docs/aipa/day108-monitoring.md 记录三曲线判读结论与回调动作。

4. 今日实测 / 产出

  • docs/aipa/day108-monitoring.md + reward-vs-step 原始数据 csv。
  • 待 GPU:≥300 步全量训练需 GPU;将产出每 20 步 reward / KL / loss 采样与抽样正确率序列。
  • 本仓 src/agent/eval/stats.tssummarizeLatency可复用于汇总训练指标分布——这部分离线可跑。
  • 产物清单:
    • reward-vs-step.csv:step / reward / kl / loss / sample_acc 五列,≥15 行(300 步 ÷ 20)。
    • 三曲线判读结论:reward 是否单调、KL 是否有界、loss 是否配合,及对应回调动作。
    • 分位汇总:reward/KL 序列的 p50/p95/p99/mean(summarizeLatency 输出)。
  • 状态诚实标注:分位汇总工具已就绪(离线,确定性可测);reward/KL/loss 实际序列待 GPU,未升级为已完成;OTel/Langfuse 训练指标接线 = NOT built/待接

5. 常见误区 / 陷阱

  1. 只看 reward 不看 KL:reward 在涨可能是 hacking 或即将崩前的回光,必须叠 KL 曲线一起判。这是 SOTA 检查里明确点名的最常见误判源。
  2. 把平台期当"收敛":reward 走平更可能是 grader 太松或 G 太小,不是真收敛;先查 verifier 严格度与 G。
  3. 只报均值不报分位:mean 藏住尾部,最差一批 rollout 的退化看不见;用 summarizeLatency 的 p5/p95 暴露分布。
  4. 训练曲线好看就宣布成功:曲线是训练内部信号,下游任务提升要等 Day 109 的同 harness 前后对比 + κ 校准,二者不可互替。
  5. 采样间隔太密拖慢训练:每步都抽样生成会显著增加算力;每 20 步抽样是「诊断分辨率 vs 训练吞吐」的折中。
  6. 抽样正确率用了不同子集:每 20 步的抽样若换了 task 子集,正确率序列不可比;必须固定同一抽样集才能看趋势。

6. 学习资源(每条带 YYYY-MM)

  • GRPO 论文 / DeepSeekMath(arXiv:2402.03300, 2024-02)——组内优势方差与 G 的关系、KL 项的稳定作用。
  • Unsloth GRPO guide(2026-01)——训练日志字段与 reward/KL 监控约定。
  • Anthropic「Demystifying evals」(2026-01)——训练外部能力评测与训练内部曲线的区分(为 Day 109 铺垫)。
  • Weights & Biases / Langfuse 训练监控文档(2026)——reward/KL/loss 看板与抽样评测的工程落地(本仓 OTel 接线待接,仅作对标参考)。

SOTA检查 (2026-06 更新)

  • 当前主线:reward / KL / loss 三曲线诊断法在 2026 仍是标准的 GRPO 训练健康判读法;配合每 N 步抽样下游正确率,是「内部曲线 + 外部能力」双轨监控的现役做法。
  • 是否仍 SOTA:是。三曲线法没有被替代,只在「指标落地到何处」(本地 csv vs OTel/Langfuse 后端)上演进。
  • 过时黑名单
    • 避免只看 reward 不看 KL(最常见误判源)。
    • 避免把 grader 太松导致的平台期当收敛。
    • 避免只报均值不报分位(藏尾部)。
    • 避免每步都抽样评测拖慢吞吐(每 20 步是折中)。
  • 下次复查点:再验是否需接 OTel/Langfuse 记录训练指标——本仓 OTel 接线 = NOT built/待接(诚实标注,未接)。下次复查确认是否落地训练指标可观测,以及 Dr.GRPO 的诊断指标(如去 std 后的优势分布)是否成为新标准看板项。

衔接

  • 昨天:Day 107 — GRPO 训练循环搭建(50 步冒烟 + step-0 reward 基线)。
  • 今天:≥300 步全量,reward/KL/loss 三曲线诊断,导出 reward-vs-step csv;离线用分位汇总刻画分布。
  • 明天:Day 109 — adapter 评测与对齐(同 harness 前后对比 + Cohen's κ 校准)。