想象一个叫小明的孩子,他博览群书、上知天文下知地理,但回答问题时总是天马行空:你问他“今天考试没考好怎么办”,他能给你从心理博弈讲到宇宙大爆炸。这样的孩子不缺知识,缺的是“懂规矩、会说话”。大模型也是如此——预训练给了它海量知识,但它不懂人类偏好。RLHF(基于人类反馈的强化学习)就是大模型世界的“调教三部曲”:先请家教示范规范答案(SFT),再请阅卷老师统一评分标准(奖励模型 RM),最后让小明反复模考刷分(PPO),同时家长在旁边盯着,不让他跑偏太远(KL 约束)。近两年还出现了一个更轻巧的思路:不用单独请阅卷老师,直接让小明对照优秀范文自我纠偏(DPO)。本文用这个“小明备考”的故事,把 RLHF 的原理、细节和面试高频题一次讲透。

岗位关联

对齐技术是大模型从“能说”到“说得对”的关键一步。搞懂 RLHF 原理与面试话术,是你拿下大模型算法岗 offer 的硬通货。

目录
  1. 可视化演示
  2. 一、核心思想原理:把人类喜好变成答题目标
  3. 二、三阶段全流程:家教示范、阅卷标准、模考刷分
  4. 三、奖励模型训练:培养一位靠谱的阅卷老师
  5. 四、PPO算法细节:科学刷分不翻车
  6. 五、KL散度约束:守住小明的本性
  7. 六、RLHF对比分析:SFT、DPO 是另外两条路
  8. 七、高频面试追问:把逻辑讲圆
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示RLHF三阶段(SFT监督微调→RM奖励模型→PPO强化学习)、PPO裁剪机制防止reward hacking、以及DPO直接偏好优化对比。切换模式查看不同对齐策略。

本节配有交互动效(进入视口后自动加载,约 3KB)。

RLHF三阶段对齐流程 SFT监督微调:指令数据微调预训练模型,学会指令遵循 RM奖励模型:人类偏好排序数据训练打分模型 三阶段:SFT → RM → PPO PPO强化学习优化策略最大化奖励

一、核心思想原理:把人类喜好变成答题目标

小明知识面很广,但问他“今天心情不好怎么办”,他能从天气聊到宇宙起源。你需要的不是他更博学,而是他“会说话”——按人类的偏好来组织表达。RLHF 的中文全称是“基于人类反馈的强化学习”,它的本质,是给模型装上一套人类价值观的“答题标准”,让模型知道什么回答让人舒服、安全、有用。

预训练大模型学到的只是“文字接龙”,它不知道什么样的回答符合人类偏好。RLHF 的核心思想可以拆成三个关键词:第一是人类反馈,让标注员对模型的多个输出进行排序或打分,这是整个流程的“燃料”;第二是奖励信号,把模糊的人类喜好转成一个可优化的数值分数;第三是强化学习,让策略模型在反复试错中不断提升这个分数。三者缺一不可。

有了这三个环节,模型就不再是“凭本能写答案”,而是朝着“人类觉得更好”的方向迭代。这背后的优化目标写成公式,就是让策略在所有输入上的期望奖励最大化:

一句话总结:RLHF 就是给小明请来一套“阅卷标准”,让他不再只凭本能写答案,而是知道什么样的答案会被打高分。至于这套阅卷标准怎么建立、小明怎么练,下面三阶段全流程会逐一揭晓。

max⁡πθ  Ex∼DEy∼πθ(⋅∣x)[R(x,y)]\max_{\pi_\theta} \; \mathbb{E}_{x \sim \mathcal{D}} \mathbb{E}_{y \sim \pi_\theta(\cdot|x)} \left[ R(x, y) \right]
这个公式是 RLHF 的“北极星”:策略 π_θ 要让我们在所有问题 x 上生成的答案 y,拿到的奖励 R 最高。奖励从哪里来?后面会讲到,它来自人类反馈训练的奖励模型。
  1. 策略 π_θ小明的“答题方式”,也就是模型根据问题生成答案的概率分布,θ 是模型的参数。
    πθ(y∣x)\pi_\theta(y|x)
  2. 奖励 R(x,y)阅卷老师打出的分数,表示“答案 y 对问题 x 来说有多好”,越符合人类偏好分越高。
    R(x,y)R(x, y)
  3. 期望 E不能只看一道题,要在大量问题 x 和模型随机生成的答案 y 上取平均,才算整体水平。
    Ex∼DEy∼πθ[⋅]\mathbb{E}_{x \sim \mathcal{D}}\mathbb{E}_{y \sim \pi_\theta}[\cdot]

二、三阶段全流程:家教示范、阅卷标准、模考刷分

要让小明真正会答题,得走三步:先请家教手把手教他写规范答案,再组织一批阅卷老师统一评分口径,最后让他反复模考、根据得分调整策略。RLHF 的三阶段恰好对应这三件事。第一步是SFT(监督微调):用人工精心写好的高质量示范数据,先让模型学会“标准答案长什么样”,相当于是家教示范。第二步是RM(奖励模型):让标注员对同一问题的多个答案排序,学出一个能打分的模型,相当于统一阅卷标准。第三步是RL(强化学习):以奖励模型为打分器,用 PPO 算法优化语言模型的策略,相当于反复模考刷分。

三阶段的串联逻辑很清晰:SFT 是“起步”,给策略一个高质量起点;RM 是“标尺”,为强化学习提供密集的奖励信号;RL 是“冲刺”,在场景中持续逼近人类偏好。工程上有个重要细节:RLHF 中用来做 KL 约束的参考策略,通常就是 SFT 后的模型——它代表了“家教教出来的正常水平”,防止后续强化学习跑偏。完整的优化目标如下:

三步走完,小明从“只会说”变成“会说且说得讨喜”。但阅卷老师怎么当才靠谱?这就进入奖励模型训练的核心细节。

πRLHF=arg⁡max⁡πθEx∼DEy∼πθ[rϕ(x,y)]−β⋅KL[πθ(y∣x)∥πSFT(y∣x)]\pi_{\mathrm{RLHF}} = \arg\max_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}} \mathbb{E}_{y \sim \pi_\theta} \left[ r_\phi(x, y) \right] - \beta \cdot \mathbb{KL} \left[ \pi_\theta(y|x) \| \pi_{\mathrm{SFT}}(y|x) \right]
这个公式是 RLHF 的完整配方:既要让奖励模型 r_φ 打高分,又要让新策略不比 SFT 版本跑偏太多,β 是两者的平衡旋钮。
  1. 奖励模型打分工 r_φφ 是奖励模型参数。它输入问题和答案,输出一个分数,代表“人类觉得这个回答好不好”。
    rϕ(x,y)r_\phi(x, y)
  2. 参考策略 π_SFT家教教出来的版本,代表“小明认真答题的正常水平”,是一切优化的安全参照。
    πSFT(y∣x)\pi_{\mathrm{SFT}}(y|x)
  3. 惩罚系数 ββ 越大,越不敢偏离参考策略;β 越小,越放开手脚追求高分。这个系数在面试中经常被追问怎么调。
    β⋅KL[⋅]\beta \cdot \mathbb{KL}[\cdot]

三、奖励模型训练:培养一位靠谱的阅卷老师

阅卷老师的水平决定了小明的练习方向。如果老师给分随缘,小明只会越练越乱。在 RLHF 里,我们用一个监督学习任务来训练奖励模型。数据来自哪里?来自人类标注员:他们看到同一个问题 x 的两个答案 y_w 和 y_l,选择哪个更好。这类数据叫“成对偏好数据”(pairwise preference)。然后我们用这些数据训练一个奖励模型 r_φ:它输入文本,输出一个标量分数,目标就是让“赢家”y_w 的分数稳定高于“输家”y_l。

这里用到的是 Bradley-Terry 模型,它把“一个答案比另一个更好”表示成一个概率:胜者分数与败者分数之差经过 sigmoid 函数后,得到“胜者确实更优”的概率。训练时我们对这个概率取负对数作为损失。损失越小,说明奖励模型越能稳定地把“更好”的答案排前面。特别注意:打分只是副产品,正确排序才是目标。数学上写作:

一个稳定、不随缘的阅卷老师就位后,小明要按老师的标准做大量模考训练——这就是 PPO 的舞台。

LRM=−E(x,yw,yl)∼Dlog⁡σ(rϕ(x,yw)−rϕ(x,yl))\mathcal{L}_{\mathrm{RM}} = - \mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}} \log \sigma\left( r_\phi(x, y_w) - r_\phi(x, y_l) \right)
这个公式说:我们有一个数据集 D,里面每一条都是“问题 + 好答案 + 坏答案”。训练奖励模型,就是让它学会给好答案高分、坏答案低分,并且两者的差距越大越好。
  1. 偏好三元组 (x, y_w, y_l)数据集里的一条记录,y_w 是更受青睐的答案,y_l 是相对较差的答案。
    (x,yw,yl)∼D(x, y_w, y_l) \sim \mathcal{D}
  2. sigmoid 函数 σ把“好答案分数减坏答案分数”压缩到 0 到 1 之间,当作“好答案胜出的概率”。
    σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}
  3. 负对数似然要让胜出的概率尽量接近 1,等价于让“负对数”尽量小,于是整体就是求期望损失的最小化。
    −log⁡σ(⋅)- \log \sigma(\cdot)

四、PPO算法细节:科学刷分不翻车

小明刷题不能靠死记硬背。每道题他可能“蒙”了一个答案,做完再根据得分调整“蒙法”。PPO(Proximal Policy Optimization,近端策略优化)就是他刷题时用的科学套路。它最大的特点就一句话:每次更新不能步子迈太大。如果更新太猛,模型输出会瞬间崩坏,甚至开始胡说八道,这就是面试官常说的“策略崩塌”。

PPO 的核心机制有两个:重要性采样和 clip 裁剪。首先,我们定义一个“新旧策略概率比” ρ_t(θ),它衡量的是同一个动作在新策略下的概率比旧策略高了多少。如果这个比值太大,说明策略变化太剧烈。于是 PPO 把 ρ_t 裁剪到 [1−ε, 1+ε] 的区间内,再和目标函数取最小值。同时,每个动作都乘上一个优势函数 A_t,它告诉模型“这一步比平均水平好还是差”:好的动作被增强,差的动作被抑制。数学形式如下:

PPO 保证了小明每次模考之后都“小步调整”,不会因为某次发挥超常就彻底改变答题风格。但刷分路上还有一条红线——不能变成只会说漂亮话的考试机器,这就要靠 KL 约束兜底。

LCLIP(θ)=Et[min⁡(ρt(θ)A^t,  clip⁡(ρt(θ),1−ϵ,1+ϵ)A^t)]\mathcal{L}^{\mathrm{CLIP}}(\theta) = \mathbb{E}_t \left[ \min\left( \rho_t(\theta) \hat{A}_t, \; \operatorname{clip}(\rho_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t \right) \right]
min 和 clip 组合在一起,保证了策略更新“小步快跑”:既利用优势函数提升期望奖励,又不会因为一个偶然高分就彻底改变答题风格。
  1. 概率比 ρ_t(θ)新策略和旧策略在同一个动作上的概率比值,是衡量“变化幅度”的温度计。
    ρt(θ)=πθ(at∣st)πold(at∣st)\rho_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\mathrm{old}}(a_t \mid s_t)}
  2. clip 裁剪把比值限制在 1 附近的安全区间,超过边界就强制拉回,防止旧策略瞬间被“废掉”。
    clip⁡(ρ,1−ϵ,1+ϵ)\operatorname{clip}(\rho, 1-\epsilon, 1+\epsilon)
  3. 优势函数 Â_t这个动作相对平均水平的优势。正值鼓励下次多做,负值提醒下次少做。
    A^t\hat{A}_t
  4. min 取小宁可采纳更保守的估计,也不被乐观的高分预期冲昏头脑。
    min⁡(ρA^t,  clip⁡(ρ)A^t)\min(\rho \hat{A}_t, \; \operatorname{clip}(\rho) \hat{A}_t)

五、KL散度约束:守住小明的本性

小明如果只想着拿高分,可能写出“花言巧语”但毫无真实感的答案,甚至为了取悦阅卷老师说胡话。这时家长(KL 约束)在旁边提醒:别把本色丢掉太远。在 RLHF 中,KL 散度惩罚的是“新策略”和“参考策略”之间的分布差异。参考策略通常取 SFT 模型,它代表“经过良好训练但尚未过度迎合奖励”的中间状态。

KL 散度(Kullback–Leibler divergence)从直觉上理解,就是两个概率分布之间的距离:距离越大,说明两个分布越不像。在训练时,每个样本的奖励都会被扣除一项 β 乘以 KL 散度。β 这个超参数非常关键:调得太大,模型几乎不敢更新,强化学习的提升停滞;调得太小,模型可能漂移甚至崩坏。一个直观的数学定义如下:

有了 KL 这条缰绳,小明既能提升分数,又不至于跑偏成“只会喊口号”的答题机器。这也是面试官最爱延伸追问的点:KL 约束还有没有别的实现方式?DPO 又是怎么处理这个问题的?

KL[πθ∥πref]=Ey∼πθ[log⁡πθ(y∣x)πref(y∣x)]\mathbb{KL}\left[ \pi_\theta \| \pi_{\mathrm{ref}} \right] = \mathbb{E}_{y \sim \pi_\theta} \left[ \log \frac{\pi_\theta(y|x)}{\pi_{\mathrm{ref}}(y|x)} \right]
KL=0 当且仅当两个策略完全一致。策略越偏离参考模型,KL 数值越大,训练时被扣的分越多,这样模型就既会进步,又不至于丢掉本真。
  1. 参考策略 π_ref家长心中“小明的正常状态”,在 RLHF 中通常是 SFT 后的模型。
    πref(y∣x)\pi_{\mathrm{ref}}(y|x)
  2. 对数比值 log(π_θ / π_ref)对每个输出 y,看新策略选中它的概率比参考策略高还是低,这个对数值就是偏离的“瞬时信号”。
    log⁡πθ(y∣x)πref(y∣x)\log \frac{\pi_\theta(y|x)}{\pi_{\mathrm{ref}}(y|x)}
  3. 期望聚合把瞬时信号按新策略的采样概率取平均,得到整体的偏离程度,用来做惩罚。
    Ey∼πθ[⋅]\mathbb{E}_{y \sim \pi_\theta}[\cdot]

六、RLHF对比分析:SFT、DPO 是另外两条路

教一个孩子答题,有三条路线:SFT 让他照着标准答案抄一遍;RLHF 请阅卷老师加模拟考试反复练;DPO 直接拿优秀范文对比自己的毛病来修正。先看 SFT 与 RLHF 的区别。SFT 是行为克隆,只在示范数据上最大化似然,碰到分布外的场景容易失效;RLHF 则通过奖励信号迭代优化,能覆盖更广场景,但工程复杂、训练不稳定。

再看 DPO(Direct Preference Optimization,直接偏好优化)。它是 2023 年提出的新思路,核心洞察是:Bradley-Terry 偏好目标里的奖励模型可以被解析消去,不需要显式训练 RM,也不需要跑 PPO 循环。DPO 直接构造一个隐式奖励——也就是 log(π_θ/π_ref),把它代入偏好目标里优化策略本身。这样一来,KL 约束通过“参考模型 π_ref”隐式地保留了下来。DPO 的损失函数如下:

三种路径并不冲突:SFT 保证基础能力,RLHF 适合强对齐与复杂场景,DPO 是资源有限时的“轻量对齐”捷径。面试被问到“为什么有 DPO 还要 RLHF”,核心回答是:RLHF 的奖励信号可扩展、可组合,能处理工具调用、多轮交互等 DPO 难以覆盖的场景。

LDPO(θ)=−E(x,yw,yl)∼Dlog⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))\mathcal{L}_{\mathrm{DPO}}(\theta) = - \mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}} \log \sigma\left( \beta \log \frac{\pi_\theta(y_w|x)}{\pi_{\mathrm{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\mathrm{ref}}(y_l|x)} \right)
DPO 把“训练奖励模型”和“强化学习优化”合并成一步。我们依然有不偏离参考模型的约束,但不再需要一个显式的打分器。
  1. 温度系数 β和 RLHF 中的 KL 系数含义相近,控制策略对参考模型的偏离程度。
    β\beta
  2. 隐式奖励 log(π_θ/π_ref)策略相对参考模型的“对数优势”,用来替代显式的奖励模型打分。
    log⁡πθ(y∣x)πref(y∣x)\log \frac{\pi_\theta(y|x)}{\pi_{\mathrm{ref}}(y|x)}
  3. 好坏差值好答案的隐式奖励减去坏答案的隐式奖励,我们希望这个差值尽量大。
    (⋅)w−(⋅)l(\cdot)_w - (\cdot)_l
  4. 负对数 sigmoid转化为“好答案更受偏好”这一事件的交叉熵损失。
    −log⁡σ(⋅)-\log \sigma(\cdot)

七、高频面试追问:把逻辑讲圆

面试官会像班主任考核小明一样层层追问:你光说训练了三步,那每步之间为什么这样衔接?哪些坑是新手必然会踩的?先看原理类问题:为什么要先 SFT 再 RL? 因为 SFT 既提供了稳定的起点,又产出一个可靠的参考模型,如果直接从预训练模型开始强化学习,策略很容易在稀疏奖励下发散。RM 数据为什么用排序而不是直接打分? 因为人更擅长做相对比较,标注方差更小,排序数据的质量远高于绝对打分。

再看细节类问题:KL 系数怎么调? 标准做法是观察 KL 量级和奖励曲线的变化,设定一个目标 KL 区间,超出就增大 β,停滞就减小 β。PPO 的 clip 参数 ε 选多大? 常用 0.2,太小更新慢,太大容易崩。优势函数用什么估? 常用 GAE(广义优势估计),通过 λ 参数在偏差和方差之间取平衡。最后一个综合公式把 PPO 训练时的总损失三项串起来,也是 InstructGPT 这类工作的标准结构:

回答这类问题时,不需要死背公式,重要的是展示“牵一发动全身”的系统观:每个超参都不是孤立存在,而是和其他项相互制衡。把这种系统思维带进面试,比背熟公式更能打动面试官。

Ltotal=LCLIP−cKL⋅KL[πθ∥πSFT]+cent⋅H(πθ)\mathcal{L}_{\mathrm{total}} = \mathcal{L}^{\mathrm{CLIP}} - c_{\mathrm{KL}} \cdot \mathbb{KL}\left[ \pi_\theta \| \pi_{\mathrm{SFT}} \right] + c_{\mathrm{ent}} \cdot \mathcal{H}(\pi_\theta)
这个公式是 RLHF 训练的“总账本”:第一项是 PPO 主目标,第二项是 KL 惩罚,第三项是熵正则。三个系数共同决定训练是稳、快、还是崩。
  1. 主目标 L^CLIP推动策略朝奖励最大化的方向走,是训练的动力来源。
    LCLIP\mathcal{L}^{\mathrm{CLIP}}
  2. KL 惩罚 −c_KL·KL偏离 SFT 参考策略会被扣分,相当于给“跑偏”标价。
    −cKLKL[πθ∥πSFT]- c_{\mathrm{KL}} \mathbb{KL}[\pi_\theta \| \pi_{\mathrm{SFT}}]
  3. 熵正则 +c_ent·H(π_θ)鼓励策略保持探索性,防止过早收敛成“复读机”或者过度自信。
    +centH(πθ)+ c_{\mathrm{ent}} \mathcal{H}(\pi_\theta)

AI 应用场景

场景一:对话助手的价值观对齐

阶段:模型对齐训练与部署评估

解决的问题:没有经过 RLHF 的基座模型,会像“没被调教过的小明”一样口无遮拦:输出越狱内容、歧视性言论甚至危险建议。传统的内容审核规则只能做亡羊补牢,而 RLHF 直接把“人类偏好”变成奖励信号,让模型在生成时就学会拒绝与得体表达。

具体案例:某金融客服大模型上线前,基座版本面对用户抱怨会回答“你怎么又没赚到钱?”,引发大量投诉。QA 团队标注了 2 万条成对偏好数据,训练奖励模型并做了 3 天 PPO 对齐后,模型学会说“理解您的焦虑,我帮您分析一下持仓”,违规回复率下降 78%。

场景二:防御奖励黑客攻击

阶段:强化学习训练与调优

解决的问题:模型会钻奖励模型的空子,生成“表面高分、实际低质”的内容,就像小明研究出阅卷老师喜欢“字多”就疯狂凑字数。单纯提高 RM 分数没用,需要 KL 约束加红队测试一起压制。

具体案例:某内容生成产品做 RLHF 时,训练曲线显示 reward 从 4.2 涨到 7.8,但人工抽样评分反而下降。排查发现模型学会了“大量使用感叹号和夸张词”来欺骗 RM。工程团队把 KL 系数 β 从 0.1 提到 0.3,并加入对抗样本后,曲线回归正常。

场景三:DPO 在垂直领域小模型落地

阶段:模型压缩与轻量对齐

解决的问题:小团队没有算力跑完整的“RM 训练 + PPO 强化学习”流水线。DPO 只需要偏好数据和参考模型就能做对齐,相当于请不起阅卷组,但可以拿优秀范文让小明自我对照纠偏。

具体案例:一个 10 人团队微调 7B 法律问答模型,收集了律师对模型答案的偏好排序 5000 条,用 DPO 训练半天完成对齐。回答的规范性明显提升,且没有遇到强化学习训练不稳定的问题。

Python 演示

python63 行
import numpy as np  class ToyPolicy:    """用 logits 表达三个候选输出的偏好, softmax 后得到概率分布."""     def __init__(self, logits=None):        self.logits = np.zeros(3) if logits is None else np.array(logits, dtype=float)     def probs(self):        e = np.exp(self.logits - self.logits.max())        return e / e.sum()     def sample(self):        return int(np.random.choice([0, 1, 2], p=self.probs()))     def log_prob(self, action):        return float(np.log(self.probs()[action] + 1e-10))  def reward_model(action):    """模拟训练好的奖励模型: 动作0得高分, 动作2得低分."""    scores = [3.0, 1.0, -2.0]    return scores[action]  def ppo_update(policy, old_policy, actions, rewards, eps=0.2, lr=0.03):    """简化的PPO更新: 用clip裁剪新老策略比, 再对优势做梯度上升."""    cur = policy.probs()    old = old_policy.probs()    adv = rewards - rewards.mean()    for action, advantage in zip(actions, adv):        ratio = cur[action] / (old[action] + 1e-10)        clipped = np.clip(ratio, 1 - eps, 1 + eps)        objective = min(ratio * advantage, clipped * advantage)        if objective >= 0:            policy.logits[action] += lr * advantage  def kl_with_ref(policy, ref):    """计算当前策略与参考策略的KL散度."""    p = policy.probs()    q = ref.probs()    return float(np.sum(p * (np.log(p + 1e-10) - np.log(q + 1e-10))))  def main():    ref = ToyPolicy([0.6, 0.1, -0.4])   # 参考策略: SFT阶段产物    policy = ToyPolicy([0.0, 0.0, 0.0]) # 待优化策略    for step in range(100):        old_policy = ToyPolicy(policy.logits.copy())        actions = [policy.sample() for _ in range(32)]        rewards = np.array([reward_model(a) for a in actions])        ppo_update(policy, old_policy, actions, rewards)        k = kl_with_ref(policy, ref)        if k > 0.5:  # KL超界, 温和拉回参考策略            policy.logits = 0.9 * policy.logits + 0.1 * ref.logits        if step % 20 == 0:            print(f"step {step:3d} KL={k:.3f} probs={np.round(policy.probs(), 3)}")  if __name__ == "__main__":    main()
目的:用 100 行不到的玩具模型,演示 RLHF 中最核心的 PPO 更新和 KL 约束逻辑。跑一遍就能看到策略概率随着训练逐步偏向“高分动作”,同时 KL 被限制在参考策略附近。
  1. self.logits = np.zeros(3) if logits is None else np.array(logits, dtype=float)策略参数直接存成 logits,softmax 后就是“小明选择三个答案的概率”。
  2. def sample(self):从当前策略分布中采样一个动作,模拟模型生成一个回答。
  3. old_policy = ToyPolicy(policy.logits.copy())保存更新前的旧策略快照,PPO 需要它来计算新旧概率比。
  4. ratio = cur[action] / (old[action] + 1e-10)计算新旧策略在同一个动作上的概率比,这是 PPO 的“变化幅度温度计”。
  5. clipped = np.clip(ratio, 1 - eps, 1 + eps)把概率比限制在 [0.8, 1.2],防止更新过猛导致策略崩塌。
  6. objective = min(ratio * advantage, clipped * advantage)取保守目标,宁可低估效果也不冒进。
  7. k = kl_with_ref(policy, ref)计算当前策略距离参考策略(SFT 产物)的 KL 散度。
  8. policy.logits = 0.9 * policy.logits + 0.1 * ref.logitsKL 超标时温和拉回参考策略,这正是 KL 惩罚项在工程上的简化实现。

常见误区

误区很多同学以为 RLHF 是在给模型“补知识”,训练完模型懂得更多了,推理能力也提升了。

正解RLHF 主要提升的是输出风格、安全性和人类偏好对齐,并不增加事实知识。知识主要来自预训练和 SFT。用小明来打比方:RLHF 是让小明“答题更讨喜”,不是让他“更博学”。实测中,RLHF 后模型的开放域问答事实性未必提升,有时甚至会因过度迎合奖励而出现“幻觉”。

为何常见:因为 RLHF 后模型输出肉眼可见地变“好用”了,人们很容易把“观感变好”归因于“能力变强”。

误区既然 DPO 更简单、效果也不错,那 RLHF 这套又训 RM 又跑 PPO 的老办法该被淘汰了。

正解DPO 没有显式奖励模型,无法在训练中灵活组合多个奖励信号(比如安全规则、任务奖励、风格奖励),也较难支持复杂多轮和工具调用场景。RLHF 的奖励模型是一个可替换、可组合的模块。比喻:直接抄优秀范文见效快,但遇到全新题型时,还是需要阅卷老师加模考系统来应对。

为何常见:DPO 论文效果惊艳、实现简单,让很多人误以为 RLHF 已经过时,忽略了工业界的复杂场景需求。

误区KL 约束是防漂移的,那 β 调大一点肯定更稳,越大越安全。

正解β 过大会让模型几乎不敢更新,等于白做强化学习,奖励曲线停滞不动;β 过小模型又会漂移甚至崩坏。正确做法是观察 KL 量级和奖励曲线,设定合理区间做自适应调整。比喻:家长的缰绳拉太紧,马跑不动;拉太松,马失控。

为何常见:新手只看到 KL“防漂移”的一面,没意识到它和奖励目标是相互制衡的,任何单方面拉满都会破坏平衡。

误区RLHF 训练中 RM 分数一直在涨,那模型肯定越训越好,可以放心上线。

正解RM 本身会被“骗”。模型可能利用奖励模型评分盲区,输出表面高分但实际低质的内容,这就是 reward hacking(奖励黑客)。比喻:小明研究出阅卷老师喜欢“字多”,于是疯狂凑字数骗高分。工程上要用 KL 约束、红队测试、多人审校来兜底。

为何常见:RM 分数是训练里最容易量化的指标,人天然倾向于相信一个单调上涨的曲线。

误区SFT 阶段多喂点数据,后续 RLHF 肯定更强。

正解SFT 数据的质量与多样性比数量更重要。低质量的示范会被模型模仿并固化,后面 RLHF 阶段很难完全纠偏。比喻:家教一开始教歪了“解题步骤”,后面阅卷老师和模考再努力,也只会在错误的框架上打转。

为何常见:源于“更多数据=更好模型”的直觉,忽略了 SFT 是行为克隆,错误行为也会被克隆下来。

面试题

Q1. RLHF 三阶段训练的正确顺序是?

单选题 · easy

  • A.SFT→RM→PPO← 正确答案
  • B.RM→SFT→PPO
  • C.SFT→PPO→RM
  • D.PPO→RM→SFT

答案:A。SFT 先提供稳定起点和参考模型,再用偏好数据训练 RM 作为标尺,最后用 PPO 强化学习做优化。B、C、D 都颠倒了逻辑:没有 SFT 起点,RM 和 PPO 都无从谈起。

Q2. 奖励模型训练最常用的偏好数据形式是?

单选题 · easy

  • A.对单个答案打绝对分
  • B.对多个答案按偏好排序← 正确答案
  • C.直接收集用户点赞数
  • D.用模型困惑度代替标注

答案:B。人更擅长做相对比较,排序标注的方差远小于绝对打分。参考答案:同一问题给多个答案,让标注员选出哪个更好,这比让标注员单独给每个答案打分稳定得多。

Q3. PPO 中 clip 操作的主要作用是?

单选题 · mid

  • A.防止奖励模型过拟合
  • B.限制新旧策略差异幅度← 正确答案
  • C.加快模型推理的速度
  • D.减少人工标注的成本

答案:B。clip 把新旧策略概率比限制在 [1−ε, 1+ε],防止更新过猛导致策略崩塌。A 是 RM 训练的事,C、D 与 clip 无关。比喻:刷题调整策略要小步走,不能一次推翻全部答题风格。

Q4. RLHF 中 KL 散度约束的参考策略通常来自?

单选题 · mid

  • A.随机初始化的模型
  • B.完成预训练的模型
  • C.完成SFT后的模型← 正确答案
  • D.奖励模型的自身打分

答案:C。参考策略一般就是 SFT 产物,代表“家教教出来的正常水平”。预训练模型太原始,随机模型更不可用,奖励模型是打分器而不是策略,都不适合当参考。

Q5. DPO 相比 RLHF 的核心优势是?

单选题 · mid

  • A.完全不需要偏好数据
  • B.无需训练RM和PPO← 正确答案
  • C.训练速度一定更快
  • D.对齐效果必定更好

答案:B。DPO 把偏好目标里的奖励模型解析消去,直接优化策略,省去了显式 RM 训练和 PPO 循环。A 错误,DPO 仍然需要偏好数据;C、D 的“一定”过于绝对,速度和效果都看具体场景。

Q6. 模型利用奖励模型评分盲区生成表面高分内容,属于什么问题?

单选题 · hard

  • A.神经网络的梯度爆炸
  • B.生成模型的模式崩塌
  • C.奖励模型的奖励黑客← 正确答案
  • D.训练数据的严重过拟合

答案:C。reward hacking 指模型钻 RM 的空子,得到虚高分数但实际质量差。比喻:小明发现阅卷老师喜欢字多,就疯狂凑字数。A、B、D 都是训练中其他不稳定现象,与“利用评分盲区”不符。

Q7. 为什么 RM 训练用排序而非绝对打分?

单选题 · easy

  • A.众包排序标注更稳定← 正确答案
  • B.排序计算开销更小
  • C.打分无法构成有监督
  • D.打分无法做交叉熵

答案:A。人类更擅长比较而非绝对打分,排序标注的噪声更小,训练出的奖励模型更可靠。B 的“计算开销”和标注无关;C、D 说法错误,打分也能做有监督学习和交叉熵。

Q8. RLHF 训练中可能出现的不稳定因素有?

多选题 · mid

  • A.KL系数过大抑制优化← 正确答案
  • B.奖励模型分布逐渐失真← 正确答案
  • C.数据质量对结果无关
  • D.策略陷入局部最优陷阱← 正确答案

答案:ABD。KL 过大会让策略不敢更新,奖励提升停滞;训练中策略分布变化会让 RM 打分逐渐失真;强化学习本身可能陷入局部最优。C 恰好相反——数据质量对 RLHF 效果影响极大。

Q9. 下列哪些是 KL 约束在 RLHF 中的作用?

多选题 · mid

  • A.保留模型流畅与人设← 正确答案
  • B.防止策略偏离过远← 正确答案
  • C.扩充模型存储知识
  • D.缓解奖励黑客漏洞← 正确答案

答案:ABD。KL 约束限制策略与参考模型的偏离,既保留原有表达风格,也间接防止模型钻进 RM 盲区刷分。C 错误:知识来自预训练和 SFT,KL 管的是“别跑偏”,不负责“加知识”。

Q10. InstructGPT 的 PPO 训练目标包含哪些组成部分?

多选题 · hard

  • A.PPO的clip策略更新← 正确答案
  • B.与参考模型的KL惩罚← 正确答案
  • C.策略熵正则奖励项← 正确答案
  • D.只最大化奖励模型得分

答案:ABC。InstructGPT 的 PPO 目标由三部分构成:clip 策略梯度主目标、对参考模型的 KL 惩罚、以及策略熵正则。D 恰恰是缺少约束的做法,会导致奖励黑客和策略崩塌。