Loading

Bradley-Terry模型解读

核心思想:

Bradley-Terry模型解决的是谁更强的问题,给定两个选项A和B,这个模型能告诉我们A被选择的概率是多少,常用于体育比赛、排序、偏好建模等场景。

公式非常简洁:

\[P(A > B) = \frac{\exp(\theta_A)}{\exp(\theta_A) + \exp(\theta_B)} = \frac{1}{1 + \exp(\theta_B - \theta_A)} \]

  • θ_Aθ_B 是A和B的"实力值"(或称为能力参数)

  • P(A > B) 表示A被选择胜过B的概率

  • A 的胜率是 A 和 B 实力差的一个「S型」函数(sigmoid),当 A 比 B 强很多时,A 几乎一定赢;当双方接近时,胜率接近 50%

Bradley-Terry 模型的核心图像 —— 胜率 vs 实力差(Sigmoid 曲线)

output

横轴表示 \(\theta_A - \theta_B\):A 和 B 的实力差

纵轴表示 \(P(A > B)\):A 战胜 B 的概率

当实力差为 0 时,胜率为 0.5(五五开)

当 A 实力远高于 B(向右),胜率逼近 1

当 A 实力远低于 B(向左),胜率逼近 0

该图Bradley-Terry 模型的核心思想:实力差越大,胜率越偏向强者,但始终保持概率性。这种平滑的 S 形函数非常适合建模“不确定但有倾向”的比较结果

直观理解:

现在有一场篮球比赛,A队实力值:\(\theta_A=2.5\),B队实力值:\(\theta_B=2.0\)

\[A队获胜概率=\frac{\exp(2.5)}{\exp(2.5) + \exp(2.0)}=\frac{12.18}{12.18+7.39}≈0.62 \]

因此A队获胜的概率是62%

模型特点:

  • 对称性:\(P(A>B)+P(B>A)=1\)

  • 传递性:A比B强,B比C强,那么A比C更强

  • 只关心相对实力:重要的是实力差值 \(\theta_A-\theta_B\),而不是绝对值

参数估计:

「最大似然」就是选择最能解释观察到证据的假设

给定观察到的数据D,我们想要找到参数\(\theta\),使得在这个参数下观察到数据D的概率最大:

\[\theta^*=argmax P(D|\theta) \]

假设我们观察到的数据是下方的比较结果:

观察数据:
- A vs B: A胜
- B vs C: B胜  
- A vs C: A胜

我们要估计参数:\(\theta_A,\theta_B,\theta_C\),每个选项的实力值

那么最大似然估计:

# 简化的Python实现思路
def likelihood(theta_A, theta_B, theta_C, results):
    prob = 1.0
    for winner, loser in results:
        prob *= exp(theta[winner]) / (exp(theta[winner]) + exp(theta[loser]))
    return prob

# 通过优化算法找到最佳的θ值

Python代码实现

import numpy as np
from scipy.optimize import minimize

# 胜负数据:0 = A, 1 = B, 2 = C
results = [(0, 1), (1, 2), (0, 2)]

# 只优化 θ_A 和 θ_C,固定 θ_B=0 作为参考
def negative_log_likelihood(theta_sub):
    theta = np.array([theta_sub[0], 0.0, theta_sub[1]])  # A, B固定为0, C
    loss = 0
    for winner, loser in results:
        p_win = np.exp(theta[winner]) / (np.exp(theta[winner]) + np.exp(theta[loser]))
        loss -= np.log(p_win)
    return loss

theta_init = np.array([0.0, 0.0])  # 初始 θ_A 和 θ_C
res = minimize(negative_log_likelihood, theta_init, method='BFGS')

# 恢复所有 θ(B=0)
theta_final = np.array([res.x[0], 0.0, res.x[1]])
theta_exp = np.exp(theta_final)  # 可选:转换到原始 θ 空间

# 打印结果
names = ['A', 'B', 'C']
for i in range(3):
    print(f"{names[i]} 的 log θ = {theta_final[i]:.3f}, 实力值 θ = {theta_exp[i]:.3f}")

扩展变种:

  1. 考虑平局的扩展:用于象棋、围棋等比赛有大量和局的场景

\[P(A胜) = \frac{\exp(\theta_A)}{\exp(\theta_A) + \exp(\theta_B) + \exp(\theta_{平局})} \]

  1. 时变模型:运动员或模型能力随时间上升或下降

\[\theta_A(t) = \theta_A + \alpha \cdot t \qquad \text{实力随时间变化} \]

  1. 多因素模型:在评分系统中考虑多维特征,如 Elo 或体育分析

    \[\theta_A = \beta_1 \cdot 攻击力 + \beta_2 \cdot 防御力 + \beta_3 \cdot 主场优势 \]

Bradley-Terry模型本质上是将比较问题转化为概率问题,通过简单的指数函数关系,优雅地建模了"谁更优秀"这一基本问题。虽然模型相对简单,但在很多实际场景中都能提供有价值的洞察。

例如在 大模型训练中的偏好学习(如RLHF)体育比赛胜率建模(如FIFA排名)搜索排序与推荐系统中都有广泛应用。

点击查看代码

<details>
<summary>点击查看代码</summary>

</details>

posted @ 2025-07-15 17:36  is_tang  阅读(567)  评论(0)    收藏  举报