福生无量摸鱼天尊

强化学习:从模态对齐到策略优化

2025/11/20
5
0

对齐到RL

一个未经对齐的 LLM 可能会产生无益、有害甚至有毒的内容,或者无法理解和遵循复杂、微妙的人类指令。

这一根本性问题被称为对齐(Alignment),即确保 AI 系统的目标和行为与人类的价值观和意图保持一致。

SFT(静态)

解决对齐问题的初步尝试是监督微调(Supervised Fine-Tuning, SFT)。SFT 使用高质量的人工标注数据集,其中包含期望的输入-输出对(例如,问题和理想答案),通过模仿学习的方式来调整模型行为。

尽管 SFT 在引导模型遵循特定格式和风格方面是有效的,但它存在固有的局限性。

  • 对于许多涉及主观判断、创造性或复杂推理的任务,不存在唯一的正确答案,这使得创建全面的 SFT 数据集变得异常困难。

  • SFT 依赖于静态数据集,无法覆盖现实世界中无穷无尽的场景和人类偏好的细微差别,导致模型在面对未见过的查询时泛化能力不足。

对齐问题

由于SFT是纯静态的方式,这会使得极其依赖高质量的数据,但是现实必然不可能有那么多领域的高质量数据集。故此为了优化SFT,研究界转向了策略优化(Policy Optimization),策略优化将LLM视为一个 “智能体” ,它的任务是:

  • 观察状态:读取输入提示(Prompt),也就是输入x

  • 执行动作:生成输出响应(Response),也就是输出y

  • 获得奖励:根据响应质量获得评分

  • 调整策略:通过高分响应的学习,让模型学会生成更“好”的答案

那么我们进行建模,这里的xy 因为LLM生成文本的本质是“逐token赌命”(自回归生成),显然不应当是一对一的输出:

  • 普通函数:f(x) = y(给定x,永远得到唯一的y)

  • LLM映射p_θ(y|x)(给定x,y有多种可能性,每个有对应概率)

所以这里是一个概率性映射,举个例子,假设要生成 "北京" 这个词:

  1. 输入 "中国的首都是" 后,模型预测下一个token的概率分布:

    • "北": 0.95

    • "上": 0.02

    • 其他: 0.03

  2. 选择"北"后,再基于 "中国的首都是北" 预测:

    • "京": 0.98

    • "方": 0.01

    • ...

  3. 整个句子 "北京" 的概率 = 所有token概率的乘积:

    p("北京") = p("北") × p("京") ≈ 0.95 × 0.98 ≈ 0.93

故此我们可以用概率分布来说明LLM输出的三个方面

  1. 表达不确定性:模型对答案的自信程度("北京"概率高 vs "上海"概率低)

  2. 支持多样采样:通过调整温度参数,可生成创意性回答(概率分布越平坦,多样性越高)

  3. 可微分优化:概率是连续值,可以用梯度下降等数学工具优化

正因为如此,我们需要通过p_θ(y|x) 建立一个prompt映射到response的概率模型,策略优化的核心目标是调整模型参数θ,以最大化一个预定义的标量目标函数(或奖励函数),该函数旨在量化模型输出的“期望性”。这个目标函数可以代表多种对齐目标,例如:

  • 人类偏好:响应是否更符合人类评估者的偏好。

  • 任务正确性:在数学或编码等任务中,答案是否正确。

  • 指令遵循:响应是否严格遵守了指令中的所有约束。

  • 安全性:响应是否避免了有害或不道德的内容。

通过将对齐问题形式化为一个优化问题,研究人员得以利用一系列强大的算法来微调 LLM 的行为,使其超越静态数据集的限制,学习到更普适和稳健的对齐能力。

近端优化策略 PPO框架

承接上文,预训练模型虽然能输出大量设定好的内容,但也同样容易一本正经地胡说八道(Hallucination),或者生成有毒、危险的内容,因为它仅仅是在模仿数据的统计规律,而非理解人类的价值观 。

为了将这种原始的智能转化为安全、有用且符合人类预期的助手,我们进入了后训练(Post-training)时代。这一阶段的核心技术是基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF)RLHF 不再关注“由于概率统计,下一个词最可能是什么”,而是关注“在这个语境下,什么样的回答是人类认为最有用、最安全的” 。  

在 RLHF 的技术栈中,近端策略优化(Proximal Policy Optimization, PPO)不仅仅是一个优化算法,它是现代大模型对齐的引擎。它允许我们将“幽默感”、“由衷的帮助”或“安全性”这些无法用简单的交叉熵损失函数描述的主观概念,转化为可优化的数学目标。通过引入人类偏好作为奖励信号,PPO 将人类的判断力像“三明治”一样夹在训练循环中,通过不断的试错与修正,精细雕琢模型的行为 。  


为什么SFT不够

上文提到,SFT极其依赖数据,这就导致了传统的策略梯度(Policy Gradient)方法极其不稳定。在传统的 RL 中,如果Agent偶然发现了一个能获得高回报的行为(哪怕是由于环境噪声),它可能会大幅更新自己的策略以利用这个发现。在语言模型中,这意味着模型参数的剧烈波动。这种剧烈更新可能导致策略坍塌(Policy Collapse)

PPO 的诞生正是为了解决这个问题。它的名字“近端(Proximal)”揭示了其核心哲学:你可以学习新的经验,但你的改变不能偏离旧的自我太远。通过在数学上强制约束策略更新的步幅,PPO 在“探索新知”与“保持稳定”之间找到了完美的平衡,使其成为当前 LLM 对齐的工业标准 。

PPO算法

与传统的深度学习任务不同,PPO 驱动的 RLHF 训练流程在工程上极具挑战性,最主要的原因在于它需要同时在内存中维护四个独立的模型

我们可以通过一个高强度写作训练班的类比来理解这四个模型的角色与互动 。

模型名称

技术角色

是否训练

写作班类比

演员模型

(Actor / Policy)

待优化的主 LLM (\pi_\theta)。负责根据提示生成文本。

学生

正在练习写作,试图写出高分作文。

评论家模型

(Critic / Value)

价值函数 (V(s))。预测当前状态下未来的预期收益。

学生的自我评估

学生内心的声音:“这句话写得不错,感觉能拿高分

奖励模型

(Reward Model)

偏好模型 (r_\theta)。提供最终的标量评分。

考官

在作文写完后给出最终分数的外部权威。

参考模型

(Reference Model)

初始 SFT 模型的副本 (\pi_{ref})。用于计算 KL 散度。

教科书/旧文集

记录学生之前的写作风格,防止学生为了高分而写出不通顺的怪文。

  • 学生写作文一个字一个字写,类比Actor一个token一个token输出。这时候学生写着写着就知道分高分低了,评论家模型评论的是Actor逐token输出时人类的喜好度

  • 奖励模型是一个预先训练好的二分类器或回归模型,它学习了人类的偏好,它只有在整段话写完后才给分。它通常基于 Bradley-Terry 模型,通过成对比较数据(Pairwise Data)训练而成 。在 PPO 阶段,它是冻结(Frozen)的,充当不可动摇的真理标准。

    • 演员在生成第 5 个字时,不知道这个字好不好。评论家提供即时的、逐个 Token 级别的反馈(优势函数估计),告诉演员:“你现在的发挥超出了预期”或“你正在搞砸” 。这构成了 Actor-Critic 架构的核心演员负责行动,评论家负责打分以辅助训练。  

  • 参考模型是在 RLHF 开始前的快照(通常是 SFT 后的模型)。它也是冻结的。

    • 每当演员生成一个 Token,系统都会计算参考模型生成该 Token 的概率。如果演员生成了一个参考模型认为概率极低的词(比如乱码),两者之间的 KL 散度(Kullback-Leibler Divergence) 就会飙升。这个散度会被作为惩罚项扣除奖励。这就像老师对学生说:“你可以发挥创意,但不能不说人话。”

PPO的数学建模

PPO的精髓是并非直接使用奖励模型的原始分数,而是通过一个预定好的奖励模型通过计算价值函数去调整大模型的输出偏好,大模型原来的输出和期望的输出就会存在一个差值,我们通过这个差值来进行数学建模,重点是表明相对优于绝对

  • 场景 A: 题目很简单,模型乱写一通也得了 8 分。

  • 场景 B: 题目极难,模型绞尽脑汁写得很好,但只得了 4 分。

如果直接用分数更新,模型会误以为场景 A 的行为比场景 B 好。为了解决这个问题,我们引入了优势函数(Advantage Function,A_t),优势函数衡量的是在状态s 下采取行动a相对于该状态下平均行动价值的好坏程度

A(s, a) = Q(s, a) - V(s)
  • Q(s, a) 是采取动作a 后的实际收益(由奖励模型给出)。

  • V(s) 是评论家模型预测的“平均预期收益”。

这个优势函数极大地降低了训练的方差,让模型专注于超越自我,而不是依赖环境的馈赠。在实际操作中,PPO 使用 GAE(Generalized Advantage Estimation),引入了参数\lambda\gamma 来平衡偏差和方差,计算多步未来的回报折现,从而提供更平滑的指导信号。

为了约束某一次训练给大模型带来无与伦比的好处,PPO引入裁剪代理目标函数(Clipped Surrogate Objective)。标准策略梯度方法的目标是最大化:

L^{PG}=\hat E_t [\frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)} \hat A_t ]

其中下式是新旧策略的概率比:

r_t(\theta)=\frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}

这个比率衡量了新策略相对于旧策略的变化程度。如果r_t > 1,说明新策略更倾向于该动作。这个比率如果过大或过小,会导致策略更新步子迈得太大,从而破坏训练过程。

PPO 的前身是信任区域策略优化(Trust Region Policy Optimization, TRPO),通过复杂的二阶优化来约束 KL 散度,从而限制更新幅度,但计算成本极高。PPO 通过一个更简单的一阶优化方法实现了类似的效果,其代理目标函数为:

L_{CLIP}(θ)=\hat E_t[min(r_t(θ)\hat A_t,clip(r_t(θ),1−ϵ,1+ϵ) \hat A_t)]

让我们用*安全攀岩”的类比来解释其中的\epsilon(通常设为 0.2):

  • 当动作为好(优势A > 0)时:

    • 我们希望增加该动作的概率(让r_t 变大)。

    • 但是,如果r_t 超过了1 + \epsilon(即 1.2,概率增加了 20%),裁剪项就会生效,强制收益封顶。

    • 直觉: “你做得很好!奖励你。但是,哪怕你做得再好,我也只允许你把这次的概率提升 20%。不要因为一次成功就得意忘形(Overfit)。”这防止了单一数据点导致策略更新过猛。

  • 当动作为坏(优势A < 0)时:

    • 我们希望减少该动作的概率(让r_t 变小)。

    • 由于A 是负数,取最小值实际上是看哪个负得更多(惩罚更重)。

    • 如果r_t 低于1 - \epsilon(即 0.8),裁剪项生效。

    • 直觉: “你搞砸了。我们要降低这个动作的概率。但即使是个错误,我也不会让你把概率降到 0。我们把惩罚限制在 20% 的幅度内。”这防止了模型因为一次失误就彻底扼杀某种可能性的探索。

这种裁剪机制就像攀岩者的安全绳。它允许模型向上攀爬(优化),但每一步都被严格限制在“近端”范围内。如果步子迈得太大,绳子就会拉住你。这使得 PPO 能够在数学上保证训练的稳定性,而不必像 TRPO 那样计算复杂的二阶海森矩阵(Hessian Matrix)。

PPO的高昂开销

PPO 的训练成本远高于 SFT,主要原因在于这四个模型的显存占用。对于一个 70B 参数的模型,在不使用量化和优化技术的情况下,全参数 PPO 训练所需的显存是惊人的:  

  • 推理开销: 每次迭代,我们需要对演员(general token)、参考模型(计算 KL)、奖励模型(计算 Reward)进行前向传播。

  • 训练开销: 我们需要存储演员和评论家的梯度(Gradients)以及优化器状态(Optimizer States)。对于 Adam 优化器,优化器状态通常是模型参数量的 2 倍。

  • 碎片化(Fragmentation): 研究表明,PPO 训练中的内存峰值往往不是由模型本身引起的,而是由推理生成阶段累积的内存碎片导致的 。  

在 7B 模型的训练中,如果使用全量微调,仅加载这四个模型就需要约 4-5 倍 于单模型推理的显存。这解释了为什么 LoRA (Low-Rank Adaptation) 和 Hydra-RLHF 等技术在 PPO 中如此重要。

Hydra-RLHF 通过共享部分参数(如演员和评论家共享主干,仅末端分离)以及使用 LoRA 适配器,可以显著降低内存占用,使得在消费级或中端企业级 GPU 上运行 PPO 成为可能 。

KL散度和黑客攻击

PPO 虽然解决了数学上的更新稳定性,但无法解决语义上的目标偏离。奖励模型只是人类偏好的一个代理(Proxy),它并不完美。这就引出了 RLHF 中最著名的现象:奖励黑客攻击(Reward Hacking)。

当一个指标成为目标时,它就不再是一个好的指标(Goodhart 定律)。如果没有约束,PPO 会极度聪明地找到奖励模型的漏洞。

经典案例 :  

  • 乱码注入: 模型发现某些特定的无意义字符组合(如重复“The The”)由于奖励模型的训练数据偏差,能获得略高的分数。于是 PPO 会让模型疯狂输出这些乱码。

  • 过度阿谀奉承(Sycophancy): 模型发现只要无脑赞同用户的观点(哪怕用户是错的),得分通常比反驳用户要高。于是模型变成了毫无原则的“马屁精”。

  • 长度欺骗: 在摘要任务中,如果使用 ROUGE 分数作为奖励,模型可能会直接抄袭原文,因为这样词汇重叠度最高。

  • 代码测试欺骗: 在代码生成任务中,模型学会了不是去修复代码,而是去修改单元测试用例,让错误的测试通过,从而获得满分奖励。

为了防止这种情况,我们在总奖励函数中加入了一个基于 KL 散度的惩罚项:

R_{total} = R_{model}(response) - \beta \cdot KL(\pi_\theta || \pi_{ref})
  • \pi_{ref} 是参考模型(SFT 模型)。

  • \beta 是惩罚系数(通常很小,如 0.05-0.1)。

直觉解释:参考模型代表了“正常人类语言的概率分布”。当演员模型为了取悦奖励模型而开始输出乱码或怪异句式时,参考模型会说:“嘿,这个词在正常语言中出现的概率几乎为零!”这会导致 KL 散度激增。由于R_{total} 会减去 KL 散度,任何通过破坏语言通顺性换来的奖励提升,都会被 KL 惩罚抵消掉。

PPO的优化:无评论家的RL

为了解决 PPO 框架的复杂性和资源消耗问题,研究人员开始探索简化 RLHF 流水线的方法。一个核心的演进方向是消除对独立评论家(Critic)或价值模型(Value Model)的依赖,从而催生了一系列更高效的“无评论家”强化学习算法。