跳转至

NLP高频面(45)PPO算法在RLHF中的原理与实现详解

本文讨论了PPO算法在RLHF中的原理与实现,详细阐述了PPO算法的基本概念、在RLHF中的训练步骤、重要性采样机制、Actor-Critic架构应用原理、KL散度的作用以及PPO两种变体的差异和适用场景。关键要点包括:

PPO算法简介:PPO是OpenAI于2017年提出的基于策略梯度的深度强化学习算法,引入“近端”约束,实现简单且训练稳定,通过替代目标函数和优势函数估计提高采样效率和稳定性。

RLHF流程:包含有监督微调(SFT)、奖励模型训练、强化学习优化(PPO阶段)三个阶段,PPO用于第三阶段的策略优化。

PPO在RLHF的步骤:包括收集样本、计算奖励、评估价值、计算优势、更新评论家、更新演员、重复迭代,属于在线策略算法。

重要性采样作用:修正策略分布差异,使旧策略下采样的数据可用于新策略的梯度估计。

Actor - Critic架构原理:由策略网络(Actor)和价值网络(Critic)组成,分离“决策”和“评价”职能,降低策略梯度方差,实现对话策略的高效优化。

KL散度的双重作用:作为正则项确保最终策略与人类自然语言分布对齐,作为更新约束保障训练过程的稳定和可靠。

PPO变体差异及适用场景:PPO - Clip直接、实现简单、经验上鲁棒,PPO - Penalty提供明确理论约束,多数RLHF场景用PPO - Clip,需精确对齐时可引入PPO - Penalty。

近端策略优化(Proximal Policy Optimization, PPO)算法是强化学习领域的一种新颖且高效的策略优化方法,在近年大规模语言模型的人类反馈强化学习(Reinforcement Learning with Human Feedback, RLHF)中发挥了关键作用。本文将以学术严谨的风格,详细阐述 PPO 算法的原理及其在 RLHF 场景下的实现细节。内容包括:PPO 基本概念及特点、PPO 在 RLHF 中训练流程的主要步骤、PPO 中重要性采样用于修正策略差异的机制、Actor-Critic 架构下双网络设计在 RLHF 中的应用原理、KL 散度(Kullback-Leibler 散度)在 RLHF 中的双重作用,以及 PPO-Clip 与 PPO-Penalty 两种变体的数学形式差异和各自适用场景。

1. 近端策略优化(PPO)简介

近端策略优化(PPO)是一种基于策略梯度的深度强化学习算法。PPO由OpenAI团队于2017年提出,旨在在保证策略更新稳定性的同时提高训练效率。与经典的策略梯度方法(如REINFORCE)相比,PPO引入了“近端”约束,避免每次更新时策略发生过大变化;与先前的信赖域策略优化(Trust Region Policy Optimization,TRPO)方法相比,PPO的实现更加简单、高效,无需二阶导数计算。


PPO 算法的核心思想是在策略优化目标中引入对新旧策略差异的限制,从而在提高采样效率的同时保持策略更新的稳定。具体而言,PPO 定义了一种替代目标函数(surrogate objective),利用重要性采样比率来衡量当前策略 $ \pi\theta\pi_{\theta} $ 相对于旧策略 $ \pi_{old}\pi_{old}\pi_{old}\pi_{old}\pi_{old}\pi_{old} $ 的变化,并通过剪切(clip)或惩罚项限制该比率的偏离幅度,使策略更新不偏离原策略过远。这种“近端”约束使得 PPO 可以在多次梯度更新中重复使用同一批采样数据,而不会导致策略陷入不稳定。PPO 通常结合优势函数(Advantage Function)的估计来减少方差,例如使用广义优势估计(Generalized Advantage Estimation, GAE)来平滑奖励信号。总体而言,PPO 算法兼具实现简单性和训练稳定性,已成为现代深度强化学习,尤其是 RLHF 场景中的常用算法。

数学定义:PPO 的典型目标函数采用裁剪的策略梯度损失形式。设策略 $ \pi_{\theta}(a|s) $ 表示在状态 s 下执行动作 a 的概率, $ \hat{A} $ 为对应的优势估计,则 PPO 损失可以表示为:

$$ L^{\mathrm{P P O}}(\theta)=\mathbb{E}{s,a\sim\pi\right], $$ }}}\left[\underbrace{\min(r(\theta),\hat{A},\mathrm{c l i p}(r(\theta),1-\epsilon,1+\epsilon),\hat{A})}_{\mathrm{c l i p p e d~s u r r o g a t e~o b j e c t i v e}

其中重要性采样比率 $ r(\theta) $定义为:

$$ r(\theta)=\frac{\pi_{\theta}(a\mid s)}{\pi_{\mathrm{o l d}}(a\mid s)} $$

€是一个很小的超参数(如 0.1~0.3),用于限制 $ r(\theta) $ 偏离 1 的幅度。上述目标取两项中的较小值(对应优势为正时限制增长,优势为负时限制下降),确保更新后策略相对于旧策略的性能指标不会显著恶化。通过最大化该目标(等价于最小化其负值损失),PPO 实现了对策略的稳定改进。

PPO 在 RLHF 中的主要步骤

在大语言模型的人类反馈强化学习(RLHF)训练过程中,PPO通常用于第三阶段的策略优化,以便模型能够根据人类偏好进行自我调整。RLHF的完整流程一般包含以下三个阶段:

有监督微调(SFT):从预训练语言模型出发,利用人类提供的高质量示范数据进行有监督微调,得到一个初始策略模型(SFT模型)。这一阶段使模型学会基本的指令遵循行为,但尚未结合人类偏好进行优化。

奖励模型训练:收集人类偏好数据(例如给定同一提示下模型不同响应的人工排名),训练一个奖励模型(Reward Model,RM)。奖励模型 RφR_\phi Rφ 接受模型输出(以及提示)作为输入,产生一个评分来表示该输出符合人类偏好的程度。训练好的奖励模型在之后的强化学习阶段提供奖励信号。

强化学习优化(PPO 阶段):固定住奖励模型 RφR_\phi Rφ,以初始策略模型作为起点,通过 PPO 算法不断优化策略使其最大化人类偏好评分。该阶段是 RLHF 的核心,具体的 PPO 优化过程可以细分为以下循环步骤:

上述步骤中,第 $ (1)-(4) $步属于策略的采样与评价过程,对应了PPO算法的on-policy采样阶段;第 $ (5)-(6) $步则是策略网络和价值网络的更新过程。值得注意的是,PPO属于在线策略算法,每次迭代


需要用当前策略生成新数据,这与 Q-learning 等离线算法不同。在 RLHF 中,这意味着模型会不断与奖励模型交互、学习,以逐步提高对人类偏好的契合度。

下面给出一个伪代码示例,展示在 RLHF 场景下应用 PPO 进行策略优化的训练循环:

代码块

假设 actor (策略网络), critic (价值网络), reward_model (奖励模型) 已初始化

for iteration in range(num_iterations): # 1. 从数据集中采样一个Prompt并用当前策略生成Response prompt = sample_prompt()

上述伪代码中,策略网络(Actor)根据提示生成文本,奖励模型给出评分 RR $ R $,价值网络(Critic)提供基线 VV V,随后利用 PPO 策略梯度公式更新 Actor。其中 clip( $ r $, $ 1 - $eps, $ 1 + $eps) 表示将比率限制在 $ [1-\epsilon,1+\epsilon][1- $epsilon $ ), $1+\epsilon\epsilon $ )[1-\epsilon,1+\epsilon] $ 区间内。通过这种方式,模型的策略被逐步优化以获得更高的奖励,同时保持与原有语言分布的相似性。需要强调,实际实现中通常会对多条样本并行执行上述过程,并在一个 batch 内对 Actor 做多次(例如 K 次)小批量更新,但上述伪代码已概括了主要流程。

重要性采样如何修正策略差异

重要性采样(Importance Sampling)是 PPO 算法中至关重要的技术,保障了在策略更新过程中使用旧数据评估新策略时的统计正确性。其作用是修正策略分布差异,使得在旧策略下采样的数据也可用于新策略的梯度估计。

具体来说,策略梯度的理想目标是最大化新策略 $ \pi_{\theta} $ 下的期望回报。但在实际更新中,我们是根据旧策略 $ \pi_{old} $ 采集的数据来估计梯度。如果新旧策略存在差异,直接使用旧策略的数据会引入偏差。重要性采样通过概率比率 $ r(\theta) = \pi_{\theta}(a|s)/\pi_{old}(a|s) $ 来调整采样权重,从而将关于旧策略的期望转化为关于新策略的期望:

$$ \mathbb{E}{a\sim\pi}}\left[\hat{A}(s,a)\right]\approx\mathbb{E{a\sim\pi(s,a)\right]. $$ }}}\left[r(\theta)\hat{A


上式表明,在状态 s 下,针对动作 a 的优势估计 $ \hat{A}(s,a) $,如果我们按照旧策略的分布采样,但对每个样本加权上新旧策略概率之比 $ r(\theta) $,就相当于在新策略分布下进行了采样。这一加权技巧确保了无偏估计的性质:当策略变化不大时,上述估计的期望与新策略下的真实期望一致。

然而,如果策略差异过大(即 $ r(\theta) $ 明显偏离 1),重要性采样估计的方差会急剧增大,导致不稳定的梯度信号。PPO 引入的重要策略约束(裁剪或 KL 惩罚)正是为了解决这一问题。在 PPO 的裁剪策略中,将比率 $ r(\theta) $ 限制在 $ [1 - \epsilon, 1 + \epsilon] $ 范围内,即:

$$ r_{\mathrm{c l i p p e d}}(\theta)=\left{\begin{array}{l l}{1+\epsilon,}&{r(\theta)>1+\epsilon,}\ {1-\epsilon,}&{r(\theta)<1-\epsilon,}\ {r(\theta),}&{\mathrm{o t h e r w i s e},}\end{array}\right. $$

并使用 $ \min(r(\theta)\hat{A}, r_{\mathrm{clipped}}(\theta)\hat{A}) $ 作为替代优势。这样做可以防止 $ r(\theta) $ 过大或过小对目标函数造成不良影响。当策略更新幅度小时, $ r(\theta) $ 接近 1,重要性采样保证了新旧策略下性能评估的一致性;当策略更新尝试跨越较大步长时,裁剪机制削弱该更新对目标的贡献,从而保障策略仅在“小幅”变化范围内被信赖。总的来说,重要性采样使 PPO 能够在 on-policy 算法中高效地重复利用采样数据,同时辅以约束手段保证估计的稳定和可靠。

RLHF 中 Actor-Critic 架构的双网络设计原理

PPO 算法通常采用 Actor-Critic 架构,这在 RLHF 中也不例外。Actor-Critic 架构包含两个主要网络:一个是策略网络(Actor),负责输出动作(对于语言模型,即生成下文文本);另一个是价值网络(Critic),负责评估给定状态(或状态-动作)的价值。两者协同工作,组成异策略评价体系:Actor 产生行为,Critic 对行为进行评价,评价结果(优势)反过来指导 Actor 调整策略。

在 RLHF 的 PPO 训练中,演员模型(Actor)通常由需要对齐的人语言模型担当,它的输出是给定提示下的文本序列;评论家模型(Critic)可以是一个专门预测累计奖励的价值函数网络。在实践中,对于大语言模型,为了高效起见,常会在 Actor 模型的基础上附加一个价值头(Value Head)来充当 Critic,从而共享大部分语言模型的参数,仅对输出的一个标量值进行调整。无论是独立的价值网络还是共享底层的双头网络,其设计原理都是将策略学习与价值估计分开,以发挥各自的功能:

策略网络(Actor)专注于根据策略梯度信号调整其参数,以在环境(或由奖励模型定义的奖励函数)中获得更高的累积奖励。Actor 的输出是一个概率分布 πθ(a | s)\pi_\theta(a|s)πθ(a | s),表示在状态sss(如当前对话上下文)下各可能动作aaa(如可能的回答)的概率。Actor 更新的目标是最大化由 Critic 指导的策略目标(如上节所述的裁剪目标函数)。

价值网络(Critic)致力于近似策略在给定状态下的价值期望。通常,Critic 学习一个值函数V(s)V(s)V(s),估计从状态 sss 开始在当前策略下能够获得的未来回报的期望。因为 RLHF 的每轮交互通常是“一次性”的(模型给出完整回答后就结束),我们经常直接将奖励模型给出的评分视为回报,这种情况下 Critic 所学的值函数接近于对奖励的预测。在训练中,Critic 通过最小化价值估计与实际奖励的误差来更新,从而为 Actor 提供更精准的基线。引入 Critic 的目的是降低策略梯度的方差:相


比直接使用奖励信号,使用优势 $ A^=R-V $ 来代替,可以减少环境固有噪声对梯度的影响,使 Actor 的更新更加稳定。

双网络设计原理 强调了将“决策”和“评价”两职能分离的重要性。在 RLHF 这样的复杂环境中,Actor(语言模型)需要处理语言生成的复杂任务,而 Critic 则需要捕捉人类偏好评分的细微差别。如果让同一网络同时承担这两个任务,可能导致梯度信号互相干扰:策略优化梯度会扰乱价值估计,反之亦然。因此,采用双网络(或至少双输出头)可以隔离目标函数,各自朝着优化方向收敛。此外,由于 Actor 和 Critic 的训练目标不同,收敛速度可能不一致,分离的网络可以允许不同的学习率或更新频率,以便分别调节。在实践中,人们常发现,价值函数的收敛对策略学习至关重要——一个准确的 Critic 能提供可靠的优势估计,从而引导 Actor 有效学习;因此通常会适当增加 Critic 的训练更新次数,确保其跟上 Actor 的策略分布变化。

总之,Actor-Critic 架构在 RLHF 中通过双网络协同,实现了对话策略的高效优化:Actor 提供生成能力,Critic 提供价值判断,二者相辅相成,促使策略既追求高奖励又避免由于估值误差而产生不稳定行为。

KL 散度在 RLHF 中的双重作用

KL 散度(Kullback-Leibler Divergence)在 RLHF 中有着双重作用,分别体现在策略正则化和更新约束两个方面。

(a) 策略正则化(保持与人类语言分布的一致性):在 RLHF 中训练大语言模型时,一个重要的考虑是防止模型为了迎合奖励模型而生成与自然语言分布相偏离的怪异输出。为此,常在奖励函数中加入 KL 散度惩罚项,鼓励当前策略 $ \pi_{\theta} $ 保持与一个参考策略 $ \pi_{\text{ref}} $ 的接近。这个参考策略一般选取为训练开始时的初始模型(例如监督微调后的模型),代表了模型原本的语言分布。KL 散度惩罚通常采取以下形式:定义修正后的奖励 $ R' = R_{\text{model}} - \beta D_{\text{KL}}(\pi_{\theta}(\cdot|s)\parallel\pi_{\text{ref}}(\cdot|s)) $,其中 $ R_{\text{model}} $ 是奖励模型给出的原始分数, $ D_{\text{KL}} $ 表示两策略在同一状态下输出分布的 KL 散度, $ \beta $ 是权衡系数。当前策略偏离参考策略时,KL 项会增大,从而扣减部分奖励;只有当模型既得到高 $ R_{\text{model}} $ 评分又与参考策略足够接近时,净奖励 $ R' $ 才高。这一机制实质上充当了正则项(Regularizer),约束模型不要偏离原有的人类语言习惯和语义合理性。特别是在大模型微调中,KL 正则可以防止模型过度优化奖励模型(即出现 Reward Gaming 行为),确保生成结果既高分又自然。

(b)更新约束(维持策略更新的稳定性):KL 散度的第二个作用是在算法层面用作 策略更新的尺度衡量,确保每次 PPO 更新不会走得太远。这一思想最早体现在 TRPO 算法中,该算法直接限制每次更新前后策略的 KL 距离不超过预设阈值。PPO 虽然未显式硬性限制 KL 距离,但其两种变体本质上都与控制 KL 有关:PPO-Penalty 方法在目标函数中加入了 KL 散度惩罚项(参见下一节),直接将 KL 差异作为一项代价;PPO-Clip 方法则通过裁剪概率比率间接限制了 KL(因为截断比例 $ r(\theta)r(\theta) $) $ r(\theta) $ 过大意味着 KL 偏大,一旦截断,实际等效于对 KL 增长进行限制)。在实际实现中,人们常常监控每次 PPO 更新后的平均 KL 散度,以判断策略是否变化过快:如果观测到 KL 突增,可能需要 降低学习率 或增加 $ \beta\backslash beta $ $ \beta $ 惩罚系数,以收紧更新步伐。相反,如果 KL 持续偏低,说明策略更新过于保守,可以适当放宽约束以加快学习。通过这样的 KL 约束机制,PPO 保持了所谓的“近端”性质——新旧策略总是足够接近,从而保证了策略梯度近似的可信度和训练的稳定收敛。


综上,KL 散度在 RLHF 中扮演了双重角色:一方面,它作为正则项,确保最终策略与人类自然语言分布不背离,达到模型行为学上的对齐(Alignment);另一方面,它作为度量指标,被用于限制每次策略更新步长,保障训练过程的稳定和可靠。这两种作用相辅相成,使得我们能够在追求高人类偏好奖励的同时,不至于让模型走上“歧途”或训练发散。

PPO-Clip 与 PPO-Penalty 的数学差异及各自适用场景

PPO 算法有两种主要变体,即 PPO-Clip 和 PPO-Penalty(有时也称为带 KL 正则的 PPO)。二者在目标函数的数学形式上有所不同,适用于略有差异的场景。

PPO-Clip:截断概率比率的方法。PPO-Clip 使用前述裁剪的替代目标函数来限制策略更新幅度。其损失函数形式可重复如下:

Image
Image

其中 β 为预设的惩罚系数,DKILadd | πg) 表示在状态 sf 下犯策略分布相对于新策略分布的 KL 散度。该式的含义是:最大化优势的期望收益,同时受到新策略偏离且策略时的惩罚。通过调整 β 可以权衡收益和策略变动幅度大小。通常我们会自通应地调节 β:当观测到更新后策略的 KL 散度远低于目标值时,降低 β 放宽约束;若 KL 超出预期,则提高 β 严格约束。通用场景方面,PPO-Penalty 更接近于理论上的信赖域方法,适合在需要严格控制策略变化的情形,例如,在一些对安全性要求极高的任务中,我们可能更倾向于用 KL 项直接约束更新。此外,在 RLHF 中,由于模型初始策略(如 SFT 模型)往往代表了合理的语言分布,对其进行微调时经常量式加入 KL 正则(正如前述),这实际与 PPO-Penalty 的思想一致:即在优化奖励的同时,将与初始策略的 KL 差距作为一个惩罚。这使得 PPO-Penalty 形式在 RLHF 理论分析中十分有用。然而,需要注意的是,PPO-Penalty 引入了一个额外的超参数 β,不恰当的惩罚系数可能导致学习过慢或约束失效,因此一般需要根据经验或通过试验调整 β(或设置 KL 目标值采用自适应调整机制),相对来说调参开销更大。

对比与总结:PPO-Clip 和 PPO-Penalty 都旨在限制每次策略更新幅度,保证策略优化的稳定收敛。PPO-Clip 方法直接、实现简单、经验上鲁棒,因此在实际应用中更为常见;而 PPO-Penalty 方法提供了更明确的理论约束,可以严格控制策略分布的变化,但需要细致地调节惩罚强度。许多现实应用(包括主流开源实现)中默认采用 PPO-Clip,而将 KL 惩罚作为辅助监控指标;也有一些实现同时结合两种方法,比如在 Clip 的基础上对总体 KL 超标时追加一个全局惩罚。对于 RLHF 场景,大多数情况下使用 PPO-Clip 已能取得满意效果,但在希望精确维持模型与初始语言风格接近的情况下,可以考虑引入 PPO-Penalty 思想,通过调节 KL 惩罚系数来达到更严格的对齐控制。