写在前面的话:

在之前的专栏中,我们从计算机视觉一路走到多模态,从大模型探索到强化学习,并在最后以C语言课程收尾。我们由浅入深地梳理了人工智能的基础知识、经典架构以及前沿方法。这些内容虽然能帮大家搭建起对AI领域的完整视野,但我也意识到,仅仅停留在“看见”是不够的,它还不足以帮我们建立起足够深刻的行业认知。

因此,从今天起,我的内容方向将迎来一次更新——我希望为大家带来更多能激发“深度思考”的内容。我们将从不同领域的实际痛点出发,结合最前沿的研究进展,共同探讨那些亟待解决的难题。我希望能借此帮助大家在AI领域形成清晰的洞察力,也希望无论大家未来走向学术科研还是工业生产,这些认知都能成为你坚实的助力。

顺便聊聊,为什么我特意将“C语言”作为上一阶段内容的收尾?我知道,在很多人眼中,Python才是AI领域的神。但编程语言本质上是人与机器沟通的桥梁,在探索技术的道路上,我们理应“越接近底层越好”。C语言与计算机硬件架构的连接性是无与伦比的,它不仅是我们接下来学习CMU的神级课程《深入理解计算机系统》(CS:APP)的最佳基石,更揭示了技术的核心逻辑。学习AI绝不是为了“调包”和“炼丹”。在AI写代码能力日益强大的今天,唯有深刻理解底层与理论,我们才能建立起属于自己的认知壁垒与职业护城河。现在我们真正需要的不再是重复写代码的能力,而是能够洞见底层与理论的联系的能力。

坦白说,之前写过的动辄数万字的深度长文对我也是一种挑战。庆幸的是,有了AI作为创作助手,在我确立核心大纲后,它能帮我高效地扩充基础内容;而我则将精力倾注于纠错、重塑逻辑,并融入我个人的思考。即便有AI辅助,打磨每一篇文章依然需要耗费大量心血,但这个过程本身就在升华我自己的思维,同时也能为大家呈现更详实、更具深度的内容,这是一件让我乐在其中的事。

感谢大家一直以来的陪伴与支持。希望接下来的系列能为大家带来更优质的阅读体验和更深度的思维碰撞。我会继续用心雕琢每一篇作品,正文见。

引言:

想象一下,你们团队十个人熬了半个月搞定了一个大项目,老板大手一挥批了100万奖金。结果财务是怎么发钱的?不看代码是谁写的,不看Bug是谁修的,直接闭着眼睛平均分,甚至连那个天天摸鱼划水的家伙也拿了10万。

换做是你,你是不是想掀桌子?

但遗憾的是,这就是当前最火的大模型对齐算法(无论你是PPO还是DPO)每天都在干的蠢事。

面对动辄几千字的长文本推理,模型到底是因为做对了哪一步关键逻辑,还是生成了哪个神来之笔的Token才得到了高分?现有的奖励机制(Reward Model)根本不关心。它们只会给整段输出贴上一个简单粗暴的全局分数(Global Reward)。这在经典的强化学习领域,是一个极其糟糕的**“信用分配(Credit Assignment)”**灾难。

今天,我想和大家聊一聊:为什么这种“吃大锅饭”的对齐机制,正在锁死大模型复杂推理能力的上限?以及如果不解决“搭便车”的Token,我们投喂再多算力,可能也只是在巩固一个巨大的幻觉引擎。

第一部分:经典RLHF的“盲人摸象”

为了大家更好的阅读,所以我还是会在第一章将PPO重新回顾一遍,如果你已经对PPO比较了解,可以直接跳过第一章,看到第二章去。我们将在第二章引入信用分配问题。

第一章:经典框架PPO

在深入 PPO(Proximal Policy Optimization,近端策略优化)之前,我们必须先理解它在RLHF(基于人类反馈的强化学习)中的位置。

大型语言模型(LLM)最初是通过海量文本“续写下一个词”训练出来的。这让它们学会了说话,但它们可能满嘴跑火车(幻觉)、具有攻击性或不听指令。RLHF 的目的就是给模型立规矩,让它符合人类的价值观(HHH原则:Helpful 有用, Honest 诚实, Harmless 无害)。

你可以把训练大模型想象成训练一只聪明的狗狗:

  1. SFT(监督微调):你手把手教狗狗动作(比如“坐下”),让它知道指令对应什么行为。

  2. RM(奖励模型):你不在的时候,需要一个自动化的“裁判”来代替你给狗狗打分。裁判学习了你的偏好,知道什么样的动作给肉骨头,什么样的动作要扣分。

  3. PPO(强化学习):狗狗为了得到裁判手里最多的肉骨头,开始不断尝试、自我调整策略。PPO 就是指导狗狗如何高效、稳定地调整行为策略的那套核心算法。

在有了一个能够给文本打分的奖励模型 (Reward Model, RM) 之后,我们为什么不能直接用传统的梯度下降来优化 LLM 呢?

因为文本生成是一个离散的过程。大模型生成文本是一个词一个词蹦出来的,RM 只能在整句话生成完毕后才给出一个总分(标量)。这种情况下,由于采样的不可导性,我们无法直接把 RM 的分数通过微积分的链式法则反向传播给 LLM。

因此,我们需要引入强化学习 (RL)。在 RLHF 的语境下,有几个名词大家可以熟悉一下:

  • Agent(智能体):LLM 本身(确切地说是 Actor 网络)。

  • Environment(环境):输入的 Prompt(提示词),就是平时你问AI的问题内容。

  • State(状态 $S_t$:当前已经生成的文本序列(AI回答你是一个字一个字蹦出来的)。

  • Action(动作 $A_t$:词表里的几万个词汇,模型选择生成下一个具体的词(Token)就是执行了一个动作。

  • Reward(奖励 $R$:由 RM 给出的评分。

我们要优化的目标是最大化整个生成序列的期望累积奖励

在 PPO 诞生之前,最基础的强化学习算法叫策略梯度 (Policy Gradient)。 它的直觉很简单:如果生成某个 Token 后最终得到了高分,我们就提高这个 Token 在那种状态下生成的概率;反之则降低。

但策略梯度有一个致命缺点:步子迈得太大容易扯着蛋(训练极度不稳定)。 大模型在更新参数时,如果发现某个词得分高,可能会过度优化,直接把这个词的概率推到 100%。这会导致模型策略发生剧烈突变,也就是所谓的“灾难性遗忘”或“策略崩溃”,一旦掉进坑里就再也学不回来了。

为了解决这个问题,研究人员提出了 TRPO,后来演进成了 PPO。 PPO 的核心思想是:小步快跑,限制更新幅度。它允许模型更新策略,但不允许新策略和老策略偏离得太远。

为了实现“限制更新幅度”,PPO 引入了两个极其重要的概念:优势函数 (Advantage)裁剪目标比率 (Clipped Surrogate Objective)

1. 优势函数 (Advantage Function, $\hat{A}_t$) 绝对的分数并不客观。比如考了 80 分,如果是平均分 90 分的卷子,那就是考砸了;如果是平均分 50 分的卷子,那就是学霸。 在 PPO 中,我们需要一个Critic(评论家,也叫 Value Model 价值模型) 来预估当前状态的平均期望得分(基线)。 优势函数表示为:实际获得的总奖励减去 Critic 预估的基础奖励。

  • 如果 $\hat{A}_t > 0$,说明当前选择的 Token 比预期的好,要增加它的概率。

  • 如果 $\hat{A}_t < 0$,说明比预期的差,要降低它的概率。

2. 裁剪函数 (Clipping) PPO 通过计算新策略和旧策略的概率比值来更新模型:

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

它表示:

  • 在状态 s_t 下,

  • 对同一个动作 a_t

  • 新策略给它的概率

  • 相对于旧策略给它的概率

  • 增加了多少或减少了多少

为了防止 $r_t(\theta)$ 变化过大,PPO 设计了其最著名的目标函数:

$L^{CLIP}(\theta) = \hat{\mathbb{E}}_t [\min(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t)]$

$\epsilon$ 通常是一个很小的常数(如 0.2)。

clip 操作强制将比率 $r_t(\theta)$ 限制在 $[0.8, 1.2]$ 之间。

  • 最多只允许放大到 1.2

  • 最多只允许缩小到 0.8

超出这个范围,就按边界值算。

min 操作是一种悲观策略,它确保当新策略偏离老策略太远时,不仅得不到更多的梯度奖励,甚至会停止更新。这就保证了模型每次只进行安全的、局部的优化。

RLHF 中 PPO 的完整系统架构(工程落地):

这是最深的一层。在真正的 RLHF 实践中,跑一次 PPO 竟然需要同时加载 4个大模型(通常在内存中会进行权重共享或量化以节省显存):

  1. Actor Model(演员模型):这就是我们要训练的目标 LLM(由第一阶段的 SFT 模型初始化而来)。它负责根据 Prompt 输出文本。

  2. Reference Model(参考模型):这是冻结了参数的初始 SFT 模型。它的作用是作为 Actor 的“锚点”。

  3. Reward Model(奖励模型):冻结参数,负责在 Actor 生成完整句子后打分。

  4. Critic Model(价值模型):跟随 Actor 一起训练,负责评估每个 Token 生成后的状态价值,用于计算优势函数。

KL 散度惩罚(RLHF 的点睛之笔): 大模型非常聪明,如果完全放任 Actor 去迎合 Reward Model,它会学会“作弊”(Reward Hacking)。比如 RM 喜欢礼貌的回复,Actor 可能不管问什么都只回答“您好,谢谢,很高兴为您服务”,从而丧失回答具体问题的能力。

为了防止这种“过度拟合偏好”导致语言能力退化,PPO 在计算最终奖励时,强制引入了与 Reference Model 的 KL 散度惩罚

$R(x, y) = r_\theta(x, y) - \beta \log \frac{\pi_\theta^{RL}(y|x)}{\pi^{SFT}(y|x)}$

这个公式的含义是:Actor说话的语气和概率分布,绝对不能偏离原始 SFT 模型太远$\beta$ 是控制惩罚力度的系数)。

具体实例

假设场景:用户输入了一个 Prompt:“地球”。 我们的目标是让模型续写更好的回答。

第 1 步:场景设定与前向传播 (The Setup)

首先,我们要让当前的 Actor 模型(也就是待训练的大模型)根据 Prompt 生成一句话,并让各个模型打分、记录概率。

  • 初始状态 ($s_0$):Prompt 是“地球”

  • 动作 1 ($a_1$):Actor 选择生成了词 “是” $\rightarrow$ 进入状态 $s_1$(“地球是”)

  • 动作 2 ($a_2$):Actor 选择生成了词 “圆” $\rightarrow$ 进入状态 $s_2$(“地球是圆”,生成结束)

在生成这两个词的同时,后台的三个模型在疯狂计算并记录数据:

Actor 记录旧策略概率 ($\pi_{old}$)

  • 生成“是”的概率:0.5

  • 在“地球是”后面生成“圆”的概率:0.8

Reference 模型给出参考概率 ($\pi_{ref}$)(为了防止后续偏离太远):

  • 生成“是”的参考概率:0.4

  • 生成“圆”的参考概率:0.7

Critic 模型预测状态价值 ($V$)(预估当前状态未来能拿多少分):

  • $V(s_0) = 0.1$ (刚看到“地球”,预估分数不高)

  • $V(s_1) = 0.5$ (看到“地球是”,感觉能接好词,预估分数涨了)

  • $V(s_2) = 0$ (生成结束,没有未来奖励了)

第 2 步:计算带有 KL 惩罚的奖励 (Reward & KL Penalty)

句子生成完了,Reward Model (RM) 开始阅卷。

RM 看到“地球是圆”这个完整的句子,觉得很棒,给出了最终的标量奖励分数 $R_{RM} = 1.0$。(注意,这个分数只在最后一个词生成后才给出)。

但我们不能只看 RM 的分数,必须加入KL 惩罚,防止 Actor 模型投机取巧。

即时奖励公式为:

$r_t = R_{RM}(t) - \beta \ln \frac{\pi_{old}(a_t|s_{t-1})}{\pi_{ref}(a_t|s_{t-1})}$

假设 KL 惩罚系数 $\beta$ 为 0.1:

  • 第 1 步 ($t=1$,“是”):没有 RM 分数,只有惩罚。

    $r_1 = 0 - 0.1 \times \ln(0.5 / 0.4) \approx -0.022$

  • 第 2 步 ($t=2$,“圆”):有 RM 分数,也有惩罚。

    $r_2 = 1.0 - 0.1 \times \ln(0.8 / 0.7) \approx 0.987$

现在,我们得到了每一步真实的即时奖励:$r_1 = -0.022$$r_2 = 0.987$

第 3 步:计算优势函数 (Advantage Estimation)

我们有了即时奖励,也有了 Critic 的预期价值,现在要算一算:Actor 刚才生成的这两个词,到底比预期好多少?

我们使用 TD误差(时序差分误差,$\delta_t$)来计算。假设折扣因子 $\gamma$ 为 1.0。

公式:

$\delta_t = r_t + \gamma V(s_t) - V(s_{t-1})$

对于“是” ($t=1$)$\delta_1 = -0.022 + 1.0 \times 0.5 - 0.1 = 0.378$ (解读:虽然即时奖励是负的,但它把状态从价值 0.1 提升到了 0.5,整体比预期好 0.378!)

对于“圆” ($t=2$)$\delta_2 = 0.987 + 1.0 \times 0 - 0.5 = 0.487$ (解读:获得了高分奖励,比预期的 0.5 还高出 0.487!)

通过 GAE(广义优势估计)将未来的误差反向累加(假设 $\lambda = 1.0$):

  • 优势值 $A_2 = \delta_2 = 0.487$

  • 优势值 $A_1 = \delta_1 + A_2 = 0.378 + 0.487 = 0.865$

结论:生成“是”和“圆”的优势 ($A_t$) 都是正数。这就告诉 Actor:方向对了,给我狠狠地增加生成这两个词的概率!

第 4 步:Actor 策略更新与 PPO 裁剪魔法 (The Clipping)

现在,Actor 模型开始反向传播,更新自己的神经网络参数($\theta$),变成了新策略 $\pi_\theta$

假设 Actor 很听话,更新后,生成“是” ($t=1$) 的概率从 0.5 涨到了 0.6

我们计算新旧概率的比率 (Ratio):

$r_1(\theta) = \frac{0.6}{0.5} = 1.2$

代入 PPO 的核心裁剪目标函数(假设裁剪阈值 $\epsilon = 0.2$,即比率最多只能在 $[0.8, 1.2]$ 之间):

$L^{CLIP} = \min(r_1(\theta) A_1, \text{clip}(r_1(\theta), 0.8, 1.2) A_1)$

  • 未裁剪的梯度:$1.2 \times 0.865 = 1.038$

  • 裁剪后的梯度:$\text{clip}(1.2, 0.8, 1.2) \times 0.865 = 1.2 \times 0.865 = 1.038$

  • 取最小值:$\min(1.038, 1.038) = 1.038$

如果 Actor 步子迈得太大,比如更新后把生成“是”的概率直接暴力推到了 0.9

此时比率 $ratio = 0.9 / 0.5 = 1.8$

  • 未裁剪:$1.8 \times 0.865 = 1.557$

  • 裁剪后:$\text{clip}(1.8, 0.8, 1.2)$ 会把 1.8 强制压平到 1.2,所以依然是 $1.2 \times 0.865 = 1.038$

  • 取最小值:$\min(1.557, 1.038) = 1.038$

你看!就算 Actor 把概率推到了 0.9,目标函数的值依然被死死卡在 1.038。这就意味着继续增大该词的概率将不再产生任何梯度奖励(梯度变为 0)。 这就是 PPO 防止模型“走火入魔”、确保训练稳定的防线!

第 5 步:Critic 价值模型同步进化 (Value Loss)

Actor 在进步,Critic(裁判)也不能闲着,它需要提高自己预测分数的准确度。

我们要计算每个状态下,模型最终实际获得的真实总回报 (Return, $R_t$):

  • $R_2 = r_2 = 0.987$

  • $R_1 = r_1 + r_2 = -0.022 + 0.987 = 0.965$

回到第 1 步看看 Critic 最初的预测:$V(s_1)$预测的是 0.5,但实际回报$R_1$竟然有 0.965;$V(s_2)$ 预测(0)和实际也不符。

于是,Critic 模型通过计算均方误差 (MSE) 来更新自己的参数:

$L^{VF} = (V_\phi(s_1) - R_1)^2 + (V_\phi(s_2) - R_2)^2$

$L^{VF} = (0.5 - 0.965)^2 + (0 - 0.987)^2$

通过最小化这个 Loss,Critic 网络的预测能力得到了提升。下一轮再遇到“地球是...”的时候,它就能给出一个更精准的基线分(比如 0.9),从而让后续的优势计算更加准确。

总结

从浅入深来看,PPO 在 RLHF 中扮演着一个戴着镣铐跳舞的优化器角色。它利用 SFT 提供初始能力,利用 RM 指引方向,利用 Critic 评估当前步的优劣,并通过 Clipping 机制和 KL 惩罚,确保大语言模型在向人类偏好对齐的过程中,不激进、不崩溃、不遗忘原本的语言表达能力。

第二章:信用分配问题

虽然PPO看似在RLHF中非常完美,但是依旧存在问题

一、 维度爆炸与“长度诅咒” (Curse of Dimensionality)

在传统的强化学习(比如让 AI 打《星际争霸》或玩雅达利游戏)中:

  • 动作空间 (Action Space) 通常只有几个到几十个(上下左右、开火)。

  • 状态 (State) 的变化相对连续可控。

但在大语言模型中,环境极度恶劣:

  • 动作空间 |V|:就是词表大小,动辄 30,000 到 100,000 个 Token。

  • 轨迹长度 T:生成的序列长度,通常在 1,000 到 8,000 个 Token 之间。

  • 可能产生的整条轨迹数量$|V|^T$。这是一个天文数字,整个宇宙的原子数量在它面前都不值一提。

在如此浩瀚的搜索空间里,模型要找到一条“完美”的轨迹本身就如同大海捞针。

二、 稀疏奖励下的“搭便车”惨剧 (The "Free Rider" Dilemma)

标准 RLHF 中的奖励模型(Reward Model, RM)通常是一个 结果奖励模型(Outcome Reward Model, ORM)。它只在模型吐出最后一个句号时,才给出一个全局的标量分数(比如 +10 分或 -10 分)。

这种极度稀疏的奖励导致了严重的信用分配失效。我们用数学直觉来看:

假设在时刻 $t$,模型生成了一个幻觉词(胡说八道)。

在 PPO 中,用来更新这个词概率的梯度方向,很大程度上取决于优势函数 $A_t$。如果只看最终奖励 $R_{final}$,简单的优势计算可以近似看作:

$A_t \approx R_{final} - V(s_t)$

如果结尾的结论是正确的,RM 给出 $R_{final} = 10$。那么对于序列中间那个“胡说八道”的 Token,它的 $A_t$ 大概率也是一个正数

后果不堪设想:

  1. 坏 Token 沾光(正向搭便车):这句“胡说八道”因为跟着好结尾混在了一条高分轨迹里,被 PPO 算法误认为是“好动作”,在梯度更新时被增加了生成的概率

  2. 好 Token 背锅(反向搭便车):如果前面推导极其严密精彩,但最后一个词不小心说错了,导致 RM 给出了全局低分(比如 -10)。那么前面所有精彩的推理步骤都会跟着遭殃,被 PPO 误伤,降低了生成概率

这就是大模型 PPO 训练极其不稳定、容易产生“幻觉”且难以收敛的罪魁祸首之一。

由于PPO实在难以训练,并且参数异常庞大,维护四个模型的同时更新两个模型,并且Critic模型还是除了名的容易崩溃,于是这个时候有人提出了DPO模型:

如果说 PPO 是一套极其复杂、需要四个大模型同时在内存里“打麻将”的精密机械;那么 DPO 就是数学家们利用一个极其优雅的代数替换,直接把这桌麻将掀了的降维打击。

第二部分:DPO的解决方法

在 PPO 的标准 RLHF 流程中,我们是严格分步走的:

  1. 用人类偏好数据(A 比 B 好)训练一个奖励模型 (Reward Model, RM)

  2. 用 PPO 算法,让大模型(Actor)去最大化这个 RM 给出的分数。

斯坦福的研究人员(DPO 的作者)提出了一个灵魂拷问:我们真的需要中间那个独立的 Reward Model 吗?

既然 RM 是用来表达“人类偏好”的,而 Actor 最终学到的“策略”(生成概率)也是为了迎合这个偏好,那么最优策略本身,其实就已经等价于一个隐式的奖励模型了

DPO 的核心思想就是:跳过奖励模型的训练,跳过复杂的强化学习(Actor-Critic)阶段,直接用人类的偏好数据(赢的回答 $y_w$ 和输的回答 $y_l$)来优化大模型自身的策略。

这是 DPO 最精彩的部分。我们需要一点点推导来看看 RM 是如何被“消去”的。我就不详细展开了,大概把思想说一下,不然又会非常冗长

在标准的 RLHF 中,我们希望最大化奖励,同时受到参考模型(Reference Model)的 KL 散度约束。数学上可以证明,这个受限优化问题的理论最优策略 $\pi^*$ 满足以下闭式解:

$\pi^*(y|x) = \frac{1}{Z(x)} \pi_{ref}(y|x) \exp\left(\frac{1}{\beta} r(x, y)\right)$

其中:

  • $r(x, y)$ 是我们原本想要拟合的奖励分数。

  • $\beta$ 是控制偏离参考模型程度的温度超参数。

  • $Z(x)$ 是配分函数(用来保证概率和为 1,这是一个很难计算的积分项)。

魔法来了! 我们对上面的公式取对数,进行代数变换,直接把奖励函数 $r(x, y)$提取出来:

$r(x, y) = \beta \log \frac{\pi^*(y|x)}{\pi_{ref}(y|x)} + \beta \log Z(x)$

你看!奖励分数 $r(x,y)$,现在完全可以由“当前策略 $\pi$”和“参考策略$\pi_{ref}$”的对数概率差来表示了! 至于那个棘手的 $Z(x)$,在下一步会被完美抵消掉。

在训练 RM 时,我们通常使用 Bradley-Terry (BT) 模型来表示偏好概率,即人类觉得 $y_w$(赢)比 $y_l$(输)好的概率为:

$P(y_w \succ y_l | x) = \sigma(r(x, y_w) - r(x, y_l))$

(其中 $\sigma$ 是 Sigmoid 函数)。

现在,我们把第二层里推导出的 $r(x, y)$公式,分别代入 $r(x, y_w)$$r(x, y_l)$。 相减的时候,那个无法计算的 $\beta \log Z(x)$ 直接被抵消了

最终,我们得到了 DPO 极其简洁的损失函数:

$L_{DPO}(\pi_\theta; \pi_{ref}) = - \mathbb{E}_{(x, y_w, y_l)} \left[ \log \sigma \left( \beta \log \frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)} \right) \right]$

看似很复杂,实际思想很简单。

括号里的这部分 $\beta \log \frac{\pi_\theta(y|x)}{\pi_{ref}(y|x)}$ 就是模型自己定义的“隐式奖励”。 DPO 的本质就是:增加好答案($y_w$)相对于参考模型的概率,同时降低坏答案($y_l$)相对于参考模型的概率。 这个概率差拉得越大,Sigmoid 算出来的值越接近 1,Loss 就越小。

回到之前极其敏锐的那个痛点:动作空间爆炸与搭便车。DPO 解决了吗?

  1. 彻底消灭了 Actor-Critic 的高方差: PPO 里的 Critic 网络极难训练,稍微预估不准就会导致策略崩溃。DPO 完全不需要 Critic,也不需要估计优势函数(Advantage),它直接在监督学习的框架下做梯度下降,极其稳定。

  2. 没有在线采样的麻烦: PPO 必须让大模型在训练时不断地生成(Sample)新文本,然后打分。生成文本是一个自回归过程,速度极慢。DPO 是离线学习的,它直接拿着之前生成好的 $(y_w, y_l)$ 数据对,做前向传播(Forward Pass)算概率即可,训练速度和 SFT 一样快

  3. 关于“搭便车”问题: 坦白说,DPO 并没有从根本上解决序列级的稀疏奖励问题。因为它的 Loss 依然是建立在整个序列 $y_w$$y_l$ 的联合概率上的。如果 $y_w$ 中间混入了一句废话,它依然会跟着整句话的隐式高分被“拉抬”概率。这是目前序列级 DPO 的局限性所在。

关于第3点:在数学推理、代码编写、复杂逻辑链条的训练中,DPO 的这个缺陷是致命的毒药。 只要你的训练数据里包含了哪怕一丁点的“过程瑕疵但结果正确”的样本,DPO 就会不断地鼓励模型去产生中间幻觉。这也就是为什么很多模型在经过大量 DPO 训练后,虽然语气变得特别讨喜(所谓的“Alignment Tax”),但深度的数理逻辑推理能力反而会下降。

在现在的工业界(如 Llama 3、Qwen 等大模型的训练中),DPO 已经成为了对齐阶段的绝对标配,因为它太轻量、太稳定了。只需要把 SFT 模型复制一份作为冻结的 $\pi_{ref}$,然后直接用偏好数据集去微调 $\pi_\theta$ 即可。原本需要 4 个模型的显存,现在只需要 2 个。

但是,DPO 并非完美,PPO 也没有死:

DPO 最大的问题是 OOD(Out-of-Distribution,分布偏移)。DPO 是拿死数据训练的,如果给定的偏好数据里的文本风格,超出了当前模型自己能生成的分布范围,模型就会被带偏,出现严重的幻觉或语言能力下降。

而 PPO 是在线采样的(Online RL),它是模型自己生成文本自己试错,因此永远在自己的分布内优化,天生对分布偏移免疫。

因此,如今最前沿的玩法是:先用 DPO 快速稳定地打底,建立一个很好的基础对齐能力;然后在最后阶段,用 PPO 配合更高质量的 Reward Model 进行在线探索,拔高上限。

第三部分:最终答案-过程奖励模型

既然大模型在长文本生成中,容易用后半段的正确掩盖前半段的胡说八道(Sequence-level 的原罪),那么最直接、最暴力的解法是什么?

不给总分了,我们当场阅卷!

这就是目前被公认为解决长逻辑推理(如数学问题、复杂代码)的最优解:过程奖励模型 (Process Reward Model, PRM),或者更极端的 Token-level 奖励机制

相比于传统结果奖励模型 (ORM) 只能在句子末尾给出一个干瘪的 $R_{final}$,PRM 改变了游戏规则:

它强行把模型输出的长轨迹拆分成一个个独立的步骤(Step)。例如一道数学题的解答过程被拆分为 $s_1, s_2, s_3, \dots, s_n$

PRM 会对每一步进行独立打分:

  • Step 1:提取公式正确(+1)

  • Step 2:代入数据正确(+1)

  • Step 3:突然开始胡说八道/计算错误(-1,当场斩杀!)

数学上,整条轨迹的回报变成了每一步奖励的累加:

$R_{process} = \sum_{i=1}^{n} r(s_i)$

一旦引入 PRM,再配合上类似 AlphaGo 的 MCTS (蒙特卡洛树搜索),大模型就不再是一条道走到黑了。它在每生成一个 Step 后,都会停下来问 PRM:“老哥,我这步走得对吗?”如果对,继续往下搜;如果错,立刻剪枝(剪掉错误分支),退回上一步重新生成。

理论上,这简直完美无缺。它精准地击杀了“信用分配”的幽灵,让“搭便车”成为不可能。

理论确实很美好,但在真实世界的机房里,这是一场令人窒息的工程与财务噩梦。对于手里只有几张甚至几十张显卡的独立研究者或初创团队来说,PRM 根本不是什么指路明灯,而是巨头们用金钱和算力筑起的护城河。

训练一个准确的 PRM,需要海量的步级(Step-level)偏好数据。 你可以花几毛钱让普通人判断“哪篇小红书文案写得好”(ORM 标注);但你要标注 PRM 数据,你必须雇佣 985 大学的理工科硕士乃至博士,让他们坐在电脑前,死死盯着大模型生成的几十步数学推导,一行一行地检查符号和逻辑,并在出错的那一行精准地打上负面标签。

  • OpenAI 发布 PRM800K 数据集时,背后是极其庞大且昂贵的专家外包团队。

  • 痛点:巨头烧得起这几千万美元的标注费,我们烧不起。没有数据,再美的算法也是无米之炊。

有学者说:“没钱请人,我们用 AI 标注 AI(RLAIF)!让 GPT-4 当裁判给开源模型的 Step 打分!”

听起来很聪明,但算一笔账:

假设你要生成 10 万条训练数据,每条数据包含 5 个候选回答,每个回答有 20 个 Step。为了构建 PRM 数据集,你需要让 GPT-4 进行 $100,000 \times 5 \times 20 = 10,000,000$(一千万)次 Step 级别的评估。

  • 痛点:调用目前顶级闭源大模型 API 完成如此细粒度的评估,产生的账单足以让一个小实验室直接破产。

退一万步讲,假设你真的搞到了数据,训练出了一个 PRM。当你试图在强化学习(RL)阶段把它用起来时,真正的物理学限制来了。 如果使用 PRM 配合树搜索(MCTS)来生成轨迹:

  • 传统的自回归生成是线性的,复杂度为 $O(N)$

  • 树搜索由于在每一个 Step 都要采样多个分支(Branching factor, b),搜索深度为 d 时,计算量呈现 $O(b^d)$ 的指数级爆炸

  • 在生成过程中,Actor 模型每吐出一个 Step,就必须暂停。显存里的 KV-Cache 被反复打断、复制、重排。你需要立刻唤醒 PRM 进行前向传播(Forward Pass)打分,然后决定保留哪个分支。

  • 痛点:这种极度频繁的上下文切换(Context Switch)和显存碎片化,会让你的训练吞吐量(Throughput)直接跌入谷底。原本一天能跑完的训练,现在可能需要一个月;原本 8 张卡能塞下的模型,现在因为庞大的搜索树状态,直接 OOM(显存溢出)。

剖析到这里,残酷的现实已经摆在桌面上: PRM 和细粒度强化学习,本质上是一种“暴力美学”,是用极度奢靡的算力和财力去强行抹平信用分配的缺陷。 巨头们(如 OpenAI、Google)可以通过定制的算力集群、极其复杂的底层 CUDA 算子优化(比如专门针对树搜索的 KV-Cache 管理机制),硬生生把这条路走通(传闻中的 Q* 或 o1 模型就是这条路径的登顶之作)。

但这套机制,从一开始就把算力受限的“平民玩家”排斥在外了。

在这个令人绝望的算力鸿沟面前,开源社区和学术界的“穷人”们并没有坐以待毙。 既然走不通 PRM 的阳关道,开源界就必须在 DPO 的基础上“魔改”,用更廉价的数学技巧去逼近 PRM 的效果。

第四部分:算力优化的智慧

既然传统的 DPO 依然有“搭便车”和严重吃显存(需要同时加载目标模型和参考模型)的问题,学术界用极其优雅的数学改写了游戏规则。

算法优化

1. SimPO (Simple Preference Optimization):干掉参考模型,终结“字数水军”

在标准 DPO 中,模型经常会学会一种作弊手段——只要我废话写得足够多,总概率加起来就容易显得分高(Length Bias)。这就导致 DPO 训练出来的模型特别啰嗦。而且 DPO 必须挂载一个冻结的 Reference Model,显存开销直接翻倍。

SimPO :

它在数学上做了一个极其暴力的截断:我连 Reference Model 都不要了!

SimPO 直接拿大模型当前策略生成的对数概率$\log \pi_\theta$,除以整句话的 Token 长度(Length Normalization),以此作为隐式奖励:

$r_{SimPO} = \frac{\beta}{|y|} \sum_{i=1}^{|y|} \log \pi_\theta (a_i | s_{i-1})$

并在赢输的奖励差之间加入了一个目标间距(Margin)。

  • 显存减半:不需要参考模型,单卡就能跑原本两张卡才能跑的微调!

  • 精准打击搭便车:因为除了长度,废话再多不仅不会增加总分,反而会稀释那些真正有价值的 Token 的平均分。它逼着模型“字字珠玑”,变相缓解了长文本的信用分配痛点。

2. KTO (Kahneman-Tversky Optimization):连“对比数据”都不需要了

训练 DPO 最大的痛点是数据收集:你必须让标注员对比 A 和 B 哪篇更好($y_w \succ y_l$)。但让人类去做复杂的排位对比,成本极高且容易产生分歧。

大模型对同一个问题(比如“如何炒土豆丝”)写了两份回答(A和B)。 标注员必须仔细阅读 A 和 B,然后艰难地决定:A 和 B 到底谁更好?

痛点来了:

  1. 太难选了:如果 A 逻辑好但啰嗦,B 简练但稍微有点语病,选谁?标注员们经常自己打起来,数据极其“吵闹(Noisy)”。

  2. 太贵了:这种“拉踩式”的对比阅读极其耗时,一条高质量的 DPO 偏好数据,成本可能高达几美金甚至几十美金。

  3. 浪费数据:很多时候你手里只有一篇绝佳的好文章,或者一篇极其糟糕的烂文章,但因为凑不齐一对(没有对比项),DPO 算法直接就拒收这些数据。

KTO 的想法:

KTO 的作者们提出了一个极其接地气的灵魂拷问:人类在真实世界里,真的是通过“成对比大小”来学习和表达偏好的吗?

并不是! 你看 B 站视频、刷小红书,你不需要把两个视频放在一起对比才能判断好坏。你觉得好,就点赞(👍);觉得烂,就踩(👎)

这种只有好坏标签、没有对比对象的数据,叫“非成对数据(Unpaired Data)”。 KTO 的核心就是:直接用这种极其廉价的“点赞/踩”数据,训练出比 DPO 更强的大模!

既然只有“点赞”和“踩”,怎么算 Loss(损失函数)呢?这里 KTO 借用了一套获得了诺贝尔经济学奖的理论:丹尼尔·卡尼曼(Daniel Kahneman)和阿莫斯·特沃斯基(Amos Tversky)提出的前景理论(Prospect Theory)

前景理论讲了人类心理的一个极其重要的非理性特征:损失厌恶(Loss Aversion)

  • 得到 100 块钱,你会开心(产生正向效用),但开心程度会随着金额增加而边际递减(赚 1000 块并没有比赚 100 块开心 10 倍)。

  • 弄丢 100 块钱,你会极其痛苦!而且这种痛苦的程度,远远大于得到 100 块钱的快乐。人类对“失去/坏事”的敏感度,是“得到/好事”的 2 到 2.5 倍。

这就是 KTO 算法的底色:不对称的赏罚机制

在 KTO 中,模型每生成一句话,我们依然可以算出一个“隐式奖励”(当前模型生成这句话的概率,相对于基础模型生成这句话的概率,是大还是小)。我们把这个偏离度叫做 r。

然后,KTO 把诺贝尔奖的“前景理论”变成了大模型的 Loss 函数:

1. 当输入的数据是一个“(Good)”的回答时:

  • 算法告诉模型:“这句话很好,你要增加生成它的概率(提高 r)。”

  • 但是(边际递减法则),一旦这个句子的概率已经被拉得足够高了,哪怕你再拼命拉高它,算法给你的“奖励(效用)”也会变得极其微小。这就防止了模型为了讨好你,疯狂重复同一句话(防止过度拟合)。

2. 当输入的数据是一个“(Bad)”的回答时:

  • 算法告诉模型:“这句话很烂,你要降低生成它的概率。”

  • 此时触发“损失厌恶”KTO 会施加一个极其陡峭、极其严厉的惩罚曲线。如果模型还敢生成这种带“踩”的特征,Loss 就会疯狂飙升。

简单来说: KTO 对待“好数据”像是一个温和的老师(鼓励为主,适可而止);对待“坏数据”则像一个暴君(斩尽杀绝,绝不姑息)。

方法优化

既然请不起人类专家来打分,也租不起极其昂贵的 GPT-4 API 做 RLAIF 裁判,那我们为什么不找一个免费、绝对客观、绝不产生幻觉的裁判

1. 代码领域的“上帝”:编译器 (Compiler)

在大模型写代码的训练中,编译器就是最完美的 Reward Model

  • 模型生成了一段长达 500 行的代码。

  • 把它扔进 Python 解释器或者 GCC 编译器,跑一下单元测试 (Unit Tests)。

  • Reward 机制极其冷酷且精准:编译失败,Reward = -1;编译成功但测试用例报错,Reward = 0;全部 AC(Accepted),Reward = +1。 在这个过程中,你不需要训练任何神经网络作为裁判,不仅零显存开销,而且评估速度极快、准确率 100%。

2. 数学领域的“真理”:计算机代数系统 (CAS)

在解数学题时,无论模型前面的“思维链 (CoT)”怎么推导,最终都会得出一个答案(比如 \boxed{x=5})。 我们可以写一个简单的规则,提取出这个答案,扔给 SymPy(一个强大的数学符号计算库)去和标准答案对比。

  • 只要最终结果等价,无论模型用了什么千奇百怪的解法,直接给予正向 Reward。

3. 拒绝采样微调 (Rejection Sampling Fine-Tuning) 与 PPO 的暴力结合

有了免费的“规则裁判”,穷人的玩法就变成了:

  1. 给定一道数学题,让基础大模型利用一定的温度(Temperature > 0)疯狂采样生成 1000 条不同的解题路径。

  2. 全部扔给规则校验器(编译器/代数系统)。990 条错了,没关系,直接扔掉。

  3. 把剩下的 10 条正确的轨迹挑出来。

  4. 直接拿这 10 条经过严苛物理法则验证的高质量数据,去跑 SFT,或者作为正样本去跑 PPO!

这种方法被称为 RBR (Rule-Based Reward)。它巧妙地避开了 PRM 昂贵的训练和标注成本。只要环境(逻辑、数学、代码)自带验证属性,我们可以通过疯狂堆叠前向生成的数量(Inference Scaling),用极其低廉的代价筛选出高质量轨迹,完成对模型的降维强化。

最终总结

  1. 起点:我们认识了 PPO ,了解了它如何通过 Actor-Critic 架构让模型变得听话。

  2. 核心:我们剖析了 PPO 的数学灵魂——优势函数(Advantage)与裁剪机制(Clipping),看清了它如何防止模型在强化学习中崩溃。

  3. 痛点:我们直面了序列长文本的“长度诅咒”,揪出了隐藏在深处的“信用分配”与“搭便车”幽灵。

  4. 破局:我们见证了 DPO 掀翻牌桌的数学技巧,以及巨头们用金钱和算力堆砌的 PRM 过程奖励壁垒。

  5. 反击:最后,我们站在这里,看到了开源界如何用 SimPO、KTO 以及规则驱动的验证机制,在算力受限的绝境中杀出一条血路。

大语言模型的对齐技术,本质上就是一场关于人类意图、数学优化与算力资源的残酷三角博弈

其实:

当前的基座模型其实已经足够聪明。它们在预训练阶段就吞噬了人类几乎所有的知识。强化学习(RLHF)及其变体,本质上并不是在教大模型‘学习新知识’,而是像一个极其高明的采访者,把模型脑子里本来就有的东西,以人类最喜欢的格式、最严密的逻辑‘引诱’出来。

因此,在很多场景下,我们并不总是需要盲目追求更大参数的模型。参数少不等于性能弱!一个参数量适中、但经过极高标准优化(如 KTO、PRM 或极致的规则驱动 RL)的模型,完全可以越级击败那些空有庞大参数却缺乏对齐的巨兽。未来的竞争,不在于谁的脑容量更大,而在于谁能用最精妙的算法,彻底榨干基座模型的每一滴潜力。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐