7.2 KL散度与交叉熵
KL 散度(Kullback-Leibler Divergence)衡量两个概率分布之间的差异,交叉熵是机器学习分类任务中最重要的损失函数之一。
交叉熵(Cross-Entropy)
交叉熵衡量用分布 来编码来自分布 的事件所需的平均比特数:
性质:
- ,当且仅当 时取等
- 交叉熵 = 熵 + KL 散度:
KL 散度(Kullback-Leibler Divergence)
KL 散度衡量用 近似 带来的额外信息损失:
性质:
- ,当且仅当 时取等
- 不是对称的:
- 因此 KL 散度不是真正的"距离"度量
手算实例:KL 散度(3 种结果)
真实分布 与模型分布 :
| 结果 | ||||
|---|---|---|---|---|
| A | ||||
| B | ||||
| C | ||||
| 合计 | — | 比特 |
比特,非常小——说明模型 对真实分布 的近似做得不错。
Python 示例
python
import numpy as np
def kl_divergence(p, q):
"""计算 KL(P || Q),单位:比特"""
p = np.asarray(p)
q = np.asarray(q)
return np.sum(p * np.log2((p + 1e-15) / (q + 1e-15)))
p = np.array([0.50, 0.30, 0.20])
q = np.array([0.60, 0.25, 0.15])
kl = kl_divergence(p, q)
print(f"KL(P||Q) = {kl:.4f} 比特")
# 输出: KL(P||Q) = 0.0210 比特
# 交叉熵 = 熵 + KL
def entropy(p):
p = np.asarray(p)
return -np.sum(p * np.log2(p + 1e-15))
cross_entropy = entropy(p) + kl
print(f"交叉熵 H(P,Q) = {cross_entropy:.4f} 比特")
# 输出: 交叉熵 H(P,Q) ≈ 1.5717 比特Quant Link:交叉熵损失与信用风险建模
在机器学习分类任务中,对于真实标签 和预测概率 ,交叉熵损失为:
在信用风险建模中,我们用交叉熵损失训练违约概率(PD)模型。如果一个贷款申请人的真实标签为违约(),模型预测 ,则损失为 ——模型越"自信"地犯错,惩罚越大。
在量化策略回测中,交叉熵也是分类型交易信号(涨/跌/平)的标准损失函数:
其中 是信号类别数(如上涨、下跌、横盘), 为 one-hot 真实标签。
分布偏移监测:KL 散度也常用于监测市场状态是否发生了分布偏移(distribution shift)——如果实时数据分布与训练集分布之间的 KL 散度突然增大,说明市场发生了结构性变化,模型需要重新训练。 \n> 下一步:继续学习 7.3 互信息