深入RLHF:从策略梯度到PPO、GAE和DPO,实现LLM对齐
欢迎阅读本篇博客文章!如果你渴望探索大语言模型(LLM)中的人类反馈强化学习(RLHF),并希望从基础开始理解其过程——从基本的策略梯度方法和经典的REINFORCE算法,到使用裁剪目标(clipping objectives)和广义优势估计(GAE)平衡偏差与方差来推导近端策略优化(PPO),最后到对DPO等离线方法的深入讨论——那么你来对了地方。
在这篇文章中,我们将从梯度策略优化的基础开始,逐步构建到成熟的REINFORCE算法,然后探讨如何通过裁剪目标实现PPO。我们还将研究GAE如何帮助在偏差和方差之间取得理想的平衡。稍后,我们将推导和讨论DPO等离线训练方法,深入了解每种训练路径的优势和挑战。
1. 在线策略(On-Policy)与离线策略(Off-Policy)强化学习
目前,大语言模型(LLM)中主流的RLHF方法大致可分为两大类:
在线策略方法(以PPO为代表)
离线策略方法(以DPO为代表)
那么,在线策略和离线策略究竟有何区别?这里有一个简单的经验法则:
在线策略: 训练期间,模型主动生成自己的数据样本。
离线策略: 训练依赖于预先收集的数据(或由其他策略生成的数据),无需实时生成。
一般来说,在线策略方法计算成本更高,耗时更长——主要瓶颈在于生成步骤。对于生成任务,模型必须一次输出一个token,这是一个极其耗费资源的过程。尽管速度较慢,但在线策略方法提供了更高的理论性能上限,因为它们会根据模型当前状态不断探索和更新。当我们稍后深入探讨PPO时,这种优势会变得更加清晰。
让我们首先探讨在线策略方法。
在线策略学习的本质
在线策略学习的核心是让模型生成自己的响应,然后对这些响应进行评分,以指导后续的参数更新。简而言之,关键思想是让模型“亲自上阵”。
想象你是一个正在学习下棋的模型。有两种可能的训练场景:
方法一: 你积极地进行棋局,教练对你的每一步实时提供反馈。当你吃掉对手的棋子时,教练为你欢呼;如果你不慎犯了导致反击的冲动错误,教练会立即建议你如何改进。
方法二: 你不亲自下棋,而是获得一系列对局记录——有些是专业比赛,有些是表现不佳的对局——并标注出哪些棋步有效,哪些无效。你通过模仿好的棋步、避免坏的棋步来被动学习。
这两种方法之间的根本区别在于你是否真的在“玩”游戏。方法一代表在线策略(On-Policy) 训练,模型生成自己的动作并从中学习;方法二体现了离线策略(Off-Policy) 训练,学习完全基于现有数据。
离线策略方法在训练过程中通常更快,因为它们依赖现成的数据,无需模型实时生成新样本。然而,它们对预先收集的数据与模型当前能力的一致性高度敏感。如果存在显著不匹配——无论是数据太具挑战性还是过于简单——学习过程都可能受到影响。另一方面,在线策略训练避免了这个问题,因为训练样本始终反映了模型的当前性能水平。
在线策略框架的关键组成部分
在语言模型中,典型的在线策略算法包含以下组成部分:
执行者(Actor): 生成句子的模型(类似于你下棋)。
评论者(Critic): 扮演教练的角色,为每个生成的输出提供即时反馈,并随着模型的进步与执行者一起更新。
奖励模型(Reward Model): 充当裁判,分配最终分数或偏好评估。这个组件在训练过程中通常保持固定。
参考模型(Reference Model): 大型模型PPO中的一个独特元素,它阻止执行者偏离原始预训练分布太远,从而减轻奖励作弊(reward hacking)等问题。
鉴于这些组件中的每一个都可能非常庞大(通常需要同时加载多个70B参数的模型),在线策略训练通常需要巨大的计算资源。这就是为什么PPO常被描述为“计算昂贵”的原因。
接下来,我们将重点关注PPO——最具代表性的在线策略方法——看看它如何在训练成本和学习效率之间取得实际平衡。
2. PPO(近端策略优化)
2.1 从策略梯度优化开始
想象你是一个刚刚开始学习下棋的新手。你的目标是通过不断完善你的棋局策略(记为π θ \pi_{\theta}π θ ,其中θ \thetaθ 表示你的策略参数)来提高胜率。你可以把每盘棋看作一个轨迹τ \tauτ ,你希望通过优化它来获得更高的奖励。
更一般地,强化学习的目标是优化策略以最大化预期回报:
π ∗ = arg max π J ( π ) \pi^* = \arg \max_\pi J(\pi) π ∗ = arg π max J ( π )
形式上,策略的回报定义为所有可能轨迹的:
J ( π θ ) = ∫ τ P ( τ ∣ π ) R ( τ ) = E τ ∼ π [ R ( τ ) ] J(\pi_{\theta}) = \int_\tau P(\tau \mid \pi) R(\tau) = \mathbb{E}_{\tau \sim \pi} [R(\tau)] J ( π θ ) = ∫ τ P ( τ ∣ π ) R ( τ ) = E τ ∼ π [ R ( τ )]
轨迹就是状态和相应动作的序列:
τ = ( s 0 , a 0 , s 1 , a 1 , … ) \tau = (s_0, a_0, s_1, a_1, \dots) τ = ( s 0 , a 0 , s 1 , a 1 , … )
在我们的象棋类比中,状态s t s_ts t 表示当前的棋盘布局,而行动a t a_ta t 表示你决定下一步怎么走。下一个状态由概率分布决定——例如,反映你对手的响应:
s t + 1 ∼ P ( ⋅ ∣ s t , a t ) s_{t+1} \sim P(\cdot \mid s_t, a_t) s t + 1 ∼ P ( ⋅ ∣ s t , a t )
因此,轨迹τ \tauτ 的概率由下式给出:
P ( τ ∣ π ) = ρ 0 ( s 0 ) ∏ t = 0 T − 1 P ( s t + 1 ∣ s t , a t ) π ( a t ∣ s t ) P(\tau \mid \pi) = \rho_0(s_0) \prod_{t=0}^{T-1} P(s_{t+1} \mid s_t, a_t) \pi(a_t \mid s_t) P ( τ ∣ π ) = ρ 0 ( s 0 ) t = 0 ∏ T − 1 P ( s t + 1 ∣ s t , a t ) π ( a t ∣ s t )
在强化学习中,我们通常会对未来的奖励进行折现——未来的回报永远不如即时回报有价值。因此,轨迹的总回报定义为:
R ( τ ) = ∑ t = 0 ∞ γ t r t R(\tau) = \sum_{t=0}^\infty \gamma^t r_t R ( τ ) = t = 0 ∑ ∞ γ t r t
其中γ ∈ [ 0 , 1 ] \gamma \in [0, 1]γ ∈ [ 0 , 1 ] 是折扣因子,r t r_tr t 是在时刻t tt 获得的奖励。
在深度学习中,我们通常使用随机梯度下降通过最小化损失函数来更新参数。然而,由于我们的目标是最大化 回报,我们使用随机梯度上升来更新策略:
θ k + 1 = θ k + α ∇ θ J ( π θ ) ∣ θ k \theta_{k+1} = \theta_k + \alpha \nabla_{\theta} J(\pi_{\theta}) \big|_{\theta_k} θ k + 1 = θ k + α ∇ θ J ( π θ ) θ k
这里,∇ θ J ( π θ ) \nabla_{\theta} J(\pi_{\theta})∇ θ J ( π θ ) 被称为策略梯度 。换句话说,每盘棋结束后,你都会回顾你的走法,评估每一步对最终结果的贡献,然后相应地调整你的策略。这种整体方法被称为策略梯度算法 。
然而,就像下棋一样,你必须考虑所有可能的走法和棋盘状态,计算精确的梯度需要对所有可能的轨迹求和或积分。在实践中(除非游戏极其简单),这在计算上是不可行的——即使R ( τ ) R(\tau)R ( τ ) 是可微分的——因为长轨迹长度使得自动微分非常耗内存。因此,我们需要仔细推导一种计算策略梯度的方法。
策略梯度的推导
为了推导出策略梯度的实用表达式——就像逐个回顾棋局一样——我们从目标函数的梯度开始。将每局棋看作一个轨迹τ \tauτ ,目标函数的梯度为:
∇ θ J ( π θ ) = ∇ θ E τ ∼ π θ [ R ( τ ) ] \nabla_{\theta}J(\pi_{\theta}) = \nabla_{\theta} \operatorname{E}_{\tau \sim \pi_{\theta}} [R(\tau)] ∇ θ J ( π θ ) = ∇ θ E τ ∼ π θ [ R ( τ )]
步骤1:展开期望
这一步等同于通过将期望展开为所有轨迹上的积分来考虑所有可能的对局:
= ∇ θ ∫ τ P ( τ ∣ θ ) R ( τ ) d τ = \nabla_{\theta} \int_{\tau} P(\tau|\theta) R(\tau) \, d\tau = ∇ θ ∫ τ P ( τ ∣ θ ) R ( τ ) d τ
步骤2:交换梯度和积分
类似于分解每一步的影响,我们将梯度算子移到积分内部:
= ∫ τ ∇ θ P ( τ ∣ θ ) R ( τ ) d τ = \int_{\tau} \nabla_{\theta} P(\tau|\theta) R(\tau) \, d\tau = ∫ τ ∇ θ P ( τ ∣ θ ) R ( τ ) d τ
步骤3:应用对数导数技巧
通过使用一种称为对数导数(或似然比)技巧的数学技巧——类似于分解每一步的重要性——我们得到:
= ∫ τ P ( τ ∣ θ ) ∇ θ log P ( τ ∣ θ ) ⋅ R ( τ ) d τ = \int_{\tau} P(\tau|\theta) \nabla_{\theta} \log P(\tau|\theta) \cdot R(\tau) \, d\tau = ∫ τ P ( τ ∣ θ ) ∇ θ log P ( τ ∣ θ ) ⋅ R ( τ ) d τ
步骤4:返回期望形式
最后,我们可以将积分重新写回期望形式:
= E τ ∼ π θ [ ∇ θ log P ( τ ∣ θ ) ⋅ R ( τ ) ] = \operatorname{E}_{\tau \sim \pi_{\theta}} \left[ \nabla_{\theta} \log P(\tau|\theta) \cdot R(\tau) \right] = E τ ∼ π θ [ ∇ θ log P ( τ ∣ θ ) ⋅ R ( τ ) ]
分解 ∇ θ log P ( τ ∣ θ ) \nabla_{\theta} \log P(\tau|\theta)∇ θ log P ( τ ∣ θ )
在一局游戏中,每一步都由你当时的决策决定。如果我们将游戏轨迹 τ \tauτ 表示为
P ( τ ∣ θ ) = ρ 0 ( s 0 ) ∏ i = 0 T − 1 P ( s i + 1 ∣ s i , a i ) π θ ( a i ∣ s i ) P(\tau|\theta) = \rho_0(s_0) \prod_{i=0}^{T-1} P(s_{i+1}|s_i, a_i) \pi_{\theta}(a_i|s_i) P ( τ ∣ θ ) = ρ 0 ( s 0 ) i = 0 ∏ T − 1 P ( s i + 1 ∣ s i , a i ) π θ ( a i ∣ s i )
那么 π θ ( a i ∣ s i ) \pi_{\theta}(a_i|s_i)π θ ( a i ∣ s i ) 是在给定棋盘状态 s i s_is i 下选择特定走法 a i a_ia i 的概率。取对数后,再求梯度,我们得到
∇ θ log P ( τ ∣ θ ) = ∑ i = 0 T ∇ θ log π θ ( a i ∣ s i ) \nabla_{\theta} \log P(\tau|\theta) = \sum_{i=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a_i|s_i) ∇ θ log P ( τ ∣ θ ) = i = 0 ∑ T ∇ θ log π θ ( a i ∣ s i )
(注意:对手的走法 P ( s i + 1 ∣ s i , a i ) P(s_{i+1}|s_i, a_i)P ( s i + 1 ∣ s i , a i ) 由固定规则决定,不依赖于 θ \thetaθ ,因此它们的梯度为零。)
2.2 最终策略梯度公式
将上述结果代入我们的期望,我们得到最终的策略梯度公式
∇ θ J ( π θ ) = E τ ∼ π θ [ ∑ i = 0 T ∇ θ log π θ ( a i ∣ s i ) ⋅ R ( τ ) ] \nabla_{\theta} J(\pi_{\theta}) = \operatorname{E}_{\tau \sim \pi_{\theta}} \left[ \sum_{i=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a_i|s_i) \cdot R(\tau) \right] ∇ θ J ( π θ ) = E τ ∼ π θ [ i = 0 ∑ T ∇ θ log π θ ( a i ∣ s i ) ⋅ R ( τ ) ]
在这个公式中,每一步的决策(由 log π θ \log \pi_{\theta}log π θ 捕获)影响游戏的整体结果,而与对手响应的固定规则无关。在实践中,我们使用蒙特卡洛采样来近似这个期望——就像通过反复练习来提高你的国际象棋技能一样。基于样本的策略梯度可以近似为
g ^ = 1 D ∑ τ ∈ D ∑ t = 0 T ∇ θ log π θ ( a t ∣ s t ) R ( τ ) \hat{g} = \frac{1}{\mathcal{D}} \sum_{\tau \in \mathcal{D}} \sum_{t=0}^T \nabla_{\theta} \text{log} \pi_\theta (a_t \mid s_t) R(\tau) g ^ = D 1 τ ∈ D ∑ t = 0 ∑ T ∇ θ log π θ ( a t ∣ s t ) R ( τ )
仔细观察,你会发现 R ( τ ) R(\tau)R ( τ ) 直接出现在策略参数的梯度计算中。
2.3 REINFORCE 算法:过程与实现步骤
现在我们来介绍经典的策略梯度方法——REINFORCE 算法——它类似于玩游戏、回顾表现并不断完善你的策略。
构建策略网络 构建一个神经网络来定义你的国际象棋策略 π θ \pi_{\theta}π θ
输入 :当前的棋盘状态 s t s_ts t
输出 :下一步棋的概率分布 P ( a t ∣ s t ) P(a_t \mid s_t)P ( a t ∣ s t )
轨迹采样 使用当前策略玩游戏,以采样轨迹 τ \tauτ 并记录每一步获得的奖励(例如,赢得游戏后的奖励)。
你可以设置每局游戏的固定步数(比如100步),或者一直玩到游戏结束。
梯度计算 从收集到的游戏数据集 D \mathcal{D}D 中计算梯度估计,就像你在回顾中评估每一步的贡献一样。
g ^ = 1 ∣ D ∣ ∑ τ ∈ D ∑ t = 0 T ∇ θ log π θ ( a t ∣ s t ) ⏟ Gradient of decision at each move ⋅ R ( τ ) ⏟ Total reward for the game \hat{g} = \frac{1}{|\mathcal{D}|} \sum_{\tau \in \mathcal{D}} \sum_{t=0}^T \underbrace{\nabla_\theta \log \pi_\theta(a_t|s_t)}_{\text{Gradient of decision at each move}} \cdot \underbrace{R(\tau)}_{\text{Total reward for the game}} g ^ = ∣ D ∣ 1 τ ∈ D ∑ t = 0 ∑ T Gradient of decision at each move ∇ θ log π θ ( a t ∣ s t ) ⋅ Total reward for the game R ( τ )
参数更新 使用随机梯度上升来更新你的策略参数——就像你根据游戏回顾调整你的下棋风格一样。
θ k + 1 = θ k + α g ^ \theta_{k+1} = \theta_k + \alpha \hat{g} θ k + 1 = θ k + α g ^
或等价地
θ k + 1 = θ k + α ∇ θ J ( π θ ) ∣ θ k \theta_{k+1} = \theta_k + \alpha \nabla_\theta J(\pi_\theta) \big|_{\theta_k} θ k + 1 = θ k + α ∇ θ J ( π θ ) θ k
迭代优化 重复“下棋-回顾-调整”的循环,直到你的策略收敛,并且你能够持续保持高水平。
核心公式解释
梯度估计公式
g ^ = 1 ∣ D ∣ ∑ τ ∈ D ∑ t = 0 T ∇ θ log π θ ( a t ∣ s t ) ⏟ Gradient of decision at each move ⋅ R ( τ ) ⏟ Total reward for the game \hat{g} = \frac{1}{|\mathcal{D}|} \sum_{\tau \in \mathcal{D}} \sum_{t=0}^T \underbrace{\nabla_\theta \log \pi_\theta(a_t|s_t)}_{\text{Gradient of decision at each move}} \cdot \underbrace{R(\tau)}_{\text{Total reward for the game}} g ^ = ∣ D ∣ 1 τ ∈ D ∑ t = 0 ∑ T Gradient of decision at each move R ( τ )
这里,我们使用大量的蒙特卡洛采样来近似完整的期望。
总奖励 R ( τ ) R(\tau)R ( τ ) 代表整个游戏的结果,用作衡量你决策累积影响的指标。
参数更新规则
θ k + 1 = θ k + α g ^ \theta_{k+1} = \theta_k + \alpha \hat{g} θ k + 1 = θ k + α g ^
项 α \alphaα 是学习率,类似于你根据游戏回顾调整策略的幅度;梯度指向增加你获胜概率的方向。
算法特点
主要优点 :该方法仅依赖于你的实际游戏经验,不需要任何关于对手策略的先验知识(无模型)。
计算要求 :它需要大量的游戏样本来降低梯度估计中固有的高方差。
可能改进 :后来的方法(如 Actor-Critic 方法)引入了一个价值函数基线来稳定策略更新——类似于在你的游戏回顾中获得专业教练的反馈以加速提高。
2.4 策略梯度优化中的挑战
策略梯度优化的一个核心假设是我们可以使用所选方法可靠地估计策略梯度。然而,当问题规模扩大时——例如,当每个轨迹 τ \tauτ 变得非常长或策略模型非常大时——你必须采样许多轨迹才能获得准确的梯度估计;否则,你将面临高方差。尽管策略梯度算法中的梯度估计器在理论上是无偏的(其期望值收敛于真实梯度),但其方差可能非常高。回顾梯度估计式:
g ^ = 1 ∣ D ∣ ∑ τ ∈ D ∑ t = 0 T ∇ θ log π θ ( a t ∣ s t ) R ( τ ) \hat{g} = \frac{1}{|\mathcal{D}|} \sum_{\tau \in \mathcal{D}} \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t \mid s_t) \, R(\tau) g ^ = ∣ D ∣ 1 τ ∈ D ∑ t = 0 ∑ T ∇ θ log π θ ( a t ∣ s t ) R ( τ )
其中
∣ D ∣ |\mathcal{D}|∣ D ∣ 表示数据集 D \mathcal{D}D 的大小,
π θ \pi_\thetaπ θ 是当前的策略(你的国际象棋策略),
R ( τ ) R(\tau)R ( τ ) 是游戏的累计回报(轨迹 τ \tauτ ),
a t , s t a_t, s_ta t , s t 分别表示时间 t tt 的行动和状态。
想象一下下国际象棋,并试图将整体结果归因于每一步棋。如果你试图将游戏的全部结果归因于每一步棋,那么评估将变得极不稳定,即表现出高方差。接下来,我们将探讨减少估计方差的方法。
2.5 降低方差:只关注未来
请注意,在上述梯度估计中,无论当前步骤 t tt 是什么,R ( τ ) R(\tau)R ( τ ) 始终包含整个轨迹的回报。这并不完全合理,因为一个决策只应考虑其对未来结果的影响——过去无法改变,不应影响对当前行动的评估。
回到我们的国际象棋示例:如果每一步棋的分数都考虑了早期的棋(无论是好是坏),就会掩盖当前决策的真实价值。实际上,在评估当前棋步时,你只需要考虑“未来回报”——从这一步到游戏结束所累积的回报。这个概念被称为 **“奖励到终点”(rewards-to-go)**。
在数学上,我们对梯度估计进行如下调整:
∇ θ J ( θ ) ≈ 1 N ∑ i = 1 N ( ∑ t = 0 T ∇ θ log π θ ( a i , t ∣ s i , t ) ) ( ∑ t ′ = t T r ( s i , t ′ , a i , t ′ ) ) \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \left( \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_{i,t} \mid s_{i,t}) \right) \left( \sum_{t'=t}^T r(s_{i,t'}, a_{i,t'}) \right) ∇ θ J ( θ ) ≈ N 1 i = 1 ∑ N ( t = 0 ∑ T ∇ θ log π θ ( a i , t ∣ s i , t ) ) ( t ′ = t ∑ T r ( s i , t ′ , a i , t ′ ) )
这里,∑ t ′ = t T r ( s i , t ′ , a i , t ′ ) \sum_{t'=t}^T r(s_{i,t'}, a_{i,t'})∑ t ′ = t T r ( s i , t ′ , a i , t ′ ) 表示从当前步骤到游戏结束的累计奖励。这类似于通过只关注从某个点开始的棋步影响来回顾游戏,而忽略已经发生的事情。
通过消除这些冗余的过去奖励,我们梯度估计的方差自然会降低。
2.6 降低方差:引入基线
为了进一步减少评估中的波动,我们可以从每一步的未来奖励中减去一个基线值。在数学上,这个基线通常表示为 b bb (实际上,我们通常使用价值函数 V π ( s ) V^\pi(s)V π ( s ) 作为基线)。修改后的梯度估计变为:
∇ θ J ( θ ) ≈ 1 N ∑ i = 1 N ( ∑ t = 0 T ∇ θ log π θ ( a i , t ∣ s i , t ) ) ( ∑ t ′ = t T r ( s i , t ′ , a i , t ′ ) − b ) \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \left( \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_{i,t} \mid s_{i,t}) \right) \left( \sum_{t'=t}^T r(s_{i,t'}, a_{i,t'}) - b \right) ∇ θ J ( θ ) ≈ N 1 i = 1 ∑ N ( t = 0 ∑ T ∇ θ log π θ ( a i , t ∣ s i , t ) ) ( t ′ = t ∑ T r ( s i , t ′ , a i , t ′ ) − b )
这里,b bb 作为基线,通常是状态 s t s_ts t 的函数,表示从当前状态获得的预期回报。项 ∑ t ′ = t T r ( s i , t ′ , a i , t ′ ) − b \sum_{t'=t}^T r(s_{i,t'}, a_{i,t'}) - b∑ t ′ = t T r ( s i , t ′ , a i , t ′ ) − b 则反映了 **优势**,即实际回报超出基线的量。在实践中,我们使用这个优势而不是原始奖励来估计梯度,以减少方差。
在对大型语言模型进行对齐时,通常在语言模型(即策略 π θ \pi_\thetaπ θ )之上添加一个额外的线性层,用于估计给定状态的预期回报 V π ( s ) V^\pi(s)V π ( s ) 。这可以作为每个状态的基准,帮助我们衡量决策的真实优势。有关为何需要基线的更直观解释,请参阅我的上一篇博客文章 。
2.7 降低方差:引入 Q QQ 和 V VV
前面我们讨论了 **“奖励到终点”** 的概念,表示为 ∑ t ′ = t T r ( s i , t ′ , a i , t ′ ) \sum_{t'=t}^T r(s_{i,t'}, a_{i,t'})∑ t ′ = t T r ( s i , t ′ , a i , t ′ ) 。在强化学习中,这个项被称为 **Q 函数** Q π ( s , a ) Q^\pi(s, a)Q π ( s , a ) ,它表示在状态 s ss 中采取行动 a aa 时,未来的总回报。通过减去状态价值 V π ( s ) V^\pi(s)V π ( s ) ,我们得到 **优势函数**:
A π ( s , a ) = Q π ( s , a ) − V π ( s ) A^\pi(s, a) = Q^\pi(s, a) - V^\pi(s) A π ( s , a ) = Q π ( s , a ) − V π ( s )
用我们的国际象棋类比来说,Q 函数量化了在状态 s ss 中走一步棋后游戏的潜在结果,而状态价值则代表棋盘位置的内在强度。即使棋盘有利,一步糟糕的棋也可能降低你的相对优势。因此,不仅要考虑一步棋的绝对分数,还要将其与基线进行比较。正的 A π ( s , a ) A^\pi(s, a)A π ( s , a ) 表明该步棋显著改善了你的位置,而负值则表明它次优。
最终,我们可以将策略梯度表示为:
∇ θ J ( θ ) ≈ 1 N ∑ i = 1 N ( ∑ t = 0 T ∇ θ log π θ ( a i , t ∣ s i , t ) ) A π ( s , a ) \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \left( \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_{i,t} \mid s_{i,t}) \right) A^\pi(s, a) ∇ θ J ( θ ) ≈ N 1 i = 1 ∑ N ( t = 0 ∑ T ∇ θ log π θ ( a i , t ∣ s i , t ) ) A π ( s , a )
这个公式概括了每一步棋的相对表现(与平均水平相比)如何指导你的策略调整。
2.8 解释优势函数
简而言之,优势函数 A π ( s , a ) A^\pi(s, a)A π ( s , a ) 告诉你,在给定状态 s ss 下,特定棋步 a aa 提高获胜机会的程度,与平均棋步相比。如果一步棋的预期回报显著高于基线,则其优势为正——表明这是一步有前途的棋;如果不是,则表明其表现低于平均水平。
总而言之,通过只关注未来奖励、引入基线以及利用优势函数,我们可以有效地降低梯度估计的方差。这种方法类似于通过专注于真正改变结果的关键棋步来回顾游戏,从而使策略更新更加稳定和有针对性。
2.9 估计优势项 – 使用迭代 GAE 策略
有几种方法可以估计优势项。例如:
A ^ π ( s t , a t ) = [ r ( s t , a t ) + γ V π ( s t + 1 ) ] − V π ( s t ) \hat{A}^\pi(s_t, a_t) = \big[ r(s_t, a_t) + \gamma V^\pi(s_{t+1}) \big] - V^\pi(s_t) A ^ π ( s t , a t ) = [ r ( s t , a t ) + γ V π ( s t + 1 ) ] − V π ( s t )
A ^ π ( s t , a t ) = [ r ( s t , a t ) + γ r ( s t + 1 , a t + 1 ) + γ 2 V π ( s t + 2 ) ] − V π ( s t ) \hat{A}^\pi(s_t, a_t) = \big[ r(s_t, a_t) + \gamma r(s_{t+1}, a_{t+1}) + \gamma^2 V^\pi(s_{t+2}) \big] - V^\pi(s_t) A ^ π ( s t , a t ) = [ r ( s t , a t ) + γ r ( s t + 1 , a t + 1 ) + γ 2 V π ( s t + 2 ) ] − V π ( s t )
A ^ π ( s t , a t ) = [ r ( s t , a t ) + γ r ( s t + 1 , a t + 1 ) + γ 2 r ( s t + 2 , a t + 2 ) + γ 3 V π ( s t + 3 ) ] − V π ( s t ) \hat{A}^\pi(s_t, a_t) = \big[ r(s_t, a_t) + \gamma r(s_{t+1}, a_{t+1}) + \gamma^2 r(s_{t+2}, a_{t+2}) + \gamma^3 V^\pi(s_{t+3}) \big] - V^\pi(s_t) A ^ π ( s t , a t ) = [ r ( s t , a t ) + γ r ( s t + 1 , a t + 1 ) + γ 2 r ( s t + 2 , a t + 2 ) + γ 3 V π ( s t + 3 ) ] − V π ( s t )
这些例子说明,通过对多个步骤求和,我们可以平衡偏差和方差。
在累积实际奖励时**过早停止**会导致**高偏差**,因为除了极少的实际奖励外,只考虑了真实回报的一小部分。
**累积过多奖励**会导致**高方差**,因为依赖更多的实际样本可能会使估计不稳定。
为了在偏差-方差权衡中取得平衡,我们采用这些项的加权和,称为**广义优势估计 (GAE)**。
δ t = r t + γ V π ( s t + 1 ) − V π ( s t ) \delta_t = r_t + \gamma V^\pi(s_{t+1}) - V^\pi(s_t) δ t = r t + γ V π ( s t + 1 ) − V π ( s t )
A ^ t = δ t + γ λ A ^ t + 1 \hat{A}_t = \delta_t + \gamma \lambda \hat{A}_{t+1} A ^ t = δ t + γλ A ^ t + 1
这是一个**递归公式**。最终时间步的优势估计可以看作是第一次扩展,每个前面的步骤都通过衰减因子 λ \lambdaλ 加权,增加另一层。
通过在时间步长上迭代累积这些项,我们平衡了实际奖励的高方差与仅依赖价值函数引入的高偏差。
在对齐大型语言模型时,这种方法指导策略(即语言模型)**在给定特定提示(状态)的情况下,平均而言,提高选择下一个生成令牌的概率,使其产生高于基线的奖励**。换句话说,模型将倾向于选择**更有可能导致满足我们期望奖励标准的序列**的令牌——从而产生与我们训练数据分布更好地对齐的输出。
2.10 PPO 损失
在近端策略优化 (PPO) 中,为了防止策略在更新过程中发生剧烈变化,我们设计了一个由几个关键组成部分组成的专门损失函数。
策略损失
L POLICY = min ( π θ ( a t ∣ s t ) π old ( a t ∣ s t ) A ^ t , clip ( π θ ( a t ∣ s t ) π old ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) A ^ t ) L_{\text{POLICY}} = \min \Bigg( \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\text{old}}(a_t \mid s_t)} \hat{A}_t, \; \text{clip}\Bigg(\frac{\pi_\theta(a_t \mid s_t)}{\pi_{\text{old}}(a_t \mid s_t)},\, 1 - \epsilon,\, 1 + \epsilon\Bigg) \, \hat{A}_t \Bigg) L POLICY = min ( π old ( a t ∣ s t ) π θ ( a t ∣ s t ) A ^ t , clip ( π old ( a t ∣ s t ) π θ ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) A ^ t )
这个组成部分类似于下棋时不要一下子彻底改变你的策略。相反,你更倾向于逐步微调你的走法,以便在改善棋盘局势的同时,避免采取可能破坏整体结构的鲁莽步骤。
价值函数损失
L VF = 1 2 ∥ V θ ( s ) − ( ∑ t = 0 T γ t r t | s 0 = s ) ∥ 2 2 L_{\text{VF}} = \frac{1}{2} \left\lVert V_\theta(s) - \left( \sum_{t=0}^T \gamma^t r_t \;\middle|\; s_0 = s \right) \right\rVert_2^2 L VF = 2 1 V θ ( s ) − ( t = 0 ∑ T γ t r t s 0 = s ) 2 2
这一项确保对于每个状态,你的预期回报估计(类似于预测比赛将如何发展)尽可能接近实际获得的回报。
熵损失
L ENTROPY = − ∑ x p ( x ) log p ( x ) L_{\text{ENTROPY}} = - \sum_x p(x) \log p(x) L ENTROPY = − x ∑ p ( x ) log p ( x )
熵损失鼓励策略保持一定程度的探索。就像一位经验丰富的棋手,他不仅掌握已知的模式,而且愿意尝试新的想法以保持适应性,这一项防止策略变得过于确定性。
PPO 总损失
L PPO = L POLICY + c 1 L VF + c 2 L ENTROPY L_{\text{PPO}} = L_{\text{POLICY}} + c_1 L_{\text{VF}} + c_2 L_{\text{ENTROPY}} L PPO = L POLICY + c 1 L VF + c 2 L ENTROPY
通过结合这些组成部分,我们得到了 PPO 总损失。此损失函数旨在在更新策略时提高胜率(或奖励),同时确保策略不会与其原始行为偏离过大——从而促进稳定高效的学习。
2.11 使用 PPO 的优势
稳定性 :剪辑操作确保策略更新是适度的——就像你不会在棋局中途大幅改变你的下棋风格一样,每一步都保持一致和有分寸。
样本效率 :PPO 有效利用收集到的游戏数据,尽管在大型模型中,仍然需要大量的样本。
内在安全性 :通过剪辑更新和相对于参考策略的 KL 惩罚,PPO 有效地防止了训练期间的剧烈偏差,确保生成输出与预训练风格保持一致。
总的来说,就像一位经验丰富的棋手通过下棋、复盘和微调策略不断进步一样,PPO 通过精确的梯度更新和对策略变化的限制来实现稳健高效的强化学习。
3. 理解和推导 GAE (广义优势估计)
想象一下你正在参加一场高风险的国际象棋锦标赛。每一步棋不仅影响当前棋盘状态,还可能对整局游戏产生深远影响。为了确定某个特定着法提供了多少优势,你必须同时考虑即时得分及其对未来棋盘位置的潜在影响。广义优势估计 (GAE) 正是为了解决这个问题而设计的——它帮助评估在给定状态下,某个行动比平均水平好多少,就像复盘一局棋,看看某一步是否显著增加了你的胜算一样。
GAE 创新性地结合了多步估计和时间差分 (TD) 学习的思想。通过使用一系列过去的误差来预测未来回报,它在偏差和方差之间取得了最佳平衡。当与 PPO 结合使用时,它就像一位棋手,不仅拥有稳健的战略框架 (PPO),还利用精确的棋局评估 (GAE) 来持续优化每一步棋,从而实现更稳定和更有效的整体表现。
3.1 引入残差概念
下棋时,你很难立即判断一个着法的全部价值;相反,你根据对后续着法的预测来估计其效果。这种预测与实际结果之间的差异被称为时间差分 (TD) 残差。
为什么我们需要残差?
想象一下你正处于棋局的关键时刻。根据经验,你认为向左移动可能有利,但在移动后,结果并没有预期那么好。你的初始预测与实际结果之间的差异就是残差——它帮助你纠正未来的估计,以便日后做出更好的决策。
残差的数学表达式
对于策略梯度方法,价值函数的梯度可以写成:
∇ R θ = E ( a t , s t ) ∼ π θ [ A θ ( a t , s t ) ∇ log P θ ( a t ∣ s t ) ] \nabla R_{\theta} = \mathbb{E}_{(a_t, s_t)\sim \pi_\theta} \left [A^{\theta}(a_t, s_t) \nabla \log P_{\theta} (a_t \mid s_t) \right] ∇ R θ = E ( a t , s t ) ∼ π θ [ A θ ( a t , s t ) ∇ log P θ ( a t ∣ s t ) ]
其中,A θ ( a t , s t ) A^{\theta}(a_t, s_t)A θ ( a t , s t ) 代表在状态 s t s_ts t 采取行动 a t a_ta t 的优势(经基线校正后的未来回报),我们将其表示为 A ( t ) A(t)A ( t ) 。如果我们简单地定义
A ( t ) = r t − V ( s t ) A(t) = r_t - V(s_t) A ( t ) = r t − V ( s t )
那么,为了更准确地反映当前着法对未来结果的全面影响,我们引入了 TD 残差。具体来说,在状态 s t s_ts t 中采取行动 a t a_ta t ,到达状态 s t + 1 s_{t+1}s t + 1 并获得即时奖励 r t r_tr t ,我们将 TD 残差定义为
δ t = r t − ( V ( s t ) − γ V ( s t + 1 ) ) \delta_t = r_t - \big(V(s_t) - \gamma V(s_{t+1})\big) δ t = r t − ( V ( s t ) − γV ( s t + 1 ) )
r t r_tr t 类似于你落子后获得的即时得分。
V ( s t ) V(s_t)V ( s t ) 和 V ( s t + 1 ) V(s_{t+1})V ( s t + 1 ) 是你对当前和下一个棋盘位置的预测值——类似于教练的评估。
γ \gammaγ 是折扣因子,表示未来奖励逐渐被弱化。
残差的直观解释
假设你正在下棋,当前棋盘状态是 s t s_ts t 。你选择一个走法 a t a_ta t ,它导致一个新的棋盘状态 s t + 1 s_{t+1}s t + 1 ,并获得即时奖励 r t r_tr t 。你的目标是评估该走法的整体影响。
你对当前状态值的估计,V ( s t ) V(s_t)V ( s t ) ,代表了如果你继续按照当前策略下棋,预期获得的收益。
你对下一个状态的估计,V ( s t + 1 ) V(s_{t+1})V ( s t + 1 ) ,反映了从那时起预期获得的收益。
理想情况下,你会有
V ( s t ) = r t + γ V ( s t + 1 ) V(s_{t}) = r_t + \gamma V(s_{t+1}) V ( s t ) = r t + γV ( s t + 1 )
也就是说,当前状态的值应该等于即时奖励加上折扣后的未来价值。然而,在现实中,V ( s t ) V(s_{t})V ( s t ) 可能偏离这个理想值,而 TD 残差 δ t \delta_tδ t 量化了这种误差。它告诉你实际结果与你的预期相差多大,就像意识到某个特定走法比你预期的影响更好或更差,从而为调整你的策略提供了依据。
为了获得更准确的评估——就像你不仅会回顾即时走法,还会回顾随后的几个走法——我们将 A k ( t ) A^k(t)A k ( t ) 定义为从时间 t tt 开始,在接下来的 k kk 个走法中的累积优势。
A 1 ( t ) = δ t A 2 ( t ) = δ t + γ δ t + 1 A 3 ( t ) = δ t + γ δ t + 1 + γ 2 δ t + 2 A k ( t ) = ∑ i = 0 k − 1 γ i δ t + i \begin{align} A^1(t) & = \delta_t \\ A^2(t) & = \delta_t + \gamma \delta_{t+1} \\ A^3(t) & = \delta_t + \gamma \delta_{t+1} + \gamma^2 \delta_{t+2} \\ A^k(t) & = \sum_{i=0}^{k-1} \gamma^{i} \delta_{t+i} \end{align} A 1 ( t ) A 2 ( t ) A 3 ( t ) A k ( t ) = δ t = δ t + γ δ t + 1 = δ t + γ δ t + 1 + γ 2 δ t + 2 = i = 0 ∑ k − 1 γ i δ t + i
当 k kk 趋于无穷大时
A k ( t ) = ∑ i = 0 ∞ γ i δ t + i A^k(t) = \sum_{i=0}^{\infty} \gamma^{i} \delta_{t+i} A k ( t ) = i = 0 ∑ ∞ γ i δ t + i
根据残差的定义,这可以展开为:
A k ( t ) = r t + γ r t + 1 + ⋯ + γ k − 1 r t + k − 1 + γ k V ( s t + k ) − V ( s t ) A^k(t) = r_t + \gamma r_{t+1} + \dots + \gamma^{k-1} r_{t+k-1} + \gamma^k V(s_{t+k}) - V(s_t) A k ( t ) = r t + γ r t + 1 + ⋯ + γ k − 1 r t + k − 1 + γ k V ( s t + k ) − V ( s t )
这类似于考虑从当前走法到游戏结束的所有得分。显然,包含的走法越多(k kk 越大),你的偏差就越小,但由于随机性增加,方差可能会增大;反之,如果只关注即时走法,偏差会更高,但方差会减小。
3.2 偏差-方差权衡
在实践中,我们不通过固定步数 k kk 来求和奖励,而是采用指数加权方法——这是 GAE 的核心思想。
首先,我们将 TD 残差定义为
δ t = r t + γ V π ( s t + 1 ) − V π ( s t ) \delta_t = r_t + \gamma V^\pi(s_{t+1}) - V^\pi(s_t) δ t = r t + γ V π ( s t + 1 ) − V π ( s t )
然后,我们使用递归公式积累优势
A ^ t = δ t + γ λ A ^ t + 1 \hat{A}_t = \delta_t + \gamma \lambda \hat{A}_{t+1} A ^ t = δ t + γλ A ^ t + 1
这里,λ ∈ [ 0 , 1 ) \lambda \in [0,1)λ ∈ [ 0 , 1 ) 决定了你对未来走法给予多少权重。
当 λ = 1 \lambda=1λ = 1 时,你考虑了整个游戏的所有影响(最小偏差但最大方差)。
当 λ = 0 \lambda=0λ = 0 时,你只依赖即时信息(最大偏差但最小方差)。
另外,我们可以将多步优势表示为加权和。定义
A GAE1 ( t ) = A t 1 + λ A t 2 + λ 2 A t 3 + … A^{\text{GAE1}}(t) = A_t^1 + \lambda A_t^2 + \lambda^2 A_t^3 + \dots A GAE1 ( t ) = A t 1 + λ A t 2 + λ 2 A t 3 + …
展开后,我们得到
A GAE1 ( t ) = δ t + λ ( δ t + γ δ t + 1 ) + λ 2 ( δ t + γ δ t + 1 + γ 2 δ t + 2 ) + … = δ t ( 1 + λ + λ 2 + … ) + γ δ t + 1 ( λ + λ 2 + … ) + γ 2 δ t + 2 ( λ 2 + λ 3 + … ) \begin{align} A^{\text{GAE1}}(t) & = \delta_t + \lambda(\delta_t + \gamma \delta_{t+1}) + \lambda^2 (\delta_t + \gamma \delta_{t+1} + \gamma^2 \delta_{t+2}) + \dots \\ & = \delta_t (1+\lambda+\lambda^2+\dots) + \gamma \delta_{t+1} (\lambda+\lambda^2+\dots) + \gamma^2 \delta_{t+2} (\lambda^2+\lambda^3+\dots) \end{align} A GAE1 ( t ) = δ t + λ ( δ t + γ δ t + 1 ) + λ 2 ( δ t + γ δ t + 1 + γ 2 δ t + 2 ) + … = δ t ( 1 + λ + λ 2 + … ) + γ δ t + 1 ( λ + λ 2 + … ) + γ 2 δ t + 2 ( λ 2 + λ 3 + … )
假设我们只对前 k kk 项求和,使用几何级数公式,我们得到
A GAE1 ( t ) = δ t 1 − λ k 1 − λ + γ δ t + 1 λ ( 1 − λ k ) 1 − λ + γ 2 δ t + 2 λ 2 ( 1 − λ k ) 1 − λ + … A^{\text{GAE1}}(t) = \delta_t \frac{1 - \lambda^k}{1 - \lambda} + \gamma \delta_{t+1} \frac{\lambda(1 - \lambda^k)}{1 - \lambda} + \gamma^2 \delta_{t+2} \frac{\lambda^2(1 - \lambda^k)}{1 - \lambda} + \dots A GAE1 ( t ) = δ t 1 − λ 1 − λ k + γ δ t + 1 1 − λ λ ( 1 − λ k ) + γ 2 δ t + 2 1 − λ λ 2 ( 1 − λ k ) + …
当 k → ∞ k \rightarrow \inftyk → ∞ 时
A GAE1 ( t ) = δ t 1 1 − λ + γ δ t + 1 λ 1 − λ + γ 2 δ t + 2 λ 2 1 − λ + … A^{\text{GAE1}}(t) = \delta_t \frac{1}{1 - \lambda} + \gamma \delta_{t+1} \frac{\lambda}{1 - \lambda} + \gamma^2 \delta_{t+2} \frac{\lambda^2}{1 - \lambda} + \dots A GAE1 ( t ) = δ t 1 − λ 1 + γ δ t + 1 1 − λ λ + γ 2 δ t + 2 1 − λ λ 2 + …
两侧乘以 1 − λ 1-\lambda1 − λ 得到:
( 1 − λ ) A GAE1 ( t ) = δ t + γ λ δ t + 1 + γ 2 λ 2 δ t + 2 + … (1-\lambda) A^{\text{GAE1}}(t) = \delta_t + \gamma\lambda \delta_{t+1} + \gamma^2\lambda^2 \delta_{t+2} + \dots ( 1 − λ ) A GAE1 ( t ) = δ t + γλ δ t + 1 + γ 2 λ 2 δ t + 2 + …
如果我们定义 A GAE ( t ) = ( 1 − λ ) A GAE1 ( t ) A^{\text{GAE}}(t) = (1-\lambda) A^{\text{GAE1}}(t) A GAE ( t ) = ( 1 − λ ) A GAE1 ( t ) ,我们最终得到:
A GAE ( t ) = δ t + γ λ δ t + 1 + γ 2 λ 2 δ t + 2 + ⋯ = ∑ k = 0 ∞ ( λ γ ) k δ t + k A^{\text{GAE}}(t) = \delta_t + \gamma\lambda \delta_{t+1} + \gamma^2\lambda^2 \delta_{t+2} + \dots = \sum_{k=0}^{\infty} (\lambda \gamma)^k \delta_{t+k} A GAE ( t ) = δ t + γλ δ t + 1 + γ 2 λ 2 δ t + 2 + ⋯ = k = 0 ∑ ∞ ( λγ ) k δ t + k
该公式清楚地展示了调整 λ \lambdaλ 如何平衡短期和长期奖励的影响。就像国际象棋棋手既不只关注下一步棋,也不试图预测所有可能的结果一样,适当选择 λ \lambdaλ 可以让您优化近端和远端效应的权重。
当 λ = 1 \lambda=1λ = 1 时,优势估计包含了整个游戏的信息(偏差最小,但方差高)
A GAE ( t ) = ∑ k = 0 ∞ γ k δ t + k = A k ( t ) = r t + γ r t + 1 + ⋯ + γ k − 1 r t + k − 1 + γ k V ( s t + k ) − V ( s t ) \begin{align} A^{\text{GAE}}(t) & = \sum_{k=0}^{\infty} \gamma^k \delta_{t+k} \\ & = A^k(t) = r_t + \gamma r_{t+1} + \dots + \gamma^{k-1} r_{t+k-1} + \gamma^k V(s_{t+k}) - V(s_t) \end{align} A GAE ( t ) = k = 0 ∑ ∞ γ k δ t + k = A k ( t ) = r t + γ r t + 1 + ⋯ + γ k − 1 r t + k − 1 + γ k V ( s t + k ) − V ( s t )
当 λ = 0 \lambda=0λ = 0 时,仅考虑即时信息(偏差最大,但方差最小)
A GAE ( t ) = δ t = r t − ( V ( s t ) − γ V ( s t + 1 ) ) A^{\text{GAE}}(t) = \delta_t = r_t - \big(V(s_t) - \gamma V(s_{t+1})\big) A GAE ( t ) = δ t = r t − ( V ( s t ) − γV ( s t + 1 ) )
总而言之,λ \lambdaλ 是平衡偏差和方差的关键超参数。
较大的 λ \lambdaλ 意味着考虑更多的未来观测,从而减少偏差但增加方差。
较小的 λ \lambdaλ 更依赖于当前估计,导致更高的偏差但更低的方差。
这种方法类似于一个国际象棋棋手,他不仅考虑一步棋的即时影响,还会审慎权衡后续棋步的含义,从而做出最优决策。
4. 使用PPO训练LLM的逐个Token过程
以下是使用PPO训练LLM时逐个token发生的事情的直接解释。本节阐明了参数(\(\theta_{\text{old}}\) 和 θ \thetaθ )的作用,并逐步介绍了第一次更新的过程。
4.1 LLM与PPO对齐
旧策略参数 (\(\theta_{\text{old}}\)):这些是用于生成数据(例如,token序列)的模型参数。在每次PPO更新之前,您使用这些参数采样token并记录生成每个token的概率(通常存储为对数概率)。
当前策略参数 (\(\theta\)):这些是在训练过程中更新的参数。通过PPO算法,您根据采样数据调整这些参数,使生成的token更好地与奖励信号对齐。更新后,θ \thetaθ 将与 θ old \theta_{\text{old}}θ old 不同。
您可以将 θ old \theta_{\text{old}}θ old 视为模型的“旧版本”,而 θ \thetaθ 是“新版本”,在一次训练迭代后,它应该表现更好(或更符合奖励信号)。每次更新后,新模型将成为下一轮采样的“旧模型”。
2. “逐个Token”训练过程
假设您已经有一个预训练的LLM,其参数设置为 θ old \theta_{\text{old}}θ old 。以下逐步概述了该过程:
(1) 采样阶段
提供提示 您将一个提示输入到LLM中(使用 θ old \theta_{\text{old}}θ old )以生成文本。
逐个生成Token 模型根据当前上下文(状态)生成下一个token(动作)。例如,当生成第t个token时:
当前状态 s t s_ts t 包括提示以及前面的 t − 1 t-1t − 1 个token。
模型选择token a t a_ta t 作为其动作,并为其分配一个概率 π θ old ( a t ∣ s t ) \pi_{\theta_{\text{old}}}(a_t \mid s_t)π θ old ( a t ∣ s t ) (通常记录为对数概率)。
记录数据 对于每个token,您记录:
状态 s t s_ts t (上下文)
动作 a t a_ta t (生成的token)
在旧策略下的生成概率(或对数概率)
可选地,任何奖励信息(例如来自奖励模型的分数)和估计值 V ( s t ) V(s_t)V ( s t ) 。
这些集合形成了一个轨迹——一个包含token及其相关数据的序列。
(2) 计算优势
在PPO中,需要为每个token计算一个优势 A t A_tA t (使用GAE、多步或单步方法)。
A t = δ t + γ λ δ t + 1 + γ 2 λ 2 δ t + 2 + ⋯ A_t = \delta_t + \gamma \lambda\, \delta_{t+1} + \gamma^2 \lambda^2\, \delta_{t+2} + \cdots A t = δ t + γλ δ t + 1 + γ 2 λ 2 δ t + 2 + ⋯
其中 δ t = r t + γ V ( s t + 1 ) − V ( s t ) \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)δ t = r t + γV ( s t + 1 ) − V ( s t ) 是一步时间差分误差。
实际上,由于轨迹是有限的,求和只计算到序列的末尾。
(3) 更新阶段:从 θ old \theta_{\text{old}}θ old 到 θ \thetaθ
一旦您采样了一批token数据,就使用PPO更新模型参数。逐个token的过程如下:
使用旧策略作为参考 您已记录了由 θ old \theta_{\text{old}}θ old 生成的每个token的对数概率,即 log π θ old ( a t ∣ s t ) \log \pi_{\theta_{\text{old}}}(a_t \mid s_t)log π θ old ( a t ∣ s t ) 。
用当前策略重新计算概率 使用当前模型参数 θ \thetaθ (最初,θ \thetaθ 与 θ old \theta_{\text{old}}θ old 相同,但它会随着后续的梯度更新而改变),您重新计算生成相同token a t a_ta t 在相同状态 s t s_ts t 下的对数概率,表示为 log π θ ( a t ∣ s t ) \log \pi_\theta(a_t \mid s_t)log π θ ( a t ∣ s t ) 。
计算概率比率 对于每个token,计算比率:
r t ( θ ) = exp ( log π θ ( a t ∣ s t ) − log π θ old ( a t ∣ s t ) ) r_t(\theta) = \exp\Big( \log \pi_\theta(a_t \mid s_t) - \log \pi_{\theta_{\text{old}}}(a_t \mid s_t) \Big) r t ( θ ) = exp ( log π θ ( a t ∣ s t ) − log π θ old ( a t ∣ s t ) )
这个比率表示新模型生成该标记的可能性相对于旧模型发生了多大变化。
构建 PPO 损失(逐标记损失) PPO 的目标是限制新策略与旧策略的偏离程度。对于每个标记,损失基于优势 A t A_tA t 和概率比率 r t ( θ ) r_t(\theta)r t ( θ ) 计算。
L t ( θ ) = − min ( r t ( θ ) A t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A t ) L_t(\theta) = -\min\Big( r_t(\theta) A_t,\ \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \, A_t \Big) L t ( θ ) = − min ( r t ( θ ) A t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A t )
通俗来说
如果概率比率 r t ( θ ) r_t(\theta)r t ( θ ) 和优势 A t A_tA t 的乘积落在可接受的范围内(即在 1 − ϵ 1-\epsilon1 − ϵ 和 1 + ϵ 1+\epsilon1 + ϵ 之间),则使用该值。
否则,如果比率过高或过低,则使用截断值以防止过大的更新。
对所有标记求平均并更新 θ \thetaθ 所有标记的损失 L t ( θ ) L_t(\theta)L t ( θ ) 被平均以形成总批次损失。然后,您使用梯度下降(或其他优化器)更新模型参数 θ \thetaθ 。
此时,θ \thetaθ 开始与 θ old \theta_{\text{old}}θ old 发生分歧,这意味着新模型比旧模型“有所改进”。
更新 θ old \theta_{\text{old}}θ old 完成一次完整的 PPO 更新后(通常在同一批数据上进行多次 epoch),将 θ old \theta_{\text{old}}θ old 设置为当前的 θ \thetaθ ,为下一轮采样做准备。
3. 伪代码
以下是一个伪代码风格的算法,概述了逐标记的 PPO 更新过程
# Initialization: Set the pre-trained LLM parameters as θ_old, and copy them to θ
θ_old = PretrainedLLM.parameters
θ = copy(θ_old)
# Sampling Phase: Generate a batch of data using θ_old
for each prompt in dataset:
trajectory = []
state = prompt
while not end_of_sequence:
token, logpi_old = θ_old.generate_token(state)
# Record the current state, token, and the log-probability under θ_old
trajectory.append( (state, token, logpi_old, reward, V(state)) )
state = state + token # Update the state (append token)
store trajectory
# Compute Advantages (e.g., using GAE)
for each trajectory:
for t from last token downto first:
δ_t = reward[t] + γ * V(state[t+1]) - V(state[t])
A_t = δ_t + γ * λ * A[t+1] # Recursively compute the advantage
# PPO Update Phase: Multiple epochs
for each PPO update epoch:
for each token data (state s_t, token a_t, logpi_old, A_t) in batch:
# 1. Compute the log-probability under the current policy
logpi_current = θ.log_probability(s_t, a_t)
# 2. Calculate the probability ratio
r_t = exp( logpi_current - logpi_old )
# 3. Compute the unclipped and clipped objectives
loss_unclipped = r_t * A_t
loss_clipped = clip(r_t, 1-ε, 1+ε) * A_t
# 4. The token loss is the negative of the minimum of these two values
loss_token = -min(loss_unclipped, loss_clipped)
# 5. Average the loss over all tokens and perform a gradient update
θ = Update(θ, average(loss_token over batch))
# After updating, copy θ to θ_old for the next round of sampling
θ_old = copy(θ)
此伪代码总结了用于训练 LLM 的逐标记 PPO 更新过程,说明了旧策略和新策略参数如何迭代使用和更新。
5. DPO:通过研究棋谱学习国际象棋
之前,我们讨论了 PPO 类似于在真实的棋盘上有一位教练——在您下棋和调整策略(即在线学习)时实时指导您。相比之下,DPO 更像是坐在家里研究棋谱(即使用离线数据),您根据预先存在的胜负比较来推断如何改进您的走法。在本节中,我们将推导 DPO (直接偏好优化)背后的数学原理,并解释其与 PPO(或更一般地,其他 RLHF 方法)相比的优点和局限性。
在我们深入探讨之前,请记住以下三个关键目标函数
r ϕ r_{\boldsymbol\phi}r ϕ 表示奖励模型。
π θ \pi_{\boldsymbol\theta}π θ 是我们想要训练的对齐模型(策略)。
π ref \pi_{\text{ref}}π ref 是参考模型(PPO 和 DPO 都依赖它来防止策略偏离过远)。
这三个目标定义如下
max r ϕ { E x , y w , y l ∼ D [ log σ ( x , y w ) − log σ ( x , y l ) ] } \max_{r_{\boldsymbol\phi}} \Bigl\{ \mathbb{E}_{x,\, y_{\text{w}},\, y_{\text{l}} \sim D} \Bigl[\log \sigma(x, y_{\text{w}}) - \log \sigma(x, y_{\text{l}})\Bigr] \Bigr\} r ϕ max { E x , y w , y l ∼ D [ log σ ( x , y w ) − log σ ( x , y l ) ] }
max π θ { E x ∼ D , y ∼ π θ ( y ∣ x ) [ r ϕ ( x , y ) − β D K L [ π θ ( y ∣ x ) ∥ π ref ( y ∣ x ) ] } \max_{\pi_{\boldsymbol\theta}} \Biggl\{ \mathbb{E}_{x \sim D,\, y \sim \pi_{\boldsymbol\theta}(y\mid x)} \Bigl[r_{\boldsymbol\phi}(x, y)\Bigr] \;-\; \beta \,\mathbb{D}_{KL}\Bigl[\pi_{\boldsymbol\theta}(y\mid x) \,\Big\|\, \pi_{\text{ref}}(y\mid x)\Bigr] \Biggr\} π θ max { E x ∼ D , y ∼ π θ ( y ∣ x ) [ r ϕ ( x , y ) ] − β D K L [ π θ ( y ∣ x ) π ref ( y ∣ x ) ] }
max π θ { E x , y w , y l ∼ D [ log σ ( β log π θ ( y w ∣ x ) π ref ( y w ∣ x ) − β log π θ ( y l ∣ x ) π ref ( y l ∣ x ) ) ] } \max_{\pi_{\boldsymbol\theta}} \Bigl\{ \mathbb{E}_{x,\, y_{\text{w}},\, y_{\text{l}} \sim D} \Bigl[ \log \sigma\Bigl( \beta \log \frac{\pi_{\boldsymbol\theta} (y_{\text{w}} \mid x)}{\pi_\text{ref}(y_{\text{w}} \mid x)} \;-\; \beta \log \frac{\pi_{\boldsymbol\theta} (y_{\text{l}} \mid x)}{\pi_\text{ref}(y_{\text{l}} \mid x)} \Bigr) \Bigr] \Bigr\} π θ max { E x , y w , y l ∼ D [ log σ ( β log π ref ( y w ∣ x ) π θ ( y w ∣ x ) − β log π ref ( y l ∣ x ) π θ ( y l ∣ x ) ) ] }
这里,KL 散度定义为
D K L ( P ∥ Q ) = ∑ i P ( i ) log ( P ( i ) Q ( i ) ) . \mathbb{D}_{KL}(P\|Q) =\;\sum_i P(i)\,\log\!\Bigl(\frac{P(i)}{Q(i)}\Bigr). D K L ( P ∥ Q ) = i ∑ P ( i ) log ( Q ( i ) P ( i ) ) .
本质上,PPO 根据实时反馈调整策略,并使用 KL 惩罚将新策略与参考策略绑定,而 DPO 则利用预先收集的比较数据(“棋局记录”)直接根据偏好比较来优化策略。这种方法有其自身的优点和挑战,我们将在以下章节中探讨。
5.1 从优化目标直接求解最优对齐模型
让我们从 PPO 损失函数开始,并进行一系列数学变换。这类似于国际象棋教练(奖励模型)提供实时反馈,同时应用 KL 散度惩罚以防止您的策略偏离参考模型太远。
代入 KL 散度公式
{ E x ∼ D , y ∼ π θ ( y ∣ x ) [ r ϕ ( x , y ) − β log ( π θ ( y ∣ x ) π ref ( y ∣ x ) ) ] } . \underset{\pi_{\boldsymbol\theta}}{\max}\,\Bigl\{ \mathbb{E}_{x \sim \mathcal{D},\,y \sim \pi_{\boldsymbol\theta}(y\mid x)}\Bigl[r_{\phi}(x,y) \;-\;\beta \log\Bigl(\tfrac{\pi_{\theta}(y\mid x)}{\pi_{\text{ref}}(y\mid x)}\Bigr)\Bigr]\Bigr\}. π θ max { E x ∼ D , y ∼ π θ ( y ∣ x ) [ r ϕ ( x , y ) − β log ( π ref ( y ∣ x ) π θ ( y ∣ x ) ) ] } .
提取常数 − 1 β -\tfrac{1}{\beta}− β 1 并应用恒等变换
{ E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π θ ( y ∣ x ) π ref ( y ∣ x ) − 1 β r ϕ ( x , y ) ] } . \underset{\pi_{\theta}}{\min}\,\Bigl\{ \mathbb{E}_{x \sim \mathcal{D},\,y \sim \pi_{\theta}(y\mid x)} \Bigl[\log\tfrac{\pi_{\theta}(y\mid x)}{\pi_{\text{ref}}(y\mid x)}\;-\;\tfrac{1}{\beta}r_{\phi}(x,y)\Bigr] \Bigr\}. π θ min { E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π ref ( y ∣ x ) π θ ( y ∣ x ) − β 1 r ϕ ( x , y ) ] } .
继续转换
{ E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π θ ( y ∣ x ) π ref ( y ∣ x ) − log e r ϕ ( x , y ) / β ] } . \underset{\pi_{\theta}}{\min}\,\Bigl\{ \mathbb{E}_{x \sim \mathcal{D},\,y \sim \pi_{\theta}(y\mid x)} \Bigl[\log\tfrac{\pi_{\theta}(y\mid x)}{\pi_{\text{ref}}(y\mid x)}\;-\;\log e^{r_{\phi}(x,y)/\beta}\Bigr] \Bigr\}. π θ min { E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π ref ( y ∣ x ) π θ ( y ∣ x ) − log e r ϕ ( x , y ) / β ] } .
获得
{ E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π θ ( y ∣ x ) π ref ( y ∣ x ) exp ( r ϕ ( x , y ) / β ) ] } . \underset{\pi_{\theta}}{\min}\,\Bigl\{ \mathbb{E}_{x \sim \mathcal{D},\,y \sim \pi_{\theta}(y\mid x)} \Bigl[\log\tfrac{\pi_{\theta}(y\mid x)}{\pi_{\text{ref}}(y\mid x)\,\exp\!\Bigl(r_{\phi}(x,y)/\beta\Bigr)}\Bigr] \Bigr\}. π θ min { E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π ref ( y ∣ x ) e x p ( r ϕ ( x , y ) / β ) π θ ( y ∣ x ) ] } .
此时,我们构建了一个新的分布 π r ( y ∣ x ) \pi_{r}(y\mid x)π r ( y ∣ x ) ,定义为
π r ( y ∣ x ) = π ref ( y ∣ x ) e r ϕ ( x , y ) / β Z ( x ) \pi_{r}(y\mid x) = \frac{\pi_{\text{ref}}(y\mid x) e^{r_{\phi}(x,y) / \beta}}{Z(x)} π r ( y ∣ x ) = Z ( x ) π ref ( y ∣ x ) e r ϕ ( x , y ) / β
其中 Z ( x ) Z(x)Z ( x ) 是一个归一化常数,确保 π r \pi_rπ r 是一个适当的概率分布(即概率之和为 1)
Z ( x ) = ∑ y π ref ( y ∣ x ) exp ( r ϕ ( x , y ) β ) . Z(x) =\;\sum_{y}\,\pi_{\text{ref}}(y\mid x)\,\exp\!\Bigl(\tfrac{r_{\phi}(x,y)}{\beta}\Bigr). Z ( x ) = y ∑ π ref ( y ∣ x ) exp ( β r ϕ ( x , y ) ) .
在此表达式中,分子表示给定输入对 ( x , y ) (x, y)( x , y ) 的预期奖励,而分母则汇总了给定相同输入 x xx 的所有可能输出 y yy 的奖励期望。这种结构执行归一化,将值限制在区间 [ 0 , 1 ] [0, 1][ 0 , 1 ] 内,从而满足形成概率分布的基本要求。
尽管我们不知道 π r ( y ∣ x ) \pi_{r}(y\mid x)π r ( y ∣ x ) 的确切形式,我们确实拥有参考分布 π ref ( y ∣ x ) \pi_{\text{ref}}(y\mid x)π ref ( y ∣ x ) 的精确表达式。利用这一点,可以通过将输入 x xx 输入到参考模型中,并遍历所有可能的 y yy 值或采样足够数量的 y yy 值,来近似分布 π r ( y ∣ x ) \pi_{r}(y\mid x)π r ( y ∣ x ) 。然而,这种方法在实践中会带来计算挑战,我们将在后面进一步讨论。
继续 PPO 损失的等价转换
E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π θ ( y ∣ x ) π ref ( y ∣ x ) exp ( r ϕ ( x , y ) / β ) Z ( x ) Z ( x ) ] . \underset{\pi_{\theta}}{\min}\, \mathbb{E}_{x \sim \mathcal{D},\, y \sim \pi_{\theta}(y\mid x)}\Bigl[\log \tfrac{\pi_{\theta}(y\mid x)} {\tfrac{\pi_{\text{ref}}(y\mid x)\,\exp\!\Bigl(r_{\phi}(x,y)/\beta\Bigr)}{\,Z(x)\,}\,Z(x)}\Bigr]. π θ min E x ∼ D , y ∼ π θ ( y ∣ x ) [ log Z ( x ) π ref ( y ∣ x ) e x p ( r ϕ ( x , y ) / β ) Z ( x ) π θ ( y ∣ x ) ] .
简化
E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π θ ( y ∣ x ) π r ( y ∣ x ) − log Z ( x ) ] . \underset{\pi_{\theta}}{\min}\, \mathbb{E}_{x \sim \mathcal{D},\, y \sim \pi_{\theta}(y\mid x)} \Bigl[\log \tfrac{\pi_{\theta}(y\mid x)}{\pi_{r}(y\mid x)} \;-\;\log Z(x)\Bigr]. π θ min E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π r ( y ∣ x ) π θ ( y ∣ x ) − log Z ( x ) ] .
忽略 log Z ( x ) \log Z(x)log Z ( x ) 项(因为它与 π θ \pi_{\theta}π θ 无关),以获得
E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π θ ( y ∣ x ) π r ( y ∣ x ) ] . \underset{\pi_{\theta}}{\min}\, \mathbb{E}_{x \sim \mathcal{D},\, y \sim \pi_{\theta}(y\mid x)} \Bigl[\log \tfrac{\pi_{\theta}(y\mid x)}{\pi_{r}(y\mid x)}\Bigr]. π θ min E x ∼ D , y ∼ π θ ( y ∣ x ) [ log π r ( y ∣ x ) π θ ( y ∣ x ) ] .
以 KL 散度形式表示
E x ∼ D [ D K L ( π θ ( y ∣ x ) ∥ π r ( y ∣ x ) ) ] . \underset{\pi_{\theta}}{\min}\,\mathbb{E}_{x \sim \mathcal{D}}\Bigl[ \mathbb{D}_{KL}\Bigl(\pi_{\theta}(y\mid x)\,\Big\|\,\pi_{r}(y\mid x)\Bigr)\Bigr]. π θ min E x ∼ D [ D K L ( π θ ( y ∣ x ) π r ( y ∣ x ) ) ] .
此时,我们的目标仅限于 KL 散度。由于 KL 散度总是非负的,并且仅当两个分布相同时才等于零,因此当 π θ ( y ∣ x ) \pi_{\theta}(y\mid x)π θ ( y ∣ x ) 恰好等于 π r ( y ∣ x ) \pi_{r}(y\mid x)π r ( y ∣ x ) 时达到最佳条件。这为我们提供了一个显式解决方案:在 PPO 下的最佳概率分布恰好是 π r ( y ∣ x ) \pi_{r}(y\mid x)π r ( y ∣ x ) 。
换句话说,如果奖励模型 r ϕ r_{\phi}r ϕ 的参数固定,那么 PPO 的最优解就是
π r ( y ∣ x ) = π ref ( y ∣ x ) exp ( r ϕ ( x , y ) β ) Z ( x ) . \pi_{r}(y\mid x) =\;\frac{\pi_{\text{ref}}(y\mid x)\,\exp\!\Bigl(\tfrac{r_{\phi}(x,y)}{\beta}\Bigr)}{Z(x)}. π r ( y ∣ x ) = Z ( x ) π ref ( y ∣ x ) exp ( β r ϕ ( x , y ) ) .
然而,在实践中,对齐训练中使用的奖励函数 r ( x , y ) r(x,y)r ( x , y ) 并非随意选择;它是通过数据驱动训练获得的,旨在产生一个最优的奖励模型。也就是说,我们首先训练一个理想的奖励模型 r ϕ ∗ r^{*}_{\phi}r ϕ ∗ (类似于教练对比赛进行评分),然后,根据这个最优奖励模型,我们进一步训练一个“下得好棋”的对齐模型。因此,最优奖励模型 r ϕ ∗ r^{*}_{\phi}r ϕ ∗ 及其产生的对齐模型 π r ∗ \pi^{*}_{r}π r ∗ 继续满足以下关系:
π r ∗ ( y ∣ x ) = π ref ( y ∣ x ) exp ( r ϕ ∗ ( x , y ) β ) Z ( x ) . \pi^{*}_{r}(y\mid x) =\;\frac{\pi_{\text{ref}}(y\mid x)\,\exp\!\Bigl(\tfrac{r^{*}_{\phi}(x,y)}{\beta}\Bigr)}{Z(x)}. π r ∗ ( y ∣ x ) = Z ( x ) π ref ( y ∣ x ) exp ( β r ϕ ∗ ( x , y ) ) .
总结
首先,我们为与人类偏好对齐定义了一个总体优化目标。这个目标函数假设我们有一个奖励函数,并旨在找到一个对齐模型以最大化这个目标。它可以理解为,在国际象棋比赛中,努力根据教练(奖励函数)的评估,采用一种能最大化胜率的策略(下棋方式)。在数学上,这个目标表示为:
max π θ { E x , y w , y l ∼ D [ log σ ( β log π θ ( y win ∣ x ) π ref ( y w ∣ x ) − β log π θ ( y l ∣ x ) π ref ( y lose ∣ x ) ) ] } . \max_{\pi_{\boldsymbol\theta}} \Biggl\{ \mathbb{E}_{x,\, y_{\text{w}},\, y_{\text{l}} \sim D} \Biggl[ \log \sigma \Biggl( \beta \log \frac{\pi_{\boldsymbol\theta} (y_{\text{win}} \mid x)}{\pi_\text{ref} (y_{\text{w}} \mid x)} - \beta \log \frac{\pi_{\boldsymbol\theta} (y_{\text{l}} \mid x)}{\pi_\text{ref} (y_{\text{lose}} \mid x)} \Biggr) \Biggr] \Biggr\}. π θ max { E x , y w , y l ∼ D [ log σ ( β log π ref ( y w ∣ x ) π θ ( y win ∣ x ) − β log π ref ( y lose ∣ x ) π θ ( y l ∣ x ) ) ] } .
接下来,从这个优化目标出发,我们推导出了当奖励函数 r rr 固定时,对齐模型 π \piπ 的显式解。这类似于从历史记录中找到国际象棋比赛中的最佳走法,其显式解由下式给出:
π ∗ ( y ∣ x ) = π ref ( y ∣ x ) e r ϕ ( x , y ) / β Z ( x ) , \pi^{*}(y \mid x) = \frac{\pi_{\text{ref}}(y \mid x)\,e^{r_{\phi}(x,y) / \beta}}{Z(x)}, π ∗ ( y ∣ x ) = Z ( x ) π ref ( y ∣ x ) e r ϕ ( x , y ) / β ,
其中归一化配分函数 Z ( x ) Z(x)Z ( x ) 定义为:
Z ( x ) = ∑ y π ref ( y ∣ x ) e r ϕ ( x , y ) / β . Z(x) = \sum\limits_{y} \pi_{\text{ref}}(y \mid x)\,e^{r_{\phi}(x,y) / \beta}. Z ( x ) = y ∑ π ref ( y ∣ x ) e r ϕ ( x , y ) / β .
最后,在实际训练中,我们通常不会孤立地训练奖励模型。相反,我们直接在最优奖励模型 r ϕ ∗ r^{*}_{\phi}r ϕ ∗ 的指导下训练对齐模型。换句话说,就像持续的实践和教练反馈最终会产生真正赢得比赛的策略一样,我们对上述公式进行稍微调整,得到:
r ϕ ( x , y ) = β log π ∗ ( y ∣ x ) Z ( x ) π ref ( y ∣ x ) + β log Z ( x ) . r_{\phi}(x,y) = \beta \log\frac{\pi^{*}(y \mid x)\,Z(x)}{\pi_{\text{ref}}(y \mid x)} + \beta \log Z(x). r ϕ ( x , y ) = β log π ref ( y ∣ x ) π ∗ ( y ∣ x ) Z ( x ) + β log Z ( x ) .
这三个步骤展示了整个过程——从定义整体对齐目标,到推导出最优策略,再到最终将奖励模型与对齐模型联系起来。整个过程类似于:首先建立赢得比赛的标准(优化目标),然后从历史记录中推导出最佳走法(显式策略解),最终通过持续实践和反馈(奖励模型训练),形成一个既能正确评估又能有效执行的策略。
5.2 跳过奖励模型训练
尽管我们已经正式推导出了:
π r ( y ∣ x ) = π ref ( y ∣ x ) exp ( r ϕ ( x , y ) β ) Z ( x ) , \pi_{r}(y\mid x) =\;\frac{\pi_{\text{ref}}(y\mid x)\,\exp\!\Bigl(\frac{r_{\phi}(x,y)}{\beta}\Bigr)}{Z(x)}, π r ( y ∣ x ) = Z ( x ) π ref ( y ∣ x ) exp ( β r ϕ ( x , y ) ) ,
但在实践中,这个显式解很难直接应用,因为:
估计 Z ( x ) Z(x)Z ( x ) 具有挑战性 :它需要对给定提示 x xx 的所有可能响应 y yy 进行穷举枚举或充分采样,以计算和累加 exp ( r ϕ ( x , y ) ) ⋅ π ref ( y ∣ x ) \exp\!\bigl(r_\phi(x,y)\bigr) \cdot \pi_{\text{ref}}(y\mid x)exp ( r ϕ ( x , y ) ) ⋅ π ref ( y ∣ x ) ,这非常耗费成本。
我们最初的目标是绕过奖励模型训练 :我们打算一步到位地学习一个对齐模型,而不是先训练一个奖励函数。然而,π r \pi_{r}π r 仍然依赖于奖励函数 r rr ,这与我们不经过中间评分阶段直接“学习下好棋”的预期结果还有一步之遥。
这促使我们考虑反向问题:如果我们有了最优对齐模型 π ∗ \pi^{*}π ∗ ,我们能否推导出它对应的奖励函数 r ϕ ∗ r_{\phi}^{*}r ϕ ∗ ?答案是肯定的。从以下公式开始:
π ∗ ( y ∣ x ) Z ( x ) π ref ( y ∣ x ) = exp ( r ϕ ∗ ( x , y ) β ) , \frac{\pi^{*}(y\mid x)\,Z(x)}{\pi_{\text{ref}}(y\mid x)} =\;\exp\!\Bigl(\frac{r_{\phi}^{*}(x,y)}{\beta}\Bigr), π ref ( y ∣ x ) π ∗ ( y ∣ x ) Z ( x ) = exp ( β r ϕ ∗ ( x , y ) ) ,
我们可以将其等价转换为:
r ϕ ∗ ( x , y ) = β log ( π ∗ ( y ∣ x ) Z ( x ) π ref ( y ∣ x ) ) + β log Z ( x ) . r_{\phi}^{*}(x,y) =\;\beta\,\log\!\Bigl(\frac{\pi^{*}(y\mid x)\,Z(x)}{\pi_{\text{ref}}(y\mid x)}\Bigr)\;+\;\beta\,\log Z(x). r ϕ ∗ ( x , y ) = β log ( π ref ( y ∣ x ) π ∗ ( y ∣ x ) Z ( x ) ) + β log Z x ) .
这个表达式允许我们用 r ∗ r^{*}r ∗ 来表示 π ∗ \pi^{*}π ∗ ,从而弥补了奖励模型训练和对齐模型训练之间的差距。
本节总结
由于我们可以用最优对齐模型 π ∗ \pi^{*}π ∗ 来表示最优奖励模型 r ϕ ∗ r^{*}_{\phi}r ϕ ∗ (就像反复下棋和分析可以帮助您推导出国际象棋走法的最佳评估标准一样),我们可以直接将 π ∗ \pi^{*}π ∗ 替换到奖励模型的训练目标中。换句话说,虽然表面上您在训练一个奖励模型,但实际上您是一步到位地直接获得了最优对齐模型。这达到了我们最初的“拥有一个既能评估又能下好棋的模型”的目标。
剩下的挑战就是训练奖励模型本身。通常,我们采用偏好排序方法进行数据标注,这类似于标注好的棋谱,其中指明了哪些走法更优。通常有两种主要方法:
只生成两个响应 对于给定的提示 x xx (或棋局),生成两个响应(走法),例如 <提示 x,选定的 y1,拒绝的 y2>
。人类标注指示哪个走法更好,我们的目标是让奖励模型为选定的走法分配更高的分数,而为被拒绝的走法分配更低的分数。
生成 K 个响应(K > 2) 对于相同的提示 x xx ,生成多个响应(走法),例如 <提示 x,y1,...,yK>
。假设人类标注者提供了一个偏好排序 τ \tauτ (例如 y2 > y3 > y1 > ... > yK
)。我们的目标是让奖励模型为真实排序 τ \tauτ 给出最高的总分数,而为任何其他排序给出更低的分数。
在某些训练框架(例如 ChatGPT 的实现)中,当生成两个以上响应时,系统会将其分解为成对比较,以便目标与两个响应的情况保持一致。然而,在更一般的情况下,整个偏好排序被视为一个整体,期望真实排序 τ \tauτ 获得最高分数。DPO 的推导基于这种偏好排序的整体视图,在以下章节中,我们将分别针对 K = 2 K=2K = 2 和 K > 2 K>2K > 2 的情况推导出最终的 DPO 目标函数。
BT 模型:只生成两个响应
想象一下,在下棋时,你的教练只给你展示两个候选走法——一个标记为“好”(chosen),另一个标记为“坏”(reject)。在这种情况下,你的目标是让你的“评分系统”(奖励模型)将好的走法评估为明显优于坏的走法。为了对此进行建模,我们可以采用经典的 Bradley-Terry(BT)模型,该模型最初于1952年提出用于分析成对比较,并广泛应用于体育、市场研究和其他领域。对于一对项目 y 1 y_1y 1 和 y 2 y_2y 2 (这里代表选定的和被拒绝的响应),BT 模型表示 y 1 y_1y 1 胜过 y 2 y_2y 2 的概率为:
P ( y 1 > y 2 ∣ x ) = e λ y 1 e λ y 1 + e λ y 2 , P(y_1 > y_2 \mid x) \;=\; \frac{e^{\lambda y_1}}{e^{\lambda y_1} + e^{\lambda y_2}}, P ( y 1 > y 2 ∣ x ) = e λ y 1 + e λ y 2 e λ y 1 ,
其中 λ y 1 \lambda y_1λ y 1 和 λ y 2 \lambda y_2λ y 2 表示它们各自的强度参数——类似于使用历史胜率来衡量国际象棋棋手的实力。在我们的上下文中,当 y 1 y_1y 1 和 y 2 y_2y 2 对应于选定和拒绝的响应时,这些参数可以解释为奖励模型给出的分数。
我们的目标是最大化 y 1 y_1y 1 在整个带标注的数据集 D = { x i , y w i , y l i } i = 1 N D = \{x^i, y_w^i, y_l^i\}_{i=1}^ND = { x i , y w i , y l i } i = 1 N 击败 y 2 y_2y 2 的概率。也就是说,我们希望选定的响应能够持续优于被拒绝的响应。因此,奖励函数的总体优化目标可以表述为:
L ( r ϕ , D ) = − E x , y w , y l ∈ D [ log ( P ( y w > y l ∣ x ) ) ] = − E x , y w , y l ∈ D [ log ( e r ( x , y w ) e r ( x , y w ) + e r ( x , y l ) ) ] = − E x , y w , y l ∈ D [ log ( 1 1 + e − ( r ( x , y w ) − r ( x , y l ) ) ) ] = − E x , y w , y l ∈ D [ log ( σ ( r ( x , y w ) − r ( x , y l ) ) ) ] . \begin{aligned} L(r_{\phi}, D) &= -\,\mathbb{E}_{x,\,y_w,\,y_l \in D}\Bigl[\log\bigl(P(y_w > y_l \mid x)\bigr)\Bigr] \\ &= -\,\mathbb{E}_{x,\,y_w,\,y_l \in D}\Bigl[\log\!\Bigl(\frac{e^{r(x, y_w)}}{\,e^{r(x, y_w)} + e^{r(x, y_l)}\,}\Bigr)\Bigr] \\ &= -\,\mathbb{E}_{x,\,y_w,\,y_l \in D}\Bigl[\log\!\Bigl(\frac{1}{1 + e^{- \bigl(r(x, y_w) - r(x, y_l)\bigr)}}\Bigr)\Bigr] \\ &= -\,\mathbb{E}_{x,\,y_w,\,y_l \in D}\Bigl[\log\!\Bigl(\sigma\bigl(r(x, y_w) - r(x, y_l)\bigr)\Bigr)\Bigr]. \end{aligned} L ( r ϕ , D ) = − E x , y w , y l ∈ D [ log ( P ( y w > y l ∣ x ) ) ] = − E x , y w , y l ∈ D [ log ( e r ( x , y w ) + e r ( x , y l ) e r ( x , y w ) ) ] = − E x , y w , y l ∈ D [ log ( 1 + e − ( r ( x , y w ) − r ( x , y l ) ) 1 ) ] = − E x , y w , y l ∈ D [ log ( σ ( r ( x , y w ) − r ( x , y l ) ) ) ] .
上面最后的表达式正是ChatGPT等系统所采用的奖励模型优化目标。直观地,这个目标鼓励奖励模型输出这样的分数,使得所选的响应明显优于被拒绝的响应。
假设我们找到了以下形式的最优奖励模型:
r ϕ ∗ ( x , y ) = β log ( π ∗ ( y ∣ x ) Z ( x ) π ref ( y ∣ x ) ) + β log Z ( x ) , r^{*}_{\phi}(x,y) \;=\; \beta\,\log\!\Bigl(\frac{\pi^{*}(y\mid x)\,Z(x)}{\pi_{\text{ref}}(y\mid x)}\Bigr) \;+\; \beta\,\log Z(x), r ϕ ∗ ( x , y ) = β log ( π ref ( y ∣ x ) π ∗ ( y ∣ x ) Z ( x ) ) + β log Z ( x ) ,
将这个最优奖励函数代入我们之前的目标函数,得到:
Reward Model Loss = { E ( x , y w , y l ) ∼ D [ log σ ( β log π ∗ ( y win ∣ x ) π ref ( y win ∣ x ) + β log Z ( x ) − β log π ∗ ( y loss ∣ x ) π ref ( y loss ∣ x ) − β log Z ( x ) ) ] } = { E ( x , y w , y l ) ∼ D [ log σ ( β log π ∗ ( y win ∣ x ) π ref ( y win ∣ x ) − β log π ∗ ( y loss ∣ x ) π ref ( y loss ∣ x ) ) ] } . \begin{aligned} & \text{奖励模型损失} \\& =\underset{\pi^{*}}{\max}\,\Biggl\{\mathbb{E}_{(x,y_{\text{w}},y_{\text{l}}) \sim \mathcal{D}} \Biggl[\log \sigma\Bigl( \beta\,\log\frac{\pi^{*}(y_{\text{win}} \mid x)}{\pi_{\text{ref}}(y_{\text{win}} \mid x)}+\beta\,\log Z(x) \;-\; \beta\,\log\frac{\pi^{*}(y_{\text{loss}} \mid x)}{\pi_{\text{ref}}(y_{\text{loss}} \mid x)}-\beta\,\log Z(x)\Bigr)\Biggr] \Biggr\} \\[6pt]& =\underset{\pi_{\theta}}{\max}\,\Biggl\{\mathbb{E}_{(x,y_{\text{w}},y_{\text{l}})\sim \mathcal{D}} \Biggl[\log \sigma\Bigl( \beta\,\log\frac{\pi^{*}(y_{\text{win}} \mid x)}{\pi_{\text{ref}}(y_{\text{win}} \mid x)}-\beta\,\log\frac{\pi^{*}(y_{\text{loss}} \mid x)}{\pi_{\text{ref}}(y_{\text{loss}} \mid x)}\Bigr)\Biggr] \Biggr\}. \end{aligned} 奖励模型损失 = π ∗ max { E ( x , y w , y l ) ∼ D [ log σ ( β log π ref ( y win ∣ x ) π ∗ ( y win ∣ x ) + β log Z ( x ) − β log π ref ( y loss ∣ x ) π ∗ ( y loss ∣ x ) − β log Z ( x ) ) ] } = π θ max { E ( x , y w , y l ) ∼ D [ log σ ( β log π ref ( y win ∣ x ) π ∗ ( y win ∣ x ) − β log π ref ( y loss ∣ x ) π ∗ ( y loss ∣ x ) ) ] } .
这个结果表明,奖励模型的训练目标已转化为仅依赖于对齐模型π \piπ 。实际上,通过这种方法,我们可以绕过单独训练奖励模型,直接使用标注的成对偏好数据来一举训练对齐模型π θ \pi_\thetaπ θ ——就像你可以直接从国际象棋记录中学习最佳走法一样。因此,经过微调并将可训练的对齐模型设置为π θ \pi_\thetaπ θ 后,最终目标变为
Reward Model Loss = { E ( x , y w , y l ) ∼ D [ log σ ( β log π θ ( y win ∣ x ) π ref ( y win ∣ x ) − β log π θ ( y loss ∣ x ) π ref ( y loss ∣ x ) ) ] } = DPO Loss . \begin{aligned} & \text{Reward Model Loss} \\& =\underset{\pi_{\theta}}{\max}\,\Biggl\{\mathbb{E}_{(x,y_{\text{w}},y_{\text{l}})\sim \mathcal{D}} \Biggl[\log \sigma\Bigl( \beta\,\log\frac{\pi_{\theta}(y_{\text{win}} \mid x)}{\pi_{\text{ref}}(y_{\text{win}} \mid x)}-\beta\,\log\frac{\pi_{\theta}(y_{\text{loss}} \mid x)}{\pi_{\text{ref}}(y_{\text{loss}} \mid x)}\Bigr)\Biggr] \Biggr\} \\[6pt]& = \text{DPO Loss}. \end{aligned} Reward Model Loss = π θ max { E ( x , y w , y l ) ∼ D [ log σ ( β log π ref ( y win ∣ x ) π θ ( y win ∣ x ) − β log π ref ( y loss ∣ x ) π θ ( y loss ∣ x ) ) ] } = DPO Loss .
PT 模型:生成 K (K > 2) 个响应
现在,想象一场国际象棋比赛,你不是只考虑两个候选走法,而是同时评估多个可能的走法。例如,在关键时刻,你的教练可能会向你展示 K 种不同的走法,并要求你根据其潜在结果对其进行排名。这种情况对应于 RLHF 设置,其中生成 K 个响应并按偏好进行排名。
与 BT 模型不同,BT 模型在只生成两个响应时侧重于成对比较,而我们在这里使用基于 Plackett-Luce 模型的统计方法,该模型可以对多个候选进行排名。让τ \tauτ 表示人类标注员提供的真实排名,即教练确定的理想走法排名。我们希望这个真实排名τ \tauτ 优于所有其他可能的排序。为此,我们定义真实排名τ \tauτ 击败所有其他排序的概率为
P ( τ ∣ y 1 , y 2 , … , y K , x ) = ∏ k = 1 K e r ( x , y τ k ) ∑ j = k K e r ( x , y τ j ) . P(\tau \mid y_1, y_2, \dots, y_K, x) =\;\prod_{k=1}^{K}\frac{e^{r(x, y_{\tau_k})}}{\sum_{j=k}^{K} e^{r(x, y_{\tau_j})}}. P ( τ ∣ y 1 , y 2 , … , y K , x ) = k = 1 ∏ K ∑ j = k K e r ( x , y τ j ) e r ( x , y τ k ) .
这里,τ k \tau_kτ k 表示真实排名τ \tauτ 中的第 k 个走法(例如,τ 1 \tau_1τ 1 是最受偏好的走法,τ 2 \tau_2τ 2 是第二好的,依此类推),x xx 表示当前的游戏状态(或提示)。直观地,我们期望排名靠前的走法 (τ 1 \tau_1τ 1 ) 在所有候选走法中得分最高;排名第二的走法 (τ 2 \tau_2τ 2 ) 在剩余走法中得分也应该很高;以此类推。
接下来,我们将最优奖励函数r ϕ ∗ ( x , y ) r^{*}_{\phi}(x,y)r ϕ ∗ ( x , y ) 代入上述公式。首先,将r ϕ ∗ ( x , y ) r^{*}_{\phi}(x,y)r ϕ ∗ ( x , y ) 表示为
r ϕ ∗ ( x , y ) = β log ( π ∗ ( y ∣ x ) Z ( x ) π ref ( y ∣ x ) ) + β log Z ( x ) , r^{*}_{\phi}(x,y) =\;\beta \,\log\!\Bigl(\frac{\pi^{*}(y\mid x)\,Z(x)}{\pi_{\text{ref}}(y\mid x)}\Bigr) \;+\;\beta\,\log Z(x), r ϕ ∗ ( x , y ) = β log ( π ref ( y ∣ x ) π ∗ ( y ∣ x ) Z ( x ) ) + β log Z ( x ) ,
则概率变为
P ( τ ∣ y 1 , y 2 , … , y K , x ) = ∏ k = 1 K e r ϕ ∗ ( x , y τ k ) ∑ j = k K e r ϕ ∗ ( x , y τ j ) . P(\tau \mid y_1, y_2, \dots, y_K, x) = \prod_{k=1}^{K}\frac{e^{r^*_\phi(x, y_{\tau_k})}}{\sum_{j=k}^{K} e^{r^*_\phi(x, y_{\tau_j})}}. P ( τ ∣ y 1 , y 2 , … , y K , x ) = k = 1 ∏ K ∑ j = k K e r ϕ ∗ ( x , y τ j ) e r ϕ ∗ ( x , y τ k ) .
然后,我们将r ϕ ∗ r^{*}_{\phi}r ϕ ∗ 用π ∗ \pi^{*}π ∗ 表示(注意:这里Z ( x ) Z(x)Z ( x ) 可以被视为与π \piπ 无关的归一化常数,并在后续分析中省略),这样表达式可以重写为
P ( τ ∣ y 1 , y 2 , … , y K , x ) = ∏ k = 1 K exp ( β log π ∗ ( y ∣ x ) Z ( x ) π ref ( y ∣ x ) ) ∑ j = k K exp ( β log π ∗ ( y ∣ x ) Z ( x ) π ref ( y ∣ x ) ) . P(\tau \mid y_1, y_2, \dots, y_K, x) = \prod_{k=1}^{K}\frac{\exp\!\Bigl(\beta\,\log\frac{\pi^{*}(y\mid x)\,Z(x)}{\pi_{\text{ref}}(y\mid x)}\Bigr)}{\sum_{j=k}^{K}\exp\!\Bigl(\beta\,\log\frac{\pi^{*}(y\mid x)\,Z(x)}{\pi_{\text{ref}}(y\mid x)}\Bigr)}. P ( τ ∣ y 1 , y 2 , … , y K , x ) = k = 1 ∏ K ∑ j = k K exp ( β log π ref ( y ∣ x ) π ∗ ( y ∣ x ) Z ( x ) ) exp ( β log π ref ( y ∣ x ) π ∗ ( y ∣ x ) Z ( x ) ) .
最后,对于整个数据集,我们希望真实排名τ \tauτ 的平均概率尽可能高——换句话说,我们的目标是最大化数据集中真实排名的概率。因此,对于多响应情况,DPO 目标函数可以写为
L DPO ( π θ , π ref ) = − E τ , y 1 , y 2 , … , y K , x ∼ D [ log ∏ k = 1 K exp ( β log π θ ( y ∣ x ) Z ( x ) π ref ( y ∣ x ) ) ∑ j = k K exp ( β log π θ ( y ∣ x ) Z ( x ) π ref ( y ∣ x ) ) ] . L DPO ( π θ , π ref ) = − E τ , y 1 , y 2 , … , y K , x ∼ D log k = 1 ∏ K ∑ j = k K exp ( β log π ref ( y ∣ x ) π θ ( y ∣ x ) Z ( x ) ) exp ( β log π ref ( y ∣ x ) π θ ( y ∣ x ) Z ( x ) ) .
参考文献
5.3 DPO的局限性
在推导了DPO的数学基础之后,我们现在转向它的局限性。就像下棋一样,仅仅研究棋谱而不实际下棋并不能保证你会下得好,DPO旨在训练模型使用奖励模型来评估响应,而不是直接复制PPO。这意味着在训练过程中,数据和损失函数与奖励模型完全对齐。
这引出了一个关键问题:模型是否能够同时提高其“评估”和“生成”能力?换句话说,DPO的训练过程只专注于教模型如何“评分”响应,类似于学习如何从棋谱中评估走法。然而,这不一定能确保模型在实际生成过程中做出最优决策——它并不能证明评估能力会无缝地转化为有效的生成性能。如果这个假设失败,那么DPO的训练过程就失去了其目的。就像人们不能期望仅仅通过阅读棋谱就成为象棋大师一样,这个假设的有效性也直接影响了SPIN和自奖励等其他方法背后的原理。
此外,由于DPO的优化目标完全依赖于奖励模型的评分,它只关心与参考模型相比,分数的变化是否符合预期,而不关心生成的句子是否流畅或吸引人。换句话说,DPO更侧重于扩大损失裕度,而不是确保模型生成高质量的输出。这可能导致DPO训练过程中出现一个尴尬的现象:好和坏响应的损失可能同时增加,迫使我们调整超参数或添加额外约束以稳定训练。
从另一个角度看,DPO的局限性可总结如下:
评估与生成脱节 DPO的训练过程只教模型“评估”——就像一个静态的棋步评分系统——而没有整合实际对弈所需的在线生成过程。相比之下,PPO通过在线生成和试错来学习,将评估能力转化为生成能力。如果没有这种在线探索,用DPO训练的模型可能在离线数据上得分很高,但在实际生成时表现不佳。
离线训练的局限性 RLHF本质上是一种在线学习方法,因为它需要不断纠正模型现有的知识——就像棋手必须定期练习以磨练技能一样。然而,DPO是完全离线的;它迫使模型完全依赖于标注者认为“正确”的内容(例如,棋谱中的最佳走法),并遵循预定的最佳路径,几乎没有探索的空间。在实践中,通常会采用一些技术,例如对偏好响应进行初始监督微调(SFT)或用多样化输出增强偏好数据,以引入一些在线学习和探索的元素。
高数据质量要求 由于DPO训练完全依赖于离线偏好数据,其有效性对数据质量和覆盖范围高度敏感。如果训练数据不全面或与实际生成分布不匹配,模型可能会生成正负样本相对比例正确的响应,但绝对概率可能会被稀释,甚至可能出现训练数据中不存在的奇怪输出。例如,在问答场景中,如果正样本是“意面应该拌番茄肉酱”,负样本是“意面应该拌辣椒油”,那么DPO优化后的模型可能会输出“意面应该拌42号混凝土”。这种偏差强调了数据质量的关键重要性。
总而言之,DPO的局限性源于其只专注于将奖励模型的“评分”能力转移到对齐模型上,而没有纳入实际的在线生成和探索。这类似于只通过研究棋谱而不实际下棋来学习棋步;因此,即使你理论上可以准确评估每一步,也不能保证你在实际对弈中做出最佳决策。因此,尽管DPO可以一步直接训练对齐模型,但如果缺乏在线生成和探索的补充,其性能通常会逊色于一个完整的RLHF系统(即奖励模型+PPO)。