双鸭山市网站建设_网站建设公司_产品经理_seo优化
2025/12/20 12:17:06 网站建设 项目流程

在 LLM 的训练体系中,Pretrain 决定了模型的知识广度,SFT(监督微调)决定了模型的指令遵循能力,而RLHF(Post-Training)则决定了模型的上限——即它能否在复杂的逻辑权衡中,输出符合人类价值观(Helpful, Honest, Harmless)甚至超越人类平均水平的内容。

GitHub 上的MiniMind项目提供了一个很有价值的实战项目,让我们得以窥见 LLM 训练的完整流程。我们将围绕作者指出的PO(Policy Optimization)统一视角 展开:

P O = E q ∼ P ( Q ) , o ∼ π ( O ∣ q ) [ f ( r t ) ⏟ 策略引导 ⋅ g ( A t ) ⏟ 优势评估 − h ( K L t ) ⏟ 正则约束 ] PO = \mathbb{E}_{q \sim P(Q), o \sim \pi(O|q)} [\underbrace{f(r_t)}_{\text{策略引导}} \cdot \underbrace{g(A_t)}_{\text{优势评估}} - \underbrace{h(KL_t)}_{\text{正则约束}}]PO=EqP(Q),oπ(Oq)[策略引导f(rt)优势评估g(At)正则约束h(KLt)]


第一部分:PPO (Proximal Policy Optimization)

PPO 是 OpenAI 训练 GPT-3.5/4 的核心算法。虽然繁琐,但它是在复杂环境中鲁棒性最强的算法。为了讲透 PPO,大家必须把它拆解为四个模型的博弈五个步骤的循环

1.1 准备工作:四个模型的“协作团队”

在PPO训练正式启动前,显存中需要同时加载(或根据硬件资源动态部分卸载)四个核心模型,它们各司其职、相互配合,共同构成了大模型RLHF(基于人类反馈的强化学习)中PPO训练的核心框架,就像一场麻将局里不同角色的玩家各有分工:

  1. Actor Model (策略模型π θ \pi_\thetaπθ)

  2. Reward Model (奖励模型R ψ R_\psiRψ)

  3. Critic Model (价值模型V ϕ V_\phiVϕ)

  4. Reference Model (亦称为Value Model,参考模型π r e f \pi_{ref}πref)


1.2 PPO 训练全流程详解 (The Step-by-Step Loop)

一个完整的 PPO Step 包括以下流程:

Step 1: 采样 (Rollout/Experience Collection)

Actor 模型针对一个 Batch 的 Prompt 生成回复。

Step 2: 评分 (Evaluation)
  • Reward Model 打分:计算最终生成的句子的奖励分数r s c o r e r_{score}rscore
  • KL 散度修正:为了防止模型跑偏,大家将 KL 散度作为惩罚项加入奖励中。即:
    R t = r s c o r e − β ⋅ log ⁡ π θ ( o t ∣ s t ) π r e f ( o t ∣ s t ) R_t = r_{score} - \beta \cdot \log \frac{\pi_\theta(o_t|s_t)}{\pi_{ref}(o_t|s_t)}Rt=rscoreβlogπref(otst)πθ(otst)
    MiniMind 细节:这里通常是 Token 级别的修正。如果某个 Token 偏离 Reference 太远,该 Token 获得的即时奖励就会大幅下降。
Step 3: 广义优势估计 (Generalized Advantage Estimation - GAE)

这是 PPO 最难理解的部分。我们需要 Critic 模型介入。

  • Critic 对序列中的每一个 Token 状态s t s_tst预测一个价值V ( s t ) V(s_t)V(st)
  • 我们计算 TD Error (时序差分误差)
    δ t = R t + γ V ( s t + 1 ) − V ( s t ) \delta_t = R_t + \gamma V(s_{t+1}) - V(s_t)δt=Rt+γV(st+1)V(st)
    直观理解:δ t \delta_tδt代表“现实(Reward + 下一刻价值)比预期(当前价值)好了多少”。
  • GAE (Generalized Advantage Estimation):依据加权累加δ t \delta_tδt来平衡方差和偏差:
    A t = ∑ k = 0 ∞ ( γ λ ) k δ t + k A_t = \sum_{k=0}^{\infty} (\gamma \lambda)^k \delta_{t+k}At=k=0(γλ)kδt+k
    • A t > 0 A_t > 0At>0:说明当前动作比平均水平好,应该鼓励(增加概率)。
    • A t < 0 A_t < 0At<0:说明当前动作差劲,应该抑制。
Step 4: 策略优化 (Policy Update)

现在我们有了数据对( s t , a t , A t , π o l d ( a t ∣ s t ) ) (s_t, a_t, A_t, \pi_{old}(a_t|s_t))(st,at,At,πold(atst))。进入内层循环(Epochs),更新 Actor 参数。

  • 计算新旧策略比率:r t ( θ ) = π θ ( a t ∣ s t ) π o l d ( a t ∣ s t ) r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{old}(a_t|s_t)}rt(θ)=πold(atst)πθ(atst)
  • Clip Loss(核心公式)
    L C L I P ( θ ) = E [ min ⁡ ( r t ( θ ) A t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A t ) ] L^{CLIP}(\theta) = \mathbb{E} [ \min(r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t) ]LCLIP(θ)=E[min(rt(θ)At,clip(rt(θ),1ϵ,1+ϵ)At)]解释:如果 A t A_tAt是正的(好动作),我们要提高概率,但不能提太猛(由1 + ϵ 1+\epsilon1+ϵ限制);如果A t A_tAt“Proximal(近端)”的含义——步子大了容易扯着蛋。就是是负的,我们要降低概率,也不能降太猛。这就注意,这里我们要最大化目标函数,即对− L C L I P ( θ ) -L^{CLIP}(\theta)LCLIP(θ) 求梯度
Step 5: 价值回归 (Critic Update)

Critic 模型也要进步,它需要让自己的预测V ( s t ) V(s_t)V(st)越来越接近真实的 Returns。

  • L V F = M S E ( V ϕ ( s t ) , Returns t ) L^{VF} = MSE(V_\phi(s_t), \text{Returns}_t)LVF=MSE(Vϕ(st),Returnst)

1.3 PO 统一视角

  • 策略项: f ( r t ) = min ⁡ ( r t , clip ( r t , 1 − ε , 1 + ε ) ) f(r_t) = \min(r_t, \text{clip}(r_t, 1−ε, 1+ε))f(rt)=min(rt,clip(rt,1ε,1+ε))(裁剪概率比防止更新过激)
  • 优势项: g ( A t ) = A t g(A_t) = A_tg(At)=At(通过Critic来进行GAE)
  • 正则项: h ( K L t ) = β ⋅ E [ K L ] h(KL_t) = β⋅\mathbb{E}[KL]h(KLt)=βE[KL](全局KL散度约束)

1.4 MiniMind 中的 PPO 代码

minimind/trainer/train_ppo.py 中,上述流程被精简为以下代码逻辑(简化版):

# 伪代码流程
for epoch in range(ppo_epochs):
# 1. Rollout: 生成数据
with torch.no_grad():
seq, action_mask = actor.generate(prompts)
old_log_probs = actor(seq)
ref_log_probs = ref_model(seq)
values = critic(seq)
reward_score = reward_model(seq)
# 2. 计算 Reward (含 KL 惩罚)
kl_div = old_log_probs - ref_log_probs
rewards = reward_score - beta * kl_div
# 3. 计算 GAE (优势函数)
advantages, returns = compute_gae(rewards, values)
# 4. PPO Update Step
for batch in dataloader(seq, advantages, returns):
new_log_probs = actor(batch.seq)
ratio = torch.exp(new_log_probs - batch.old_log_probs)
# PPO Clip Loss
surr1 = ratio * batch.advantages
surr2 = torch.clamp(ratio, 1-eps, 1+eps) * batch.advantages
actor_loss = -torch.min(surr1, surr2).mean()
# Critic Loss
new_values = critic(batch.seq)
critic_loss = (new_values - batch.returns).pow(2).mean()
# Backward
loss = actor_loss + 0.5 * critic_loss
optimizer.step()

第二部分:DPO (Direct Preference Optimization)

看完了 PPO 繁琐的流程,你会发现它太重了。你需要训练 Critic,需要拟合 Value,但这真的是必须的吗?
2023年斯坦福提出的 DPO 证明了:Reward Model 实际上是多余的中间商

2.1 核心改进原理:从奖励建模到策略的变量变换

经过数学推导,揭示了“人类偏好数据”与“最优策略”之间的直接关联——偏好数据本身已隐式定义了最优策略,无需先通过偏好训练奖励模型,再用奖励模型优化策略。这一推导过程可拆解为三个关键步骤:就是DPO的核心突破并非否定PPO的优化目标,而

步骤1:用Bradley-Terry模型建模人类偏好

人类对“好回答(y w y_wyw)”和“坏回答(y l y_lyl)”的选择,本质上反映了潜在奖励的差异。DPO采用经典的Bradley-Terry(BT)模型量化这种偏好:假设存在一个真实的潜在奖励函数r ∗ ( x , y ) r^*(x,y)r(x,y),人类选择y w y_wyw而非y l y_lyl的概率,由两者奖励的指数函数比值决定:
p ∗ ( y w ≻ y l ∣ x ) = exp ⁡ ( r ∗ ( x , y w ) ) exp ⁡ ( r ∗ ( x , y w ) ) + exp ⁡ ( r ∗ ( x , y l ) ) p^*(y_w \succ y_l | x) = \frac{\exp(r^*(x, y_w))}{\exp(r^*(x, y_w)) + \exp(r^*(x, y_l))}p(ywylx)=exp(r(x,yw))+exp(r(x,yl))exp(r(x,yw))
传统RLHF的RM阶段,会通过最大化上述概率的似然来训练奖励模型r ϕ ( x , y ) r_\phi(x,y)rϕ(x,y),损失函数为:
L R ( r ϕ , D ) = − E ( x , y w , y l ) ∼ D [ log ⁡ σ ( r ϕ ( x , y w ) − r ϕ ( x , y l ) ) ] \mathcal{L}_R(r_\phi, \mathcal{D}) = -\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}} \left[ \log \sigma(r_\phi(x, y_w) - r_\phi(x, y_l)) \right]LR(rϕ,D)=E(x,yw,yl)D[logσ(rϕ(x,yw)rϕ(x,yl))]
但DPO并未止步于此——它进一步探索了“训练好的奖励模型”与“最终策略”的数学关系。

步骤2:推导最优策略与奖励函数的显式关联

“最大化奖励期望,同时通过KL散度约束避免偏离参考策略就是在PPO的优化框架中,策略的目标π ref \pi_{\text{ref}}πref”,其目标函数可表示为:
max ⁡ π θ E x ∼ D , y ∼ π θ ( y ∣ x ) [ r ( x , y ) ] − β ⋅ KL ( π θ ∥ π ref ) \max_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y|x)} \left[ r(x,y) \right] - \beta \cdot \text{KL}(\pi_\theta \parallel \pi_{\text{ref}})πθmaxExD,yπθ(yx)[r(x,y)]βKL(πθπref)
DPO通过数学推导证明:满足上述目标的最优策略π ∗ \pi^*π,可直接由参考策略π ref \pi_{\text{ref}}πref和奖励函数r ( x , y ) r(x,y)r(x,y)参数化,形式为:
π ∗ ( y ∣ x ) = 1 Z ( x ) ⋅ π ref ( y ∣ x ) ⋅ exp ⁡ ( 1 β ⋅ r ( x , y ) ) \pi^*(y|x) = \frac{1}{Z(x)} \cdot \pi_{\text{ref}}(y|x) \cdot \exp\left(\frac{1}{\beta} \cdot r(x, y)\right)π(yx)=Z(x)1πref(yx)exp(β1r(x,y))
其中Z ( x ) Z(x)Z(x)是归一化常数(确保策略概率和为1),β \betaβ是KL散度的权重系数。这一公式的关键意义在于:奖励函数r ( x , y ) r(x,y)r(x,y)不再是独立的优化目标,而是可以被“最优策略π ∗ \pi^*π与参考策略π ref \pi_{\text{ref}}πref的比值”所替代

步骤3:消去奖励函数,直接用策略表示偏好

将最优策略公式代入Bradley-Terry模型,可消去潜在奖励函数r ∗ ( x , y ) r^*(x,y)r(x,y),得到仅由策略表示的人类偏好概率:
p ( y w ≻ y l ∣ x ) = σ ( 1 β ⋅ ( log ⁡ π ∗ ( y w ∣ x ) π ref ( y w ∣ x ) − log ⁡ π ∗ ( y l ∣ x ) π ref ( y l ∣ x ) ) ) p(y_w \succ y_l | x) = \sigma\left( \frac{1}{\beta} \cdot \left( \log \frac{\pi^*(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \log \frac{\pi^*(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right) \right)p(ywylx)=σ(β1(logπref(ywx)π(ywx)logπref(ylx)π(ylx)))
这一推导彻底颠覆了传统流程:既然人类偏好可直接用“当前策略π θ \pi_\thetaπθ与参考策略π ref \pi_{\text{ref}}πref的对数概率比”表示,我们就无需先训练奖励模型——直接优化π θ \pi_\thetaπθ,使其满足上述偏好概率即可

最终,DPO的损失函数被定义为“最小化模型预测偏好与人类真实偏好的偏差”,形式为二元交叉熵损失:
L DPO ( π θ ; π ref ) = − E ( x , y w , y l ) ∼ D [ log ⁡ σ ( β ⋅ ( log ⁡ π θ ( y w ∣ x ) π ref ( y w ∣ x ) − log ⁡ π θ ( y l ∣ x ) π ref ( y l ∣ x ) ) ) ] \mathcal{L}_{\text{DPO}}(\pi_\theta; \pi_{\text{ref}}) = -\mathbb{E}_{(x,y_w,y_l)\sim\mathcal{D}} \left[ \log \sigma\left( \beta \cdot \left( \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right) \right) \right]LDPO(πθ;πref)=E(x,yw,yl)D[logσ(β(logπref(ywx)πθ(ywx)logπref(ylx)πθ(ylx)))]
其中β \betaβ的作用与PPO一致:控制策略偏离π ref \pi_{\text{ref}}πref的程度——β \betaβ越大,策略越接近参考模型,探索性越弱;β \betaβ越小,策略灵活性越高,但易因过度偏离导致训练不稳定。

2.2 流程对比 (PPO vs DPO)

  • PPO:在线 (Online)。必须实时生成素材(Rollout),实时打分,实时更新。效率低,显存炸裂。
  • DPO通过:离线 (Offline)。你能够把它看作是一种特殊的 Supervised Fine-Tuning
    1. 准备数据集:Promptx xx, 好回答 y w y_wyw, 坏回答 y l y_lyl
    2. 不需要 Critic,不应该 Reward Model
    3. 直接计算 Loss:
      L D P O = − E ( x , y w , y l ) ∼ D [ log ⁡ σ ( β log ⁡ π θ ( y w ∣ x ) π r e f ( y w ∣ x ) − β log ⁡ π θ ( y l ∣ x ) π r e f ( y l ∣ x ) ) ] L_{DPO} = - \mathbb{E}_{(x, y_w, y_l) \sim D} [\log \sigma (\beta \log \frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)})]LDPO=E(x,yw,yl)D[logσ(βlogπref(ywx)πθ(ywx)βlogπref(ylx)πθ(ylx))]注意:这边的公式与 DPO 论文统一,因此前面已经加过负号了,求梯度不需要再加了,但下文的 GRPO 与 PPO 一致,还是需要加负号的。

2.3 PO 统一视角

MiniMind 中的解释:就是这

  • 策略项: f ( r t ) = log ⁡ r w − log ⁡ r l f(r_t) = \log r_w - \log r_lf(rt)=logrwlogrl(对比chosen vs rejected的概率比)
  • 优势项: g ( A t ) = / g(A_t) = /g(At)=/(通过偏好对比,无需显式计算优势)
  • 正则项: h ( K L t ) h(KL_t)h(KLt) 隐含在 β \betaβ中 (控制偏离参考模型程度)

不过我有另一种理解允许参考:

  • 策略项 f ( r t ) f(r_t)f(rt)& 优势项g ( A t ) g(A_t)g(At):被隐式融合。DPO 认为,“优势”就是log ⁡ π ( y w ) π ( y l ) \log \frac{\pi(y_w)}{\pi(y_l)}logπ(yl)π(yw)的比值扩大。
  • 正则项 h ( K L t ) h(KL_t)h(KLt):被完美内嵌。当你优化 DPO Loss 时,你数学上等价于在优化 Reward 且受到 KL 约束。

MiniMind 实践建议:对于个人开发者,首选 DPO。它只需要加载 Actor 和 Ref 两个模型,显存占用减半,且训练速度快数倍。但务必注意:DPO 对数据标注质量极其敏感,脏数据会导致模型迅速崩坏。


第三部分:GRPO (Group Relative Policy Optimization)

PPO 很稳但太贵,DPO 很轻但对数据挑剔且容易过拟合。有没有一种结合二者优点的方案?
DeepSeek-R1 (DeepSeek-Math) 验证了GRPO的威力。它特别适用于推理、数学、代码等有明确客观评价标准的领域。

3.1 核心改进:干掉 Critic

在 PPO 中,Critic 模型(Value Function)是最难训练的。它必须预测“这道数学题做到这一步,未来做对的概率是多少”,这太难了。
:就是GRPO 的思路我不预测分值了,我直接看这一组考生的相对排名。

3.2 训练流程差异

  1. Group Sampling
    对于一个 Promptq qq,Actor 采样生成G GG个不同的回答{ o 1 , o 2 , . . . , o G } \{o_1, o_2, ..., o_G\}{o1,o2,...,oG}(比如 G = 8 G=8G=8)。
  2. 打分
    用 Reward Model(或者规则检查器,比如代码编译器、数学答案匹配)给这G GG个回答打分,得到{ r 1 , . . . , r G } \{r_1, ..., r_G\}{r1,...,rG}
  3. 计算相对优势 (Group Relative Advantage)
    用这组数据的平均值做基线。就是这是 GRPO 的灵魂。它不要求 Critic 来告诉我基线是多少,而
    A i = r i − mean ( r 1.. G ) std ( r 1.. G ) + ϵ A_i = \frac{r_i - \text{mean}(r_{1..G})}{\text{std}(r_{1..G}) + \epsilon}Ai=std(r1..G)+ϵrimean(r1..G)
    • 如果你考了80分,组平均分60分,你的优势就是正的。
    • 负的。就是如果你考了50分,组平均分60分,你的优势就
  4. 策略更新
    应用 PPO 的 Clip Loss,但优势A t A_tAt换成了上面的A i A_iAi。并且还需要显式地在 Loss 中加上 KL 散度项(因为没有 PPO 的 Critic 带来的隐式约束)。

L G R P O = E [ 1 G ∑ i = 1 G ( L i C L I P − β D K L ( π ∣ ∣ π r e f ) ) ] L_{GRPO} = \mathbb{E} \left[ \frac{1}{G} \sum_{i=1}^G (L^{CLIP}_i - \beta D_{KL}(\pi || \pi_{ref})) \right]LGRPO=E[G1i=1G(LiCLIPβDKL(π∣∣πref))]

3.3 PO 统一视角

  • 策略项: f ( r t ) = r t f(r_t) = r_tf(rt)=rt(直接运用概率比,无clip裁剪)
  • 优势项: g ( A t ) = R − μ g r o u p σ g r o u p g(A_t) = \frac{R - \mu_{group}}{\sigma_{group}}g(At)=σgroupRμgroup(组内归一化,消除Critic网络)
  • 正则项: h ( K L t ) = β ⋅ K L t h(KL_t) = β⋅KL_th(KLt)=βKLt(token级KL散度约束)

3.4 为什么 GRPO 适合 Reasoning?

在推理任务中,答案往往非黑即白(Right/Wrong)。

  • 假如模型生成了8个解法,其中1个对了(Reward=1),7个错了(Reward=0)。
  • 平均分是 0.125。
  • 做对的那个样本,优势A ≈ ( 1 − 0.125 ) / σ A \approx (1 - 0.125) / \sigmaA(10.125)/σ,是一个巨大的正信号。
  • GRPO 能极高效地从偶尔的“灵光一现”中提取正反馈,强化模型产生正确推理路径的概率。

第四部分:总结与技术选型表

结合 MiniMind 的实现,我们从工程角度总结这三个算法:

算法核心组件显存压力数据要求核心公式特征 (统一视角)适用场景
PPOActor, Critic, Ref, RM 极大 (4模型)偏好对/打分模型A t A_tAt由 Critic 预测,含 KL 隐式约束通用对话,复杂任务,追求极致稳定性
DPOActor, Ref 极小 (2模型)高质量偏好对( y w , y l ) (y_w, y_l)(yw,yl)r rrπ \piπ的解析映射,无显式A t A_tAt资源受限,有高质量材料集,指令微调
GRPOActor, Ref, (RM/Rule)⚖️ 中等 (2模型+采样)Prompt + 评分规则A t A_tAt由组内均值计算 (Group Norm)数学、代码、逻辑推理,长思维链训练

最后的建议

如果你正在使用MiniMind 进行入门:

  1. 先跑通 SFT,这是基础。
  2. 想体验 RLHF,先从DPO开始,因为它最不容易因为 OOM (显存溢出) 而报错,代码逻辑也最线性。
  3. 当你理解了 DPO,尝试阅读 train_ppo.py,去观察 compute_gae 函数是如何实现的,这是进阶的关键。
  4. 假如你想复现 DeepSeek 的效果,尝试用 GRPO 训练一个小型的数学模型,只需要定义一个简便的 Reward 函数(比如答案匹配),你就能看到模型如何依据自我博弈(Self-Play 雏形)提升准确率。

本文参考:
强化学习一锅端:一文梳理从PPO到GSPO强化学习发展历程 - 曾天真的文章 - 知乎
大模型强化学习-PPO/DPO/GRPO区别对比 - 硅基趣玩喵的文章 - 知乎

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询