信息论基础
信息论(Information Theory)由克劳德·香农于1948年在《通信的数学理论》中奠定基础,是研究信息量化、存储和传输的数学分支。1 在机器学习和深度学习中,信息论提供了理解模型行为、优化训练过程的重要理论框架。
熵(Entropy)
信息量
理解熵之前,先了解信息量(Self-Information)的概念。对于事件 ,其信息量为:
- 当 时,单位为 比特(bits)
- 当 时,单位为 奈特(nats)
关键洞察:稀有事件携带更多信息。例如:
- 硬币正面(): bit
- 连续三次正面(): bits
- 极稀有事件(): bits
香农熵的定义
香农熵(Shannon Entropy)是对概率分布不确定性的度量:
或等价形式:
熵的性质
| 性质 | 描述 |
|---|---|
| 非负性 | |
| 对称性 | |
| 可加性 | (链式法则) |
| 最大值 | 均匀分布熵最大 |
| 极值性 | 确定分布熵为 0 |
联合熵与条件熵
联合熵:
条件熵:
熵的链式法则
代码实现
import numpy as np
def shannon_entropy(p):
"""计算香农熵(使用自然对数,单位为nats)"""
p = np.array(p)
# 过滤掉概率为0的项(0*log(0) = 0)
mask = (p > 0) & (p < 1)
return -np.sum(p[mask] * np.log(p[mask]))
def joint_entropy(p_xy):
"""计算联合熵"""
p_xy = np.array(p_xy)
mask = (p_xy > 0) & (p_xy < 1)
return -np.sum(p_xy[mask] * np.log(p_xy[mask]))
def conditional_entropy(p_y_given_x, p_x):
"""计算条件熵 H(Y|X)"""
return sum(p_x[i] * shannon_entropy(p_y_given_x[i]) for i in range(len(p_x)))
# 示例:二元分类中的类别分布
p_balanced = [0.5, 0.5] # 平衡数据集
p_imbalanced = [0.9, 0.1] # 不平衡数据集
print(f"平衡数据熵: {shannon_entropy(p_balanced):.4f}") # ~0.693
print(f"不平衡数据熵: {shannon_entropy(p_imbalanced):.4f}") # ~0.325互信息(Mutual Information)
定义
互信息衡量两个随机变量之间的依赖程度:
与熵的关系
互信息可以表示为多种等价形式:
物理意义: 表示已知 后对 不确定性的减少量。
维恩图表示
┌───────────────────────────┐
│ │
│ H(X, Y) │
│ ┌─────────────┐ │
│ │ H(X|Y) │ H(Y|X)│
│ └──────┬──────┘ │
│ │ │
│ │ I(X;Y) │
│ │ │
└──────────┴─────────────────┘
性质
| 性质 | 公式 |
|---|---|
| 对称性 | |
| 非负性 | |
| 独立性 | |
| 自信息 | |
| 数据处理不等式(DPI) |
在机器学习中的应用
特征选择
利用互信息选择与目标变量高度相关的特征:
def mutual_information(p_xy, p_x, p_y):
"""计算互信息"""
return np.sum(p_xy * np.log(p_xy / (np.outer(p_x, p_y) + 1e-10) + 1e-10))InfoGAN 中的应用
InfoGAN 通过最大化隐变量 与生成图像 之间的互信息来学习解耦表示:
KL 散度(Kullback-Leibler Divergence)
定义
KL 散度衡量两个概率分布之间的差异:
对于连续分布:
关键性质
| 性质 | 描述 |
|---|---|
| 非负性 | (吉布斯不等式) |
| 非对称性 | |
| 链式法则 | |
| 积性 |
与交叉熵的关系
交叉熵定义为:
三者之间的关系:
因此,当 固定时,最小化交叉熵等价于最小化 KL 散度。
代码实现
import scipy.stats
def kl_divergence(p, q):
"""计算 KL 散度 D_KL(P || Q)"""
p = np.array(p, dtype=np.float64)
q = np.array(q, dtype=np.float64)
# 过滤掉 P 中为 0 的项
mask = (p > 0) & (q > 0)
return np.sum(p[mask] * np.log(p[mask] / q[mask]))
# 使用 scipy 验证
p = np.array([0.3, 0.7])
q = np.array([0.4, 0.6])
print(f"D_KL(P||Q): {scipy.stats.entropy(p, q):.4f}")交叉熵与损失函数
交叉熵损失函数
在分类任务中,交叉熵损失衡量真实分布 与预测分布 之间的差异:
其中 是 one-hot 编码的真实标签, 是预测概率。
二元交叉熵(Binary Cross-Entropy, BCE)
对于二分类问题:
PyTorch 实现
import torch
import torch.nn as nn
# 多分类示例
criterion = nn.CrossEntropyLoss()
logits = torch.randn(32, 10) # batch_size=32, 10个类别
targets = torch.randint(0, 10, (32,))
loss = criterion(logits, targets)
# 二分类示例
criterion_bce = nn.BCEWithLogitsLoss()
logits = torch.randn(32, 1)
targets = torch.randint(0, 2, (32, 1)).float()
loss = criterion_bce(logits, targets)交叉熵损失的优势
- 良好的梯度特性:当预测错误时提供强梯度信号
- 概率解释:与最大似然估计(MLE)一致
- 与信息论的联系:最小化交叉熵等价于最大化数据似然
标签平滑(Label Smoothing)
标签平滑是一种正则化技术,将硬标签替换为软标签:
其中 是类别数, 是平滑参数(通常取 )。
def label_smoothing(labels, num_classes, epsilon=0.1):
"""标签平滑"""
return labels * (1 - epsilon) + epsilon / num_classes最大熵原理(Maximum Entropy Principle)
原理阐述
在只知道部分约束的情况下,应该选择熵最大的概率分布,即不确定性最大的分布。这一原理在统计学和物理学中都有重要应用。
数学形式
给定约束 for ,最大化:
subject to:
拉格朗日求解
引入拉格朗日乘子 :
求导并令为 0:
解得:
其中 是归一化常数(配分函数)。
在机器学习中的应用
逻辑回归
逻辑回归本质上是最大熵分类器在二分类情况下的特例,其输出是满足给定特征期望约束的最大熵分布。
最大熵马尔可夫模型(MEMM)
MEMM 使用最大熵原理进行序列标注,结合了 HMM 的发射概率和最大熵的全局特征建模能力。
信息论在深度学习中的核心应用
注意力机制的信息论视角
注意力机制可以被理解为一种信息路由和选择过程:
从信息论角度:
- Query :表示需要查询的信息目标
- Key :代表可用的信息键
- Value :包含实际的信息内容
- Softmax 操作计算 Query 与各 Key 之间的互信息近似
对比学习中的 InfoNCE
InfoNCE 是对比学习中常用的损失函数,源自互信息的下界估计:
其中 是相似度函数, 是温度参数。
与互信息的联系:InfoNCE 损失是互信息的下界估计,最小化 InfoNCE 损失等价于最大化正样本对之间的互信息。
核心公式速查表
| 概念 | 公式 |
|---|---|
| 信息量 | |
| 熵 | |
| 联合熵 | |
| 条件熵 | |
| 互信息 | |
| KL散度 | |
| 交叉熵 | |
| 关系 |
参考
Footnotes
-
Shannon, C.E. (1948). “A Mathematical Theory of Communication”. Bell System Technical Journal, 27(3), 379-423. ↩