[斯坦福2025春季新课CS336:从头开始构建大模型]自学笔记(15-17)

详解SFT、RLHF & 详解大模型RL算法 & 详解GRPO

SFT

模型输出幻觉造成的损失较小

SFT难以做到的事:

  1. 让模型拒绝回答:避免输出幻觉

SFT时,少量的数据都能极大地提高模型的表现,包括让模型输出更少的harmful内容

Pre-train 和 SFT 的界限变得模糊,都是预测序列,现在很多做法是把两个阶段变为一个

在预训练时,混入少量的SFT数据。可能会再短暂地进行第二轮指令微调

SFT由于数据规模较小,并不像预训练能够学习知识

RLHF

RLHF是找到一个策略,使得奖励最大化。强化学习算法可归纳为:给好的东西增加权重;给坏的东西减少权重

进行RLHF的原因:

  • SFT的数据expensive
  • 生成人类更喜欢的内容

成对的反馈数据比SFT数据更容易获得

RLHF后的模型回答的长度更长

DPO

算是离线算法,因为有一大堆最初收集的成对数据

1767792692565

1767792740072

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)

利用当前估计值和下一步的奖励与状态信息来更新价值函数。

  • 优点:低方差。
  • 缺点:偏差大、训练不稳定
    优势函数为:

\[A_t=r_{t+1} + \gamma V(s_{t+1}) - V(s_t) \]

其中:

  • $ \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)的实际回报来估计状态或动作的价值。

  • 优点:低偏差
  • 缺点:高方差

优势函数为

\[A_t = \sum_{l=0}^{T-t} \gamma^l r_{t+l} - V(s_t) \]

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 进行指数加权求和:

\[A_t^{\text{GAE}(\gamma,\lambda)}=\sum_{l=0}^{\infty} (\gamma\lambda)^l \delta_{t+l} \]

  • \(\gamma\):折扣因子
  • \(\lambda \in [0,1]\)偏差–方差权衡参数

PPO损失函数:

\[\min\left(\frac{\pi_{\theta}(a|s)}{\pi_{\theta_{k}}(a|s)}A^{\pi_{\theta_{k}}}(s,a),\mathrm{clip}\left(\frac{\pi_{\theta}(a|s)}{\pi_{\theta_{k}}(a|s)},1-\epsilon,1+\epsilon\right)A^{\pi_{\theta_{k}}}(s,a)\right) \]

  • 理想情况下:\(\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的伪代码如下图所示:
1767965959393

实际中,两层循环实现:第一层循环表示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 值。

posted @ 2026-01-10 12:00  片刻的自由  阅读(42)  评论(0)    收藏  举报