有笨蛋嘛?
Graph Neural Networks 炼丹中...
睡大觉中
前方高能反应!
BUG 修复进度 99%
到底在干嘛?
GROMACS 跑起来了吗?
Tailwind CSS 拯救前端
在干嘛呢?
MD 模拟什么时候才能出图啊
写算法中
有笨蛋嘛?
BUG 修复进度 99%
睡大觉中
前方高能反应!
Evernightの宝藏之地
首页项目归档照片墙音乐说说友链关于
封面

RLHF算法原理讲解:让大模型对齐人类偏好

写作时间:2026-05-21
约 10 分钟 · 3466 字

预训练之后,模型真的"好用"了吗?

一个在海量语料上完成自回归预训练的 LLM,本质上是一个极强的下一个 token 预测器。给定前缀,它能以很高概率续写出通顺、知识密集,甚至风格鲜明的文本;但它并不天然知道什么答案是"有用的"、什么是"无害的",也不知道用户下达指令时,自己应该以助手口吻回答,而不是继续补全一段互联网文本。

如果你问它"怎么造炸弹",基座模型可能会认真罗列步骤。不是因为它有恶意,而是因为它的训练目标只是最大化条件语言模型概率:


max⁡θ  Ex∼D[∑tlog⁡πθ(xt∣x<t)]\max_\theta \; \mathbb{E}_{x \sim \mathcal{D}} \left[ \sum_t \log \pi_\theta(x_t \mid x_{\lt t}) \right]θmax​Ex∼D​[t∑​logπθ​(xt​∣x<t​)]

这个目标从未告诉模型:有些问题不该回答,有些回答虽然"像训练语料",却不符合人类期望。

RLHF(Reinforcement Learning from Human Feedback) 正是为了解决这一类对齐问题而形成的经典范式。它在 OpenAI 的 InstructGPT 论文中被系统化使用,随后成为 ChatGPT、Claude、Llama 等对话模型的重要对齐流程之一。

整条 RLHF 流水线主要包含三个阶段:监督微调 (SFT)、奖励模型 (RM) 的训练以及基于 PPO 的策略优化。


Step 1:监督微调(SFT)

动机

基座模型的默认行为是"补全",不是"回应"。SFT(Supervised Fine-Tuning)的目标,是用高质量人工示范数据告诉模型:面对一条用户指令时,理想回答应该长什么样。

换句话说,SFT 不是让模型从零学会语言,而是把它从"续写器"推向"助手"。

数据构造

标注团队会为一批 prompt 编写高质量回答,形成示范数据集:


例如:

prompt xxx demonstration yyy
解释什么是光合作用 光合作用是植物利用光能,将二氧化碳和水转化为葡萄糖和氧气的过程……
用 Python 写一个冒泡排序 def bubble_sort(arr): ...

数据规模通常在几千到几万条。这里的关键不是越多越好,而是覆盖足够多样的任务类型,并且回答质量稳定。

训练目标

SFT 仍然使用标准的因果语言建模目标,只是训练数据从互联网文本变成了"指令—回答"对:


LSFT(θ)=−E(x,y)∼DSFT[∑t=1∣y∣log⁡πθ(yt∣x,y<t)]\mathcal{L}_{\mathrm{SFT}}(\theta) = -\mathbb{E}_{(x,y) \sim \mathcal{D}_{\mathrm{SFT}}} \left[ \sum_{t=1}^{|y|} \log \pi_\theta(y_t \mid x, y_{\lt t}) \right]LSFT​(θ)=−E(x,y)∼DSFT​​​t=1∑∣y∣​logπθ​(yt​∣x,y<t​)​

直观地说,这一步就是让模型逐 token 模仿标注员的回答。实际训练时,通常只让回答部分 yyy 参与 loss 计算,prompt 部分 xxx 作为条件上下文,不作为预测目标。

SFT 之后,模型已经初步学会"听指令、给回答"。但它仍有一个关键问题:它不知道同一个 prompt 下,两个候选回答哪一个更符合人类偏好。SFT 只能模仿单条示范,不能直接学习"回答之间的优劣排序"。这正是奖励模型要解决的问题。


Step 2:训练奖励模型(Reward Model)

为什么需要奖励模型?

最理想的做法当然是让人类实时评判模型输出,然后直接把这些评价用于训练。但把人类放进每一步训练循环并不现实:速度太慢,成本太高,而且不同标注者的绝对评分标准也会明显波动。

RLHF 的解决思路是:先用人类偏好数据训练一个"模拟裁判"。这个裁判就是奖励模型(Reward Model, RM)。后续强化学习阶段中,RM 会替代真实人类,为模型生成的回答给出奖励信号。

数据构造:偏好比较而非绝对打分

RM 通常不直接学习"这个回答是 4 分还是 5 分",而是学习"回答 A 是否优于回答 B"。原因很简单:绝对打分的标注方差很大,而二选一或排序比较更稳定、更容易复现。

具体流程是:对同一个 prompt xxx,用当前模型采样出多个回答 y1,y2,…,yK{y_1, y_2, \ldots, y_K}y1​,y2​,…,yK​,让标注员选择更好的回答,从而构建偏好数据集:

prompt xxx 偏好回答 ywy_wyw​ 非偏好回答 yly_lyl​
"解释什么是梯度下降" 条理清晰、带例子的讲解 含糊、堆砌术语的讲解
"用 Python 写一个快速排序" 正确、考虑边界情况的实现 存在边界 bug 的实现

这里的 ywy_wyw​ 和 yly_lyl​ 不一定意味着"完美回答"和"错误回答",只表示在同一个 prompt 下,人类更偏好前者。

模型架构

RM 通常从 SFT 模型初始化,这样它已经具备基本的语言理解和指令理解能力。随后把最后的 LM head(输出词表分布)替换为一个标量输出头,让模型对完整的 (x,y)(x, y)(x,y) 序列输出一个实数奖励:


这个标量 rθ(x,y)r_\theta(x,y)rθ​(x,y) 就是奖励模型对"回答 yyy 有多好"的预测。

实践中,常把 prompt 和 answer 拼接后送入 RM,并在回答末尾加入特殊的 <EOS> token,用该位置的 hidden state 表示整段回答。这样比直接取最后一个普通 token 更稳定。

训练目标:Bradley-Terry 偏好模型

RM 的训练目标通常基于 Bradley-Terry 模型。它假设人类偏好 ywy_wyw​ 胜过 yly_lyl​ 的概率,由两者奖励差的 sigmoid 给出:


P(yw≻yl∣x)=σ(rθ(x,yw)−rθ(x,yl))P(y_w \succ y_l \mid x) = \sigma\left(r_\theta(x, y_w) - r_\theta(x, y_l)\right)P(yw​≻yl​∣x)=σ(rθ​(x,yw​)−rθ​(x,yl​))

其中:


σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}σ(z)=1+e−z1​

如果 rθ(x,yw)r_\theta(x,y_w)rθ​(x,yw​) 比 rθ(x,yl)r_\theta(x,y_l)rθ​(x,yl​) 大很多,那么模型认为"chosen 更好"的概率接近 1;如果两者奖励接近,偏好概率就接近 0.5。

于是 RM 的损失函数就是负对数似然:


LRM(θ)=−E(x,yw,yl)∼DRM[log⁡σ(rθ(x,yw)−rθ(x,yl))]\mathcal{L}_{\mathrm{RM}}(\theta) = -\mathbb{E}_{(x,y_w,y_l) \sim \mathcal{D}_{\mathrm{RM}}} \left[ \log \sigma\left(r_\theta(x,y_w) - r_\theta(x,y_l)\right) \right]LRM​(θ)=−E(x,yw​,yl​)∼DRM​​[logσ(rθ​(x,yw​)−rθ​(x,yl​))]

梯度方向非常直观:拉大 chosen 与 rejected 之间的奖励差距。当奖励差很小时,loss 大,模型会被推动着更明确地区分二者;当 chosen 的奖励已经明显高于 rejected 时,sigmoid 接近饱和,loss 逐渐趋近于零。


Step 3:PPO 强化学习微调

强化学习视角下的 LLM

完成 SFT 和 RM 后,我们手里有三个关键对象:

角色 记号 功能
当前策略 πϕ\pi_\phiπϕ​ 待优化的 LLM,从 SFT 初始化,负责生成回答
参考策略 πref\pi_{\mathrm{ref}}πref​ 冻结的 SFT 模型,用来限制策略漂移
奖励模型 rθr_\thetarθ​ 冻结的 RM,给 (x,y)(x,y)(x,y) 输出标量奖励

从强化学习角度看,prompt 是初始状态,模型逐 token 采样动作,完整回答是一条 trajectory,RM 在序列末尾给出主要奖励。

奖励信号:RM 分数 + KL 约束

如果直接最大化 RM 分数,会遇到典型的奖励黑客(reward hacking):策略可能学会生成某些人类不喜欢、但 RM 错误高估的模式,比如重复模板、堆砌安全话术,甚至输出异常符号。

因此 RLHF 通常不会只优化 rθ(x,y)r_\theta(x,y)rθ​(x,y),而是加入相对于参考模型的 KL 惩罚:


R(x,y)=rθ(x,y)−βlog⁡πϕ(y∣x)πref(y∣x)R(x,y) = r_\theta(x,y) - \beta \log \frac{\pi_\phi(y \mid x)}{\pi_{\mathrm{ref}}(y \mid x)}R(x,y)=rθ​(x,y)−βlogπref​(y∣x)πϕ​(y∣x)​

等价地,可以写成期望形式:


max⁡ϕ  Ex∼D, y∼πϕ(⋅∣x)[rθ(x,y)−βDKL(πϕ(⋅∣x)∥πref(⋅∣x))]\max_\phi \; \mathbb{E}_{x \sim \mathcal{D},\, y \sim \pi_\phi(\cdot \mid x)} \left[ r_\theta(x,y) - \beta D_{\mathrm{KL}}\left(\pi_\phi(\cdot \mid x) \parallel \pi_{\mathrm{ref}}(\cdot \mid x)\right) \right]ϕmax​Ex∼D,y∼πϕ​(⋅∣x)​[rθ​(x,y)−βDKL​(πϕ​(⋅∣x)∥πref​(⋅∣x))]

这里的 β\betaβ 控制约束强度:太小容易 reward hacking,太大则策略几乎无法偏离 SFT 模型。

在实现中,KL 惩罚通常按 token 近似累加:


log⁡πϕ(y∣x)πref(y∣x)=∑t=1Tlog⁡πϕ(yt∣x,y<t)πref(yt∣x,y<t)\log \frac{\pi_\phi(y \mid x)}{\pi_{\mathrm{ref}}(y \mid x)} = \sum_{t=1}^{T} \log \frac{\pi_\phi(y_t \mid x, y_{\lt t})} {\pi_{\mathrm{ref}}(y_t \mid x, y_{\lt t})}logπref​(y∣x)πϕ​(y∣x)​=t=1∑T​logπref​(yt​∣x,y<t​)πϕ​(yt​∣x,y<t​)​

这就是 RLHF 里"既追求高奖励,又不要离原来的语言模型太远"的核心约束。

数据采集循环

PPO 阶段是在线策略优化。每一轮训练大致如下:

  1. 用当前策略 πϕ\pi_\phiπϕ​ 对一批 prompt 采样 rollout 回答;
  2. 用 RM 为每条回答打分,并叠加相对参考策略的 KL 惩罚,得到最终奖励;
  3. 用价值函数 VϕV_\phiVϕ​ 和 GAE 估计每个 token 的优势 A^t\hat{A}_tA^t​;
  4. 按 PPO 裁剪目标更新策略与价值网络;
  5. 重复以上步骤,直到奖励收敛或 KL 漂移达到预算上限。

这里"当前策略自己生成回答"非常关键。PPO 是 on-policy 算法,更新所依赖的 rollout 必须来自当前或近似当前的策略,而不能完全替换成离线回答数据。

PPO 的裁剪目标

PPO(Proximal Policy Optimization)的核心,是限制每次策略更新的幅度。对第 ttt 个 token,定义新旧策略概率比:


ρt(ϕ)=πϕ(at∣st)πϕold(at∣st)\rho_t(\phi) = \frac{\pi_\phi(a_t \mid s_t)} {\pi_{\phi_{\mathrm{old}}}(a_t \mid s_t)}ρt​(ϕ)=πϕold​​(at​∣st​)πϕ​(at​∣st​)​

其中 st=(x,y<t)s_t = (x, y_{\lt t})st​=(x,y<t​),at=yta_t = y_tat​=yt​。PPO 的 clipped surrogate objective 写作:


JPPO(ϕ)=Et[min⁡(ρt(ϕ)A^t,clip⁡(ρt(ϕ),1−ϵ,1+ϵ)A^t)]\mathcal{J}_{\mathrm{PPO}}(\phi) = \mathbb{E}_t \left[ \min\left( \rho_t(\phi)\hat{A}_t, \operatorname{clip}(\rho_t(\phi), 1-\epsilon, 1+\epsilon)\hat{A}_t \right) \right]JPPO​(ϕ)=Et​[min(ρt​(ϕ)A^t​,clip(ρt​(ϕ),1−ϵ,1+ϵ)A^t​)]

其中:

  • A^t\hat{A}_tA^t​:第 ttt 步的优势估计(advantage estimate)
  • ϵ\epsilonϵ:裁剪阈值,常见取值为 0.1 或 0.2
  • πϕold\pi_{\phi_{\mathrm{old}}}πϕold​​:采样 rollout 时使用的旧策略

当 ρt\rho_tρt​ 偏离 1 太远时,clip 会截断目标函数的收益,避免一次更新把策略推得过远。直观地说:PPO 鼓励模型朝优势为正的方向改进,但不允许它一步跨得太大。

优势估计与价值函数

语言生成任务的奖励往往在序列末尾才由 RM 给出,因此需要把"整段回答的好坏"分配回每一个 token 决策。常用方法是 GAE(Generalized Advantage Estimation):


A^t=∑l=0T−t−1(γλ)lδt+l\hat{A}_t = \sum_{l=0}^{T-t-1} (\gamma\lambda)^l \delta_{t+l}A^t​=l=0∑T−t−1​(γλ)lδt+l​

其中 TD 残差为:


δt=rt+γVϕ(st+1)−Vϕ(st)\delta_t = r_t + \gamma V_\phi(s_{t+1}) - V_\phi(s_t)δt​=rt​+γVϕ​(st+1​)−Vϕ​(st​)

Vϕ(st)V_\phi(s_t)Vϕ​(st​) 是价值函数,用来预测从当前状态开始的期望未来回报。RLHF 实践中,value head 通常与 policy 共享 Transformer 主干,只在最后增加一个输出标量的线性层。

价值函数用均方误差训练:


LV(ϕ)=Et[(Vϕ(st)−R^t)2]\mathcal{L}_V(\phi) = \mathbb{E}_t \left[ \left(V_\phi(s_t) - \hat{R}_t\right)^2 \right]LV​(ϕ)=Et​[(Vϕ​(st​)−R^t​)2]

PPO 阶段的总目标

如果把 PPO 写成"最大化目标",常见形式是:


max⁡ϕ  JPPO(ϕ)−c1LV(ϕ)+c2H[πϕ]\max_\phi \; \mathcal{J}_{\mathrm{PPO}}(\phi) - c_1 \mathcal{L}_V(\phi) + c_2 \mathcal{H}\left[\pi_\phi\right]ϕmax​JPPO​(ϕ)−c1​LV​(ϕ)+c2​H[πϕ​]

三项分别对应:

项 作用
JPPO\mathcal{J}_{\mathrm{PPO}}JPPO​ 最大化裁剪后的策略改进目标
−c1LV-c_1\mathcal{L}_V−c1​LV​ 训练价值函数,使回报预测更准确
c2H[πϕ]c_2 \mathcal{H}[\pi_\phi]c2​H[πϕ​] 熵奖励,鼓励策略保持一定探索性,避免过早塌缩

如果工程实现里使用梯度下降,则通常会最小化它的相反数,即把 policy objective 取负,再加上 value loss,并减去 entropy bonus。


全局视角:三种目标函数的分工

把三幕合在一起看,SFT、RM、PPO 的职责非常清晰。

SFT 提供基础交互能力,RM 提供人类偏好的近似评判标准,PPO 则在 KL 约束下探索比 SFT 更符合偏好的策略。

可以把它理解成:

  1. SFT 教模型"像一个助手一样回答"。
  2. RM 教模型"什么样的回答更受人类偏好"。
  3. PPO 让模型"在不偏离太远的前提下,主动寻找更好的回答"。

DPO:RLHF 的简化替代

完整 RLHF 管线工程复杂度很高:要训练 RM,要维护参考模型,要在线采样,还要调 PPO、value head、KL 系数等一系列超参数。

2023 年提出的 DPO(Direct Preference Optimization) 给出了一条更简洁的路线:不显式训练 RM,也不运行 PPO,而是直接用偏好数据优化策略。

DPO 的关键洞察是,在带 KL 约束的最优策略形式中,奖励函数和策略之间存在如下关系:


r(x,y)=βlog⁡π∗(y∣x)πref(y∣x)+βlog⁡Z(x)r(x,y) = \beta \log \frac{\pi^*(y \mid x)}{\pi_{\mathrm{ref}}(y \mid x)} + \beta \log Z(x)r(x,y)=βlogπref​(y∣x)π∗(y∣x)​+βlogZ(x)

将它代入 Bradley-Terry 偏好模型后,归一化项 Z(x)Z(x)Z(x) 会在 chosen 和 rejected 的差分中抵消,于是得到直接优化策略的损失:


LDPO(πθ;πref)=−E(x,yw,yl)∼D[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))]\mathcal{L}_{\mathrm{DPO}}(\pi_\theta; \pi_{\mathrm{ref}}) = -\mathbb{E}_{(x,y_w,y_l) \sim \mathcal{D}} \left[ \log \sigma\left( \beta \log \frac{\pi_\theta(y_w \mid x)}{\pi_{\mathrm{ref}}(y_w \mid x)} - \beta \log \frac{\pi_\theta(y_l \mid x)}{\pi_{\mathrm{ref}}(y_l \mid x)} \right) \right]LDPO​(πθ​;πref​)=−E(x,yw​,yl​)∼D​[logσ(βlogπref​(yw​∣x)πθ​(yw​∣x)​−βlogπref​(yl​∣x)πθ​(yl​∣x)​)]

DPO 的含义很直观:相对于参考模型,提升 chosen 的生成概率,压低 rejected 的生成概率。它不需要显式 RM,也不需要 PPO 的在线 rollout 和价值函数。

维度 PPO-style RLHF DPO
显式 RM 需要 不需要
在线采样 需要 不需要,使用离线偏好数据
价值函数 通常需要 不需要
工程复杂度 高 低
灵活性 更容易接入复杂奖励 更依赖已有偏好数据覆盖

因此,资源充足的团队仍可能选择完整 PPO 管线或其变体(例如 GRPO、RLOO 等),而开源社区和中小团队常更青睐 DPO、IPO、KTO 这类更轻量的偏好优化方法。


总结

RLHF 解决的是预训练 LLM "能力强但不一定听话"的问题。它不是让模型突然拥有价值观,而是通过一套可训练的算法流程,把人类偏好压进模型的行为分布里。

从算法角度看,它是三段渐进式精炼:

  1. SFT:用人工示范教模型如何回答。
  2. RM:用偏好比较训练一个会打分的裁判。
  3. PPO:在裁判引导和 KL 约束下优化策略。

理解 RLHF,就是理解为什么对话模型不只是"知道下一个 token 可能是什么",还会学习"在这个上下文里,什么样的回答更应该被说出来。

上一篇LSH算法原理讲解:从文本相似到大规模候选检索

评论

正在加载评论…

正在检查登录状态…

avatar

Evernight

记录学习、代码与生活的片刻。

RECOMMENDED

LSH算法原理讲解:从文本相似到大规模候选检索

2026-05-19

BPE 分词算法原理讲解:大模型背后的词表构建基石

2026-05-19

从 Hexo 到 Nuxt:博客迁移全记录

2026-05-03

Table of Contents

© 2026 Evernight✦把片刻留给永夜

基于 XingHuiSama · Evernight 修改CC BY-NC 4.0