Appearance
chat_rl.py — 強化學習實作解說
scripts/chat_rl.py 實作了 nanochat 的強化學習階段,以 GSM8K 數學題為訓練任務。
演算法:簡化版 GRPO / REINFORCE
Karpathy 在註釋中說明這是 GRPO 的簡化版,實際上更接近 REINFORCE:
- 無 trust region:刪除 KL 正則化項,沒有 reference model
- On-policy 無 PPO ratio+clip:因為每次更新都使用當前 policy 產生的資料
- DAPO 風格的 normalization:token-level,非 sequence-level
- Advantage:僅減去 mean(r - μ),不使用 z-score (r - μ)/σ
流程
- 載入 SFT 階段的模型
- 對每個 GSM8K 題目產生多個回答(
--num-samples=16) - 計算每個回答的 reward(答案是否正確)
- 計算 log probabilities,以 advantage 加權計算 policy gradient 損失
- 更新模型參數
損失函數
logp = -model(inputs, targets, loss_reduction='none') # log probability
pg_obj = (logp * advantages.unsqueeze(-1)).sum() # policy gradient objective
loss = -pg_obj / (num_valid * num_passes * examples_per_rank) # minimize neg PG監控指標
reward:平均 reward(越高越好)pass@k:top-k 回答的正確率sequence_length:生成序列平均長度