[斯坦福2025春季新课CS336:从头开始构建大模型]自学笔记(15-17)
详解SFT、RLHF & 详解大模型RL算法 & 详解GRPO
SFT
模型输出幻觉造成的损失较小
SFT难以做到的事:
- 让模型拒绝回答:避免输出幻觉
SFT时,少量的数据都能极大地提高模型的表现,包括让模型输出更少的harmful内容
Pre-train 和 SFT 的界限变得模糊,都是预测序列,现在很多做法是把两个阶段变为一个
在预训练时,混入少量的SFT数据。可能会再短暂地进行第二轮指令微调
SFT由于数据规模较小,并不像预训练能够学习知识
RLHF
RLHF是找到一个策略,使得奖励最大化。强化学习算法可归纳为:给好的东西增加权重;给坏的东西减少权重
进行RLHF的原因:
- SFT的数据expensive
- 生成人类更喜欢的内容
成对的反馈数据比SFT数据更容易获得
RLHF后的模型回答的长度更长
DPO
算是离线算法,因为有一大堆最初收集的成对数据


DPO不适合数学问题,因为没有成对的回答。
PPO
优势(Advantage)函数表达式为:\(A_t=Q(s_t,a_t)−V(s_t)\),但在RLHF中:
- 奖励是稀疏的(序列长度为T,只有少量时间步有奖励)
- \(V(s_t)\)不够精确,即始终是近似的、含噪声。
因此需要广义优势估计(Generalized Advantage Estimation, GAE)
两种GAE:
单步时序差分(Temporal Difference),TD(0)
利用当前估计值和下一步的奖励与状态信息来更新价值函数。
- 优点:低方差。
- 缺点:偏差大、训练不稳定
优势函数为:
其中:
- $ \alpha $:学习率
- $ \gamma $:折扣因子(0 ≤ γ ≤ 1)
- $ r_{t+1} $:在状态 $ s_t $ 执行动作后获得的即时奖励(时间步为\(t\)时,不包含当前步生成的token)
- $ V(s_{t+1}) $:下一个状态的估计价值
蒙特卡洛(Monte Carlo)估计
蒙特卡洛(Monte Carlo, MC)估计是强化学习中用于评估策略(policy evaluation)的一种经典方法,它基于完整回合(episode,也称rollout、trajectory)的实际回报来估计状态或动作的价值。
- 优点:低偏差
- 缺点:高方差
优势函数为
GAE
因此引入GAE,对MC和TD做一个调和。GAE 的目标不是估计\(V(s)\),而是估计\(A_t\)
定义TD误差\(\delta_t\):\(\delta_t = r_{t+1} + \gamma V(s_{t+1}) - V(s_t)\)
GAE 将多个 TD error 进行指数加权求和:
- \(\gamma\):折扣因子
- \(\lambda \in [0,1]\):偏差–方差权衡参数
PPO损失函数:
- 理想情况下:\(\mathbb{E}_{\pi_\theta}\big[ \nabla_\theta \log \pi_\theta(a|s) \cdot R(s,a) \big]\)
- 估计:\(\mathbb{E}_{\pi_\theta}\big[ \nabla_\theta \log \pi_\theta(a|s) \cdot \delta \big]\)
在DeepSeek R1中,奖励有两种:
- 准确率奖励(回答是否正确)
- 格式奖励(使用thinking tag)
R1 的训练pipeline:
Deepseek-V3 -> Reasoning SFT -> RL(GRPO) -> SFT/RLHF
上面的RLHF仍然可以使用GRPO
GRPO的伪代码如下图所示:

实际中,两层循环实现:第一层循环表示epoch,得到response,计算reward 和 \(\delta\);第二层循环,计算GRPO损失
包含两种正则:1. clipping应用于ref模型,KL散度关于ref模型和actor模型
其他
需要注意的是PPO/GRPO的奖励是Sequence-Level的,一个完整的回答有一个标量的值表示reward,但是Sequence-Level的奖励如何分摊到每个token上?
对于PPO,对于序列中的每一个 Token,其实时奖励 \(r_t\) 的初步构成如下:\(r_t=-\beta\log\frac{\pi_\theta(x_t|s_t)}{\pi_{\mathrm{ref}}(x_t|s_t)}\)。
- \(\pi_{\theta}\):当前正在优化的策略模型。
- \(\pi_{\text{ref}}\):原始的 SFT 参考模型。
奖励模型(RM)给出的总分 \(R_{total}\) 并不是平均分摊到每个 Token 上,而是作为增量补偿,附加在序列的最后一个 Token(通常是 [EOS])上。此时,序列的完整奖励序列变成:
- 非结尾 Token (\(t < T\)): \(R_t = r_t\) (仅包含 KL 惩罚)
- 结尾 Token (\(t = T\)): \(R_T = r_T + \text{RM}(\text{sequence})\)
而GRPO 是一种为大语言模型(LLM)对齐任务设计的 免 critic 的 PPO 变体,其核心思想是:
- 不显式训练一个价值网络(critic)来估计状态价值\(V(s)\);
- 而是通过 组内相对排序(group-wise relative ranking) 来构造 reward 或 advantage 信号。
在 GRPO(Group Relative Policy Optimization) 中,同一个 sequence 内的所有 token 通常共享同一个 Advantage 值。

浙公网安备 33010602011771号