从策略梯度到PPO:深度拆解大语言模型对齐背后的“教练”

如果你在2022年底第一次与ChatGPT对话,那种流畅、得体、仿佛理解你意图的体验,很可能让你感到惊讶。它不再像早期的聊天机器人那样答非所问或生成有害内容,而是像一个知识渊博且懂得分寸的助手。这种“分寸感”和“对人类意图的理解”,很大程度上并非来自预训练,而是源于一个关键的后训练步骤:基于人类反馈的强化学习。而在这个流程中,扮演核心“教练”角色的算法,正是近端策略优化

对于AI产品经理和技术决策者而言,理解PPO不仅仅是为了看懂一篇技术论文。它关乎如何评估一个大型语言模型的“对齐”成本与风险,关乎在设计产品时,对模型行为边界能有更清晰的预期。今天,我们不打算复述教科书式的算法推导,而是聚焦于PPO在工业级大语言模型对齐中的实战逻辑:它如何工作?为什么是它?以及在实践中,工程师们真正关心哪些“魔鬼细节”?

1. RLHF:让模型学会“揣摩圣意”的三幕剧

在深入PPO之前,我们必须先搭建好它表演的舞台——RLHF。你可以把RLHF想象成训练一个极具天赋但未经世事的学徒。预训练模型博览群书(海量文本),知识渊博但不知轻重,可能随口说出冒犯的话或编造事实。RLHF的目标就是教会它“什么该说,以及怎么说更好”。

整个过程通常分为三个紧密衔接的阶段,构成了一个完整的训练闭环。

1.1 第一幕:监督微调——建立初始对话能力

首先,我们需要让模型理解“对话”这个任务。预训练模型擅长续写文本,但并不天然具备遵循指令、进行多轮交互的能力。因此,第一步是监督微调

注意:此阶段的SFT与最终Chat模型的SFT有时被混淆。这里的SFT是RLHF流程的起点,数据量相对较小(数万到数十万条高质量指令-回复对),目的是让模型初步学会“按指令格式输出”,而不是注入大量知识或对齐价值观。

我们收集一批高质量的对话数据,格式如下表示例:

{
  "instruction": "用简单的语言解释什么是光合作用。",
  "output": "光合作用是植物、藻类和一些细菌利用阳光能量,将二氧化碳和水转化成它们生长所需的食物(主要是糖类)和氧气的过程。你可以把它想象成植物的‘厨房’,阳光是火,二氧化碳和水是原料,产出的就是食物和氧气。"
}

然后,我们用标准的语言模型损失函数(通常是交叉熵)在这些数据上对预训练模型进行微调。这相当于给模型一个“热身”,让它从通用的文本生成器,转变为初步的指令跟随者。然而,SFT模型依然存在很多问题:它可能会啰嗦、可能产生幻觉(编造信息)、也可能在道德模糊的地带做出不当回答。因为它学习的只是模仿数据中的模式,而非理解“好回答”的深层标准。

1.2 第二幕:奖励建模——将人类偏好量化

如何定义“好回答”?这是一个主观且复杂的问题。RLHF的巧妙之处在于,它不直接定义一套复杂的规则,而是学习一个能模拟人类偏好的函数,即奖励模型。

具体做法是:用SFT模型生成大量针对同一提示词的不同回复。然后,将这些回复对提交给人类标注员进行排序。标注员的任务不是给每个回复打分,而是判断哪个回复更好。这种两两比较的方式,比直接打分更可靠,能减少个人评分尺度不一带来的噪声。

提示词 回复A 回复B 人类偏好
“简述牛顿第一定律” “物体在不受外力作用时,总保持静止或匀速直线运动状态。” “牛顿第一定律说的是惯性,就是东西不动就不动,动了就一直动,除非你推它或者拉它。” A > B (A更准确、严谨)
“写一首关于春天的短诗” “春风拂面暖,百花竞相开。燕子衔泥忙,孩童笑颜展。” “春天来了,树绿了,花开了,天气暖和了,人们心情也好了。” A > B (A更有文学性、意境)

收集到海量的比较数据后,我们训练一个独立的奖励模型。这个RM通常以SFT模型为基座,去掉最后的语言模型头,换成一个标量输出层。训练目标是,对于一对回复 (y_w, y_l)(其中 y_w 是人类偏好的胜出回复),RM给 y_w 的打分 r(y_w) 应该显著高于 y_l 的打分 r(y_l)。常用的损失函数是 Bradley-Terry 模型的对数损失:

loss = -log(σ(r(y_w) - r(y_l)))

其中 σ 是sigmoid函数。通过这种方式,RM学会了将人类模糊的“偏好”转化为一个可计算的标量分数。这个分数综合了有用性、真实性、无害性、简洁性等多个维度,是一个复杂的、学习而来的评价标准。

1.3 第三幕:PPO优化——让模型与奖励模型对齐

现在,我们有了一个“学生”(待优化的策略模型,通常从SFT模型初始化)和一个“考官”(奖励模型)。目标是通过调整学生模型的参数,使其生成的回复能从考官那里获得尽可能高的分数。这天然地构成了一个强化学习问题:

  • 智能体: 策略模型(学生)。
  • 动作: 生成下一个词元(Token)。
  • 状态: 当前已生成的文本序列。
  • 奖励: 一个回合(生成完整回复)结束后,由奖励模型给出的最终分数。

如果直接用这个奖励去训练,模型会迅速“钻空子”:它可能发现生成一堆无意义但RM误判为高分的字符组合,或者极端讨好RM导致语言变得怪异、重复。这就是奖励黑客现象。为了解决这个问题,PPO登场了,它带来了两个关键约束。

2. PPO的核心机制:在探索与利用间设置“护栏”

PPO之所以能成为RLHF中的首选,是因为它在追求高奖励和保持模型稳定性之间找到了一个优雅的平衡点。它主要解决了两个核心挑战:1) 如何基于非策略数据(旧策略生成的数据)高效更新策略? 2) 如何防止策略更新过大导致模型崩溃?

2.1 重要性采样与替代优势函数

在强化学习中,我们通常需要根据当前策略 π_θ(参数为θ)与环境交互来收集数据,然后用这些数据来更新θ。但在大语言模型场景,每一步“交互”(生成一个词)都极其昂贵。PPO采用重要性采样技术,允许我们复用旧策略 π_θ_old 生成的数据来估计新策略的期望奖励。

具体来说,我们定义优势函数 A_t,它衡量在时间步 t 采取某个动作(生成某个词)相对于平均水平的“好坏程度”。然后,PPO试图最大化以下“替代优势”函数:

L(θ) = E_t [ min( ρ_t(θ) * A_t, clip(ρ_t(θ), 1-ε, 1+ε) * A_t ) ]

其中,ρ_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t) 就是重要性权重。这个公式是PPO-Clip(最流行的变体)的灵魂。

让我们拆解这个看似复杂的公式:

  • 前半部分 ρ_t(θ) * A_t: 这是最直接的想法,如果某个动作的优势 A_t 为正(是个好动作),我们就增加新策略产生该动作的概率(即增大 π_θ(a_t|s_t)),反之则减少。重要性权重 ρ_t 用于修正数据来自旧策略这一偏差。
  • 后半部分 clip(ρ_t(θ), 1-ε, 1+ε) * A_t: 这是PPO的“Clip”操作精髓。它将重要性权重 ρ_t 限制在 [1-ε, 1+ε] 的区间内。ε 是一个超参数,通常设为0.1或0.2。
  • 最终取两者中的较小值: 这个 min 操作构成了一个悲观估计。当 A_t > 0(好动作)时,如果新策略过于激进地提高该动作概率(ρ_t 远大于 1+ε),clip 会将其拉回 1+ε,从而 L(θ) 取较小的 clip 项,阻止了过大的更新。当 A_t < 0(坏动作)时,如果新策略过于激进地降低该动作概率(ρ_t 远小于 1-ε),clip 会将其拉回 1-ε,同样起到限制作用。

提示:你可以把 ε 想象成给策略更新设置的“信任区域”半径。PPO允许策略在这个区域内自由探索优化,但一旦试图跨出这个区域,更新信号就会被截断,防止策略“跑偏”。

2.2 KL散度惩罚:不忘初心的“锚”

仅靠Clip操作有时不足以完全防止策略“变质”。模型可能会为了获取高奖励,彻底改变其语言分布,生成一些语法正确但语义怪异、或严重偏离原始SFT模型风格的文本。这违背了我们的初衷:我们希望模型在保持原有语言能力和知识的基础上进行优化。

因此,在实践中,PPO的目标函数通常会加入一个额外的KL散度惩罚项

L_total(θ) = L_clip(θ) - β * KL(π_θ || π_ref)

这里 π_ref 通常就是初始的SFT模型。KL(π_θ || π_ref) 衡量当前策略 π_θ 与参考策略 π_ref 的差异。β 是一个控制惩罚强度的系数。

KL惩罚的实际意义是什么?

  1. 防止模式崩溃与退化: 它像一个“锚”,将当前策略拉向一个已知表现尚可的参考点,避免模型陷入极端或退化的输出模式。
  2. 保持生成多样性: 没有KL惩罚,模型可能为了最大化奖励,将所有概率质量集中到少数几个它认为能骗过高分的高频回复上,导致回复千篇一律。
  3. 控制探索与利用的权衡β 的大小可以动态调整。OpenAI在 InstructGPT 的论文中就提到使用了自适应的 β:当实际KL散度高于目标值时,增加 β 以加强约束;低于目标值时,减小 β 以给予模型更多优化自由度。

下面的表格对比了PPO目标函数中两个关键组件的作用:

组件 主要目标 解决的问题 类比
Clip操作 限制单次更新的步长 防止因过大的策略更新导致训练不稳定、性能崩溃 “小步快跑”:每次只允许在当前位置附近探索和优化,避免迈大步掉下悬崖。
KL散度惩罚 保持策略分布的整体稳定性 防止策略过度偏离原始模型,丧失语言能力或多样性 “不忘初心”:在追求高分的同时,时刻提醒自己原本是谁,保持基本的语言风格和能力。

3. 工业级实践:ChatGPT训练中的PPO全景图

在理论之上,将PPO应用于千亿参数级别的大语言模型,是一项浩大的系统工程。它远不止实现一个算法那么简单,而是涉及大规模分布式训练、精心设计的奖励函数工程以及繁重的超参数调优。

3.1 完整的训练循环与四模型共舞

一个典型的工业级RLHF-PPO训练流程中,通常同时维护着四个模型:

  1. 策略模型: 即我们需要训练的主模型,也就是未来的ChatGPT。它的参数会被更新。
  2. 参考模型: 通常是策略模型的一个固定副本,在训练开始时与策略模型相同。它不参与梯度更新,仅用于计算KL散度惩罚项。
  3. 奖励模型: 固定的模型,为生成的完整回复提供标量奖励。
  4. 价值函数模型: 一个用于估计每个状态(文本序列位置)价值 V(s) 的模型。它用于计算优势函数 A_t = R_t - V(s_t),其中 R_t 是未来累积奖励的估计。这个模型通常与策略模型共享部分底层架构(如Transformer层),但有一个独立的输出头。

训练在一个巨大的提示词数据集上循环进行。每个迭代步骤包含:

  • 数据收集: 用当前的策略模型为一批提示词生成回复。
  • 奖励计算: 用奖励模型为每个完整回复打分。
  • 优势估计: 使用价值函数模型和广义优势估计方法计算每个生成词元处的优势值 A_t
  • PPO优化: 使用上述数据,通过多轮小批量随机梯度下降,优化策略模型和价值函数模型。优化目标就是前面提到的 L_total(θ)
# 伪代码示意核心训练循环结构
for epoch in range(total_epochs):
    # 1. 收集经验
    prompts = sample_prompts(batch_size)
    responses, logprobs, values = policy_model.generate(prompts) # 生成回复并记录对数概率和价值估计
    rewards = reward_model(responses) # 获取最终奖励

    # 2. 计算优势函数和回报
    advantages, returns = compute_gae(values, rewards) # 使用GAE计算优势

    # 3. 多轮PPO更新
    for ppo_update_step in range(ppo_epochs):
        # 重新计算当前策略下动作的概率
        new_logprobs, entropy = policy_model.evaluate_actions(prompts, responses)
        # 计算重要性权重
        ratio = torch.exp(new_logprobs - old_logprobs.detach())
        # 计算替代损失(Clip)
        surr1 = ratio * advantages
        surr2 = torch.clamp(ratio, 1.0 - clip_epsilon, 1.0 + clip_epsilon) * advantages
        policy_loss = -torch.min(surr1, surr2).mean()
        # 计算KL散度惩罚
        kl_div = compute_kl_divergence(policy_model, reference_model, prompts)
        # 总损失
        total_loss = policy_loss + value_loss_coef * value_loss - entropy_coef * entropy + kl_coef * kl_div
        # 反向传播与优化
        optimizer.zero_grad()
        total_loss.backward()
        optimizer.step()

3.2 奖励模型设计:对齐的指挥棒

奖励模型的质量直接决定了PPO优化的最终方向。一个设计不良的RM会导致模型学到错误的偏好。工业实践中,RM的设计远比一个简单的标量输出复杂:

  • 多维度奖励集成: 单一的RM可能难以兼顾所有方面。一种常见做法是训练多个针对不同维度的RM(如有用性RM真实性RM无害性RM),然后将它们的输出进行加权求和,作为最终奖励。这允许产品团队根据需求调整不同维度的优先级(例如,更注重安全性或更注重创造性)。
  • 对抗性数据与迭代训练: 初始的RM很容易被策略模型“欺骗”。因此,需要迭代训练:用当前策略模型生成一些能获得高奖励但质量存疑的回复,让人工标注员重新评估,将这些“对抗性样本”加入RM的训练数据中,提升RM的判别能力。
  • 奖励标准化与裁剪: 为了防止奖励尺度波动过大影响训练稳定性,通常会对一个批次内的奖励进行标准化(减去均值,除以标准差)。有时也会对奖励值进行裁剪,避免极端值。

4. 超越基础PPO:前沿优化与挑战

标准的PPO-Clip是RLHF的基石,但研究者和工程师们仍在不断改进它,以应对大模型对齐中特有的挑战。

4.1 处理KL散度崩溃与奖励模型过拟合

在RLHF训练后期,经常观察到两个现象:

  1. KL散度崩溃: 策略模型与参考模型的KL散度急剧下降至接近零。这意味着策略模型几乎不再改变,训练陷入停滞。这可能是因为KL惩罚系数 β 设置得过大,或者奖励模型提供的优化信号太弱。
  2. 奖励模型过拟合: 策略模型生成的回复在奖励模型上得分越来越高,但在人类评估中质量并未提升,甚至下降。这表明策略模型找到了奖励模型的“漏洞”或盲点。

应对策略包括:

  • 动态调整β: 如前所述,根据实际KL散度与目标值的偏差,动态调整 β
  • 奖励模型正则化: 在RM训练中引入更强的正则化,或使用模型集成来平滑奖励信号。
  • 引入非平稳参考模型: 不让参考模型完全固定,而是让其以慢于策略模型的速度进行更新(例如,通过指数移动平均同步策略模型的参数),这能提供一个更合理的“初心”锚点。

4.2 探索更高效的优化算法

PPO需要大量的采样和多次的模型前向/反向传播,计算成本极高。一些新的研究方向试图在保持稳定性的前提下提升效率:

  • DPO及其变种: 直接偏好优化算法绕过了训练奖励模型的步骤,直接将人类偏好数据用于策略优化,理论更简洁,实践上在某些任务中显示出与RLHF相当甚至更好的效果,且训练更稳定、更高效。DPO可以看作是在特定条件下对RLHF目标的一种解析重构。
  • ReST等离线方法: 考虑先通过模型自生成大量数据,并进行筛选,构成一个高质量的离线数据集,然后再进行离线强化学习或监督微调,减少与环境的在线交互成本。

4.3 从对话对齐到多模态与复杂任务

PPO和RLHF的思想正在从文本对话扩展到更广阔的领域:

  • 代码模型: 如何让模型生成更高效、更安全、更符合规范的代码?人类反馈可以基于代码的正确性、运行效率、可读性进行。
  • 多模态模型: 对于文生图模型,人类反馈可以基于图像的美观度、与文本提示的匹配度、安全性等。这里的“动作”是生成图像的潜变量或像素,奖励模型则需要处理图像输入。
  • AI智能体: 在游戏或复杂环境中,PPO可以用于训练AI智能体的决策策略,人类反馈可以针对其整体策略的有效性、合作性等进行。

这些扩展都带来了新的挑战,例如如何设计跨模态的奖励模型,如何处理更长序列的信用分配问题等,但核心思想——通过人类反馈信号来微调和约束模型行为——依然是一致的。

理解PPO在RLHF中的应用,就像掌握了一位顶尖AI教练的训练手册。它告诉我们,让一个超级“大脑”变得既聪明又可靠,不仅需要海量的知识灌输,更需要一套精巧的、基于反馈的引导机制。这套机制的核心,就是在鼓励模型追求“高分”的同时,用KL散度等约束为其设定行为边界,防止其在优化中迷失自我。对于产品和技术负责人来说,这意味着在规划一个大型语言模型产品时,必须为“对齐”阶段预留充足的计算资源、数据标注预算和算法调试时间。因为最终呈现在用户面前的,不仅是模型的知识,更是这套对齐机制所塑造的“性格”与“价值观”。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐