基础知识
RLHF 的三阶段流程
RLHF(Reinforcement Learning from Human Feedback)通常包含三个主要阶段:
监督微调(SFT)→ 偏好采样 + 奖励模型学习 → 强化学习优化(RL)
简单可以理解为:先学”怎么说话”,再学”什么话更好”,最后逼模型多说”好话”
阶段一:SFT(Supervised Fine-Tuning)
RLHF 通常从对一个预训练语言模型进行监督微调开始,使用高质量的人工数据(如对话、摘要等),得到一个模型 $ \pi_{SFT} $。
数据形式:$ (\text{prompt} x, \text{高质量回答} y) $
损失函数:标准的监督学习损失函数
- $ \pi_\theta $:策略模型的参数化形式
- $ D $:监督微调数据集
- $ x $:输入提示
- $ y $:目标回答
目标:让模型学会基本的对话能力和任务完成能力,即”怎么说话”
阶段二:奖励模型(Reward Modeling)
使用 SFT 模型,对同一个 prompt $ x $ 采样两个回答:
交给人类标注者,让他们选更好的一个:
- $ y_w $:winner,preferred(赢家)
- $ y_l $:loser,rejected(输家)
潜在奖励函数假设:假设人类偏好是由一个未知的真实奖励函数 $ r^*(x,y) $ 生成的。我们并不知道它,但假设它存在。
偏好模型:
数据集形式:
损失函数:
补充解释
BT 模型:
Bradley-Terry 模型是一个用于成对比较的概率模型
核心思想:
- 每个对象 $ i $ 有一个隐藏的”实力值”参数 $ \lambda_i $
- 当两个对象 $ i $ 和 $ j $ 比较时,$ i $ 战胜 $ j $ 的概率为:
在 DPO 中的应用:
- 将奖励函数 $ r(x,y) $ 看作”实力值”
- 人类偏好 $ y_w \succ y_l $ 就是”比较结果”
- 通过 BT 模型建立奖励与偏好的桥梁
为什么不用「谁分数大就选谁」?
如果直接规定:
那问题是:人类判断有噪声,同一个人、同一个问题,不一定每次选同样的。所以我们不建模成确定性规则,而是:概率模型
把公式 (1) 改写一下:
这就是熟悉的 Sigmoid 函数:
于是:
因为真实数据里人确实选择了 $ y_w $,所以该事件的概率是上式,对数似然是:
最大化所有样本的对数似然:
意思是:对每一条数据,都算一次”模型认为人类会选赢家的概率的对数”,然后把它们加起来,让这个总和尽可能大。对数把“连乘”变成“连加”,最优解不变(对数是单调递增函数)
等价地,最小化负对数似然(Likelihood):
这正是公式 (2)。意思是:对数据集里的样本取平均,然后对”对数概率”取负号,让这个值尽可能小。
对一个有限数据集 $ D = {z_1, …, z_N} $,如果你均匀随机从中抽一个样本,那么:
👉 期望 = 平均值
令 $ f(x,yw,y_l) = \log \sigma(r\theta(x,yw) - r\theta(x,y_l)) $ 那么:
因为 $ \sum{i=1}^N f_i $ 和 $ \frac{1}{N} \sum{i=1}^N f_i $ 只差一个常数 $ \frac{1}{N} $。而在优化中:乘以一个正的常数,不会改变最优解的位置。也就是说:
原目标:$ \max_\theta \mathbb{E}_D [\log \sigma(\cdots)] $
等价于:$ \min_\theta -\mathbb{E}_D [\log \sigma(\cdots)] $
于是定义:$ L_R = -\mathbb{E}_D [\log \sigma(\cdots)] $
为什么机器学习里”总是最小化”?
因为梯度下降(Gradient Descent)默认是 minimize loss,所以大家习惯:把”想最大化的目标”,写成”要最小化的损失”。
阶段三:RL 微调
RL 目标函数(核心):
补充解释
一句话解释:👉 让模型生成 奖励高的回答 👉 但不能偏离原始 SFT 模型太远
$ \pi{ref} $(即初始 SFT 模型 $ \pi{SFT} $)实践中,语言模型策略 $ \pi\theta $ 也被初始化为 $ \pi{SFT} $。
- 初始状态:$ \pi\theta = \pi{ref} = \pi_{SFT} $
- 训练目标:在保持与原始 SFT 模型接近的前提下,优化奖励
- KL 约束作用:确保模型不会偏离初始能力太远
KL 约束:
KL 散度(Kullback-Leibler 散度)衡量两个概率分布之间的差异:
这表示:
- 如果 $ \pi\theta $ 和 $ \pi{SFT} $ 相同:KL = 0
- 如果 $ \pi\theta $ 偏离 $ \pi{SFT} $:KL > 0
- 目标函数中的 $ -\beta KL $ 惩罚偏离行为
KL 散度推导过程详解
KL 散度的通用定义(离散型):
期望的定义:
对于随机变量 $ Y \sim P $,函数 $ f(Y) $ 的期望定义为:
进行变量映射
在 RLHF 的语境下,我们要计算的是两个模型策略(概率分布)之间的差异:
- $ P $ (当前分布):$ \pi_\theta(y|x) $ —— 模型当前正在学习的策略
- $ Q $ (参考分布):$ \pi_{SFT}(y|x) $ —— 原始的 SFT 策略
- 样本空间:$ y $(模型生成的所有可能的回答序列)
将这些代入通用公式:
转化为期望形式
外层加权部分与被加权项改写如下:
前者表示“按照 $ \pi_\theta(y|x) $ 分布做加权平均”,后者是被取期望的对象。
因此,根据 $ \sum P \cdot f = \mathbb{E}_P[f] $ 得:
为什么实践中要写成期望形式?
- 无法全量求和:语言模型的输出空间天文巨大,无法枚举 $ y $。
蒙特卡洛采样:通过采样 $ y \sim \pi_\theta $,计算
的平均值即可近似 KL。
对齐目标函数:原始 RL 目标也是期望形式,可写成:
这样每次采样就能同时更新奖励和 KL 惩罚。
为什么这个目标函数不可导?
语言模型生成序列是离散操作,导致 $ \mathbb{E}{y \sim \pi\theta(y|x)}[r(x,y)] $ 无法直接对 $ \theta $ 求导,只能用策略梯度(REINFORCE/PPO)。
KL 约束如何变成“奖励”?
先把公式 (3) 的 KL 项写成 log-prob 形式:
代回目标:
于是可以定义新的奖励:
即论文中常见的:
其中 $ \beta $ 可被吸收到系数里。
转换后的简化目标
此时 $ r(x,y) $ 已含 KL 惩罚,成为无约束奖励最大化问题。
直接偏好优化(Direct Preference Optimization)
版权声明
本文作者:ZhenWusi
本文链接:https://zhenwusi.github.io/2026/02/23/RLHF%20%E7%9A%84%E4%B8%89%E9%98%B6%E6%AE%B5%E6%B5%81%E7%A8%8B/
除特别声明外,本站所有文章均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!