RL Basic
RL Basic
Section titled “RL Basic”补一点基本的 RL 相关的内容,作为后文的前置知识
和普通的监督学习不一样,RL 的行为逻辑是:
-
智能体在环境里看到一个状态
-
采取动作
-
环境返回奖励
-
同时转移到下一个状态
所以 RL 的本质是:通过与环境不断交互,学到一个策略,使长期累计奖励最大。
如果把目标定得更明确一点,这里并不是要系统学完整套强化学习,而是先把 PPO 在解决什么问题、公式里的符号分别表示什么、训练流程为什么这么设计补齐。
所以看 PPO 之前,前置知识其实不用很多,但要补得准。最核心的四层是:
-
MDP 与交互过程
-
价值函数与优势函数
-
策略梯度
-
从 TRPO 到 PPO 的”为什么要限制更新幅度”
PPO 论文默认把环境建模成 马尔可夫决策过程(MDP, Markov Decision Process)。一个 MDP 通常写成:
分别表示:
- :状态空间
- :动作空间
- :状态转移概率
- 或 :奖励函数
- :折扣因子
这里最关键的假设是 马尔可夫性:
也就是:下一个状态只依赖当前状态和当前动作,不依赖更久之前的历史。这个假设很重要,因为后面很多价值函数和递推公式都建立在它上面。
一条交互轨迹通常记作:
PPO 训练时会先用当前策略去环境里跑,收集很多这样的轨迹,这个过程常叫:
- sampling
- rollout
- collect trajectories
你在 PPO 代码里经常看到的 obs、actions、rewards、dones、log_probs、values,本质上就是一批 rollout 数据。
Return、Policy、Value
Section titled “Return、Policy、Value”这一部分是看 PPO 前最需要先吃透的内容。如果这里没建立起来,后面的 loss 会显得很抽象。
Return
Section titled “Return”从时刻 开始的累计回报定义为:
它表示:从当前开始,未来总共能拿到多少奖励。
之所以要乘折扣因子 ,直觉上有三个原因:
- 更远处的奖励权重更小
- 数学上更稳定
- 表达”越近的收益越重要”
Policy
Section titled “Policy”策略就是”在一个状态下怎么选动作”的规则,通常记为:
表示在状态 下选择动作 的概率。参数化之后通常写成:
其中 是策略网络参数。PPO 这类方法通常使用随机策略,因为它本质上属于策略梯度方法。
State Value
Section titled “State Value”状态价值函数定义为:
意思是:如果当前在状态 ,之后都按照策略 行动,期望能拿到多少累计回报。
它评估的是:这个状态本身有多好。
Action Value
Section titled “Action Value”动作价值函数定义为:
意思是:在状态 下先采取动作 ,后面继续按策略 行动,期望总回报是多少。
它评估的是:在这个状态下做这个动作有多好。
Advantage
Section titled “Advantage”优势函数定义为:
它表示:这个动作比该状态下的平均水平好多少。
拆开看就很好理解:
- :状态 的平均水平
- :在 下选了动作 的效果
- 两者相减:这个动作相对平均水平到底是赚了还是亏了
因此:
- :这个动作比平均好,应该提高它的概率
- :这个动作比平均差,应该降低它的概率
后面 PPO 目标函数里的 ,本质上就在做这件事。
Bellman 关系
Section titled “Bellman 关系”虽然这里不展开完整推导,但至少要能看懂它在表达什么。
因为 return 满足:
所以价值函数会满足 Bellman expectation equation:
直觉上就是:
当前状态的价值 = 当前奖励 + 下一个状态的折扣价值。
类似地:
这两个递推关系后面会直接连到 TD、GAE、critic。
Actor-Critic 与 TD
Section titled “Actor-Critic 与 TD”如果直接用采样得到的 去更新策略,方差通常会很大,训练不稳定。所以强化学习里常引入一个网络专门预测 ,这就是 critic;而输出动作分布 的策略网络叫 actor。
于是就有:
- Actor:输出动作分布
- Critic:输出状态价值
PPO 本质上就是一个 actor-critic 方法。
进一步,如果每次都等整条 trajectory 结束,再去计算完整 return,效率低,方差也大。于是引入 Temporal Difference, TD 的思想,定义一步 TD 误差:
它表示的是:当前价值估计和”一步奖励 + 下一个状态价值”这个目标之间差了多少。
可以这样理解:
- :说明这个状态比原来估得更好
- :说明原来的价值估计偏高了
这个量后面会直接进入 GAE。
GAE:PPO 里的 Advantage 是怎么来的
Section titled “GAE:PPO 里的 Advantage 是怎么来的”PPO 公式里经常出现 。很多实现里它并不是直接用 Monte Carlo return 算出来的,而是通过 GAE(Generalized Advantage Estimation) 来估计。
理论上:
但 往往拿不到,所以只能估计。
最简单的一步近似就是刚才的 TD 误差:
它本身就可以看成一种一步 advantage 估计。
GAE 则是把未来很多步的 TD 误差按权重累加起来:
其中:
- :折扣因子
- :控制 bias-variance tradeoff 的参数
最重要的直觉是:
- 小:更依赖短期 TD,偏差大一点,但方差小
- 大:更接近 Monte Carlo,偏差小,但方差大
PPO 常用 GAE,就是为了得到一个相对稳定的 advantage 估计。
这是 PPO 最直接的理论来源。
强化学习里我们希望最大化策略的期望回报:
其中 是整条轨迹的回报。
问题在于:轨迹是通过采样产生的,不能像普通监督学习那样直接对标签求导,所以需要策略梯度。
策略梯度最核心的形式可以写成:
这个公式不用一开始就完整推导,但一定要抓住它的直觉:
- :告诉你怎样改参数,才能让这个动作更可能或者更不可能
- :告诉你这个动作到底值不值得鼓励
所以它表达的就是:
如果某个动作的 advantage 为正,就提高它的概率;如果 advantage 为负,就降低它的概率。
这里前面的 log 概率来自一个常见技巧:
这就是所谓的 log-derivative trick。你现在不需要把证明推完,但要知道后面 PPO 代码里的 old_log_prob、new_log_prob、ratio 都和这里直接相关。
从 REINFORCE 到 Actor-Critic
Section titled “从 REINFORCE 到 Actor-Critic”最原始的策略梯度方法例如 REINFORCE,通常直接使用 return:
问题是:
- 方差很大
- 训练不稳定
- 样本效率低
所以后来会减去一个 baseline,最常见的就是 ,也就是用:
这其实就是 advantage 的雏形。再往后就发展成 actor-critic:actor 学策略,critic 学价值,用来降低方差、提高训练稳定性。PPO 基本就是这条路线上的现代稳定版本。
为什么 PPO 里会出现 Old Policy、Ratio、Clip
Section titled “为什么 PPO 里会出现 Old Policy、Ratio、Clip”这是读 PPO 论文前必须先建立起来的动机。
如果直接按普通策略梯度去更新,可能会发生:
- 一次更新太大
- 策略突然变化
- 性能崩掉
- 训练变得很不稳定
所以一个自然的问题是:能不能在每次更新时,不要让新策略离旧策略太远?
这就是 TRPO 和 PPO 的背景。
PPO 公式里会出现一个非常关键的比值:
它表示:当前新策略对这个动作的概率,相比旧策略变化了多少。
如果:
- :新策略更倾向这个动作
- :新策略更不倾向这个动作
之所以需要它,是因为数据通常是由旧策略采样出来的,但你现在想评估新策略,这时就需要 importance sampling ratio 来修正分布差异。
如果只使用
作为目标,那么当 变得很大或很小时,策略更新可能会过于激进。
PPO-Clip 于是引入了下面这个目标:
它的关键直觉不是推导,而是”保守更新”:
- 当 时,我们希望提高该动作概率,但不能提高得太夸张,所以把 限制在 附近
- 当 时,我们希望降低该动作概率,但也不能降得过猛,所以把 限制在 附近
min的作用是取一个更保守的目标,避免策略更新过度
所以 PPO 用一句话概括就是:
在策略梯度的基础上,用 clip 机制限制每次策略更新的幅度,提高训练稳定性。
读 PPO 前最小公式清单
Section titled “读 PPO 前最小公式清单”如果只想先把 PPO 论文读顺,下面这些公式基本够用:
回报:
状态价值:
动作价值:
优势函数:
一步 TD 误差:
GAE:
策略梯度核心形式:
PPO ratio:
PPO clip 目标:
到这里为止,后面的 PPO 章节里出现的大部分符号其实就都能对上了。
论文全名:Proximal Policy Optimization Algorithms,2017,来自 OpenAI
PPO 的全称是 Proximal Policy Optimization(近端策略优化),是一种通用的策略梯度强化学习算法,在 RLHF 中被广泛用于基于 reward model 的策略优化阶段。
在 PPO 之前,策略梯度方法存在两个主要问题:
-
Vanilla Policy Gradient:每采一批数据只能做一次梯度更新,样本效率低,而且如果步长太大,策略会发生灾难性的大幅变化
-
TRPO(Trust Region Policy Optimization):通过 KL 散度硬约束限制更新幅度,保证单调改进,但实现复杂(需要共轭梯度法),不兼容 dropout 和参数共享架构
PPO 的目标是:保留 TRPO 的稳定性,同时像 vanilla PG 一样简单,只需要一阶优化(SGD/Adam)。
策略梯度基础
Section titled “策略梯度基础”标准策略梯度的梯度估计:
其中 是优势函数(advantage function)的估计——衡量”在状态 选择动作 ,比平均水平好多少”。对应的损失函数(通过求梯度得到):
但问题是:在同一批数据上做多步优化这个损失,策略会更新过大导致崩溃。
TRPO 的思路
Section titled “TRPO 的思路”TRPO 引入了重要性采样比(importance sampling ratio),用旧策略采集的数据来优化新策略,并用 KL 散度作为硬约束:
理论上也可以改成 KL 惩罚项的无约束形式:
但实验表明固定 效果不好——不同问题、不同训练阶段需要不同的 ,所以 TRPO 选择了硬约束的实现方式,导致了实现复杂性。
PPO-Clip:核心方法
Section titled “PPO-Clip:核心方法”PPO 提出了一个巧妙的替代方案。定义概率比 ,PPO 的 clipped surrogate objective 为:
其中 是超参数,通常取 0.2。
这个公式的直觉解释:
-
:就是标准的 importance sampling 目标(和 TRPO 一样)
-
:把概率比裁剪到 范围内,超过这个范围的变化不再提供梯度信号
-
取 min:在两者之间取较小值,形成悲观估计(下界)
分两种情况理解 clip 的效果:
-
(好动作):策略应该增大 (提高这个动作的概率),但 clip 限制了 最大只能到 ,防止对好动作过度乐观
-
(差动作):策略应该减小 (降低这个动作的概率),但 clip 限制了 最小只能到 ,防止对差动作矫枉过正
本质上,clip 起到了类似 trust region 的作用——限制每次策略更新的幅度,但实现起来只需要一个 min 和 clip 操作,远比 TRPO 的共轭梯度法简单。
PPO-Penalty:自适应 KL 惩罚
Section titled “PPO-Penalty:自适应 KL 惩罚”PPO 还提出了另一个变体,使用自适应 KL 惩罚系数:
每次策略更新后,根据实际 KL 散度 和目标值 动态调整 :
-
如果 ,说明更新太保守,
-
如果 ,说明更新太激进,
实验表明 PPO-Clip 效果优于 PPO-Penalty,因此实践中 PPO 通常指的是 PPO-Clip。
完整目标函数
Section titled “完整目标函数”在实际使用中(尤其是 actor-critic 架构),PPO 的完整损失函数还包括 value function 损失和熵正则:
其中:
- 是 value function 的均方误差损失
- 是策略的熵,鼓励探索
- 是系数
优势估计:GAE
Section titled “优势估计:GAE”PPO 使用 Generalized Advantage Estimation (GAE) 来估计优势函数:
其中 是 TD 误差, 是折扣因子, 控制 bias-variance 的权衡( 时退化为 Monte Carlo 估计, 时退化为单步 TD)。
for iteration = 1, 2, ... do for actor = 1, 2, ..., N do 用当前策略 π_θ_old 在环境中跑 T 步,收集轨迹 end for 计算每一步的优势估计 Â_1, ..., Â_T 在收集的 NT 条数据上优化 L^CLIP+VF+S,跑 K 个 epoch(minibatch SGD) θ_old ← θend for关键特性:同一批数据可以复用多次(多个 epoch),这是 PPO 相比 vanilla PG 样本效率高的关键原因,也是 clip 机制的存在意义——保证多次更新不会偏离太远。
PPO 在 RLHF 中的角色
Section titled “PPO 在 RLHF 中的角色”在 RLHF 的语境下,PPO 的使用方式是:
-
状态 :prompt + 已生成的 token 序列
-
动作 :下一个生成的 token
-
策略 :语言模型
-
Reward:只在序列生成完成后由 reward model 给出,中间步骤 reward 为 0
-
KL 惩罚:通常在每个 token 级别加一个 KL 惩罚项
-
Value Model:需要额外训练一个 value head(通常在 LM 最后一层上加一个线性层)来估计
这也是为什么 RLHF 需要维护四个模型的原因:policy model、reference model、reward model、value model。
论文全名:Direct Preference Optimization: Your Language Model is Secretly a Reward Model
发表于 NeurIPS 2023,作者来自 Stanford University
DPO 的全称是 Direct Preference Optimization(直接偏好优化),是一种用人类偏好数据直接微调语言模型的方法,不需要显式训练 reward model,也不需要强化学习。
在 DPO 之前,让语言模型对齐人类偏好的主流方法是 RLHF(Reinforcement Learning from Human Feedback),其流程是:先用偏好数据训练一个 reward model,再用 PPO 等强化学习算法优化语言模型使其获得高 reward。这个过程复杂且不稳定,需要同时维护多个模型(policy、reward model、value model、reference model),超参数也很难调。
DPO 的核心发现是:可以通过变量替换,把 RLHF 中的 RL 优化目标直接转化成一个基于策略模型本身的分类损失函数,从而跳过 reward model 和 RL 训练,直接在偏好数据上用简单的交叉熵损失微调语言模型。
用论文的话说:你的语言模型本身就(隐式地)是一个 reward model。
背景:RLHF 流程回顾
Section titled “背景:RLHF 流程回顾”标准 RLHF 包含三个阶段:
1. 监督微调(SFT)
Section titled “1. 监督微调(SFT)”在高质量数据上对预训练模型做监督微调,得到
2. Reward Model 训练
Section titled “2. Reward Model 训练”给定 prompt ,用 SFT 模型生成两个回答 ,让人类标注哪个更好(),用 Bradley-Terry 模型 建模偏好概率:
然后用极大似然训练 reward model :
其中 是 sigmoid 函数。直觉上就是让 reward model 给”好回答”打更高的分。
3. RL 微调(PPO)
Section titled “3. RL 微调(PPO)”用训好的 reward model 指导语言模型优化,同时加一个 KL 散度约束防止模型跑太远:
这里 就是 SFT 模型, 控制 KL 惩罚力度。这个目标的意思是:最大化 reward 的同时不要和原模型偏离太多。
在 RLHF 中,这一步通常使用 PPO(Proximal Policy Optimization)算法来完成。PPO 的核心是通过 clipped surrogate objective 限制每次策略更新的幅度,在保持训练稳定性的同时只需要一阶优化器(SGD/Adam),相比 TRPO 大幅简化了实现。详细的 PPO 原理参见下方 PPO 章节。
PPO 在 RLHF 语境下需要维护四个模型:policy model、reference model、reward model、value model,这个复杂性正是 DPO 试图解决的核心痛点。
DPO 的核心推导
Section titled “DPO 的核心推导”DPO 最精彩的地方在于其推导过程,通过一个巧妙的变量替换,把上面的 RL 问题变成了一个简单的分类问题。
第一步:写出 RL 目标的最优解
Section titled “第一步:写出 RL 目标的最优解”上面的 KL 约束 reward 最大化问题,其最优策略有闭式解:
其中 是归一化常数(partition function)。
直觉理解:最优策略就是在参考模型的基础上,按 reward 的指数进行加权——reward 高的回答概率变大,reward 低的回答概率缩小。
第二步:反解出 reward
Section titled “第二步:反解出 reward”把上面的公式两边取对数,反解出 reward:
这是 DPO 最关键的一步:reward 可以用最优策略和参考策略的对数概率比来表示。
第三步:代入 Bradley-Terry 模型
Section titled “第三步:代入 Bradley-Terry 模型”把上面的 reward 代入 Bradley-Terry 偏好模型,由于 只和 有关(和 无关),在做差的时候会被消掉:
也就是说,人类偏好概率完全可以用最优策略和参考策略来表示,不需要显式的 reward model。
第四步:得到 DPO 损失函数
Section titled “第四步:得到 DPO 损失函数”现在把未知的最优策略 换成我们要训练的参数化策略 ,用极大似然来优化,就得到了 DPO 损失函数:
这个损失函数非常直观:
- 它衡量的是模型对”好回答”相对于”差回答”的偏好程度
- 是好回答相对于参考模型的隐式 reward
- 是差回答相对于参考模型的隐式 reward
- 损失要求好回答的隐式 reward 显著高于差回答的隐式 reward
DPO 梯度的直觉理解
Section titled “DPO 梯度的直觉理解”DPO 损失的梯度可以写成:
其中 是语言模型隐式定义的 reward。
梯度的含义是:
- 提高好回答 的概率,降低差回答 的概率
- 前面的权重 起到动态加权的作用——当模型还没学好(隐式 reward 排序错误)时,这个权重大,梯度更强;当已经学得差不多了,权重小,梯度就弱了
- 这个加权机制防止了模型退化,如果去掉这个权重只用朴素的概率比,模型会崩掉(论文实验验证了这一点)
DPO 的理论保证
Section titled “DPO 的理论保证”你的语言模型就是 Reward Model
Section titled “你的语言模型就是 Reward Model”论文证明了一个重要定理:在 Plackett-Luce(包括 Bradley-Terry)偏好框架下,所有与之一致的 reward 等价类都可以用如下形式表示:
也就是说,DPO 的重参数化不会丢失任何表达能力。每训练一个策略 ,就等价于隐式地拟合了一个 reward model。
对 PPO 不稳定性的解释
Section titled “对 PPO 不稳定性的解释”论文还用 DPO 框架解释了 PPO 训练不稳定的原因:PPO 的目标中有一个归一化项 ,这个项需要用 value function 来估计或用基线来近似,估计不准就会导致高方差和不稳定。而 DPO 的重参数化天然消除了这个归一化项。
DPO 流程总结
Section titled “DPO 流程总结”相比 RLHF 的三阶段流程,DPO 简化为两步:
| 步骤 | RLHF | DPO |
|---|---|---|
| 1 | 偏好数据 → 训练 Reward Model | 偏好数据 → 直接优化策略 |
| 2 | Reward Model + PPO → 优化策略 | (不需要) |
具体来说:
- 准备偏好数据:收集 三元组
- 直接优化:用 对语言模型做梯度下降,参考模型 固定不动
不需要训练 reward model,不需要采样,不需要 PPO 的各种 trick(value function、GAE、clipping 等)。
论文在三个任务上验证了 DPO 的效果:
受控情感生成(IMDb)
Section titled “受控情感生成(IMDb)”- 使用 GPT-2-large,控制影评生成的情感倾向
- DPO 在所有 KL 预算下都取得了最高的 reward,严格优于 PPO,甚至优于用真实 reward function 训练的 PPO-GT
摘要生成(TL;DR)
Section titled “摘要生成(TL;DR)”- 使用 GPT-J 6B 模型
- DPO 在温度 0 时 win rate 约 61%,超过 PPO 最优温度时的 57%
- DPO 对采样温度的变化更鲁棒
单轮对话(Anthropic HH)
Section titled “单轮对话(Anthropic HH)”- 使用 Pythia 2.8B 模型
- DPO 是唯一一个在所有温度下都超过数据集首选回答的方法
- DPO 收敛速度快,训练稳定
- 在 TL;DR 上训练的模型,直接在 CNN/DailyMail 新闻数据集上测试
- DPO 的泛化能力优于 PPO
DPO 的 PyTorch 实现非常简洁:
import torch.nn.functional as F
def dpo_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, beta): pi_yw_logps, pi_yl_logps = pi_logps[yw_idxs], pi_logps[yl_idxs] ref_yw_logps, ref_yl_logps = ref_logps[yw_idxs], ref_logps[yl_idxs]
pi_logratios = pi_yw_logps - pi_yl_logps ref_logratios = ref_yw_logps - ref_yl_logps
losses = -F.logsigmoid(beta * (pi_logratios - ref_logratios)) rewards = beta * (pi_logps - ref_logps).detach() return losses, rewards默认超参数:,batch size 64,RMSprop 优化器,学习率 1e-6,warmup 150 步。
局限性与展望
Section titled “局限性与展望”- 分布外泛化:DPO 策略在分布外的泛化能力需要更多研究
- 自标注:能否用 DPO 策略自身的生成来做自标注训练?
- Reward 过优化:训练后期 win rate 略微下降,可能存在过优化问题
- 规模扩展:论文实验最大到 6B 参数,更大规模的效果有待探索
- 多模态:DPO 的思路可以推广到其他生成模型的偏好优化
DPO 是一篇非常优雅的工作,核心贡献是一个巧妙的数学推导——发现 RLHF 的 RL 优化目标可以通过变量替换,直接变成一个关于策略模型的分类损失。这个发现让偏好对齐从”RL 问题”变成了”监督学习问题”,大幅降低了实现和训练的复杂度。
DPO 的成功说明了一个深刻的道理:有时候看似需要复杂流程的问题,换一个角度重新建模,可能有非常简洁的解法。RLHF 需要四个模型(policy、reference、reward、value),而 DPO 只需要两个(policy 和 reference),效果还更好。
DPO 发表后迅速成为偏好对齐的主流方法之一,催生了大量后续工作(如 IPO、KTO、ORPO 等),也成为当前大模型训练 pipeline 中的标配组件。