第 5 讲:学习选择预测——最大似然估计

Machine Learning from Human Preferences · Lecture 05。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS329H Fall 2026 Lecture 5(10/7 Learning choice prediction; MLE estimation)。依据教材第 2 章 2.2–2.3、2.5–2.10 节(最大似然、Elo 在线学习、正则化、交叉验证、优化器、评估指标、LLM 偏好学习案例)及第 2 章幻灯片;MM 算法依据 Hunter(2004)。 配套代码:code/lecture05/(从本讲起需要 numpy) 预计阅读时间:3~4 小时(含运行代码)


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 写出 BT 模型的对数似然,推导梯度(“实际胜场 − 预期胜场”)和海森矩阵(负的加权图拉普拉斯),解释它为什么是凹的、为什么有一个零特征值。
  2. 从海森矩阵得到标准误和置信区间,解释比较图的连通性(代数连通度)怎样决定估计的精度。
  3. 说出梯度上升、牛顿法、MM 算法、Adam 的原理和适用场合;解释步长 1/L1/L、二次收敛、条件数。
  4. 推导 Elo 更新就是对数似然的随机梯度上升;说出 K 因子的权衡、顺序依赖、Robbins–Monro 条件,以及 Elo 和批量最大似然各自适合什么场景。
  5. 解释 L2 正则化 = 高斯先验下的最大后验估计(MAP),说出提前停止的作用,用 kk 折交叉验证选正则化强度,并识别”挑选之后的乐观偏差”。
  6. 区分排序指标(准确率、AUC)和概率指标(对数损失、Brier、ECE),解释校准和温度缩放,说出指标的上限从哪里来。
  7. 解释随机标注噪声和系统性标注噪声对学到的偏好的不同影响;说出 DPO 和 BT 最大似然的关系。

0.2 先修知识

知识点用在哪里最低要求
第 1~4 讲全部BT 模型、比较图(第 2 讲第 4.2 节)、Rasch 与附带参数问题(第 4 讲)
微积分第 2、3 节导数、偏导数、链式法则;σ′(x)=σ(x)(1−σ(x))\sigma'(x) = \sigma(x)(1-\sigma(x))
线性代数第 3、4 节矩阵、特征值、正定 / 半正定
numpy代码不需要预先会;bt_numpy.py 开头和代码 README 有集中说明

0.3 本讲地图

第1节  从“模型”到“学习”:第二单元的问题
第2节  最大似然的思想:两个选项的例子                         ← 代码 01
第3节  BT 的梯度与海森矩阵:矩匹配、凹性、图拉普拉斯、连通性    ← 代码 01
第4节  优化算法:梯度上升、牛顿法、MM、Adam;步长与条件数      ← 代码 02
第5节  在线学习:Elo = 随机梯度上升                          ← 代码 03
第6节  不确定性与正则化:标准误、MAP、提前停止                 ← 代码 01、04
第7节  模型选择:交叉验证与“挑选之后的乐观”                   ← 代码 04
第8节  评估:排序、概率、校准                                ← 代码 05
第9节  案例:LLM 偏好数据里的两种噪声;DPO 是 BT 最大似然      ← 代码 05
第10–14节 小结、与考核的关系、练习、延伸阅读、下一讲预告

1. 从”模型”到”学习”

第一单元(第 14 讲)回答了”偏好数据长什么样、用什么概率模型描述”。拟合模型时,我们一直把 fit_bradley_terry、fit_choice_model、fit_mf 当成工具。第二单元(第 59 讲)把它们打开,回答”怎样从数据里把参数学出来”:

讲次方法输出
5最大似然(及其在线版本 Elo)一个点估计
6贝叶斯推断;在预训练模型上微调奖励模型后验分布(不确定性);神经网络奖励模型
7Fisher 信息与实验设计下一个问题该问什么
8、9RLHF、DPO用学到的偏好训练语言模型

教材强调:最大似然、贝叶斯、在线学习估计的是同一个模型,区别只在计算方式、数据访问方式和是否量化不确定性。本讲先把最大似然讲透,后面的方法都建立在它之上。


2. 最大似然的思想

2.1 原则

给定模型 P(数据∣θ)P(\text{数据} \mid \theta) 和观察到的数据,最大似然估计(MLE)选让”已经观察到的数据出现的概率”最大的参数:

θ^=arg⁡max⁡θ  log⁡P(数据∣θ)=arg⁡max⁡θ∑nlog⁡P(第 n 条数据∣θ)\hat\theta = \arg\max_\theta \; \log P(\text{数据} \mid \theta) = \arg\max_\theta \sum_n \log P(\text{第 } n \text{ 条数据} \mid \theta)

(各条数据独立时,概率相乘,取对数后相加。)为什么是它?统计学的经典结论:数据足够多、模型正确时,MLE 一致(收敛到真值)、渐近正态(误差近似服从正态分布),并且在所有”渐近无偏”的估计里方差最小(渐近有效)。第 4 讲的附带参数问题说明了这些结论的前提:参数个数不能随数据一起增长。

2.2 两个选项的例子

最简单的情形:只有 aa、bb 两个选项,aa 赢了 70 次、输了 30 次。设 Δ=sa−sb\Delta = s_a - s_b,对数似然

ℓ(Δ)=70log⁡σ(Δ)+30log⁡σ(−Δ)\ell(\Delta) = 70 \log\sigma(\Delta) + 30 \log\sigma(-\Delta)

求导令其为 0:70(1−σ(Δ))−30σ(Δ)=070(1 - \sigma(\Delta)) - 30\sigma(\Delta) = 0,得 σ(Δ^)=0.7\sigma(\hat\Delta) = 0.7,即

Δ^=log⁡7030≈0.847\hat\Delta = \log\frac{70}{30} \approx 0.847

直觉:让模型预测的胜率等于观察到的胜率。

代码 01_likelihood_gradient.py 的演示 1 画出了 ℓ(Δ)\ell(\Delta):它在 0.85 附近达到最大,两边对称地下降。曲线在最高点附近的曲率(二阶导数)是 −n p(1−p)=−100×0.7×0.3=−21-n\,p(1-p) = -100 \times 0.7 \times 0.3 = -21,标准误约为 1/21≈0.2181/\sqrt{21} \approx 0.218,所以 95% 置信区间大约是 0.847±1.96×0.218=[0.420,1.275]0.847 \pm 1.96 \times 0.218 = [0.420, 1.275]。数据多 100 倍时,最高点的位置不变,曲线尖锐 100 倍,标准误缩小 10 倍。

注意 p(1−p)p(1-p) 这个因子:p=0.5p = 0.5 时最大。实力接近的两个选项,比一次学到的东西最多——这是第 7 讲实验设计的出发点。


3. BT 的梯度与海森矩阵

3.1 记号

本讲把比较数据存成三个数组:第 nn 条比较在选项 ini_n 和 jnj_n 之间,yn=1y_n = 1 表示 ini_n 赢了。pn=σ(sin−sjn)p_n = \sigma(s_{i_n} - s_{j_n}) 是模型预测 ini_n 赢的概率。目标函数(平均对数似然减去 L2 正则化):

ℓ(s)=1N∑n=1N[ynlog⁡pn+(1−yn)log⁡(1−pn)]−λ2∥s∥2\ell(s) = \frac{1}{N}\sum_{n=1}^N \big[ y_n \log p_n + (1 - y_n)\log(1 - p_n) \big] - \frac{\lambda}{2}\lVert s \rVert^2

3.2 梯度:观察到的 − 预期的

对一条比较,∂∂sinlog⁡P=yn−pn\frac{\partial}{\partial s_{i_n}} \log P = y_n - p_n(“残差”),∂∂sjn=−(yn−pn)\frac{\partial}{\partial s_{j_n}} = -(y_n - p_n)。把所有比较按选项加起来:

∂ℓ∂sk=1N[#{k 赢的场数}⏟实际−∑k 参加的比较P(k 赢)⏟预期]−λsk\frac{\partial \ell}{\partial s_k} = \frac{1}{N}\Big[\underbrace{\#\{k \text{ 赢的场数}\}}_{\text{实际}} - \underbrace{\sum_{k \text{ 参加的比较}} P(k \text{ 赢})}_{\text{预期}}\Big] - \lambda s_k

代码 01 的演示 2 在 s=0s = 0(模型认为每场都五五开)处展示了这一点:真实分数最高的选项 0 实际赢了 122 场,预期 77.5 场,梯度为 +44.5,所以要把它的分数往上调;选项 4 实际 45 场、预期 83 场,梯度 −38。用数值差分验证,解析梯度的误差只有 6×10−116 \times 10^{-11}——写梯度代码时,永远先做这个检查。

两个推论:

  • 矩匹配:最大似然估计(梯度为 0,λ=0\lambda = 0)满足”每个选项的预期胜场 = 实际胜场”。这是指数族模型最大似然的普遍性质,Zermelo 1929 年就是从这个方程出发给棋手排名的。
  • 梯度的分量加起来是 0:一场比赛一胜一负,总的实际胜场等于总的预期胜场。这是”平移不变”在梯度上的体现。

3.3 海森矩阵:负的加权图拉普拉斯

对一条比较,令 wn=pn(1−pn)w_n = p_n(1 - p_n)。log⁡P\log P 对 (sin,sjn)(s_{i_n}, s_{j_n}) 的二阶导数是 −wn(1−1−11)-w_n \begin{pmatrix} 1 & -1 \\ -1 & 1 \end{pmatrix}。加起来:

∇2ℓ(s)=−1NLw−λI,(Lw)kk=∑k 参加的比较wn,(Lw)kl=−∑k, l 之间的比较wn\nabla^2 \ell(s) = -\frac{1}{N} L_w - \lambda I, \qquad (L_w)_{kk} = \sum_{k \text{ 参加的比较}} w_n, \quad (L_w)_{kl} = -\sum_{k,\,l \text{ 之间的比较}} w_n

LwL_w 是比较图的加权拉普拉斯矩阵(边的权重是 p(1−p)p(1-p))。它告诉我们三件事:

  1. 凹性。对任意向量 vv,v⊤Lwv=∑nwn(vin−vjn)2≥0v^\top L_w v = \sum_n w_n (v_{i_n} - v_{j_n})^2 \ge 0,所以海森矩阵半负定,对数似然是凹函数,只有一个最高点(或一组平移等价的最高点),梯度上升不会被困在局部最优。这是 BT(以及所有逻辑回归)好优化的根本原因——第 6 讲的神经网络奖励模型就没有这么幸运了。
  2. 平移不变。全 1 向量满足 Lw1=0L_w \mathbf{1} = 0,所以 λ=0\lambda = 0 时海森矩阵有一个零特征值:所有分数加同一个常数,似然不变。这就是”只有差值可识别”的线性代数版本。加 L2 正则化后它变成 λ\lambda,解唯一。
  3. 连通性决定精度。LwL_w 的第二小特征值叫代数连通度(Fiedler 值)。比较图分成两块时它等于 0(两块之间的相对高低无法确定,第 2 讲第 4.2 节);连得越”松”,它越小,估计越不准。

代码 01 的演示 3:30 个选项、1500 条比较,两种设计:

设计最小特征值代数连通度最大特征值s0−s29s_0 - s_{29} 的标准误
随机配对≈ 011.59425.010.379
链式(只和编号相邻的比)≈ 00.31941.881.010

链式设计里,相隔很远的两个选项只能通过一长串中间人间接比较,误差层层累积:代数连通度小了几十倍,标准误大了将近三倍。数据量一样,“谁和谁比”决定了能学多准。

与 Zermelo–Ford 条件的关系:第 2 讲说最大似然存在且唯一 ⇔ 胜负图强连通。凹性保证”最多一个最高点”;强连通保证”最高点不在无穷远处”(如果某个选项从没输过,沿着”把它的分数调大”的方向,似然一直增加,永远到不了顶)。


4. 优化算法

凹函数只有一个最高点,问题只是”怎样最快爬上去”。

4.1 梯度上升与步长

s←s+η ∇ℓ(s)s \leftarrow s + \eta\, \nabla \ell(s)

步长 η\eta 怎么选?设 LL 是曲率的上界(海森矩阵最大特征值的绝对值),取 η=1/L\eta = 1/L 时每一步都保证目标不下降。对 BT,p(1−p)≤1/4p(1-p) \le 1/4,由 Gershgorin 圆盘定理可得 L≤max⁡k(度数k)/(2N)+λL \le \max_k(\text{度数}_k)/(2N) + \lambda——第 1~4 讲的拟合函数都是这样自动设定步长的。

代码 02_optimizers.py 的演示 2(100 个选项、5000 条比较,1/L=801/L = 80):步长取 0.5、1、4 倍的 1/L1/L 都收敛(1/L1/L 是保守的上界,实际曲率更小,稍大的步长反而更快);16 倍和 64 倍就发散了——一步跨过山顶,越跳越远。深度学习里”学习率太大,损失变成 NaN”就是这个现象。

4.2 牛顿法

在当前点用二次函数近似目标,直接跳到二次函数的最高点:

s←s−[∇2ℓ(s)]−1∇ℓ(s)s \leftarrow s - \big[\nabla^2 \ell(s)\big]^{-1} \nabla \ell(s)

离最优点近时,误差每一步大约平方一次(二次收敛:10−2→10−4→10−810^{-2} \to 10^{-4} \to 10^{-8})。代价是每一步要解一个 M×MM \times M 的线性方程组(O(M3)O(M^3))。λ=0\lambda = 0 时海森矩阵奇异,用伪逆(相当于”平均值为 0”的约束)。第 2 讲的线性 BT、第 4 讲的小逻辑回归用的都是牛顿法。

4.3 MM 算法

Zermelo(1929)给出的迭代,Hunter(2004)把它解释成最小化—最大化(Minorize–Maximize)算法。用实力值 πk=esk\pi_k = e^{s_k},对数似然是

ℓ(π)=∑kWklog⁡πk−∑nlog⁡(πin+πjn)\ell(\pi) = \sum_k W_k \log \pi_k - \sum_n \log(\pi_{i_n} + \pi_{j_n})

(WkW_k 是 kk 赢的场数。)利用对数的凹性 log⁡x≤log⁡y+(x−y)/y\log x \le \log y + (x - y)/y,在当前点 π(t)\pi^{(t)} 处有

−log⁡(πi+πj)≥−log⁡(πi(t)+πj(t))−πi+πjπi(t)+πj(t)+1-\log(\pi_i + \pi_j) \ge -\log(\pi_i^{(t)} + \pi_j^{(t)}) - \frac{\pi_i + \pi_j}{\pi_i^{(t)} + \pi_j^{(t)}} + 1

右边是一个处处不超过 ℓ\ell、并在当前点和 ℓ\ell 相等的”下界函数”,而且对每个 πk\pi_k 是分开的。最大化它得到更新:

πk←Wk∑k 参加的比较 n1/(πin(t)+πjn(t))\pi_k \leftarrow \frac{W_k}{\sum_{k \text{ 参加的比较 } n} 1/(\pi_{i_n}^{(t)} + \pi_{j_n}^{(t)})}

直觉:实力 = 赢的场数 / “按当前实力,预期能赢的机会”。每一步都保证似然不下降,不需要选步长。

4.4 Adam

Adam(Kingma & Ba 2014)给梯度上升加了两样东西:动量(梯度的指数移动平均,方向更稳)和每个参数各自的步长(除以梯度平方的移动平均的平方根):

m←β1m+(1−β1)g,v←β2v+(1−β2)g2,s←s+η m^v^+ϵm \leftarrow \beta_1 m + (1 - \beta_1) g, \quad v \leftarrow \beta_2 v + (1-\beta_2) g^2, \quad s \leftarrow s + \eta\, \frac{\hat m}{\sqrt{\hat v} + \epsilon}

(m^\hat m、v^\hat v 是偏差修正后的值,默认 β1=0.9\beta_1 = 0.9、β2=0.999\beta_2 = 0.999。)它是训练神经网络的默认选择,教材也推荐它作为偏好学习的默认优化器。

4.5 比较

代码 02 的演示 1(100 个选项、5000 条随机配对的比较,收敛标准:梯度最大分量 <10−6< 10^{-6}):

优化器收敛步数第 10 步的最优性差距
梯度上升(步长 1/L1/L)801.7×10−31.7 \times 10^{-3}
牛顿法5已收敛
MM 算法615.2×10−45.2 \times 10^{-4}
Adam(η=0.05\eta = 0.05)2446.7×10−26.7 \times 10^{-2}

所有方法收敛到同一个解(凹函数只有一个最高点)——选哪个优化器只影响速度,不影响答案。牛顿法步数最少,但每步最贵;选项有几百万个时(例如给每条推文打分),只能用梯度类方法。Adam 在这种光滑的凸问题上没有优势,它的优势在神经网络那种大规模、随机梯度、非凸的问题(第 6 讲)。

4.6 条件数

代码 02 的演示 3 换成链式设计(只和邻居比):梯度上升从 70 步变成 1040 步,牛顿法反而只要 2 步。原因:梯度上升的收敛速度由条件数(最大曲率 / 最小非零曲率)决定,链式设计的代数连通度很小(第 3.3 节),最平缓的方向上每步只挪一点点;牛顿法用海森矩阵的逆矫正了各方向的曲率差异。比较的设计不只影响统计精度,也影响计算。


5. 在线学习:Elo = 随机梯度上升

5.1 推导

只用一条比较 (i,j,y)(i, j, y) 计算梯度:∂log⁡P/∂si=y−p\partial \log P / \partial s_i = y - p,∂log⁡P/∂sj=−(y−p)\partial \log P / \partial s_j = -(y - p)。沿这个方向走一步:

si←si+K(y−p),sj←sj−K(y−p)s_i \leftarrow s_i + K (y - p), \qquad s_j \leftarrow s_j - K(y - p)

这正是国际象棋的 Elo 等级分(Arpad Elo,1960 年代起被美国国际象棋联合会、国际棋联采用),KK 就是步长。y−py - p 是”惊讶程度”:爆冷门时更新得多,意料之中时几乎不动;更新是零和的(一方加多少,另一方就减多少)。国际象棋的 Elo 分 = 自然对数单位的分数 × 400/ln⁡10≈173.7400/\ln 10 \approx 173.7,所以国际象棋常用的 K=32K = 32 分相当于这里的 K≈0.18K \approx 0.18。

Elo 不需要存下所有比赛,来一场算一场,每场 O(1)O(1) 的计算——非常适合比赛源源不断的场景。

5.2 K 的权衡

代码 03_elo_online.py 的演示 1:20 位选手、20000 场比赛,估计分数和真实分数的均方根误差(Elo 分):

方法第 500 场第 2000 场第 5000 场第 20000 场
Elo,K=0.01K = 0.011491136816
Elo,K=0.05K = 0.05105392829
Elo,K=0.2K = 0.259325752
Elo,K=0.5K = 0.597809081
最大似然(全部历史)59282111

KK 小:追得慢,但最后很稳。KK 大:很快追上,之后一直大幅抖动——太相信最近的一场比赛。最大似然每次都用全部历史重新拟合,在每个时刻都几乎最好。国际象棋联合会给新棋手大的 KK(快速定级)、给老棋手小的 KK(稳定),正是这个权衡。

5.3 顺序依赖

代码 03 的演示 2:同样的 3000 场比赛,随机打乱顺序 5 次分别跑 Elo(K=0.2K = 0.2),各选手分数的极差平均有 105 分;最大似然打乱前后的差别是 4×10−144 \times 10^{-14}。Elo 依赖顺序(最近的比赛影响最大),最大似然只依赖胜负表。对模型排行榜来说这是个实际问题:模型的实力在评估期间不变,没有理由让后来的投票比先来的更重要。LMSYS 在 2023 年 12 月把 Chatbot Arena 的排行榜从在线 Elo 改成了 BT 最大似然(加自助法置信区间),理由正是稳定性。

5.4 逐渐变小的步长

如果让 KtK_t 满足 Robbins–Monro 条件 ∑tKt=∞\sum_t K_t = \infty、∑tKt2<∞\sum_t K_t^2 < \infty(例如 Kt∝1/tK_t \propto 1/t),随机梯度上升会收敛到批量的最优解。代码 03 的演示 3:同一份 40000 场比赛的数据处理两遍,和最大似然的均方根距离:固定 K=0.2K = 0.2 时 47.4 分,固定 K=0.02K = 0.02 时 11.0 分,Kt=2/(10+t/M)K_t = 2/(10 + t/M) 时 5.7 分。Elo 和最大似然不是两种模型,而是同一个模型的两种优化方法。

5.5 实力会变

代码 03 的演示 4:选手 0 的实力从 −1 线性增长到 +2。比赛结束时他的相对分(Elo 分):真实 328;Elo(KK = 0.02 / 0.1 / 0.3)235 / 298 / 328;最大似然(全部历史)只有 51;最大似然(只用最近 2000 场)251。最大似然假设实力不变,把全部历史平均起来;Elo 天然地”遗忘”旧比赛。更系统的做法是把”实力随时间变化”写进模型(Glicko、TrueSkill),这需要贝叶斯的工具(第 6 讲)。偏好也会随时间漂移(用户口味、模型版本),奖励模型和排行榜需要决定”记住多久”。


6. 不确定性与正则化

6.1 标准误

数据足够多时,最大似然估计近似服从正态分布,协方差约等于负的总海森矩阵的逆(第 7 讲会讲它和 Fisher 信息的关系)。BT 的海森矩阵奇异,用伪逆(“平均值为 0”的约束)。sa−sbs_a - s_b 的标准误是 Caa+Cbb−2Cab\sqrt{C_{aa} + C_{bb} - 2C_{ab}}。

代码 01 的演示 4(10 个选项、每次 600 条比较、重复 300 次实验,关心 s0−s9s_0 - s_9,真实值 −2.00):估计值的实际标准差 0.316,公式给出的标准误 0.301,自助法 0.332——三者基本一致;95% 置信区间包含真值的比例 95.0%。估计值的平均是 −2.049,绝对值略大于真值:最大似然在小样本下有轻微的”往外推”的偏差(第 4 讲附带参数问题的温和版本),L2 正则化会把它往回拉。

6.2 过拟合与 L2 正则化

数据少、选项多时,最大似然会过拟合。代码 04_regularization_cv.py 的演示 1:60 个选项,只有 300 条训练比较(平均每个选项 10 场),其中 2 个选项一场都没输过:

λ训练损失测试损失和真实分数的误差最大的分数
10−510^{-5}0.3990.7321.3716.48
0.00030.4050.6490.8553.51
0.0010.4210.6060.6132.46
0.0030.4570.5860.5341.64
0.010.5260.6020.6720.93
0.10.6550.6710.9380.20
(真实分数)0.4920.53802.18

λ 很小:训练损失最低、测试损失最高,全胜的选项分数被推到 6.48——过拟合(方差大)。λ 很大:分数被压向 0——欠拟合(偏差大)。中间有一个最好的 λ。

6.3 L2 正则化 = 高斯先验

为什么最好的 λ 恰好在 0.003 附近?给每个分数一个高斯先验 sk∼N(0,τ2)s_k \sim N(0, \tau^2),最大后验估计(MAP)的目标是

log⁡P(数据∣s)+log⁡P(s)=∑nlog⁡P(⋅)−12τ2∑ksk2=N[1N∑nlog⁡P(⋅)⏟平均对数似然−λ2∥s∥2],λ=1Nτ2\log P(\text{数据} \mid s) + \log P(s) = \sum_n \log P(\cdot) - \frac{1}{2\tau^2}\sum_k s_k^2 = N\Big[\underbrace{\tfrac{1}{N}\sum_n \log P(\cdot)}_{\text{平均对数似然}} - \frac{\lambda}{2}\lVert s \rVert^2\Big], \quad \lambda = \frac{1}{N\tau^2}

所以 L2 正则化就是高斯先验下的 MAP,先验方差 τ2\tau^2 取真实分数的方差最合适:λ≈1/(Nσ2)=1/(300×1)≈0.0033\lambda \approx 1/(N\sigma^2) = 1/(300 \times 1) \approx 0.0033,和实验吻合。第 6 讲把这个想法推到底:不只要”最可能的”分数,而要整个后验分布。

6.4 提前停止

代码 04 的演示 2:不加正则化,从 s=0s = 0 开始做梯度上升,测试损失在第 1、5、20、100、1000 步分别是 0.631、0.586、0.625、0.701、0.743——先降后升,第 5 步左右最低,正好等于最好的 L2 正则化。原因:从 0 出发的梯度上升,前几步主要学到”数据最确定的方向”(曲率大的方向),后面才慢慢去拟合不确定的方向;提前停止相当于没让它走完。训练神经网络奖励模型时,提前停止是最常用的正则化手段之一——很多奖励模型只训练一个周期就停(InstructGPT 的奖励模型训练一个周期,部分原因就是第 2 讲提到的过拟合)。


7. 模型选择:交叉验证

7.1 kk 折交叉验证

λ 不能用测试集来选(那等于偷看答案)。kk 折交叉验证:把训练数据分成 kk 份,轮流用 k−1k-1 份训练、1 份验证,取 kk 个验证损失的平均。代码 04 的演示 3(同样的设定,5 折):

λ交叉验证损失(各折的标准差)测试损失
0.0010.6770.0640.620
0.0030.6330.0440.608
0.010.6260.0220.620
0.030.6390.0120.649

交叉验证选出 λ = 0.01,事后看测试集最好的是 0.003,两者相邻,测试损失只差 0.012。注意各折的标准差不小:差别小于一个标准差的几个 λ 其实分不出好坏。

划分的单位:这里每条比较独立,按条划分。数据有分组(同一次排序、同一个提示词、同一个标注员)时要按组划分(第 2 讲第 3.5、5.7 节),否则交叉验证会过于乐观。

7.2 挑选之后的乐观

代码 04 的演示 4:只有 150 条训练比较,重复 30 次实验,比较”交叉验证损失 − 真正的测试损失”:

做法平均差值交叉验证偏乐观的实验比例
事先固定 λ = 0.003(不挑)+0.03733%
在 12 个 λ 里挑交叉验证最好的−0.01057%

不挑时,交叉验证偏悲观(每折只用 4/5 的数据训练,模型比用全部数据的差一点)。从 12 个候选里挑出”交叉验证损失最低”的那个,很可能挑中的是”碰巧被低估得最多”的那个——挑选把分数往乐观的方向推了 0.047,超过了原来的悲观偏差。这和”考了 12 次挑最高分”是一回事;候选越多、数据越少,推得越厉害。

正确的做法:另留一个从没参与选择的测试集,最后只用一次;或者用嵌套交叉验证(外层估计性能、内层选超参数;Cawley & Talbot 2010)。“在测试集上反复调参、最后报告测试集上的分数”是论文和项目里最常见的评估错误之一——这正是第 1 讲”预分析计划”要防止的分岔小径。


8. 评估:排序、概率、校准

8.1 几种指标

指标衡量什么瞎猜时
准确率p>0.5p > 0.5 时预测对不对0.5
AUC随机挑一个 y=1y=1 和一个 y=0y=0,模型给前者的概率更高的比例(排序质量)0.5
对数损失−mean[log⁡P(观察到的结果)]-\text{mean}[\log P(\text{观察到的结果})](概率的准确性)0.693
Brier 分数mean[(p−y)2]\text{mean}[(p - y)^2]0.25
ECE(期望校准误差)把预测分段,比较每段的”平均预测”和”实际比例”—

对数损失和 Brier 分数都是恰当评分规则(第 1 讲第 3.1 节):只有如实报告概率,期望得分才最好。

8.2 上限、过度自信与温度缩放

代码 05_evaluation_metrics.py 的演示 1、2(40 个选项、4000 条训练比较、40000 条测试比较):

模型准确率AUC对数损失BrierECE
真实分数(上限)0.7430.8210.5180.1730.003
最大似然估计0.7390.8160.5260.1760.012
过于自信(分数 × 2)0.7390.8160.6180.1900.111
过于保守(分数 × 0.4)0.7390.8160.5710.1920.117
过于自信 + 温度缩放(T = 2.30)0.7390.8160.5250.1750.012
  • 上限:即使知道真实分数,准确率也只有 74%,AUC 只有 0.82——两个实力接近的选项,结果本来就接近抛硬币。“准确率不高”不一定是模型不好,先看上限在哪里(教材:Bayes 最优的 AUC 也小于 1)。
  • 排序 vs 概率:把分数乘以 2 或 0.4,排序完全不变,准确率和 AUC 一模一样;对数损失、Brier、ECE 都变差了。可靠性表显示,过于自信的模型说”90% 以上”时实际只有 85% 左右是对的,说”10% 以下”时实际有 15% 左右。只看准确率 / AUC 发现不了概率的问题;只看对数损失又分不清是”排序错了”还是”太自信了”。所以要同时报告排序指标和概率指标。
  • 温度缩放(Guo 等 2017):在验证集上找一个数 TT,把分数整体除以 TT。排序不变,校准恢复。找到的 T=2.30T = 2.30 比 2 稍大,顺便修正了最大似然本身轻微的过度自信。

概率为什么重要?RLHF 里奖励模型的分数差直接决定了策略往哪边推、推多大力(π∗∝πrefer/β\pi^* \propto \pi_{\text{ref}} e^{r/\beta});过于自信的奖励模型会让策略过度相信它,加剧过度优化(第 8 讲)。


9. 案例:LLM 偏好数据里的两种噪声

9.1 设定

教材第 2.9 节的设定:50 个 LLM 回答,每个有一个 8 维嵌入 xx;真实效用是 w⊤xw^\top x;200 条比较,约 10% 的标签被翻转。用线性 BT(特征差上的逻辑回归,第 2 讲第 5.2 节)拟合。代码 05 的演示 3 比较两种翻转(各重复 200 次):

  • 随机噪声:每条比较以 10% 的概率被翻转(标注员偶尔点错)。
  • 系统性噪声:当输家在第 0 维(想象成”长度”)上更大时,以 20% 的概率把它判成赢家(标注员偏爱长回答)。实际翻转比例和随机噪声差不多(9.7%)。
设定权重的余弦相似度效用排名的相关第 0 维权重的偏差权重的长度比
没有噪声0.9830.980−0.0071.06
随机噪声 10%0.9580.957−0.1170.53
系统性噪声0.9190.918+0.4240.59
  • 随机噪声:方向几乎不变,但权重整体变短了一半——模型把”标签有时是反的”解释成”差距没那么大”。排序基本不受影响,概率变得过于保守(又是校准问题)。
  • 系统性噪声:翻转比例差不多,可它们有方向:第 0 维(“长度”)的权重被系统性地抬高。模型学到了”标注员喜欢长回答”,而不是”长回答更好”——这正是第 1 讲众包标注员的长度偏差。
  • 教训:随机噪声主要是”数据少了一点”,多收集就能弥补;系统性噪声是偏差,数据再多也消除不了(第 1 讲代码 03 演示 5),必须在建模(第 14 讲的风格控制)或数据收集上处理。

9.2 DPO 就是 BT 的最大似然

第 1 讲的 DPO 损失

LDPO=−E[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))]\mathcal{L}_{\text{DPO}} = -\mathbb{E}\Big[\log\sigma\Big(\beta\log\frac{\pi_\theta(y_w \mid x)}{\pi_{\text{ref}}(y_w \mid x)} - \beta\log\frac{\pi_\theta(y_l \mid x)}{\pi_{\text{ref}}(y_l \mid x)}\Big)\Big]

正是 BT 的负对数似然,只是”分数”换成了 s(y)=βlog⁡(πθ(y∣x)/πref(y∣x))s(y) = \beta\log(\pi_\theta(y \mid x)/\pi_{\text{ref}}(y \mid x))。所以本讲的一切都直接适用(教材第 2.9.3 节):梯度是”残差 × 分数的梯度”,正则化防止过拟合,Adam 和学习率调度加速训练,交叉验证选 β\beta 和学习率,校准影响下游行为。第 9 讲会详细推导;也会看到这个类比的隐藏假设:恢复出的奖励依赖于参考策略,偏好被假设服从 BT,β\beta 控制对参考策略的忠实程度。


10. 小结

  1. 最大似然:选让观察到的数据最可能出现的参数。两个选项时 Δ^=log⁡(胜/负)\hat\Delta = \log(\text{胜}/\text{负}):让预测胜率等于观察到的胜率。
  2. 梯度 = 实际胜场 − 预期胜场(矩匹配);海森矩阵 = 负的加权图拉普拉斯:凹(一个最高点)、一个零特征值(平移不变)、代数连通度决定精度。Zermelo–Ford 条件保证最高点不在无穷远。
  3. 优化:梯度上升(步长 1/L1/L 保证收敛,太大发散)、牛顿法(二次收敛、每步贵)、MM(实力 = 胜场 / 预期机会,单调、无步长)、Adam(神经网络的默认)。都收敛到同一个解;条件数(比较设计)决定梯度类方法的速度。
  4. Elo = 随机梯度上升:KK 是步长,权衡适应速度和稳定性;依赖顺序(最大似然不依赖);Robbins–Monro 步长下收敛到最大似然;实力会变时 Elo 能跟上。
  5. 不确定性与正则化:标准误 ≈ 负海森矩阵逆的对角线,置信区间覆盖率约 95%。L2 正则化 = 高斯先验的 MAP,最好的 λ≈1/(Nσ2)\lambda \approx 1/(N\sigma^2);提前停止有类似效果。
  6. 交叉验证按独立单元划分;挑选之后的交叉验证分数偏乐观,要留独立的测试集或用嵌套交叉验证。
  7. 评估:排序指标(准确率、AUC)和概率指标(对数损失、Brier、ECE)衡量不同的东西;指标有由噪声决定的上限;温度缩放修复校准。
  8. 两种噪声:随机噪声让权重整体变短(可以用数据弥补),系统性噪声让权重有方向地偏(数据弥补不了)。DPO 就是 BT 的最大似然。

11. 与测验、口试和项目的关系

  • 测验与口试可能会问:推导 BT 的梯度,解释”矩匹配”;为什么 BT 的对数似然是凹的;为什么海森矩阵有一个零特征值;推导 Elo 更新;Elo 和最大似然各适合什么场景;L2 正则化和高斯先验的关系;准确率高但对数损失差说明什么;为什么不能在测试集上调参。
  • 期末项目:本讲是几乎所有项目的”基础设施”。写预分析计划时要说明:用什么优化器和收敛标准;正则化强度怎么选(交叉验证的划分单位);报告哪些指标(至少一个排序指标 + 一个概率指标)、置信区间怎么算;测试集什么时候、用几次。

12. 练习

练习 1(计算)。两个选项,aa 赢 30 次、输 10 次。 (a) 求 Δ^\hat\Delta 和它的标准误。 (b) 如果 aa 赢 40 次、输 0 次呢?

参考答案

(a) Δ^=log⁡(30/10)=ln⁡3≈1.099\hat\Delta = \log(30/10) = \ln 3 \approx 1.099。p^=0.75\hat p = 0.75,曲率 −40×0.75×0.25=−7.5-40 \times 0.75 \times 0.25 = -7.5,标准误 ≈1/7.5≈0.365\approx 1/\sqrt{7.5} \approx 0.365。 (b) Δ^=log⁡(40/0)=+∞\hat\Delta = \log(40/0) = +\infty:最大似然不存在(Zermelo–Ford 条件不满足)。需要正则化(相当于先验,例如加上”各有 0.5 场”的伪计数得到 log⁡(40.5/0.5)≈4.39\log(40.5/0.5) \approx 4.39),或者贝叶斯方法(第 6 讲)。

练习 2(推导)。 (a) 证明 BT 对数似然的梯度各分量之和为 0(λ=0\lambda = 0)。 (b) 证明在最大似然估计处,每个选项的预期胜场等于实际胜场。

参考答案

(a) 每条比较对 sins_{i_n} 贡献 rn=yn−pnr_n = y_n - p_n,对 sjns_{j_n} 贡献 −rn-r_n,加起来为 0;所有比较的贡献相加仍为 0。 (b) 最大似然处梯度为 0:∑in=k(yn−pn)−∑jn=k(yn−pn)=0\sum_{i_n = k} (y_n - p_n) - \sum_{j_n = k}(y_n - p_n) = 0。整理:∑in=kyn+∑jn=k(1−yn)=∑in=kpn+∑jn=k(1−pn)\sum_{i_n = k} y_n + \sum_{j_n = k}(1 - y_n) = \sum_{i_n = k} p_n + \sum_{j_n = k}(1 - p_n)。左边是 kk 实际赢的场数,右边是模型预期 kk 赢的场数。

练习 3(证明)。证明 BT 对数似然的海森矩阵半负定。什么时候它(在”平均值为 0”的子空间上)是负定的?

参考答案

对任意 vv,v⊤(∇2ℓ)v=−1N∑nwn(vin−vjn)2≤0v^\top(\nabla^2\ell)v = -\frac{1}{N}\sum_n w_n (v_{i_n} - v_{j_n})^2 \le 0(wn=pn(1−pn)>0w_n = p_n(1-p_n) > 0)。等号成立 ⇔ 每条比较的两端 vv 值相等 ⇔ vv 在比较图的每个连通分量上是常数。所以比较图(无向)连通时,零空间只有全 1 向量,在”平均值为 0”的子空间上负定。

练习 4(Elo)。 (a) 从单条比较的对数似然推导 Elo 更新。 (b) 国际象棋常用 K=32K = 32(Elo 分)。换成本讲的自然对数单位,步长是多少? (c) 一位 1500 分的棋手赢了一位 1700 分的棋手,K=32K = 32 时他的分数增加多少?

参考答案

(a) log⁡P=ylog⁡σ(si−sj)+(1−y)log⁡σ(sj−si)\log P = y\log\sigma(s_i - s_j) + (1-y)\log\sigma(s_j - s_i),对 sis_i 求导得 y−σ(si−sj)y - \sigma(s_i - s_j),对 sjs_j 求导得相反数。沿梯度走步长 KK。 (b) Elo 分 = 自然单位 × 173.7,所以 K=32/173.7≈0.18K = 32/173.7 \approx 0.18。 (c) 预测胜率 E=1/(1+10200/400)=1/(1+10)≈0.240E = 1/(1 + 10^{200/400}) = 1/(1 + \sqrt{10}) \approx 0.240。增加 32×(1−0.240)≈24.332 \times (1 - 0.240) \approx 24.3 分;对手减少同样多。

练习 5(MAP)。目标函数写成”平均对数似然 −λ2∥s∥2- \frac{\lambda}{2}\lVert s \rVert^2“,证明它等价于先验 sk∼N(0,1/(Nλ))s_k \sim N(0, 1/(N\lambda)) 下的 MAP。如果数据量 NN 翻倍、λ\lambda 不变,相当于先验怎样变化?

参考答案

MAP 最大化 ∑nlog⁡P(⋅)−∑ksk2/(2τ2)\sum_n \log P(\cdot) - \sum_k s_k^2/(2\tau^2)。除以 NN:1N∑nlog⁡P(⋅)−12Nτ2∥s∥2\frac{1}{N}\sum_n \log P(\cdot) - \frac{1}{2N\tau^2}\lVert s\rVert^2。令 λ=1/(Nτ2)\lambda = 1/(N\tau^2) 即得,τ2=1/(Nλ)\tau^2 = 1/(N\lambda)。NN 翻倍、λ\lambda 不变,相当于先验方差减半——先验变”强”了。所以用”平均”写法时,数据越多,λ 应该越小(λ∝1/N\lambda \propto 1/N)才保持同样的先验;用交叉验证选 λ 时,要在和最终训练相同的数据规模下选(这也是交叉验证偏悲观的原因之一)。

练习 6(校准)。一个奖励模型对 200 对回答都给出”A 更好的概率 0.9”,其中 A 实际更好的有 144 对。 (a) 这一段的校准误差是多少?模型是过于自信还是过于保守? (b) 如果所有预测都在这一段,用温度缩放能修好吗?需要 TT 大于 1 还是小于 1?

参考答案

(a) 实际比例 144/200 = 0.72,预测 0.9,误差 0.18,过于自信。 (b) 能:需要把 0.9 拉回 0.72。σ(d)=0.9⇒d≈2.197\sigma(d) = 0.9 \Rightarrow d \approx 2.197;σ(d/T)=0.72⇒d/T≈0.944\sigma(d/T) = 0.72 \Rightarrow d/T \approx 0.944,T≈2.33>1T \approx 2.33 > 1。

练习 7(交叉验证)。你有 500 个提示词,每个提示词有 4 个回答的排序(拆成 6 对比较),要用交叉验证选奖励模型的正则化强度,再报告它在新提示词上的准确率。设计你的评估流程。

参考答案

先按提示词留出一个测试集(例如 100 个提示词),在最后只用一次。在剩下的 400 个提示词上做按提示词分组的 5 折交叉验证选 λ(同一个提示词的 6 对比较必须在同一折)。选好 λ 后用全部 400 个提示词重新训练,在 100 个测试提示词上报告准确率(以及对数损失、ECE),用按提示词重抽样的自助法给置信区间。如果还要比较多个模型结构,用嵌套交叉验证或再留一个验证集,避免”挑选之后的乐观”。

练习 8(DPO 预告)。DPO 的”分数”是 sθ(y)=βlog⁡(πθ(y∣x)/πref(y∣x))s_\theta(y) = \beta\log(\pi_\theta(y \mid x)/\pi_{\text{ref}}(y \mid x))。利用本讲 BT 梯度的形式,写出 DPO 损失对 θ\theta 的梯度,并解释它的直觉。

参考答案

令 m=sθ(yw)−sθ(yl)m = s_\theta(y_w) - s_\theta(y_l)。−log⁡σ(m)-\log\sigma(m) 对 mm 的导数是 −(1−σ(m))=−σ(−m)-(1 - \sigma(m)) = -\sigma(-m)。所以 ∇θL=−σ(−m) β [∇θlog⁡πθ(yw∣x)−∇θlog⁡πθ(yl∣x)]\nabla_\theta \mathcal{L} = -\sigma(-m)\,\beta\,\big[\nabla_\theta \log\pi_\theta(y_w \mid x) - \nabla_\theta\log\pi_\theta(y_l \mid x)\big]。 直觉:和 BT 的”残差”一样,σ(−m)\sigma(-m) 是”模型认为输家会赢的概率”——模型把这对排错得越厉害,更新越大;更新的方向是”提高赢家的对数概率、降低输家的对数概率”。第 9 讲会详细讨论。


13. 延伸阅读

课程教材

  • Truong, Haupt, Koyejo. Machine Learning from Human Preferences. 第 2 章 2.2–2.10 节。

Bradley–Terry 的最大似然

  • Zermelo. Die Berechnung der Turnier-Ergebnisse als ein Maximumproblem der Wahrscheinlichkeitsrechnung. 1929.
  • Ford. Solution of a Ranking Problem from Binary Comparisons. 1957.
  • Hunter. MM Algorithms for Generalized Bradley-Terry Models. Annals of Statistics 2004.
  • Shah et al. Estimation from Pairwise Comparisons: Sharp Minimax Bounds with Topology Dependence. JMLR 2016.(比较图的拓扑怎样决定估计误差)

在线学习与等级分

  • Elo. The Rating of Chessplayers, Past and Present. 1978.
  • Glickman. Parameter Estimation in Large Dynamic Paired Comparison Experiments. Applied Statistics 1999.(Glicko)
  • Herbrich, Minka, Graepel. TrueSkill: A Bayesian Skill Rating System. NeurIPS 2006.
  • Robbins, Monro. A Stochastic Approximation Method. 1951.

优化与正则化

  • Kingma, Ba. Adam: A Method for Stochastic Optimization. 2014.
  • Hastie, Tibshirani, Friedman. The Elements of Statistical Learning. 第 3、7 章(正则化、模型选择与交叉验证)。
  • Cawley, Talbot. On Over-fitting in Model Selection and Subsequent Selection Bias in Performance Evaluation. JMLR 2010.

评估与校准

  • Gneiting, Raftery. Strictly Proper Scoring Rules, Prediction, and Estimation. JASA 2007.
  • Guo, Pleiss, Sun, Weinberger. On Calibration of Modern Neural Networks. ICML 2017.(温度缩放)

14. 下一讲预告

本讲的最大似然给出一个最好的估计,再用海森矩阵近似它的不确定性。可是:数据很少时(一个新模型只打了几场全胜),正态近似不可靠;我们真正想要的往往是”对偏好的不确定性”本身——知道哪里不确定,才知道下一个问题该问什么(第 7 讲),才知道该探索还是利用(第 11~13 讲)。

第 6 讲讲贝叶斯估计与微调:

  • 贝叶斯 BT:先验 + 似然 → 后验;用 Metropolis–Hastings 采样得到后验分布,学会看诊断(多条链、接受率);拉普拉斯近似(用最大值处的海森矩阵近似整个后验——本讲的标准误就是它)。
  • 高斯过程偏好学习:当效用是特征的未知非线性函数时,怎样做非参数的贝叶斯推断。
  • 微调:在预训练的语言模型上加一个”打分头”,训练真正的神经网络奖励模型;过拟合、提前停止、奖励模型集成(量化不确定性的实用办法)。代码会用 PyTorch(CPU 即可)。
← 返回课程目录