引言

在快速发展的大语言模型 (LLM) 领域,越大并不总是越好——尤其是当涉及到模型回复的长度时。如果你曾与现代聊天机器人互动过,你可能注意到了一个独特的习惯: 它们喜欢喋喋不休。问一个简单的问题,你往往会得到长篇大论。

这种现象被称为冗长 (verbosity) 。 虽然我们希望模型是详尽的,但我们不希望它们混淆“长”与“正确”。

目前,将模型与人类偏好对齐的行业标准是直接偏好优化 (Direct Preference Optimization, DPO) 。 它优雅、稳定,且通常有效。然而,DPO 有一个隐蔽的缺陷: 它受困于一种固有的算法偏差,这种偏差鼓励模型通过生成更长的回复来“作弊”,以最大化其奖励分数。

在这篇文章中,我们将深入探讨一篇引人入胜的论文,题为 “Eliminating Biased Length Reliance of Direct Preference Optimization via Down-Sampled KL Divergence” (通过下采样 KL 散度消除直接偏好优化的有偏长度依赖) 。作者准确指出了 DPO 为何偏好冗长,并提出了一种巧妙、轻量级的解决方案,称为 SamPO (Sampled Preference Optimization,采样偏好优化) 来修复这一问题。

背景: 通往 DPO 之路

要理解解决方案,我们首先需要理解问题所在。我们如何教 LLM 什么是人类喜欢的?

从 RLHF 到 DPO

最初,我们使用基于人类反馈的强化学习 (RLHF) 。 这是一个复杂的多阶段过程:

  1. 训练一个奖励模型 (Reward Model) 来模仿人类的偏好。
  2. 使用该奖励模型通过强化学习 (如 PPO) 来训练 LLM。

虽然有效,但 RLHF 计算成本高昂且不稳定。于是 DPO (直接偏好优化) 出现了。DPO 通过完全移除独立的奖励模型简化了这场游戏。取而代之的是,它使用一种数学技巧,直接基于偏好数据 (成对的“选中”和“拒绝”回复) 来优化模型。

隐式奖励

DPO 不会给模型一个像“10 分满分得 8 分”那样的分数。相反,它计算一个隐式奖励 。 这个奖励基于模型生成“选中”回复相对于参考模型 (通常是原始基础模型) 的概率。

DPO 的核心依赖于 Bradley-Terry 模型 , 该模型估计一个回复比另一个回复更好的概率。损失函数如下所示:

基于期望值的 DPO 损失函数。

在这里,\(\Delta\) 代表选中回复 (\(y_w\)) 和拒绝回复 (\(y_l\)) 之间“隐式奖励”的差值。

Delta 的公式,代表隐式奖励的差异。

这个差距 (\(\Delta\)) 越大,模型就越能学会偏好选中的回复。

核心问题: 算法长度偏差

这正是该论文做出关键贡献的地方。之前的研究假设模型之所以啰嗦,是因为训练数据有偏差 (即人类标注员单纯喜欢更长的答案) 。虽然这也是事实,但作者认为 DPO 本身在数学上就偏向于长度。

分解奖励

为了明白其中的原因,我们需要看看那个隐式奖励究竟是如何计算的。这个奖励本质上是KL 散度 (衡量概率分布差异的一种指标) 在整个文本序列上的总和。

如果我们将方程分解到 Token (词元) 级别,它看起来是这样的:

显示 KL 散度在 Token 级别分解的方程。

注意求和符号 (\(\Sigma\)) 。奖励是从 \(t=1\) 到 \(T\) 的每个 Token 的对数概率之和。

这就是问题所在: 如果“选中”的回复 (\(T_w\)) 明显比“拒绝”的回复 (\(T_l\)) 长,那么选中回复的求和项就会更多。它仅仅因为拥有更多的 Token 就累积了更多的值。

  • 高估 (Overestimation) : 如果选中回复更长,DPO 会高估其质量,因为奖励总和因长度而膨胀。
  • 低估 (Underestimation) : 如果选中回复更短 (即使它简洁且正确) ,DPO 会低估其奖励。

这激励模型生成更长的序列来利用奖励函数的漏洞。

可视化偏差

作者在下图中精彩地展示了这一点。

图 2: 成对回复的不平等迫使 DPO 高估或低估实际奖励。

  • 顶部 (a): 看红线和紫线。这些是累积奖励。因为“选中 (Chosen) ”序列更长,红线不断攀升,仅仅因为存在的时间更长就制造了巨大的差距 (奖励) 。
  • 左下 (b): 如果你尝试通过平均化来归一化 (DPO-SANorm) ,你会失去 Token 级别的方差细微差别。
  • 右下 (c): 这是提出的解决方案 (SamPO) ,我们将在接下来讨论。注意奖励的累积是如何变得更加平衡的。

解决方案: SamPO (下采样 DPO)

为了消除这种长度依赖性,作者引入了 SamPO 。 这个想法很直观: 为了公平地比较两名赛跑者,他们必须跑相同的距离。

如果选中的回复长 100 个 Token,而拒绝的回复长 50 个 Token,我们不应该将 100 个 Token 的总和与 50 个 Token 的总和进行比较。

SamPO 如何工作

SamPO 通过对较长的序列进行下采样 (down-sampling) 来修改损失计算。

  1. 确定选中回复的长度 (\(T_w\)) 和拒绝回复的长度 (\(T_l\)) 。
  2. 找到最小长度: \(T_m = \min(T_w, T_l)\)。
  3. 两个序列中随机采样 \(T_m\) 个 Token (或者只对较长的那个进行采样以匹配较短的) 。
  4. 仅使用这些采样后的 Token 计算隐式奖励。

新公式如下所示:

SamPO 方程显示求和至 Tm,其中 Tm 是最小长度。

通过确保求和中的项数相同 (\(T_m\)) ,“长度”变量从方程中被移除了。模型不再能简单地通过增加 Token 来增加奖励;它必须提高其生成 Token 的质量 (概率) 。

Top-K 与随机采样

你可能会问: 为什么要选择随机 Token?为什么不选择概率最高的“最佳” Token (Top-K) ?

作者实际上测试了这一点。有趣的是,随机采样效果更好。如下图所示,Top-K 采样 (图 6) 造成的人为差距可能过于激进,而随机采样在修正长度的同时保留了文本的自然分布。

图 6: 比较随机 K 与 Top K 下采样。

实验与结果

SamPO 真的有效吗?作者在多个模型 (Pythia, Llama3, Tulu2) 和基准测试 (GSM8K, AlpacaEval 等) 上进行了测试。

1. 证明偏差的存在

首先,他们进行了一个“合理性检查”实验。他们将 UltraFeedback 数据集分成两个子集:

  • Long (长) : 选中回复较长的样本对。
  • Short (短) : 选中回复较短的样本对。

他们在这些子集上训练了一个标准的 DPO 模型。

图 3: 使用不同子集微调时隐式奖励的趋势。

  • “Short”子集 (蓝线) : 当 DPO 在获胜者更短的数据上训练时,奖励崩塌了 (趋势向下) 。DPO 难以学会“短即是好”,因为它的数学机制在与之对抗。
  • SamPO 的修复 (表 1) : SamPO 稳定了这一点。即使在“Short”数据集上,SamPO 也取得了不错的平均基准分数 (49.73) ,而标准 DPO 则崩塌了 (40.59) 。

2. 性能比较

作者将 SamPO 与 DPO 以及其他近期方法如 SimPO (使用长度归一化) 和 TDPO 进行了比较。

结果在图 1 中可视化,显示了一个明显的趋势:

图 1: 下采样策略有助于减轻长度依赖并改进 DPO。

SamPO 在各个基准测试中始终优于标准 DPO。例如:

  • GSM8K (数学) : SamPO 达到 77.81%,而 DPO 为 75.59%。
  • AlpacaEval 2 (通用聊天) : SamPO 达到了 35.14% 的胜率,而 DPO 为 23.2% (使用长度控制评估) 。

3. 冗长性分析

这是最关键的结果。模型停止啰嗦了吗?

下图追踪了在 3 个训练周期 (Epoch) 内,平均输出长度 (Y 轴) 与性能分数 (X 轴) 的关系。

图 4: 3 个周期内策略模型回复长度与测试性能的关系。

  • 粉色三角形 (DPO) : 注意那条急剧向上的轨迹。随着训练的进行,模型变得稍微好了一点,但变得长得多。它正在学会啰嗦。
  • 蓝色方块 (Iterative SamPO) : 曲线向右移动 (性能更好) ,但在 Y 轴上保持相对平坦。模型在没有膨胀长度的情况下提高了质量。

4. 综合基准测试

在使用 Llama3-8B 模型进行的详细比较中,SamPO 展示了它可以在简洁与信息量之间保持微妙的平衡。

表 2: 微调两个 LLM 的定性结果。

观察表 2 , 我们可以看到 SimPO (另一种控制长度的方法) 往往会过度减少长度。

  • SimPO: 极大地减少了长度 (Length/Token ~375) ,但有时会损害像 GSM8K 这样的推理任务的性能 (72.93) 。
  • SamPO: 保持了健康的长度 (Length/Token ~375-377) ,但在 GSM8K 上取得了最高分 (77.81) 。

这表明 SamPO 不仅仅是“削减”文本;它在鼓励模型变得更高效。

5. 其他数据集 (HH-RLHF 和 TL;DR)

作者还在 HH-RLHF (有用且无害) 和 TL;DR (摘要) 数据集上进行了测试。

表 3: HH-RLHF 和 TL;DR 上的胜率和输出长度。

TL;DR (摘要) 任务上,简洁是关键。

  • DPO 的胜率为 60.98%。
  • Iterative SamPO 跃升至 73.58%

这证明了对于需要简洁回答的任务,消除长度偏差是一个巨大的优势。

结论

LLM 中的“冗长”问题不仅仅是训练数据的怪癖;它是我们在 DPO 中计算奖励方式的数学产物。通过对不等长的对数概率进行求和,我们无意中教会了模型“多即是好”。

SamPO 提供了一个优雅的代码级修复方案。通过在损失计算期间将 Token 序列下采样到相同长度,它迫使模型在质量而非数量上进行竞争。

其意义重大:

  1. 效率: 更短、正确的答案在推理过程中节省了计算成本。
  2. 用户体验: 用户得到的是直接的回答,而不是啰嗦的文章。
  3. 对齐: 我们可以将模型与真正的人类偏好对齐,而不仅仅是像长度这样的表面特征。

随着我们迈向更自主、更高效的 AI 智能体,像 SamPO 这样的方法对于确保我们的模型不仅说得更多,而且说得更好至关重要。