4.6 信息论与假设检验、大偏差
4.4 与 4.5 两节讨论的是工程极限:压缩率与传输速率的上界。本节把视角转回统计推断,回答另一类问题:如果要用数据在两件事之间做判断,或者要从数据中估计一个参数,信息量能给出什么保证。第二章已经建立了假设检验框架与 Cramér-Rao 下界,本节补上信息论视角下的推导与量化结果。
两个方向会反复出现。其一是误差指数:样本量增大时,检验的错误概率以指数速度下降,下降速度由 KL 散度或它的变体决定。这一结果把定性的极限定理变成可以估算样本量的公式。其二是大偏差:大数定律只说样本均值收敛到期望,大偏差理论给出偏离以多快的指数速度被抑制,抑制速度由 KL 散度给出的速率函数控制。两者是同一个机制在两个问题上的表现。
本节按四条线索展开。4.6.1 节从信息不等式与 Cramér-Rao 下界开始,把 Fisher 信息与估计精度连接起来;4.6.2 节建立大偏差原理与 Cramér 定理,给出速率函数;4.6.3 节介绍 Sanov 定理,把速率函数解释为到约束集合的最小 KL 散度,并推广到过程的相对熵率;4.6.4 节回到假设检验,得到 Chernoff-Stein 引理与 Chernoff 信息;4.6.5 节整理集中不等式,说明在分布细节未知时如何得到可用的界;4.6.6 节小结。
4.6.1 信息不等式与 Cramér-Rao 下界
得分函数与 Fisher 信息
设数据
在正则条件下(可在积分号下求导),得分函数的期望为零。把
得分函数的方差称为 Fisher 信息:
再把期望为零这一等式对
样本量每翻一倍,Fisher 信息翻一倍。信息以线性速度积累,这一线性性会在下面的下界中表现为方差按
信息不等式
信息不等式(information inequality,通常称为 Cramér-Rao 下界)说明 Fisher 信息限制了任何无偏估计的精度。
设
证明。由无偏性,
由于
整理即得结论。等号成立要求得分函数与估计误差之间存在精确的线性关系
多参数情形把不等式升级为矩阵形式。参数为
对无偏估计,协方差矩阵满足
信息不等式的读法
下界说明参数的估计精度由分布族本身的局部结构决定,与使用哪种估计方法无关。分布越能分辨邻近的参数取值(Fisher 信息越大),可达到的方差越小。换成几何语言:参数方向上走一段距离
数据处理与有效性
Fisher 信息满足与 KL 散度同构的单调性。对样本做任何统计变换
等号成立当且仅当
把这段结论与渐近理论合起来,得到一个完整的图景。样本量小时精度受限,下界由 Fisher 信息给出;样本量大时极大似然估计渐近达到下界,因此中心极限定理给出的方差
import numpy as np
def fisher_bernoulli(p):
"""伯努利模型单样本的 Fisher 信息:I(p) = 1 / (p(1-p))"""
return 1.0 / (p * (1.0 - p))
def kl_bernoulli(p, q):
"""伯努利分布之间的 KL 散度(自然对数)"""
return p * np.log(p / q) + (1 - p) * np.log((1 - p) / (1 - q))
# 用重复抽样验证 n 个样本下无偏估计的方差与 Cramér-Rao 下界
rng = np.random.default_rng(0)
n, trials = 200, 20000
print("样本量 n =", n)
for p in [0.1, 0.3, 0.5, 0.8]:
samples = rng.binomial(1, p, size=(trials, n))
var_emp = samples.mean(axis=1).var()
bound = 1.0 / (n * fisher_bernoulli(p))
print(f" p = {p:.1f}: 经验方差 = {var_emp:.6f},CR 下界 = {bound:.6f}")
# KL 的二阶展开:D(Bern(p) || Bern(p+d)) ≈ 0.5 * I(p) * d^2
p = 0.3
print("\n步长 d 精确 KL 0.5 * I(p) * d^2")
for d in [0.1, 0.05, 0.01, 0.001]:
print(f" {d:.3f} {kl_bernoulli(p, p + d):.4e} {0.5 * fisher_bernoulli(p) * d ** 2:.4e}")
# 经验方差与下界数值接近,相对偏差在百分之一以内,说明样本均值达到下界
# 步长减小时精确 KL 与二次近似之比趋于 1输出显示经验方差与下界的相对偏差在百分之一以内;右半部分的比值随
4.6.2 大偏差原理与 Cramér 定理
大数定律之外的精细信息
设
两个结论都没有覆盖第三种情形:偏离量
指数中的
Chernoff 上界
上界来自马尔可夫不等式与矩生成函数。设
第二步用了马尔可夫不等式,第三步用独立性把期望写成
上界随
这一构造称为 Chernoff 上界(Chernoff bound)。速率函数
非负性:
在均值处为零:
凸性与局部形状:Legendre 变换是凸函数的共轭,
Cramér 定理
上界是否精确,由下面的定理回答。
Cramér 定理:设
对左尾
它的均值恰好为
对某个常数
速率函数与 KL 散度
速率函数可以写成 KL 散度的形式,这是信息论视角的关键一步:
最小值在指数倾斜分布处取到。证明用到 4.2 节的对数矩生成的变分表示(Gibbs 变分):对任意分布
代入
伯努利分布给出一个闭式的例子。对
取
下列代码验证三件事:速率函数与 KL 表达式一致、Legendre 变换的数值结果与闭式公式吻合、尾概率的对数除以
import numpy as np
from scipy import optimize, stats
def rate_bernoulli(p, a):
"""伯努利分布的速率函数 I(a) = D(Bern(a) || Bern(p))(自然对数)"""
if a in (0.0, 1.0):
return np.inf
return a * np.log(a / p) + (1 - a) * np.log((1 - a) / (1 - p))
def rate_legendre(p, a):
"""用 Legendre 变换数值求解:sup_theta {theta * a - log M(theta)}"""
def negative(theta):
lam = np.log(p * np.exp(theta) + (1 - p)) # Lambda(theta) = log(p e^theta + 1 - p)
return -(theta * a - lam)
res = optimize.minimize_scalar(negative, bounds=(-30, 30), method='bounded')
return -res.fun
p = 0.5
print("a KL 表达式 Legendre 变换")
for a in [0.55, 0.6, 0.7, 0.8]:
print(f" {a:.2f} {rate_bernoulli(p, a):.6f} {rate_legendre(p, a):.6f}")
# 尾概率的对数除以 n 收敛到 -I(a)
a = 0.6
I = rate_bernoulli(p, a)
print(f"\nI(0.6) = {I:.6f} 自然对数单位 = {I / np.log(2):.6f} 比特")
print("n 精确尾概率 (1/n) ln P -I(a)")
for n in [10, 50, 100, 1000, 5000, 20000]:
tail = stats.binom.sf(int(np.ceil(a * n)) - 1, n, p) # P(X >= a * n)
print(f" {n:5d} {tail:.3e} {np.log(tail) / n:+.6f} {-I:+.6f}")
# 两列数值完全一致,说明 Legendre 变换给出的就是 KL 表达式
# (1/n) ln P 从 -0.0976 缓慢逼近 -0.0201,修正项量级为 log(n)/n,收敛速度慢输出中 Legendre 变换与闭式公式逐位相同,确认速率函数就是 KL 散度。第三部分的收敛过程展示了这一领域的常态:修正项是
4.6.3 Sanov 定理与相对熵率
类型与类型类
Cramér 定理处理的是一个具体的统计量(样本均值),Sanov 定理把它推广到整个经验分布。设字母表
所有频率向量相同的序列构成一个类型类
指数上的
本小节的公式以 2 为底展开,熵与 KL 散度都按比特计;若改用自然对数,把指数中的量除以
乘上类型类的大小,用上面对
熵在乘法中恰好抵消,剩下的只有 KL 散度。这就是类型方法的核心结论:在熵的尺度上,偏离真实分布
Sanov 定理
类型方法直接给出集合的概率估计。
Sanov 定理:设
这里两侧都按比特计算(对数以 2 为底,KL 散度也以 2 为底)。含义是:经验分布落到一个集合外这件事的概率,由集合内离真实分布最近的分布决定。集合越容易与真实分布混淆(最小 KL 越小),越难通过样本量把它排除。
Cramér 定理是 Sanov 定理的一个投影。取
相对熵率
对过程数据,单符号的 KL 散度需要换成按符号平均的版本。设两个平稳过程的
存在,则称它为相对熵率(relative entropy rate)。它是 4.1 节熵率的对应物:熵率度量过程每符号的平均不确定性,相对熵率度量两个过程每符号的平均差异。
马尔可夫链有闭式表达。设真实链的转移矩阵为
即按
下列代码用三符号字母表验证类型类的概率估计:给定真实分布
import numpy as np
from scipy import stats
p = np.array([0.5, 0.3, 0.2]) # 真实分布
q = np.array([0.4, 0.4, 0.2]) # 目标类型的频率
D = float(np.sum(q * np.log(q / p)))
print(f"D(Q||P) = {D:.6f} 自然对数单位 = {D / np.log(2):.6f} 比特")
print("n P^n(T(Q)) 2^(-nD) 比值 比值 * n (1/n) log2 P")
for n in [10, 20, 100, 1000, 10000]:
counts = (q * n).astype(int)
prob = stats.multinomial.pmf(counts, n, p) # 类型类的精确概率
bound = 2 ** (-n * D / np.log(2))
print(f" {n:6d} {prob:.4e} {bound:.4e} {prob / bound:.4f} {prob / bound * n:.4f} {np.log2(prob) / n:+.6f}")
# 比值随 n 以 1/n 的量级下降(比值 * n 稳定在 0.89 附近),即概率等于 2^(-nD) 乘一个多项式因子
# 最后一列从 -0.397 降到 -0.039,单调逼近 -D/log2 = -0.0372输出验证了三个要点。类型类概率确实位于下界
4.6.4 假设检验的误差指数
框架回顾
回到 2.11 节的设定。两个假设
样本量趋于无穷时,两个错误概率不可能同时保持正的下界(否则两个假设永远无法可靠区分)。可争取的目标有两种:让其中一个错误以指数速度衰减,或让等先验下两者之和以指数速度衰减,问题在于衰减速度是多少。信息论给出的答案由两条结论组成,分别对应这两种设定。
Chernoff-Stein 引理
固定第一类错误。设
这一结论称为 Chernoff-Stein 引理(或 Stein 引理),右端的
可达性方向由 4.1 节的典型性直接给出。固定
反向方向说明
由大数定律,它在
代回第二类错误:
指数中的 KL 散度从零假设的分布指向备择的分布。交换两个假设,指数变为
贝叶斯情形与 Chernoff 信息
等先验、最小化总错误。当两个假设的先验相等时,自然的准则是最小化
极限与
因此
对称地也有
最优
在
这个分布在 KL 意义下与两个假设等距,检验阈值落在它附近;序列落在这条分界线上时两个假设最难区分。这一构造与 4.3 节的信息投影相同:在连接两个分布的指数族中寻找等距点。
数值对比说明两个指数的关系。取
两者相差约
三个指数可以放在一起对照。
| 检验设定 | 错误与指数 |
|---|---|
| 固定第一类错误( | 第二类错误 |
| 固定第一类错误(假设交换) | 第二类错误 |
| 等先验,最小化总错误 | 总错误 |
表中的指数与 KL 都按自然对数计。
收敛速度
指数结论描述
import numpy as np
from scipy import stats
p0, p1 = 0.4, 0.6
def kl(a, b):
return a * np.log(a / b) + (1 - a) * np.log((1 - a) / (1 - b))
def chernoff(p0, p1, grid=200001):
"""在网格上最大化 (1 - lambda) D_lambda,得到 Chernoff 信息"""
s = np.linspace(0, 1, grid)
f = p0 ** s * p1 ** (1 - s) + (1 - p0) ** s * (1 - p1) ** (1 - s)
i = np.argmax(-np.log(f))
return -np.log(f[i]), s[i]
D = kl(p0, p1)
C, s_star = chernoff(p0, p1)
print(f"Stein 指数 D(P||Q) = {D:.6f} 自然对数单位 = {D / np.log(2):.6f} 比特")
print(f"Chernoff 信息 C = {C:.6f} 自然对数单位 = {C / np.log(2):.6f} 比特,最优 lambda = {s_star:.3f}")
# 固定 alpha = 0.05 的似然比检验:接受 H0 当频数不超过 H0 的 95% 分位数
print("\n固定第一类错误(alpha <= 0.05):")
for n in [1280, 2560, 5120]:
thr = stats.binom.ppf(0.95, n, p0)
log_beta = stats.binom.logcdf(thr, n, p1)
print(f" n = {n:5d}: (1/n) log2 beta = {log_beta / n / np.log(2):+.5f}")
print(f" 目标斜率 -D / log2 = {-D / np.log(2):+.5f}")
# 等先验贝叶斯检验:阈值取在 n/2(两个参数的中点)
print("\n等先验贝叶斯检验:")
for n in [2560, 5120, 10240, 20480]:
log_pe = np.log(0.5) + np.logaddexp(stats.binom.logsf(n // 2, n, p0),
stats.binom.logsf(n // 2 - 1, n, p0))
print(f" n = {n:5d}: (1/n) log2 Pe = {log_pe / n / np.log(2):+.5f}")
print(f" 目标斜率 -C / log2 = {-C / np.log(2):+.5f}")
# beta 的斜率从 -0.101 到 -0.105,向 -0.117 缓慢逼近;阈值与均值的偏移为 O(1/sqrt(n)),收敛慢
# Pe 的斜率从 -0.031 到 -0.030,向 -0.029 逼近,收敛明显更快输出确认两个指数都成立,且收敛速度的差别与阈值理论一致:
4.6.5 Hoeffding 界与集中不等式
从速率函数到普适上界
Chernoff 上界需要矩生成函数,前提是分布族已知。若只知道变量有界,可用的工具是 Hoeffding 不等式。
Hoeffding 引理:设
引理的证明用到有界性与
所有变量都落在
Hoeffding 界与速率函数的关系可以直接比较。在均值附近
使用方差信息的界
引入方差信息可以显著收紧指数。设
小偏离区指数为
依赖结构与泛化界
独立同分布是上述结论的共同前提,去掉它需要新的工具。
Azuma 不等式处理鞅差分序列:若
McDiarmid 不等式(有界差分不等式)处理有界敏感性:若改变
它覆盖了许多实际场景:交叉验证误差、排序统计量、图算法输出都能写成满足有界差分的函数。在统计学习理论中,训练误差与测试误差之差用有界差分控制,泛化界形如
界的选择
分布已知(参数模型):用速率函数
下列代码把同一个尾概率的精确值、Chernoff 上界、Hoeffding 界与正态近似放在一起比较,观察各条结论的松紧程度与指数斜率。
import numpy as np
from scipy import stats
def rate_bernoulli(p, a):
return a * np.log(a / p) + (1 - a) * np.log((1 - a) / (1 - p))
p, a = 0.5, 0.6
I = rate_bernoulli(p, a)
print("n 精确尾概率 Chernoff 界 Hoeffding 界 正态近似")
for n in [50, 100, 500, 1000, 5000]:
tail = stats.binom.sf(int(np.ceil(a * n)) - 1, n, p)
cram = np.exp(-n * I)
hoeff = np.exp(-2 * n * (a - p) ** 2)
norm = stats.norm.sf((a - p) / np.sqrt(p * (1 - p) / n))
print(f" {n:5d} {tail:.3e} {cram:.3e} {hoeff:.3e} {norm:.3e}")
# 两个界都始终大于精确值;此处伯努利(0.5)的方差恰为 1/4,Hoeffding 的指数 0.02 只略低于真速率 0.0201
# 正态近似没有上界性质,数值上接近但不构成保证输出显示两个界都保持有效(大于精确值),在这个特殊情形下数值接近(伯努利的方差恰好使两者差别很小)。正态近似在中心区域准确,但缺少误差界,不能替代大偏差结论。样本量增大时,各列按各自的指数速率下降,指数之间的差别在概率量级上被放大。
4.6.6 本节小结
从信息量到误差极限
本节把信息量变成了误差极限。估计问题中,Fisher 信息给出精度下界:无偏估计的方差不小于
贯穿全节的量是 KL 散度:它以局部曲率的形式出现在估计精度中,以速率函数的形式出现在尾概率中,以指数或最小化目标的形式出现在检验与 Sanov 定理中。4.1 节的数据处理不等式保证这些量在信息变换下只减不增,因此上述极限无法通过处理数据来突破。
本节的结果与机器学习有直接对应。交叉熵与 KL 正则出现在训练目标中,互信息估计与信息瓶颈出现在表示学习中,PAC-Bayes 与依赖数据的界出现在泛化分析中,这些联系都建立在同样的指数与散度机制上。下一节回到机器学习,讨论信息瓶颈、互信息估计、对比学习与泛化界;4.8 节继续处理算法信息论与前沿方向。
练习题
第 1 题 概念推导
设
参考答案
累积量函数:伯努利的矩生成函数为
Chernoff 上界:对
求最优参数:对
解得
倾斜分布的均值:以
代入
速率函数:把
数值验证:
第 2 题 计算推理
设
参考答案
KL 散度:
两个方向不相等,差值约
Chernoff 信息:对
数值结果为
计算得
大小关系:
样本量估算。固定第一类错误(
等先验贝叶斯检验的指数为
差异来自检验目标:把一侧错误冻结为常数的代价只是一侧不衰减,而两侧都要降到
两个数都是忽略修正项的量级估算,修正方向相反。固定第一类错误的情形实际需要的样本量略多于估算值,因为阈值的偏移使有效指数略低于极限;贝叶斯情形实际需要的略少于估算值,因为亚指数因子带来指数公式之外的额外衰减。两类修正都在常数倍范围内,量级估算足以判断方案是否可行。
第 3 题 代码验证
用精确的二项分布概率验证 4.6.4 节的两个误差指数:对
参考答案
import numpy as np
from scipy import stats
p0, p1 = 0.4, 0.6
def kl(a, b):
return a * np.log(a / b) + (1 - a) * np.log((1 - a) / (1 - b))
def chernoff(p0, p1, grid=200001):
s = np.linspace(0, 1, grid)
f = p0 ** s * p1 ** (1 - s) + (1 - p0) ** s * (1 - p1) ** (1 - s)
i = np.argmax(-np.log(f))
return -np.log(f[i]), s[i]
D = kl(p0, p1)
C, s_star = chernoff(p0, p1)
print(f"D = {D:.6f} nats, C = {C:.6f} nats, lambda* = {s_star:.3f}")
print(f"目标斜率(比特): 固定 alpha = {-D / np.log(2):+.5f}, 贝叶斯 = {-C / np.log(2):+.5f}")
# 固定第一类错误:接受 H0 当频数不超过 H0 的 95% 分位数
print("\n固定第一类错误:")
for n in [1280, 2560, 5120]:
thr = stats.binom.ppf(0.95, n, p0)
log_beta = stats.binom.logcdf(thr, n, p1)
print(f" n = {n:5d}: (1/n) log2 beta = {log_beta / n / np.log(2):+.5f}")
# 等先验贝叶斯:阈值在中点 n/2
print("\n等先验贝叶斯:")
for n in [2560, 5120, 10240, 20480]:
log_pe = np.log(0.5) + np.logaddexp(stats.binom.logsf(n // 2, n, p0),
stats.binom.logsf(n // 2 - 1, n, p0))
print(f" n = {n:5d}: (1/n) log2 Pe = {log_pe / n / np.log(2):+.5f}")输出(节选):
D = 0.081093 nats, C = 0.020411 nats, lambda* = 0.500
目标斜率(比特): 固定 alpha = -0.11699, 贝叶斯 = -0.02945
固定第一类错误:
n = 1280: (1/n) log2 beta = -0.09551
n = 2560: (1/n) log2 beta = -0.10099
n = 5120: (1/n) log2 beta = -0.10521
等先验贝叶斯:
n = 2560: (1/n) log2 Pe = -0.03127
n = 5120: (1/n) log2 Pe = -0.03046
n = 10240: (1/n) log2 Pe = -0.03000
n = 20480: (1/n) log2 Pe = -0.02975结果解读:
收敛速度差别的原因:固定第一类错误时,检验阈值位于零假设均值之外约
第 4 题 综合应用
某产品的两个版本进行线上实验:版本 A 的点击率为
参考答案
两个指数(以
Chernoff 信息约为 Stein 指数的四分之一,两个分布的差异很小,对称检验的难度显著更高。
样本量估算:
固定第一类错误(
等先验(
精确计算:用二项分布直接计算两种检验的错误概率(贝叶斯检验的阈值比例为
与估算对照:固定第一类错误的精确需求(约
Hoeffding 界:若只知道点击率落于
这个数目大于前面两个精确需求(约
结论:指数公式适合快速估算量级,判断实验是否可行;确定最终样本量时,用精确计算或仿真在校准常数因子之后再定。两个版本的差异越小时,两个指数都按差异的平方缩小(局部近似下
常见错误
错误 1 · 把 Chernoff 界与 Chernoff 信息混为一谈
原因:两个概念的名字相似,出现的位置也邻近,容易被当作同一个量。Chernoff 界是推导尾概率上界的技术(马尔可夫不等式加矩生成函数优化),得到的指数是速率函数
解决:按用途区分命名。讨论单个分布尾概率时写速率函数或 Chernoff 上界;讨论两个分布之间的检验难度时写 Chernoff 信息,并说明它与 Rényi 散度的关系
错误 2 · 把 KL 散度当作对称量,或在 Stein 引理中弄反方向
原因:KL 散度不满足对称性,Stein 指数是
解决:书写结论时把零假设与备择假设的分布明确代入公式,先写出
错误 3 · 把指数速率当作有限样本的精确样本量
原因:
解决:指数公式用于量级估算与方案比较,最终样本量用精确计算(离散分布可直接查二项分布)、仿真或已知的修正公式校准。报告结论时说明估算的保守方向,避免把估算值当作精确需求。
错误 4 · 在重尾分布或强依赖数据上直接套用上述结论
原因:Cramér 定理与 Stein 引理要求矩生成函数在原点邻域有限,Hoeffding 界要求有界性,Azuma 与 McDiarmid 要求鞅差分或有界差分。重尾分布(如帕累托分布
解决:使用前检查前提。重尾数据改用次指数或次高斯假设之外的工具,或对数据做变换后重新验证;时间序列数据用混合条件或对子采样后的近似独立样本计算指数,并用块自助法(2.12 节与非参数方法)估计错误率的衰减曲线,与理论指数对照。