Skip to content

7.2 KL散度与交叉熵

KL 散度(Kullback-Leibler Divergence)衡量两个概率分布之间的差异,交叉熵是机器学习分类任务中最重要的损失函数之一。


交叉熵(Cross-Entropy)

交叉熵衡量用分布 QQ 来编码来自分布 PP 的事件所需的平均比特数:

H(P,Q)=xP(x)logQ(x)H(P, Q) = -\sum_{x} P(x) \log Q(x)

性质:

  • H(P,Q)H(P)H(P, Q) \ge H(P),当且仅当 P=QP = Q 时取等
  • 交叉熵 = 熵 + KL 散度:H(P,Q)=H(P)+DKL(PQ)H(P, Q) = H(P) + D_{\text{KL}}(P \parallel Q)

KL 散度(Kullback-Leibler Divergence)

KL 散度衡量用 QQ 近似 PP 带来的额外信息损失:

DKL(PQ)=xP(x)logP(x)Q(x)=H(P,Q)H(P)D_{\text{KL}}(P \parallel Q) = \sum_{x} P(x) \log \frac{P(x)}{Q(x)} = H(P, Q) - H(P)

性质:

  • DKL(PQ)0D_{\text{KL}}(P \parallel Q) \ge 0,当且仅当 P=QP = Q 时取等
  • 不是对称的DKL(PQ)DKL(QP)D_{\text{KL}}(P \parallel Q) \neq D_{\text{KL}}(Q \parallel P)
  • 因此 KL 散度不是真正的"距离"度量

手算实例:KL 散度(3 种结果)

真实分布 PP 与模型分布 QQ

结果P(x)P(x)Q(x)Q(x)log(P/Q)\log(P/Q)Plog(P/Q)P \cdot \log(P/Q)
A0.500.500.600.60log(0.5/0.6)=0.1823\log(0.5/0.6) = -0.18230.50×(0.1823)=0.09120.50 \times (-0.1823) = -0.0912
B0.300.300.250.25log(0.3/0.25)=0.1823\log(0.3/0.25) = 0.18230.30×0.1823=0.05470.30 \times 0.1823 = 0.0547
C0.200.200.150.15log(0.2/0.15)=0.2877\log(0.2/0.15) = 0.28770.20×0.2877=0.05750.20 \times 0.2877 = 0.0575
合计1.01.01.01.0DKL=0.0210D_{\text{KL}} = 0.0210 比特

DKL(PQ)=0.0210D_{\text{KL}}(P \parallel Q) = 0.0210 比特,非常小——说明模型 QQ 对真实分布 PP 的近似做得不错。


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 比特

在机器学习分类任务中,对于真实标签 yy 和预测概率 y^\hat{y}交叉熵损失为:

L=iyilogy^i\mathcal{L} = -\sum_{i} y_i \log \hat{y}_i

信用风险建模中,我们用交叉熵损失训练违约概率(PD)模型。如果一个贷款申请人的真实标签为违约(y=1y=1),模型预测 y^=0.05\hat{y}=0.05,则损失为 log(0.05)2.996-\log(0.05) \approx 2.996——模型越"自信"地犯错,惩罚越大。

在量化策略回测中,交叉熵也是分类型交易信号(涨/跌/平)的标准损失函数:

LCE=1Tt=1Tc=1Cyt,clogy^t,c\mathcal{L}_{\text{CE}} = -\frac{1}{T} \sum_{t=1}^T \sum_{c=1}^C y_{t,c} \log \hat{y}_{t,c}

其中 CC 是信号类别数(如上涨、下跌、横盘),yt,cy_{t,c} 为 one-hot 真实标签。

分布偏移监测:KL 散度也常用于监测市场状态是否发生了分布偏移(distribution shift)——如果实时数据分布与训练集分布之间的 KL 散度突然增大,说明市场发生了结构性变化,模型需要重新训练。 \n> 下一步:继续学习 7.3 互信息

Built with VitePress