高新 | AI平台开发工程师

AI平台开发工程师,专注于AI平台工程和Kubernetes云原生技术。拥有AI平台开发、GPU资源优化和AI服务部署经验

Kl散度与dpo算法


KL散度

KL散度公式的定义

Kullback-Leibler (KL) 散度 是信息论和机器学习中的一个重要概念,用于衡量两个概率分布之间的差异。其数学公式为:

$$ KL(P||Q) = \sum_{x \in X} P(x) \log\left(\frac{P(x)}{Q(x)}\right) $$

这个公式表示分布 $ P $ 相对于分布 $ Q $ 的散度。它并不是一个真正的距离,因为它不对称,即 $ KL(P||Q) \neq KL(Q||P) $。


公式中各个参数的含义

公式中的参数:

  • $ KL(P||Q) $:这是分布 $ P $ 和 $ Q $ 之间的 KL 散度。它量化了用 $ Q $ 近似 $ P $ 时损失的信息量。
  • $ P(x) $:事件 $ x $ 在分布 $ P $ 下的概率,通常被视为“真实”或目标分布。
  • $ Q(x) $:事件 $ x $ 在分布 $ Q $ 下的概率,通常是近似分布或参考分布。
  • $ \sum_{x \in X} $:对样本空间 $ X $ 中所有可能的事件 $ x $ 进行求和。如果是连续分布,则用积分代替求和。
  • $ \log\left(\frac{P(x)}{Q(x)}\right) $:这是 $ P(x) $ 和 $ Q(x) $ 在事件 $ x $ 上的概率比的对数,衡量两者的相对差异。这个对数项由 $ P(x) $ 加权,意味着 $ P $ 下概率较高的事件对散度的贡献更大。

公式的意义

KL 散度有几个关键特性,解释了它的意义:

  1. 非负性:$ KL(P||Q) \geq 0 $,并且只有当 $ P = Q $ 时才等于 0。这意味着散度总是正值或零,除非两个分布完全相同。
  2. 不对称性:$ KL(P||Q) $ 和 $ KL(Q||P) $ 的值通常不同。它衡量的是 $ Q $ 偏离 $ P $ 的程度,而不是双向距离。
  3. 信息损失的度量:KL 散度可以理解为用基于 $ Q $ 优化的编码方式去编码来自 $ P $ 的事件时,平均需要的额外信息量(如果用自然对数,单位是奈特;如果用以 2 为底的对数,单位是比特)。

简单来说,KL 散度告诉我们两个分布有多大的不同。


用具体例子解释公式

通过一个具体的例子来计算 KL 散度,假设有两个离散概率分布 $ P $ 和 $ Q $,定义在二元样本空间 $ X = {0, 1} $ 上:

  • 分布 $ P $
    • $ P(x=0) = 0.2 $
    • $ P(x=1) = 0.8 $
  • 分布 $ Q $
    • $ Q(x=0) = 0.8 $
    • $ Q(x=1) = 0.2 $

现在计算 $ KL(P||Q) $:

$$ KL(P||Q) = \sum_{x \in {0,1}} P(x) \log\left(\frac{P(x)}{Q(x)}\right) = P(0) \log\left(\frac{P(0)}{Q(0)}\right) + P(1) \log\left(\frac{P(1)}{Q(1)}\right) $$

代入数值:

$$ KL(P||Q) = 0.2 \log\left(\frac{0.2}{0.8}\right) + 0.8 \log\left(\frac{0.8}{0.2}\right) $$

第一步:计算概率比

  • 对于 $ x=0 $:$\frac{0.2}{0.8} = 0.25$
  • 对于 $ x=1 $:$\frac{0.8}{0.2} = 4$

第二步:计算对数(使用自然对数)

  • $\log(0.25) = \log\left(\frac{1}{4}\right) = -\log(4) \approx -1.386$
  • $\log(4) \approx 1.386$

第三步:代入公式

$$ KL(P||Q) = 0.2 \times (-1.386) + 0.8 \times 1.386 $$

$$ = -0.2772 + 1.1088 $$

$$ \approx 0.8316 $$

结果分析

计算结果 $ KL(P||Q) \approx 0.8316 $,是一个正值。这表明 $ P $ 和 $ Q $ 是不同的分布。如果 $ P = Q $,则 $ KL(P||Q) = 0 $。这个正值验证了 KL 散度的非负性,也说明 $ P $ 和 $ Q $ 在概率分配上有显著差异。


与 DPO 算法核心的联系

Direct Preference Optimization (DPO) 是一种用于强化学习和语言模型微调的算法,旨在使模型输出更符合人类偏好(例如基于成对比较数据)。KL 散度在 DPO 中扮演了核心角色,具体体现在以下方面:

  1. 正则化项

    • 在 DPO 中,优化目标通常包括一个 KL 散度项,例如 $ KL(\pi_{\theta} || \pi_{\text{ref}}) $,其中:
      • $ \pi_{\theta} $ 是待优化的模型或策略。
      • $ \pi_{\text{ref}} $ 是参考模型或策略(通常是优化前的原始模型)。
    • 这个 KL 散度项衡量优化后的模型输出分布与参考模型输出分布之间的差异。
  2. 防止过大偏差

    • DPO 的目标是调整模型以匹配偏好数据,但如果调整过于激进,可能会导致模型不稳定或偏离原始行为。KL 散度作为惩罚项,确保优化后的模型不会偏离参考模型太远,从而保持训练的稳定性。
  3. 数学形式

    • DPO 的损失函数通常包含两部分:偏好对的奖励项和 KL 散度的正则化项。例如: $$ L = - \text{reward}(\text{preference}) + \beta \cdot KL(\pi_{\theta} || \pi_{\text{ref}}) $$ 其中 $ \beta $ 是调节 KL 散度影响的超参数。KL 散度在这里确保模型在追求偏好改进时仍然受控。
  4. 实际意义

    • 在语言模型中,$ \pi_{\theta} $ 和 $ \pi_{\text{ref}} $ 可以看作对某些输入生成不同输出的概率分布。KL 散度量化了这些分布的差异。例如,如果参考模型倾向于生成保守的回答,而优化后的模型倾向于更冒险的回答,KL 散度会限制这种变化的幅度。

通过这种方式,KL 散度帮助 DPO 在提升模型性能(符合人类偏好)和维持稳定性之间找到平衡。


总结

  • 公式:$ KL(P||Q) = \sum_{x \in X} P(x) \log\left(\frac{P(x)}{Q(x)}\right) $ 衡量 $ P $ 和 $ Q $ 之间的差异。
  • 参数含义:$ P(x) $ 和 $ Q(x) $ 是事件 $ x $ 在两个分布下的概率,$\log\left(\frac{P(x)}{Q(x)}\right)$ 计算概率的相对差异。
  • 意义:KL 散度是非负的、不对称的,反映了用 $ Q $ 近似 $ P $ 的信息损失。
  • 例子:对于 $ P = [0.2, 0.8] $ 和 $ Q = [0.8, 0.2] $,$ KL(P||Q) \approx 0.8316 $,表明两分布不同。
  • DPO 核心:KL 散度作为正则化项,限制优化模型偏离参考模型的程度,确保微调过程稳定并符合偏好。

DPO算法

1. Bradley-Terry 模型的背景和公式

Bradley-Terry 模型 是一种经典的统计模型,用于分析成对比较数据,预测某个选项(或个体)优于另一个选项的概率。它在机器学习中常用于偏好学习,比如在 DPO 算法中用来建模人类偏好。

Bradley-Terry 模型的核心概率公式:

$$ P(i > j) = \frac{\alpha_i}{\alpha_i + \alpha_j} $$

参数含义:

  • $ P(i > j) $:表示选项 $ i $ 优于选项 $ j $ 的概率。
  • $ \alpha_i $:表示选项 $ i $ 的“实力”或“得分”,是一个正值,反映了选项 $ i $ 的优越性。
  • $ \alpha_j $:表示选项 $ j $ 的“实力”或“得分”,同样是一个正值。
  • $ \alpha_i + \alpha_j $:两个选项的实力总和,用于归一化。

这个公式告诉我们:如果 $ \alpha_i $ 比 $ \alpha_j $ 大很多,那么 $ P(i > j) $ 就会接近 1,意味着 $ i $ 几乎总是优于 $ j $。


2. 例子

比赛排名

假设我们有三支足球队:A、B、C:

  • A 队对 B 队:A 赢了 8 次,B 赢了 4 次。
  • A 队对 C 队:A 赢了 3 次,C 赢了 5 次。

用 Bradley-Terry 模型来估计每支队伍的“实力” $ \alpha_A $、$ \alpha_B $、$ \alpha_C $,然后预测它们之间的胜率。

步骤 1:理解 $ P(i > j) $

公式 $ P(i > j) = \frac{\alpha_i}{\alpha_i + \alpha_j} $ 的意思是:A 队打败 B 队的概率取决于 A 和 B 的实力比例。

假设通过计算(后面会解释如何计算),我们得到了:

  • $ \alpha_A = 2 $
  • $ \alpha_B = 1 $
  • $ \alpha_C = 3 $

那么:

  • A 队打败 B 队的概率: $$ P(A > B) = \frac{\alpha_A}{\alpha_A + \alpha_B} = \frac{2}{2 + 1} = \frac{2}{3} \approx 0.667 $$ 这意味着 A 队有 66.7% 的概率赢 B 队,和表格中 A 赢 8 次、B 赢 4 次(8/12 ≈ 0.667)的比例一致。

  • A 队打败 C 队的概率: $$ P(A > C) = \frac{\alpha_A}{\alpha_A + \alpha_C} = \frac{2}{2 + 3} = \frac{2}{5} = 0.4 $$ 这意味着 A 队有 40% 的概率赢 C 队,和表格中 A 赢 3 次、C 赢 5 次(3/8 = 0.375,接近 0.4)的比例也差不多。

步骤 2:如何计算 $ \alpha $

图片中给出了对数似然函数和损失函数,用于估计 $ \alpha $。我们先看对数似然:

$$ \ln L = 8 \ln\left(\frac{\alpha_A}{\alpha_A + \alpha_B}\right) + 4 \ln\left(\frac{\alpha_B}{\alpha_A + \alpha_B}\right) + 3 \ln\left(\frac{\alpha_A}{\alpha_A + \alpha_C}\right) + 5 \ln\left(\frac{\alpha_C}{\alpha_A + \alpha_C}\right) $$

  • $ 8 \ln\left(\frac{\alpha_A}{\alpha_A + \alpha_B}\right) $:A 赢 B 8 次,每赢一次贡献一个 $ \ln\left(\frac{\alpha_A}{\alpha_A + \alpha_B}\right) $。
  • $ 4 \ln\left(\frac{\alpha_B}{\alpha_A + \alpha_B}\right) $:B 赢 A 4 次,每赢一次贡献一个 $ \ln\left(\frac{\alpha_B}{\alpha_A + \alpha_B}\right) $。
  • $ 3 \ln\left(\frac{\alpha_A}{\alpha_A + \alpha_C}\right) $:A 赢 C 3 次。
  • $ 5 \ln\left(\frac{\alpha_C}{\alpha_A + \alpha_C}\right) $:C 赢 A 5 次。

这个对数似然 $ \ln L $ 衡量了模型预测的概率与实际比赛结果的匹配程度。我们通过最大化 $ \ln L $(或最小化损失函数)来找到最合适的 $ \alpha_A $、$ \alpha_B $、$ \alpha_C $。

步骤 3:损失函数

损失函数是:

$$ \text{Loss} = -E_{(x, y) \sim D} \left[ \ln \frac{\alpha_x}{\alpha_x + \alpha_y} \right] $$

  • $ (x, y) \sim D $:表示从数据 $ D $ 中采样一对比较(比如 A 对 B)。
  • $ \ln \frac{\alpha_x}{\alpha_x + \alpha_y} $:如果 $ x $ 赢了 $ y $,我们希望这个概率大,损失小。
  • 负号:因为我们希望最大化似然,所以用负的对数似然作为损失,最小化损失等价于最大化似然。

3. 公式的意义

Bradley-Terry 模型的核心意义在于:通过成对比较数据,量化每个选项的相对实力,并预测未来的比较结果

生活化解释:

  • 回到足球队的例子,Bradley-Terry 模型就像一个“裁判”,通过观察比赛结果(A 赢 B 多少次,A 赢 C 多少次),给每支队伍打一个“实力分”($ \alpha $)。
  • 然后,这个“裁判”用实力分预测未来的比赛:如果 A 的实力是 B 的两倍,A 赢 B 的概率就是 2/3。
  • 这个模型的意义在于,它把复杂的比较数据(谁赢谁多少次)简化成了一个直观的“实力排名”,并且可以用这个排名去预测新比赛的结果。

更广义的意义:

  • 在机器学习中,Bradley-Terry 模型可以用来建模任何偏好数据,比如用户更喜欢哪部电影、哪款产品,或者在 DPO 中,人类更喜欢模型生成的哪个回答。
  • 它提供了一种数学方式,把“偏好”转化为“概率”,从而让机器能够学习和优化。

4. 与 DPO 算法核心的联系

DPO(Direct Preference Optimization) 是一种用于微调语言模型的算法,目标是让模型生成更符合人类偏好的输出。Bradley-Terry 模型在 DPO 中扮演了关键角色,具体体现在以下几点:

4.1 DPO 的核心思想

DPO 的输入是成对偏好数据,比如“回答 A 优于回答 B”。它的目标是调整模型的参数,让模型生成的回答更符合这些偏好。

4.2 Bradley-Terry 模型在 DPO 中的作用

在 DPO 中,Bradley-Terry 模型被用来建模偏好概率:

  • 假设模型 $ \pi_\theta $ 生成两个回答 $ y_1 $ 和 $ y_2 $,我们用 Bradley-Terry 模型定义 $ y_1 $ 优于 $ y_2 $ 的概率: $$ P(y_1 > y_2) = \frac{\alpha(y_1)}{\alpha(y_1) + \alpha(y_2)} $$ 这里的 $ \alpha(y) $ 通常与模型的输出概率相关,比如 $ \alpha(y) \propto \pi_\theta(y) $,或者通过一个奖励函数 $ r(y) $ 来定义。

4.3 DPO 的损失函数

DPO 的损失函数直接使用了 Bradley-Terry 模型的概率形式。假设我们有偏好数据 $ y_w > y_l $($ y_w $ 是优选的回答,$ y_l $ 是次选的回答),DPO 的损失函数类似于:

$$ \text{Loss} = - \log \left( \frac{\pi_\theta(y_w)}{\pi_\theta(y_w) + \pi_\theta(y_l)} \right) $$

  • 这和 Bradley-Terry 模型的 $ \frac{\alpha_i}{\alpha_i + \alpha_j} $ 形式一致。
  • 损失函数的目标是:如果 $ y_w $ 是优选的回答,模型应该提高 $ \pi_\theta(y_w) $,降低 $ \pi_\theta(y_l) $,从而让 $ P(y_w > y_l) $ 更大。

4.4 结合 KL 散度

在 DPO 中,除了偏好损失,还会加入一个 KL 散度项(参考你之前的问题),用来约束模型不要偏离原始行为太远。完整的损失函数可能是:

$$ \text{Loss} = - \log \left( \frac{\pi_\theta(y_w)}{\pi_\theta(y_w) + \pi_\theta(y_l)} \right) + \beta \cdot \text{KL}(\pi_\theta || \pi_{\text{ref}}) $$

  • Bradley-Terry 部分:确保模型符合偏好数据。
  • KL 散度部分:确保模型不会改变得太激进,保持稳定性。

5. 总结

  • 公式:$ P(i > j) = \frac{\alpha_i}{\alpha_i + \alpha_j} $ 表示选项 $ i $ 优于 $ j $ 的概率,基于它们的相对实力 $ \alpha $。
  • 参数含义:$ \alpha_i $ 是选项 $ i $ 的实力得分,反映其优越性。
  • 意义:Bradley-Terry 模型通过成对比较数据量化选项的实力,并预测未来的比较结果。
  • DPO 核心:DPO 用 Bradley-Terry 模型建模偏好概率,通过优化损失函数让模型生成更符合人类偏好的输出,同时用 KL 散度约束稳定性。