PPO算法:LLM炼成神器的秘密,防作弊,速增效!

近年来,随着人工智能技术的飞速发展,特别是大型语言模型(LLM)在各个领域的广泛应用,如何让这些强大的模型更好地理解人类意图、生成更符合人类偏好的内容,成为了业界关注的焦点。其中,强化学习(RL)方法,尤其是像DPO、GRPO、RLVR等,在LLM的后期训练中展现出了惊人的效果。对于许多刚接触强化学习的朋友来说,理解这些前沿技术,往往可以从最基础也是最核心的算法——近端策略优化(PPO)入手。PPO算法在OpenAI公司推出的InstructGPT模型中发挥了关键作用,有效提升了LLM与人类意图的对齐程度,为后续RL方法的研究奠定了坚实基础。
理解PPO算法,有助于我们建立起策略梯度方面的正确思维模型,从而更好地把握那些基于相似思想构建的新型LLM专用强化学习方法。 PPO算法背后蕴含着丰富的数学原理,为了帮助大家深入理解PPO目标函数,本文将从强化学习的基本概念出发,一步步推导出PPO的核心原理。
强化学习的核心概念
首先,我们来回顾一下强化学习中一些最基本也是最重要的概念。
强化学习:这是一种学习范式,智能体(Agent)通过在环境中不断尝试和交互,学习如何采取最优行动以最大化其获得的累积奖励。在大型语言模型(LLM)的语境下,例如采用“人类反馈强化学习”(RLHF)进行微调时,就是让语言模型学习如何生成更符合人类偏好的回复,其核心是基于奖励信号进行反馈学习。
环境:对智能体而言,除了自身以外,所有与之交互并产生观察和奖励的外部因素都构成环境。在LLM中,这包括输入的提示(Prompt)分布、交互循环,以及用于评估生成回复的奖励模型所提供的奖励信号。
智能体:智能体是学习者和决策者,它观察当前状态,采取行动,并接收环境的奖励。对于LLM来说,智能体就是那个逐字逐句生成文本的语言模型。
行动(a):智能体做出的选择,通常基于当前状态s。在LLM生成过程中,行动就是模型在每一步选择下一个要生成的词元(Token)。
状态(s):智能体在某一时刻所能获取的信息总和。在LLM中,状态通常指当前的提示加上已经生成的部分回复(即当前的词元上下文)。
奖励(r):一个标量信号,用来告诉智能体其行动结果的好坏。在RLHF中,奖励由一个基于人类偏好数据训练的奖励模型(Reward Model)给出,用以评判一个回复的优劣。
策略(π):一个从状态到行动分布的随机映射,它定义了智能体在特定状态下采取何种行动的概率。对于LLM而言,策略就是模型在给定上下文中对下一个词元生成的概率分布。
目标:找到一个最优策略π*,使智能体在一段时间内获得的预期累积奖励最大化。在LLM微调中,目标是更新(对齐)模型,使其倾向于生成能获得更高奖励模型分数的回复。
RLHF中的奖励模型
在LLM的RLHF流程中,奖励模型(RM)扮演着至关重要的角色。它本质上是一个神经网络,接收提示x和生成的回复y作为输入,然后输出一个标量奖励r_ϕ(x,y) ∈ R,这个值代表了该回复在多大程度上符合“人类偏好”或“对齐”得有多好。
策略梯度方法(包括PPO)需要一个标量目标来更新策略参数。在传统的强化学习中,这个信号通常由环境直接提供。然而,对于语言生成任务,并没有一个天然的环境能够直接给出“好回复”的奖励。让人类对每个生成的输出都进行评分,这显然不切实际。而且,为了进行基于梯度的优化,我们需要一个可微分的标量信号来进行反向传播。因此,一个经过学习的奖励模型,就为我们提供了这样一个经济、可微分的、能够近似人类偏好的代理信号,用于强化学习训练阶段。
奖励模型如何训练?
训练奖励模型的标准流程通常包括以下几个步骤:
- 收集提示:从数据集中随机抽取一系列提示(x)。
- 生成候选回复:使用一个基线策略(通常是一个经过监督微调(SFT)的语言模型)为每个提示生成多个候选回复(y₁, y₂, ..., yK)。
- 人类偏好标注:邀请人类标注员对这些候选回复进行比较(通常采用两两比较的方式,因为这比绝对评分更容易进行)。
- 训练奖励模型:根据人类的偏好数据训练奖励模型(r_ϕ),使其能够预测这些偏好。
从架构上看,奖励模型通常会:
- 初始化:使用一个预训练的语言模型(通常就是SFT模型本身)进行初始化。
- 移除顶层:移除原模型中将隐藏状态映射到词汇表概率的最后一层非嵌入层。
- 替换:将其替换为一个线性层,将最后一个词元的隐藏状态映射到一个单一的标量输出。
奖励模型的损失函数
奖励模型通常使用布拉德利-特里(Bradley-Terry)模型进行两两比较训练。对于任何给定的提示x,回复yʷ(人类更偏好的)比yˡ(人类较不偏好的)更受偏好的概率可以建模为:
P(yʷ > yˡ | x) = σ(r_θ(x, yʷ) - r_θ(x, yˡ)) (II.I)
其中σ是sigmoid函数:σ(z) = 1 / (1 + e⁻ᶻ)。
相应的负对数似然损失函数为:
L_RM(ϕ) = -E_{(x, yʷ, yˡ)~D} [log σ(r_ϕ(x, yʷ) - r_ϕ(x, yˡ))]
通过这个损失函数,我们可以验证,它会促使奖励模型为更受偏好的回复分配更高的奖励值。这里有两个关键的洞察:
- 我们不需要绝对的奖励分数,只需要奖励模型能够正确地对回复进行排序。
- 这个损失函数只依赖于奖励值的差异(r_ϕ(x,yʷ) - r_ϕ(x,yˡ)),因此对所有奖励加上一个常数是保持不变的。这一点在后续讨论PPO损失时会很有用。
通过这种方式,奖励模型充当了人类偏好的学习代理,将获取人类对每个生成内容的反馈这个棘手问题,转化为了一个可行的监督学习问题。一旦训练完成,它就能提供优化我们策略(LLM)所需的标量信号r_ϕ(x,y),并可用于PPO等强化学习算法。
轨迹与回报
在强化学习中,智能体与环境交互的过程被记录下来,形成一系列数据,我们称之为轨迹。
轨迹
一条轨迹(也称为“rollout”或“episode”)是智能体与环境交互时,由一系列状态(s)、行动(a)和奖励(r)组成的序列:
τ = (s₀, a₀, r₀, s₁, a₁, r₁, ..., s_T, a_T, r_T)
在LLM的背景下,一条轨迹对应着完整的词元生成序列。它从提示开始,一直到序列结束符为止,包含了所有生成的词元。值得注意的是,状态s_t总是随机建模的,s_{t+1}可以表示为s_{t+1} ~ P(s_{t+1} | s_t, a_t)。给定一个随机策略π_θ(a_t | s_t),一条轨迹τ的概率是以下各项的乘积:
- 初始状态分布 ρ₀(s₀)
- 随机策略 π_θ(a_t | s_t)
- 环境转移动态 P(s_{t+1} | s_t, a_t)
P(τ | π_θ) = ρ₀(s₀) Π_{t=0}^{T-1} π_θ(a_t | s_t) ⋅ P(s_{t+1} | s_t, a_t) (III.I)
回报
回报是指在一条完整轨迹(τ)上累积的奖励总和。最简单的形式是无折扣回报:
R(τ) = ∑_{t=0}^{T} r_t
更普遍地,我们使用折扣回报:
R(τ) = ∑_{k=0}^{∞} γ^k r_k = r₀ + γr₁ + γ²r₂ + ... (III.II)
其中γ ∈ [0,1]是折扣因子。折扣因子γ有两个主要作用:
- 它确保了无限时间范围任务(T→∞)的回报是有限的。
- 它使得智能体更看重即时奖励,而非远期奖励。
策略梯度优化与REINFORCE算法
强化学习的核心目标是找到一个最优策略π_θ,使其能够最大化所有可能轨迹的预期回报:
J(θ) = E_{τ~π_θ}[R(τ)] (IV.I)
这就是我们的目标函数,我们希望找到参数θ*,使得:
θ* = argmax_θ J(θ)
为了使用基于梯度的方法最大化J(θ),我们需要计算∇_θJ(θ)并执行梯度上升:
θ_{k+1} = θ_k + α∇θJ(π_θ)|{θ_k} (IV.II)
这个策略梯度的表达式看起来很简单,但实际计算起来却非常复杂。期望是针对从π_θ采样的轨迹进行的,而π_θ本身又依赖于θ。我们不能简单地枚举所有可能的轨迹。对于任何合理规模的状态-行动空间(更不用说LLM了!),这在计算上是不可行的。因此,下一步我们需要推导一个合理且可行的∇_θJ(θ)近似。我们可以通过对数导数技巧来实现这一点。
∇_θJ(θ) = ∇θE{τ~π_θ}[R(τ)]
这个期望可以写成一个积分形式:
= ∇_θ ∫_τ P(τ | θ)R(τ) dτ
将梯度操作移入积分内:
= ∫_τ ∇_θP(τ | θ)R(τ) dτ
现在应用对数导数技巧:
∇_θ log P(τ | θ) = (∇_θ P(τ | θ)) / P(τ | θ)
重新排列后得到:
∇_θP(τ | θ) = P(τ | θ)∇_θ log P(τ | θ)
代入上式,我们得到:
= ∫_τ P(τ | θ)∇_θ log P(τ | θ)R(τ) dτ
这也可以写成以下期望形式:
∇θJ(θ) = E{τ~π_θ}[∇_θ log P(τ | θ) ⋅ R(τ)] (IV.III)
请注意,这里梯度现在是轨迹对数概率梯度乘以回报的期望。这可以通过使用轨迹概率表达式(III.I)进一步简化:
P(τ | θ) = ρ₀(s₀) Π_{t=0}^{T-1} π_θ(a_t | s_t) ⋅ P(s_{t+1} | s_t, a_t)
取对数:
log P(τ | θ) = log ρ₀(s₀) + ∑{t=0}^{T-1} log π_θ(a_t | s_t) + ∑{t=0}^{T-1} log P(s_{t+1} | s_t, a_t)
当我们计算∇_θ时,只有策略项依赖于θ:
∇θ log P(τ | θ) = ∑{t=0}^{T-1} ∇_θ log π_θ(a_t | s_t)
初始状态分布和环境转移动态与θ无关,所以它们的梯度为零。代回上式,我们得到了策略梯度定理:
∇θJ(θ) = E{τ~π_θ}[∑_{t=0}^{T} ∇_θ log π_θ(a_t | s_t) ⋅ R(τ)] (IV.IV)
这是一个非常重要的结果。它表明我们可以在不微分环境动态的情况下,计算出目标函数的梯度,只需要知道策略的对数概率的梯度。由于我们无法精确计算期望,因此我们通过采样N条轨迹来近似它,得到一个样本均值:
∇θJ(θ) ≈ ĝ = (1/N) ∑{i=1}^{N} (∑{t=0}^{T} ∇θ log π_θ(a{i,t} | s{i,t})) R(τ_i) (IV.V)
这便是REINFORCE算法的基石:
- 初始化:从一个预训练或监督微调(SFT)的语言模型π_θ开始。
- 采样提示:从数据集中抽取一批N个提示 {x₁, x₂, ..., x_N}。
- 生成轨迹:对于每个提示x_i,通过从策略π_θ中采样词元来生成一个回复y_i=(a₀, a₁, ..., a_T)。每条轨迹是状态(提示+已生成词元)和行动(选定的词元)的序列。
- 计算对数概率:对于每条轨迹,计算每个生成的词元在其给定上下文下的对数概率:log π_θ(a_t | s_t),t = 0, 1, ..., T。
- 计算奖励:使用奖励模型对每个完整的(提示,回复)对进行评分:R(τ_i) = r_ϕ(x_i, y_i)。
- 估计策略梯度:使用公式(IV.V)计算梯度估计:ĝ = (1/N) ∑{i=1}^{N} (∑{t=0}^{T} ∇θ log π_θ(a{i,t} | s_{i,t})) R(τ_i)。
- 更新策略:执行梯度上升步骤:θ ← θ + αĝ。
- 重复:返回步骤2,并重复迭代直至收敛。
尽管REINFORCE提供了无偏的梯度估计,但它存在两个关键问题,使其在LLM训练中变得不切实际:
- 高方差:梯度估计ĝ会因采样轨迹的不同而产生高方差。这种方差可能很大,导致梯度噪声过大,训练不稳定。如果我们再次审视(IV.V),会发现每个行动的梯度估计都由整个轨迹的回报R(τ)加权。这意味着,即使某个行动本身是好的,它也可能因为轨迹中其他行动导致的结果不佳而获得负的梯度更新(反之亦然)。在大量样本中,这种耦合引入的噪声可能非常显著,导致高方差。
- 同策略限制(样本效率低下):REINFORCE要求轨迹必须从当前策略π_θ中采样。因此,每次梯度更新θ→θ'之后,之前收集的轨迹就必须被丢弃,并从更新后的策略中重新采样新的轨迹。对于LLM这种每个轨迹都需要通过一个参数量高达数十亿的模型进行完整前向传播的场景来说,这种做法成本极高,尤其是在需要大量小步长梯度更新才能有效训练时。
减少方差与优势函数
REINFORCE算法提供的是一个无偏的梯度估计(IV.V),但尽管是无偏的,这个估计器的方差却很高。减少方差是提升强化学习算法稳定性和效率的关键。
用“回报到终点”代替全轨迹回报(利用因果关系)
第一个减少方差的方法源于这样一个观察:在时间t采取的行动a_t不可能影响在时间t之前已经收到的奖励。这是因果关系的一个基本结果。这些过去的奖励项只会给梯度估计带来噪声,增加方差而不会贡献任何有用信号。因此,我们可以移除它们,只考虑从当前时间点开始的“回报到终点”(rewards-to-go):
R̂t = ∑{t'=t}^{T} r_{t'}
这为我们提供了一个方差更低的估计器:
∇θJ(θ) ≈ (1/N) ∑{i=1}^{N} ∑{t=0}^{T} ∇θ log π_θ(a{i,t} | s{i,t}) ⋅ R̂_{i,t} (V.I)
其中R̂_{i,t} = ∑{t'=t}^{T} r{i,t'} 是轨迹i中从时间t开始的回报到终点。
减去基线
第二个互补的方差减少技术是从奖励中减去一个基线b(s_t)。关键在于,我们可以从奖励信号中减去任何不依赖于行动的函数,而不会改变梯度的期望值。因此,我们可以从“回报到终点”中减去一个依赖于状态的基线b(s_t),从而得到一个无偏的梯度估计器:
∇θJ(θ) ≈ (1/N) ∑{i=1}^{N} ∑{t=0}^{T} ∇θ log π_θ(a{i,t} | s{i,t}) ⋅ (R̂_{i,t} - b(s_{i,t})) (V.II)
价值函数:V_π(s) 和 Q_π(s,a)
基线仍然是一个任意函数。为了使其更系统化和具体化,强化学习理论中有两个基本函数。
- 状态价值函数(State Value Function):状态价值函数V_π(s)表示当智能体处于状态s并根据策略π行动时,预期的回报。
V_π(s) = E_{τ~π}[∑_{t=0}^{∞} γ^t r_t | s₀ = s]
直观上,V_π(s)告诉我们“这个状态平均来说有多好?”,并被用作基线b(s) = V_π(s)。
- 行动价值函数(Q函数):行动价值函数Q_π(s,a)表示当智能体从状态s开始,采取行动a,然后根据策略π行动时,预期的回报。
Q_π(s, a) = E_{τ~π}[∑_{t=0}^{∞} γ^t r_t | s₀ = s, a₀ = a]
直观上,Q_π(s,a)告诉我们“在这个状态下,采取这个特定行动有多好?”,在强化学习中,“回报到终点”被用来估计Q_π(s,a)。
在LLM的上下文中:
- V_π(s)估计了给定提示和部分回复的预期奖励,假设模型继续根据其当前策略生成。
- Q_π(s,a)估计了如果从当前提示和部分回复开始,模型生成特定下一个词元a,然后继续根据其策略生成,所获得的预期奖励。
优势函数
优势函数A_π(s,a)衡量了特定行动a相对于在该策略下采取的平均行动的好(或坏)的程度:
A_π(s, a) = Q_π(s, a) - V_π(s) (V.III)
优势函数直接告诉我们:“与我们在这个状态下通常会做的事情相比,这个特定行动好多少?”这正是我们希望用于策略改进的信号。我们希望增加具有正优势的行动的概率,并减少具有负优势的行动的概率。
以LLM为例,假设提示是“上海在哪里?”,模型已经生成了“上海是”。从这个状态开始:
- 如果模型采样词元“在”(导致“上海是在中国”),这个行动可能具有正优势,因为它比模型可能生成的平均词元要好。
- 如果模型采样词元“好吃”(导致一个不连贯的回复),这个行动可能具有负优势,因为它比模型可能生成的平均词元要差。
优势加权策略梯度
用“回报到终点”和价值函数作为基线代入,我们得到了策略梯度的以下形式:
∇θJ(θ) = E{τ~π_θ}[∑_{t=0}^{T} ∇_θ log π_θ(a_t | s_t) ⋅ (Q_π(s_t,a_t) - V_π(s_t))]
这也可以写成:
∇θJ(θ) = E{τ~π_θ}[∑_{t=0}^{T} ∇_θ log π_θ(a_t | s_t) ⋅ A_π_θ(s_t,a_t)] (V.IV)
对于基于样本的近似:
∇θJ(θ) ≈ (1/N) ∑{i=1}^{N} ∑{t=0}^{T} ∇θ log π_θ(a{i,t} | s{i,t}) ⋅ Â_{i,t} (V.V)
其中Â_{i,t}是轨迹i中时间t处优势函数的估计。这是策略梯度常用的形式。实践中,A_π(s_t,a_t)可以按以下方式估计:
- 学习一个价值函数:训练一个神经网络V_ϕ(s)(通常称为“评论家”或“价值头”)来近似V_π(s)。在LLM微调中,这通常是与策略共享相同Transformer骨干的线性层。
- 从样本中估计Q_π:给定一条轨迹,回报到终点R̂t = ∑{t'=t}^{T} γ^{t'} r_{t'} 为Q_π(s_t,a_t)提供了无偏(但高方差)的估计。
- 计算优势估计:Â_t = R̂_t - V_ϕ(s_t)。
更复杂的方法,如广义优势估计(GAE),通过多步回报的加权组合,在高方差、低偏差估计和低方差、高偏差估计之间进行插值。
重要性采样与离策略策略梯度
在强化学习文献中,“离策略”(off-policy)通常指那些行为策略(生成数据的策略)与目标策略(正在优化的策略)可能任意不同的方法,例如重用数千次更新之前策略的数据。在本节中,我们所说的“离策略”更精确地应该称为“局部离策略”。
优势加权策略梯度(V.IV)要求轨迹必须从当前策略π_θ中采样。这造成了一个根本性的低效率问题,即在每次梯度更新θ→θ'之后,所有之前收集的轨迹都会变得“陈旧”,我们必须丢弃这些轨迹并从更新后的策略中重新采样新的轨迹。对于LLM来说,每次轨迹生成都需要对一个参数量高达数十亿的模型进行完整的前向传播,这使得这种做法成本极高,尤其是在我们需要许多小步长梯度更新才能有效训练时。我们需要一种方法来重用相同的轨迹进行多次梯度更新。重要性采样正是提供这种数学工具的关键!
重要性采样
重要性采样是一种技术,用于在一个概率分布下估计期望值,而样本则是从另一个不同的分布中抽取的。考虑一个分布p(x)下的期望:
E_{x~p}[f(x)] = ∫ p(x) f(x) dx
我们可以通过乘以并除以另一个分布q(x)(只要q(x)>0,当p(x)>0时)来重写它:
= ∫ q(x) (p(x) / q(x)) f(x) dx = E_{x~q}[(p(x) / q(x)) f(x)]
比率p(x) / q(x)被称为重要性权重。这个恒等式告诉我们:
E_{xp}[f(x)] = E_{xq}[(p(x) / q(x)) f(x)] (VI.I)
我们现在可以使用从q中抽取的样本来估计p下的期望,只要我们通过概率比率对每个样本进行重新加权。
将重要性采样应用于策略梯度
我们可以将这项技术应用于策略梯度设置。同策略优势加权梯度(V.IV)是:
∇θJ(θ) = E{τ~π_θ}[∑_{t=0}^{T} ∇_θ log π_θ(a_t | s_t) ⋅ A_π_θ(s_t,a_t)]
为了应用重要性采样,我们从时间步层面而非轨迹层面进行操作(完整轨迹的重要性权重方差极高)。对于单个时间步:
∇θJ(θ) = E{(s_t,a_t)~π_θ}[∇_θ log π_θ(a_t | s_t) ⋅ A_π_θ(s_t,a_t)]
使用从π_{θ_old}中抽取的样本进行重要性采样:
= E_{(s_t,a_t)~π_{θ_old}}[(π_θ(a_t | s_t) / π_{θ_old}(a_t | s_t)) ∇_θ log π_θ(a_t | s_t) ⋅ A_π_θ(s_t,a_t)]
现在我们应用对数导数恒等式∇_θ log π_θ = (∇_θ π_θ) / π_θ,这给了我们一个代理目标函数L(θ),其梯度等于这个重要性加权策略梯度:
∇θJ(θ) = E{(s_t,a_t)~π_{θ_old}}[(∇θ π_θ(a_t | s_t) / π{θ_old}(a_t | s_t)) A_π_{θ_old}(s_t,a_t)]
其中重要性加权代理目标函数,也称为保守策略迭代(CPI)目标函数,是:
L_{CPI}(θ) = E_{(s_t,a_t)~π_{θ_old}}[(π_θ(a_t | s_t) / π_{θ_old}(a_t | s_t)) A_π_{θ_old}(s_t,a_t)]
我们还将概率比率定义为:
r_t(θ) = π_θ(a_t | s_t) / π_{θ_old}(a_t | s_t) (VI.II)
请注意,r_t(θ_{old}) = 1 是由其构造决定的。因此,CPI目标函数可以写成:
L_{CPI}(θ) = E_t[(π_θ(a_t | s_t) / π_{θ_old}(a_t | s_t)) Â_t] = E_t[r_t(θ)Â_t] (VI.III)
其中Ât是时间t的估计优势,E_t[⋅]表示在π{θ_old}下收集的一批样本的经验平均值。这个目标函数有一个清晰的解释:
- 如果Â_t > 0(行动优于平均水平),我们希望增加r_t(θ),即让新策略更有可能采取这个行动。
- 如果Â_t < 0(行动劣于平均水平),我们希望减少r_t(θ),即让新策略更不可能采取这个行动。
相应的基于样本的近似是:
L_{CPI}(θ) ≈ (1/N) ∑{i=1}^{N} ∑{t=0}^{T} (π_θ(a_{i,t} | s_{i,t}) / π_{θ_old}(a_{i,t} | s_{i,t})) Â_{i,t} (VI.IV)
离策略学习:重用轨迹
CPI目标函数实现了离策略学习:我们可以从π_{θ_old}中采样轨迹,存储它们,然后使用相同批次的离线数据对θ进行多次梯度更新。典型的工作流程变为:
- 收集:从当前策略π_{θ_old}中采样轨迹 {τ_i}。
- 计算:计算优势Â_{i,t}和对数概率log π_{θ_old}(a_{i,t} | s_{i,t})。
- 存储:将轨迹及其优势和旧的对数概率存储起来。
- 优化:使用存储数据中的小批量样本,对L_{CPI}(θ)执行多次梯度上升步骤。
- 重复:设置θ_{old} ← θ,然后返回步骤1。
这极大地提高了样本效率。我们不再是在进行一次梯度更新后就丢弃轨迹,而是可以从每批昂贵的LLM生成结果中提取多次更新。
不稳定性问题
尽管CPI目标函数提高了样本效率,但对L_{CPI}(θ)进行无约束优化会导致不稳定。核心问题在于,当π_θ偏离π_{θ_old}太远时,重要性采样就会变得不可靠:
- 极端的概率比率:比率r_t(θ)可能变得任意大或小,导致梯度估计不稳定。
- 陈旧的优势估计:优势估计Ât是在π{θ_old}下计算的,当π_θ发散时,它们会变得不准确。优化器可能会利用这些陈旧的估计,进行看似有利实则有害的更新。
在实践中,对L_{CPI}(θ)的无约束最大化往往会导致策略更新过大,从而引发灾难性的性能崩溃。
以LLM为例,假设我们有一条轨迹,其中模型生成了“上海是在中国”,并且这个动作具有很高的优势。无约束的优化可能会大幅提高“中国”作为“上海是在”之后下一个词元的概率——但这可能同时导致其他地方出现意想不到的概率漂移,也许会让模型在完全不相关的语境中过度倾向于说“中国”,或者以不可预测的方式扰乱整个词汇表的概率分布。我们需要一种机制来限制π_θ不要偏离π_{θ_old}太远,并使比率r_t(θ)保持接近1,同时仍然允许有意义的策略改进。
信赖域策略优化(TRPO)
CPI目标函数由于可以通过重要性比率重用数据而具有吸引力,但无约束优化却是不稳定的。当π_θ偏离π_{θ_old}太远时,概率比率r_t(θ)会变得极端,优势估计Ât也会变得陈旧,并可能被优化器利用。**信赖域策略优化(TRPO)**的关键思想是,代理目标函数L{CPI}(θ)仅在θ_{old}的局部邻域内才是真实目标的有效近似。TRPO论文通过证明,只要连续策略之间的KL散度保持有界,策略性能就保证会提高。这一理论结果促使我们将策略更新限制在“信赖域”内,在该区域内代理目标函数仍然可靠。
TRPO将这一洞察转化为一个约束优化问题,确保策略更新保持在“信赖域”内,在该区域内代理目标函数仍然可靠。
max_θ L_{CPI}(θ) = E_t[(π_θ(a_t | s_t) / π_{θ_old}(a_t | s_t)) Ât]
受限于 E_t[D{KL}(π_{θ_old}(⋅|s_t) || π_θ(⋅|s_t))] ≤ δ (VII.I)
超参数δ定义了信赖域的大小,即连续策略之间允许的最大散度。这个约束确保了r_t(θ)保持接近1,从而使我们的重要性加权估计保持可靠。
求解(VII.I)需要二阶优化。TRPO将目标函数线性近似,将KL约束二次近似(使用费雪信息矩阵),然后通过共轭梯度算法求解结果问题,接着进行线搜索以确保满足约束。对于大规模LLM训练,这种方法不切实际:
- 计算开销:每次策略更新都需要多次共轭梯度迭代和线搜索步骤,这比标准的梯度下降昂贵得多。
- 内存需求:计算费雪-向量乘积会为数十亿参数的模型带来大量的内存开销。
TRPO背后的理论也建议使用KL惩罚而不是硬约束。它更容易实现且计算效率更高。
max_θ E_t[r_t(θ)Ât - β ⋅ D{KL}(π_θ(⋅|s_t) || π_{θ_old}(⋅|s_t))] (VII.II)
然而,选择一个在不同问题甚至不同训练阶段都有效的惩罚系数β是出了名的困难。这促使了**近端策略优化(PPO)**的出现:一种一阶方法,它通过裁剪代理目标函数,而不是通过显式约束来实现TRPO的稳定性。
近端策略优化(PPO)
近端策略优化(PPO)通过仅使用一阶优化来实现TRPO的稳定性保证。PPO不是显式地约束KL散度,而是通过裁剪机制修改目标函数本身,以阻止大的策略更新。它隐式地限制了策略可以移动的距离,通过使用标准梯度下降提供了一个“软”的信赖域。
裁剪代理目标函数
在第六节中,我们已经了解了CPI目标函数和概率比率:
L_{CPI}(θ) = E_t[r_t(θ)Ât] 其中 r_t(θ) = π_θ(a_t | s_t) / π{θ_old}(a_t | s_t)
L_{CPI}的问题在于,没有任何机制可以阻止r_t(θ)变得任意大或任意小。PPO通过将概率比率裁剪到[1-ϵ, 1+ϵ]范围内来解决这个问题:
L_{CLIP}(θ) = E_t[min(r_t(θ)Â_t, clip(r_t(θ), 1-ϵ, 1+ϵ) ⋅ Â_t)] (VIII.I)
其中ϵ是一个超参数(PPO论文中通常设定为ϵ = 0.2),clip函数定义为:
clip(r, 1-ϵ, 1+ϵ) =
{ 1-ϵ 如果 r < 1-ϵ
{ r 如果 1-ϵ ≤ r ≤ 1+ϵ
{ 1+ϵ 如果 r > 1+ϵ
(VIII.I)中的min运算符至关重要。它确保我们在裁剪和未裁剪目标之间选择更悲观(更低)的估计。这会根据优势的符号产生不同的行为:
(1) 情况1:正优势 ( Â_t > 0 )
当一个行动优于平均水平时,我们希望增加其概率,这意味着增加r_t(θ)。目标函数变为:
L_{t,CLIP} = min(r_t(θ), 1+ϵ) ⋅ Â_t
- 如果 r_t(θ) ≤ 1+ϵ:目标函数是 r_t(θ)Â_t,因此梯度上升会增加 r_t(θ)。
- 如果 r_t(θ) > 1+ϵ:目标函数变为 (1+ϵ)Â_t。裁剪机制消除了将 r_t(θ)增加到超过1+ϵ的激励。
(2) 情况2:负优势 ( Â_t < 0 )
当一个行动劣于平均水平时,我们希望降低其概率,这意味着减少r_t(θ)。由于Â_t < 0,乘以一个较小的r_t会使乘积变得不那么负(数值上更大)。目标函数变为:
L_{t,CLIP} = max(r_t(θ), 1-ϵ) ⋅ Â_t
- 如果 r_t(θ) ≥ 1-ϵ:目标函数是 r_t(θ)Â_t,因此梯度上升会减少 r_t(θ)。
- 如果 r_t(θ) < 1-ϵ:目标函数变为 (1-ϵ)Â_t。裁剪机制消除了将 r_t(θ)减少到低于1-ϵ的激励。
这里的核心思想是PPO提供了一个对L_{CPI}的悲观下界。当更新会使情况“好得不真实”时,我们忽略这些更新。
在大型语言模型微调的背景下,策略π_θ(a_t|s_t)是模型在给定上下文s_t(提示+先前生成的词元)下分配给词元a_t的概率。概率比率r_t(θ)衡量了微调后的模型生成特定词元与参考策略相比的可能性有多大。裁剪机制确保了任何单个词元的概率在单次更新迭代中不能改变超过(1±ϵ)的因子,从而防止模型对高优势词元“反应过度”。
PPO目标函数
在实践中,PPO将裁剪后的策略目标与另外两个项结合起来:
L_{PPO}(θ) = E_t[L_{t,CLIP}(θ) - c₁ L_{t,VF}(θ) + c₂ Sπ_θ] (VIII.II)
- 价值函数损失 ( L_VF ):回想第五节,我们需要一个价值函数V_ϕ(s)来计算优势估计。价值函数通过最小化其预测与实际回报之间的平方误差进行训练:
L_{t,VF}(θ) = (V_θ(s_t) - V_{t,target})²
其中V_{t,target}通常是折扣后的回报到终点。当策略和价值函数共享参数(在LLM微调中很常见,两者都使用相同的Transformer骨干)时,这个损失项从目标函数中减去(因此是负号,因为我们最大化L_{PPO}但最小化L_{VF})。
- 熵奖励 ( S[π_θ] ):为了鼓励探索并防止过早收敛到确定性策略,PPO增加了熵损失项:
Sπ_θ = -∑_a π_θ(a|s_t) log π_θ(a|s_t)
这里的系数c₁和c₂ > 0 控制着正则化的强度。新媒网跨境获悉,这一设计确保了模型在优化性能的同时,也保持了生成内容的丰富性和多样性。
带有KL惩罚的完整PPO目标函数
当使用“香草味”PPO(即不加额外KL惩罚的PPO)微调LLM时,策略会学习最大化来自奖励模型的奖励。然而,奖励模型对人类偏好来说是一个不完美的代理。它是一个基于有限数据训练的神经网络,可能被“利用”。在没有约束的情况下,策略可能会发现一些对抗性的输出,这些输出在奖励模型上获得高分,但实际生成的文本却可能:
- 退化为重复或无意义的模式,从而“欺骗”奖励模型。
- 偏离自然语言,失去流畅性和连贯性。
- 利用奖励模型学到的虚假相关性。
这种现象被称为奖励作弊(reward hacking)。策略找到了一种“玩弄”奖励模型的方法,而不是真正提高回复质量。为了防止奖励作弊,InstructGPT论文引入了一个KL散度惩罚,用以正则化策略,使其保持接近参考模型π_ref(通常是RL微调前的SFT模型)。
如第八节所述,PPO目标函数(通过梯度上升最大化)由三部分组成:
L_{PPO}(θ) = L_{CLIP}(θ) (裁剪策略目标) - c₁ L_{VF}(θ) (价值函数损失) + c₂ S[π_θ] (熵奖励)
现在,我们不再直接使用原始的奖励模型分数。相反,我们定义一个KL惩罚的奖励,它通过正则化策略使其接近参考模型π_ref来保持模型的稳定性:
r_{total}(s_t,a_t) = r_{RM}(s_t,a_t) - β ⋅ D_{KL}(π_θ(⋅|s_t) || π_{ref}(⋅|s_t)) (IX.I)
其中:
- r_{RM}(s_t,a_t) 是时间步t的奖励信号。
- β 是KL惩罚系数。
- π_ref 是冻结的参考模型。
在每个词元位置,KL散度简化为:
D_{KL}(π_θ(⋅|s_t) || π_{ref}(⋅|s_t)) = E_{a~π_θ}[log (π_θ(a|s_t) / π_{ref}(a|s_t))]
实际上,我们用采样的词元a_t来估计这个期望,得到:
d̂t = log (π_θ(a_t|s_t) / π{ref}(a_t|s_t))
需要注意的是,奖励模型r_ϕ(x,y)会为完整的回复(x,y)产生一个单一的标量分数。这个分数只在最终词元T处分配,而KL惩罚适用于每个词元。
r̃ϕ =
{ -β ⋅ log (π_θ(a_t | s_t) / π{ref}(a_t | s_t)) 如果 t < T
{ r_ϕ(x, y) - β ⋅ log (π_θ(a_T | s_T) / π_{ref}(a_T | s_T)) 如果 t = T
KL惩罚服务于两个目的:
- 防止奖励作弊:策略不能任意偏离自然语言。
- 保持流畅性:输出在分布上与训练有素的SFT模型保持相似。
它通过修改每个词元的奖励来改变PPO中使用的优势估计Â_t。然而,在数学上等效(且在实现上更高效)的方法是直接将KL项添加到目标函数中。带有KL惩罚的PPO目标函数是:
J(θ) = E_{a~π_θ}[r_{RM}(s,a)] (香草PPO目标) - β ⋅ D_{KL}(π_θ || π_{ref}) (KL惩罚项)
第一项正是香草PPO使用裁剪代理优化最大化的目标。KL惩罚项作为单独的加性分量出现,它惩罚与参考模型的偏离。将PPO裁剪代理替换第一项:
J_c(θ) = E_t[min(r_t(θ)Ât, clip(r_t(θ), 1-ϵ, 1+ϵ)Â_t)] - β ⋅ D{KL}(π_θ || π_{ref})
结合所有组成部分,带有KL惩罚的完整PPO目标函数(需要最大化)是:
L_{RLHF}(θ) = L_{CLIP}(θ) (策略目标) - c₁ L_{VF}(θ) (价值损失) + c₂ S[π_θ] (熵奖励) - β ⋅ D_{KL}(π_θ || π_{ref}) (KL惩罚) (IX.II)
在这里,每个项都服务于一个独特的目的:
- 策略目标 (L_{CLIP}):通过裁剪机制改进策略,同时防止破坏性更新。
- 价值损失 (c₁L_{VF}):训练评论家以实现准确的优势估计(最小化)。
- 熵奖励 (c₂S[π_θ]):鼓励探索并防止过早收敛。
- KL惩罚 (βD_{KL}):防止奖励作弊并保持语言质量。
区分完整损失函数中两个与KL相关的机制非常重要。PPO裁剪机制充当一个短期锚点,限制策略在单次更新中可以改变的程度,而KL惩罚则是一个长期锚点,限制策略在整个训练过程中可以偏离其起点的程度。新媒网跨境了解到,正是这种多层次的约束与优化,共同铸就了PPO在LLM对齐训练中的卓越表现。
至此,PPO算法的核心原理及其在LLM微调中的完整目标函数推导已然呈现。新媒网跨境认为,每一个最终损失函数中的项都有其特定的目的,它们的存在都是为了解决在算法设计过程中遇到的具体问题。虽然理解所有数学细节和概念并非易事,但深入剖析其原理,无疑能让我们对这项技术有更透彻的认识。未来,随着人工智能的不断演进,像PPO这样的基础算法也将持续迭代,为我们带来更多创新与突破。
新媒网(公号: 新媒网跨境发布),是一个专业的跨境电商、游戏、支付、贸易和广告社区平台,为百万跨境人传递最新的海外淘金精准资讯情报。
本文来源:新媒网 https://nmedialink.com/posts/ppo-makes-llm-smarter-faster-no-hack.html


粤公网安备 44011302004783号 













