4.7 信息论与机器学习
前面六节建立了信息量的定义、性质、极限与误差指数,这些内容以理论分析为主。本节回到机器学习,整理信息论的三个用途:作为训练目标的一部分,作为表示学习的准则,作为泛化分析的工具。
作为训练目标,交叉熵损失、KL 正则与证据下界都以 KL 散度为核心,训练过程可以读成分布之间距离的最小化。作为表示学习的准则,信息瓶颈用互信息描述压缩与预测的权衡,对比学习用互信息的变分下界构造训练目标。作为分析工具,PAC-Bayes 界与互信息泛化界用 KL 散度度量模型复杂度,给出测试误差与训练误差之差的界。
一个反复出现的困难也值得提前说明:高维连续变量之间的互信息无法直接计算,只能用变分下界估计。4.6 节的证据下界、大偏差与 Gibbs 变分在这里以估计器的形式重新出现,而估计的紧致程度决定了信息论准则在实践中能做多精确。本节按目标函数、表示学习、估计器、泛化界的顺序展开。
4.7.1 训练目标中的交叉熵与 KL 正则
交叉熵与最大似然
分类模型的训练目标通常写成交叉熵:对样本
其中
标签分布的熵
从最大似然的角度看,同一件事还有第三种读法:最小化交叉熵就是最大化训练集的对数似然(2.10 节)。三种读法在选择训练目标时给出不同的推广方向。需要模型覆盖标签分布的多个模态时用正向 KL(
训练中的 KL 正则
许多训练目标在损失之外加上 KL 惩罚,形式为
其中
知识蒸馏:学生模型在软标签上训练,参考分布是教师模型的输出。KL 项传递的不只是标签,还有教师对各候选的相对偏好(暗知识),在同样的数据量下给学生更多的监督信息。
策略优化中的信任域:强化学习更新策略时,KL 惩罚限制新策略与旧策略(或参考策略)的偏离,防止一次更新把分布推到完全不同的区域。这一约束的物理含义是控制每步的信息量:单步允许的分布变化对应互信息或 KL 的预算。
生成模型的先验约束:变分自编码器的编码分布被拉向先验,扩散模型的训练目标可以整理成去噪得分匹配与 KL 的组合。这类约束的作用在下一节以率的形式重新出现。
为什么 KL 惩罚常用反向方向
4.7.2 变分推断的信息论读法
证据下界的三种写法
2.12 节介绍了变分推断的框架:用编码分布
它与对数证据的关系是
差距由近似后验与真实后验之间的 KL 给出。最大化 ELBO 同时做两件事:提高重构项,把近似后验推向真实后验。
换成信息论的语言,两项各有名字。第一项是失真(distortion):给定隐变量后重建数据的对数似然,最大化它等于最小化重构误差。第二项是率(rate)的上界:对所有样本取期望,
其中
重构成正比于负失真,KL 项构成率的惩罚。变分自编码器因此是在失真与率之间做权衡:率是编码器保留了多少关于输入的信息,失真是这些信息对重建的贡献。这与 4.4 节率失真理论的形式一致,
就是率失真的拉格朗日形式,
玩具模型验证
取
失真取重建误差
import numpy as np
def kl_gauss(m1, s1, m2, s2):
"""两个一维高斯分布之间的 KL 散度"""
return np.log(s2 / s1) + (s1 ** 2 + (m1 - m2) ** 2) / (2 * s2 ** 2) - 0.5
# 分解验证:E_x[D(q(z|x)||p(z))] = I(X;Z) + D(q(z)||p(z))
a, sigma = 0.8, 0.5
I_analytic = 0.5 * np.log(1 + a ** 2 / sigma ** 2) # 高斯信道互信息
Dq = kl_gauss(0.0, np.sqrt(a ** 2 + sigma ** 2), 0.0, 1.0) # D(q(z)||p(z))
rate_analytic = kl_gauss(0.0, sigma, 0.0, 1.0) + 0.5 * a ** 2 # E_x D(q(z|x)||p(z))
print(f"a = {a}, sigma = {sigma}")
print(f" I(X;Z) = {I_analytic:.6f},D(q(z)||p(z)) = {Dq:.6f}")
print(f" 两者之和 = {I_analytic + Dq:.6f},与 E_x D(q(z|x)||p(z)) = {rate_analytic:.6f} 一致")
# 蒙特卡洛核对
rng = np.random.default_rng(0)
x = rng.normal(size=200000)
print(f" 蒙特卡洛估计 = {np.mean(kl_gauss(a * x, sigma, 0.0, 1.0)):.6f}")
# 率失真权衡:a = 1 时,率与失真的组合随 sigma 变化
print("\nsigma 失真(= sigma^2) 率(= I(X;Z), 自然对数单位)")
for sigma in [0.2, 0.5, 1.0, 2.0]:
print(f" {sigma:.1f} {sigma ** 2:.2f} {0.5 * np.log(1 + 1 / sigma ** 2):.4f}")
# 失真增大时率下降,与 4.4 节率失真曲线的单调形状一致输出确认分解关系在小数点后三位一致,蒙特卡洛估计与解析值相符;最后一组数据显示率随失真增大而下降:失真
4.7.3 信息瓶颈
问题设定
给定输入
第一项要求压缩,第二项要求预测能力,
与 4.4 节的率失真问题同构:那里的失真函数换成
与其他方法的联系
信息瓶颈的三条推论。
充分统计量的推广。若
确定性编码的限制。若限制
深度网络的信息平面。把每一层的输出看作
4.7.4 互信息估计
困难所在
除了离散或高斯等可解析情形,互信息没有闭式。直接估计面临两个问题。
第一,互信息要对数密度比
Donsker-Varadhan 下界与 MINE
可用的工具是变分下界。对任意函数
等号在
实践中的问题是方差:指数项对
其他下界形式
把
它的方差更低,代价是界更松。更一般地,4.2 节的
下列代码在二维高斯模型上演示这一构造。设
import numpy as np
from scipy import optimize, stats
rho = 0.7
true_mi = -0.5 * np.log(1 - rho ** 2)
print(f"真实互信息 I(X;Z) = {true_mi:.6f} 自然对数单位 = {true_mi / np.log(2):.6f} 比特")
# 在网格上用数值积分计算 DV 目标:E_p[F] - log E_{p*p}[e^F],F 取二次型
g = np.linspace(-4, 4, 161)
h = g[1] - g[0]
xx, zz = np.meshgrid(g, g, indexing='ij')
p_joint = stats.multivariate_normal.pdf(
np.stack([xx, zz], axis=-1), mean=[0, 0], cov=[[1, rho], [rho, 1]]) * h ** 2
p_prod = np.outer(stats.norm.pdf(g), stats.norm.pdf(g)) * h ** 2
def negative_dv(theta):
c1, c2, c3 = theta # F = c1 * x * z + c2 * x^2 + c3 * z^2
F = c1 * xx * zz + c2 * xx ** 2 + c3 * zz ** 2
return -(np.sum(F * p_joint) - np.log(np.sum(np.exp(F) * p_prod)))
res = optimize.minimize(negative_dv, np.zeros(3), method='Nelder-Mead',
options={'xatol': 1e-8, 'fatol': 1e-10, 'maxiter': 4000})
c1, c2, c3 = res.x
print(f"最优评论家:c1 = {c1:.4f}(理论值 rho / (1 - rho^2) = {rho / (1 - rho ** 2):.4f})")
print(f" c2 = {c2:.4f}, c3 = {c3:.4f}(理论值 -1/2 * (1/(1-rho^2) - 1) = {-0.5 * (1 / (1 - rho ** 2) - 1):.4f})")
print(f"Donsker-Varadhan 下界 = {-res.fun:.6f}(不超过真实值,差距来自数值积分离散化)")
# 最优评论家与对数密度比只差常数,验证了取等号的条件输出显示最优系数与理论值吻合(
4.7.5 对比学习与 InfoNCE
InfoNCE 目标
对比学习使用一个更简单的目标。给定一批样本,每批包含一个正样本对
与互信息的关系
InfoNCE 损失与互信息之间的结论是
差号两侧的含义值得拆开看。右端随负样本数
温度参数决定评分的尺度。温度低使 softmax 接近硬分配,训练集中在最难的负样本上,梯度方差大;温度高使分布平滑,负样本的贡献更均衡。这一取舍与 4.3 节指数族中自然参数的尺度问题同源:评分函数的尺度决定了目标函数关注哪个区域的样本。
与其他目标的统一
几个经典目标可以放在同一框架下。
噪声对比估计(NCE)用逻辑回归区分数据与噪声样本,是 InfoNCE 在
下列代码在离散信道上验证 InfoNCE 下界。输入
import numpy as np
from scipy.special import logsumexp
m, eps = 16, 0.3
p_flip = eps / (m - 1)
H_Z = np.log(m)
H_Z_given_X = -((1 - eps) * np.log(1 - eps) + (m - 1) * p_flip * np.log(p_flip))
I_true = H_Z - H_Z_given_X
print(f"I(X;Z) = {I_true:.6f} 自然对数单位 = {I_true / np.log(2):.6f} 比特,log m = {np.log(m):.4f}")
p_zx = np.full((m, m), p_flip) # p_zx[z, x] = P(Z = z | X = x)
np.fill_diagonal(p_zx, 1 - eps)
rng = np.random.default_rng(1)
trials = 20000
x = rng.integers(0, m, size=trials)
flip = rng.random(trials) < eps
z_pos = x.copy()
z_pos[flip] = rng.integers(0, m - 1, size=int(flip.sum()))
z_pos[flip] += (z_pos[flip] >= x[flip]).astype(int) # 保证翻转后不等于原符号
print("K log K - L 与真实值之差")
for K in [2, 4, 8, 16, 64, 256]:
z_neg = rng.integers(0, m, size=(trials, K - 1))
z_all = np.concatenate([z_pos[:, None], z_neg], axis=1)
scores = np.log(p_zx[z_all, x[:, None]]) # 评论家取 log p(z|x)
L = float(-np.mean(scores[:, 0] - logsumexp(scores, axis=1)))
print(f"{K:4d} {np.log(K) - L:.4f} {I_true - (np.log(K) - L):+.4f}")
# log K - L 始终不超过真实互信息,且随 K 增大单调逼近
# K = 2 时差距 0.96,K = 256 时缩小到 0.02输出验证了界的两个性质:
4.7.6 泛化界:PAC-Bayes 与互信息
PAC-Bayes 界
4.6 节的集中不等式控制单个假设的经验误差与真实误差之差;模型选择涉及整个假设类,需要一致性的界。PAC-Bayes 处理的是随机化预测器:算法输出参数分布
右端由经验误差与复杂度项组成,复杂度项的核是后验与先验之间的 KL:算法通过观察数据把先验更新为后验,KL 度量更新的幅度。这一项的读法与 4.7.1 节的 KL 正则一致,区别在于出现在界的右端而不是损失里,因此可以把界本身当作训练目标:在若干组先验与后验参数化的组合上最小化右端。这种做法在小型网络上得到的界与测试误差接近,说明界在小样本下并非完全空洞。
PAC-Bayes 的证明思路给出了理解界的工具。对固定先验与后验,经验误差与真实误差之差可以用 4.6 节的变分表示控制:把 Gibbs 变分
用于对数似然比,再对假设类取并集界。KL 项从变分表示中自然出现。这一结构也说明界对先验的选择敏感:先验在训练前固定,选择与后验接近的先验会减小 KL。
互信息泛化界
另一类界直接使用数据与模型输出之间的互信息。设训练集
含义是:模型输出保留的训练集信息越多,泛化差距的界越大。这一读法与直觉一致:把训练集记住的模型在新数据上表现不稳;带有随机性(如随机初始化、随机扰动、dropout)的算法输出与数据的互信息更小,界更紧。
使用这一结论时有两个前提要检查。第一,
三类信息量的作用对比
训练目标中的 KL:优化对象,直接进入梯度,度量模型分布与参考分布的偏离。 表示学习中的互信息:设计准则,用变分下界近似,权衡压缩与预测。 泛化界中的 KL 与互信息:分析工具,出现在界的右端,度量算法对数据的依赖程度。 三者形式相同,位置不同;混用会把优化目标当作保证,或者把分析工具当作可直接优化的损失。
4.7.7 本节小结
信息论在机器学习中的三个位置
本节把前面的信息量落到机器学习的三个位置。目标函数层面,交叉熵等于标签分布的熵加 KL 散度,最小化交叉熵等价于最小化模型与标签分布的距离;KL 正则以参考分布为锚点限制模型的偏离幅度,蒸馏、信任域与生成模型都用这一形式。表示学习层面,ELBO 的期望等于负失真减率,率由编码器互信息构成,聚合后验与先验的 KL 是率的上界;信息瓶颈在压缩与预测之间做权衡,与率失真问题同构;对比学习用 InfoNCE 把互信息的下界转成分类损失,界为
至此信息论在应用层面的内容完成。最后一节处理三个更专门的方向:算法信息论把熵推广到单个对象的描述长度,差分隐私用 KL 的变体定义隐私强度,量子信息论把熵推广到密度矩阵。
练习题
第 1 题 概念推导
证明证据下界的两种分解:其一,
参考答案
第一个分解:由贝叶斯公式,
两侧在
前两项是 ELBO,最后一项是近似后验与真实后验的 KL。结论说明最大化 ELBO 的另一个效果是缩小近似后验的误差:ELBO 越小,两者差距越大,下界越松。
第二个分解:把左侧展开:
第一项按定义是
解释:第一个分解说明 ELBO 是证据的下界,优化它同时在做近似后验的修正。第二个分解说明编码项
第 2 题 计算推理
在 4.7.2 节的玩具模型中取
参考答案
两点的率与失真:
两点的对比给出率失真曲线的两个位置:低失真伴随高率,高失真允许低率,单调关系与 4.4 节的率失真函数一致。
重构质量下降的原因:失真项
第 3 题 代码验证
用 4.7.5 节的离散信道模型(
参考答案
import numpy as np
from scipy.special import logsumexp
def experiment(m, eps, scorer, K_list, trials=20000, seed=1):
p_flip = eps / (m - 1)
H_Z = np.log(m)
H_Z_given_X = -((1 - eps) * np.log(1 - eps) + (m - 1) * p_flip * np.log(p_flip))
I_true = H_Z - H_Z_given_X
p_zx = np.full((m, m), p_flip)
np.fill_diagonal(p_zx, 1 - eps)
rng = np.random.default_rng(seed)
x = rng.integers(0, m, size=trials)
flip = rng.random(trials) < eps
z_pos = x.copy()
z_pos[flip] = rng.integers(0, m - 1, size=int(flip.sum()))
z_pos[flip] += (z_pos[flip] >= x[flip]).astype(int)
rows = []
for K in K_list:
z_neg = rng.integers(0, m, size=(trials, K - 1))
z_all = np.concatenate([z_pos[:, None], z_neg], axis=1)
scores = scorer(x[:, None], z_all, p_zx)
L = float(-np.mean(scores[:, 0] - logsumexp(scores, axis=1)))
rows.append((K, np.log(K) - L))
return I_true, rows
K_list = [2, 16, 64, 256]
# 实验一:eps = 0.1,评论家取 log p(z|x)
I_true, rows = experiment(16, 0.1, lambda x, z, p: np.log(p[z, x]), K_list)
print(f"eps = 0.1:真实互信息 = {I_true:.4f}")
for K, b in rows:
print(f" K = {K:4d}: log K - L = {b:.4f},差距 = {I_true - b:+.4f}")
# 实验二:eps = 0.3,评论家换成指示函数乘以 10
I_true2, rows2 = experiment(16, 0.3, lambda x, z, p: 10.0 * (z == x), K_list)
print(f"\n未校准评分:真实互信息 = {I_true2:.4f}")
for K, b in rows2:
print(f" K = {K:4d}: log K - L = {b:.4f},差距 = {I_true2 - b:+.4f}")输出(节选):
eps = 0.1:真实互信息 = 2.1767
K = 2: log K - L = 0.5474,差距 = +1.6293
K = 16: log K - L = 1.7850,差距 = +0.3917
K = 256: log K - L = 2.1525,差距 = +0.0242
未校准评分:真实互信息 = 1.3493
K = 2: log K - L = 0.2932,差距 = +1.0561
K = 16: log K - L = 0.1561,差距 = +1.1932
K = 64: log K - L = -0.2674,差距 = +1.6167现象一:
现象二:未校准的评分函数仍然给出成立的界(数值始终不超过真实互信息),但数值系统性偏低,并且不再随
第 4 题 综合应用
某团队训练一个对比学习模型,正样本对来自同一物体的两个视图,负样本取自当前批次的其他样本。他们计划用
参考答案
三个前提条件:
其一,评论家质量。界对任意评论家成立,但只有接近最优评论家(对数密度比)时数值才接近真实互信息。报告的数值前需要验证评论家的训练是否充分,例如观察损失在验证集上是否收敛,或用不同容量与不同随机种子的评论家检查稳定性。
其二,负样本的分布。界要求负样本从边缘分布
其三,批大小与
所需
温度与批大小的相互影响:温度决定评分的尺度,等价于改变 softmax 的尖锐程度。温度过低时训练集中在最难的负样本上,少量负样本主导梯度,
常见错误
错误 1 · 把互信息下界当作精确的互信息估计
原因:InfoNCE 的
解决:报告数值时同时给出估计器的定义、批大小(或
错误 2 · 在确定性编码器上讨论互信息
原因:确定性映射
解决:如果分析目标是编码器携带的信息量,在表示上加入可控噪声(如变分编码器的高斯采样),或使用离散化并报告量化精度。分析确定性网络时,改用对输入扰动的敏感度、秩或稀疏性等替代指标,或在给定噪声水平下报告互信息随噪声变化的曲线。
错误 3 · 把变分自编码器的 KL 项直接当作率
原因:训练中使用的 KL 项是
解决:区分三个量:编码项(训练中可算)、率
错误 4 · 把 PAC-Bayes 界中的 KL 与训练正则中的 KL 混同
原因:两者都叫 KL 且形式相同,但出现的位置与约束不同。PAC-Bayes 的 KL 是参数分布的后验与先验之间的距离,先验必须在训练前固定、不能依赖训练集,否则界的推导失效;训练正则中的 KL 是模型输出分布与参考分布之间的距离,参考分布可以随训练更新(如策略优化中的旧策略)。把两者当作同一个量会导致先验泄露(用数据选先验)或误读界的方向。
解决:使用 PAC-Bayes 界时明确写出先验的定义与固定时刻,先验的选择规则若依赖数据则整个界失效。把界当作训练目标(最小化右端)时,先验部分必须冻结,只更新后验的表示与训练误差项。报告结果时给出界的数值与先验的构造方式,避免只报"界与测试误差接近"而不说明先验来源。