跳到主要内容

大模型强化学习建模思路

OpenAI 大模型强化学习(RLHF)三段式建模流程

RLHF(Reinforcement Learning from Human Feedback)的核心思想:不直接让 LLM 在环境中探索,而是先让人类标偏好 → 训出奖励模型 RM → 用 RM 当环境奖励,PPO 微调 LLM。整体分三步串行执行。

总体数据流

Base LLM (预训练模型)  SFT  SFT Model  训 RM  Reward Model (冻结)  PPO  最终对齐模型\text{Base LLM (预训练模型)} \;\xrightarrow{\text{SFT}}\; \text{SFT Model} \;\xrightarrow{\text{训 RM}}\; \text{Reward Model (冻结)} \;\xrightarrow{\text{PPO}}\; \text{最终对齐模型}

先澄清一个建模直觉:为什么大模型 RL 天然是"联合概率 + 单条路径采样"

在经典强化学习里,我们会把 P(ss,a)P(s' \mid s,a)(环境转移)和 π(as)\pi(a \mid s)(策略)分开写;但在基于 LLM 的文本生成 RLHF中,状态(前缀 st=x+y<ts_{t} = x + y_{<t})和动作(下一个 token at=yta_{t} = y_{t})都是离散且维度巨大的,整个"环境 + 策略"其实就是 LLM 自己按链规则分解出的回答 yy 给定 prompt xx 的联合概率

πθ(yx)=t=1yπθ(ytx,y<t)\pi_{\theta}(y \mid x) = \prod_{t=1}^{|y|} \pi_{\theta}(y_{t} \mid x,\, y_{<t})

因此,一条完整的生成路径(轨迹)对应一个"样本回答 yy"。由于词表极大(几万 token)、回答长度 y|y| 也长,这个联合分布无法枚举(组合爆炸),我们在训练时也不可能把所有可能的 yy 都求期望——只能从 πθ(x)\pi_{\theta}(\cdot \mid x) 中采样出若干条路径(即蒙特卡洛),再用这些路径的奖励/优势去加权更新 θ\theta。这就是 REINFORCE / PPO 策略梯度里写的:

θJ(θ)=EτPθ(τ)[θlogPθ(τ)R(τ)]\nabla_{\theta} J(\theta) = \mathbb{E}_{\tau \sim P_{\theta}(\tau)}\Big[\, \nabla_{\theta} \log P_{\theta}(\tau) \cdot R(\tau) \,\Big]

式中 τ\tau 就是"一次采样出的单条路径",上面的期望在工程上直接用 batch 内的多条轨迹做平均(不需要把分布枚举完)。


第 1 步:SFT(Supervised Fine-Tuning,监督微调)

目的:让基座 LLM 学会"按照指令(prompt)去回答"的基本格式,把下一 token 语言建模扭到"助手回答"的分布上。

说明
数据人工撰写的高质量 (prompt, response) 对(几千到几万条即可)
训练目标标准 next-token 交叉熵(和预训练一致)

SFT 损失:

LSFT(θ)=E(x,y)DSFTt=1ylogπθ(ytx,y<t)\mathcal{L}_{\text{SFT}}(\theta) = -\mathbb{E}_{(x,y)\sim \mathcal{D}_{\text{SFT}}} \sum_{t=1}^{|y|} \log \pi_{\theta}(y_{t} \mid x, y_{<t})

为什么要有 SFT:直接拿预训练模型做 PPO 会崩——预训练模型"回答姿势都不对",RL 的信号太稀疏、奖励模型也难以泛化。


第 2 步:训练 RM(Reward Model,奖励模型)

目的:把"人类偏好回答更好 / 更差"这种无法直接微分的信号,转化成一个可对任意回答打分的标量函数 rϕ(x,y)r_{\phi}(x, y),供 PPO 当每步(或整体)奖励。

说明
数据人工排序数据集:对同一条 prompt,给出 y+yy^+ \succ y^-y+y^+yy^- 好)
模型结构把 SFT 模型复制一份,在末尾 token 的 hidden state 上接一个线性头,输出标量 rr
损失Bradley-Terry / 成对排序交叉熵

RM 损失(排序偏好):对 prompt xx 的一对候选回答 (yw,yl)(y_{w}, y_{l}),其中 ywy_{w} 是赢家、yly_{l} 是输家:

LRM(ϕ)=E(x,yw,yl)logσ(rϕ(x,yw)rϕ(x,yl))\mathcal{L}_{\text{RM}}(\phi) = -\mathbb{E}_{(x,y_{w},y_{l})} \log \sigma\Big(\, r_{\phi}(x, y_{w}) - r_{\phi}(x, y_{l}) \,\Big)

RM 训练完成后冻结参数,在 PPO 阶段固定作为奖励函数。


第 3 步:PPO 微调(把 SFT 模型往 RM 分数高的方向推)

目的:以 RM 打分作为总奖励,用 PPO(on-policy,clip 版)在策略空间中找一条"既高分又不过度偏离 SFT 分布"的路径。

3.1 奖励设计(每生成完一个完整 response 后给分;或每步 token 级别可差分)

对一次交互(prompt xx,模型生成回答 yy):

Rtotal(x,y)=rϕ(x,y)RM 奖励(回答整体的人类偏好)    β(logπθ(yx)logπSFT(yx))KL 惩罚(防止 PPO 把语言模型改歪)R_{\text{total}}(x, y) = \underbrace{r_{\phi}(x, y)}_{\text{RM 奖励(回答整体的人类偏好)}} \;-\; \underbrace{\beta \cdot \Big(\,\log \pi_{\theta}(y \mid x) - \log \pi_{\text{SFT}}(y \mid x)\,\Big)}_{\text{KL 惩罚(防止 PPO 把语言模型改歪)}}
  • β\beta 超参:平衡"讨好 RM"和"保留 LLM 原本语言能力"
  • KL 项是 OpenAI 的关键稳定技巧:没有它,模型会学到"高 RM 分但人话不通"的对抗样本

3.2 PPO Clip 目标(同概述.md 3.6,仅状态 ss = 前缀上下文,动作 ata_{t} = 下一个 token)

每个 token 的 PPO 裁剪目标:

LPPO(θ)=Et[min(rt(θ)A^t, clip(rt(θ),1ϵ,1+ϵ)A^t)]\mathcal{L}_{\text{PPO}}(\theta) = \mathbb{E}_{t} \Big[\, \min\big(\, r_{t}(\theta) \hat{A}_{t},\ \text{clip}(r_{t}(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_{t} \big) \,\Big]

其中概率比:

rt(θ)=πθ(atst)πθold(atst)r_{t}(\theta) = \frac{\pi_{\theta}(a_{t} \mid s_{t})}{\pi_{\theta_{\text{old}}}(a_{t} \mid s_{t})}

实际工业训练会把上面的 PPO 目标和 SFT 的一小部分 NLL 损失加权相加(PPO+SFT objective),防止遗忘语言建模:

Ltotal(θ)=LPPO(θ)+λLSFT(θ)\mathcal{L}_{\text{total}}(\theta) = -\mathcal{L}_{\text{PPO}}(\theta) + \lambda \cdot \mathcal{L}_{\text{SFT}}(\theta)

总结:OpenAI 方法为什么是这三步?

阶段解决的问题
SFT预训练模型"会说英语"但"不会听指令回答"
RM人类偏好不可微、不能直接做 loss,转成一个打分函数
PPO + KL 惩罚在 RM 梯度方向上安全地微调 LLM,KL 惩罚阻止其偏离原分布过远