1 熵
1.1 熵的定义和理解
热力学用熵值描述系统混乱程度或不确定程度,香农用信息熵的概念来描述信源的不确定度。信息量与信息熵是相对的,告诉你一件事实,你获取了信息量,但减少了熵。或者说,得知一件事实后信息熵减少的量,就是你得到的这个事实所包含的信息的量。
对于随机变量
X
X
X ,其概率分布
P
X
P_{X}
PX ,熵为:
H
(
X
)
=
E
[
log
1
P
X
(
X
)
]
=
∑
x
∈
X
P
X
(
x
)
log
1
P
X
(
x
)
=
−
∑
x
∈
X
P
X
(
x
)
log
P
X
(
x
)
\begin{aligned} H(X) &=\mathbb{E}\left[\log \frac{1}{P_{X}(X)}\right] \\ &=\sum_{x \in \mathcal{X}} P_{X}(x) \log \frac{1}{P_{X}(x)}\\ &=-\sum_{x \in \mathcal{X}} P_{X}(x) \log {P_{X}(x)} \end{aligned}
H(X)=E[logPX(X)1]=x∈X∑PX(x)logPX(x)1=−x∈X∑PX(x)logPX(x)
这个公式可以理解为,随机元素的熵是 log 1 P X ( x ) \log \frac{1}{P_{X}(x)} logPX(x)1,然后所有随机元素熵的加权平均数就是随机变量的熵。
如下图,我们以2项分布为例,事件发生的概率是p,不发生的概率是1-p,
−
x
l
o
g
x
-xlogx
−xlogx(图中默认log底是2)是一个凸函数,当概率接近0或者1的时候元素值都很小,最高点出现在0.3678附近(自然常数的倒数1/e),当p=0.5即所有事件发生的概率是等概率(完全随机),熵是最大的,如果有些事件概率大或者小,熵都会趋向于减少,也就是不确定性更少。不同的对数底,对元素和熵最大值绝对值有影响,底越大,曲线越平坦,底越小,曲线越陡峭,但出现其最大值的对应的概率值x都是一样的。
熵公式中log函数不同的底对应熵的单位不同,如果底是2,熵的单位是bits,如果底是自然常数e,熵的单位是nats,如果底是256,熵的单位是bytes。从信息编码的角度理解,如果用二进制编码,熵就是某个概率分布对信息编码所需要的最短平均编码长度(如果有更短反推概率和一定不为1)。
1.2 交叉熵
一个样本集中两个概率分布
P
\mathrm{P}
P ,
Q
\mathrm{Q}
Q ,在机器学习中
P
\mathrm{P}
P 为真实概率分布,
Q
\mathrm{Q}
Q 为预测的概率分布。交叉熵是用
Q
\mathrm{Q}
Q 来编码P的平均编码长度。
H
(
P
,
Q
)
=
∑
i
=
1
n
P
(
x
i
)
log
1
Q
(
x
i
)
H(P, Q)=\sum_{i=1}^{n} P\left(x_{i}\right) \log\frac{1}{Q\left(x_{i}\right)}
H(P,Q)=i=1∑nP(xi)logQ(xi)1 在机器学习中,交叉熵通常作为损失函数loss,更常见的形式是:
H
(
y
,
y
^
)
=
−
∑
i
y
i
log
y
^
i
H(y, \hat{y})=-\sum_{i} y_{i} \log \hat{y}_{i}
H(y,y^)=−i∑yilogy^i 其中,
y
\mathrm{y}
y是真实标签分布,
y
^
\hat{y}
y^是模型预估标签,每一个标签的最小编码长度变成
log
(
1
y
^
i
)
\log \left(\frac{1}{\hat{y}_{i}}\right)
log(y^i1),最终整体平均编码长度就是上面加权平均的结果,损失函数越小,即模型预估来表示真实标签分布需要的编码长度越小,说明二者更接近。
预测分布和真实分布的交叉熵大于等于真实分布本身的熵, 因为我们使用了带有预测误差的分布会带来更多bit的使用。(这里即使是预测的分布,也是严格遵守概率和为 1 的, 只要有这个条件约束, 交叉熵就会大于等于真实分布的熵)
1.3 相对熵——KL散度
相对熵也叫KL散度(Kullback-Leibler divergence),描述两个概率分布的差异。以上面真实概率分布 P \mathrm{P} P 和预测概率分布 Q \mathrm{Q} Q 为例,相对熵=预测分布和真实分布交叉熵-真实分布自身的熵。
Q
\mathrm{Q}
Q 表示
P
\mathrm{P}
P 的平均编码长度(预测分布和真实分布交叉熵):
∑
i
=
1
n
P
(
x
i
)
log
2
1
Q
(
x
i
)
\sum_{i=1}^{n} P\left(x_{i}\right) \log _{2} \frac{1}{Q\left(x_{i}\right)}
i=1∑nP(xi)log2Q(xi)1
P
\mathrm{P}
P 表示
P
\mathrm{P}
P 的平均编码长度(真实分布自身的熵) :
∑
i
=
1
n
P
(
x
i
)
log
2
1
P
(
x
i
)
\sum_{i=1}^{n} P\left(x_{i}\right) \log _{2} \frac{1}{P\left(x_{i}\right)}
i=1∑nP(xi)log2P(xi)1
K
L
\mathrm{KL}
KL散度:
∑
i
=
1
n
P
(
x
i
)
log
2
1
Q
(
x
i
)
−
∑
i
=
1
n
P
(
x
i
)
log
2
1
P
(
x
i
)
\quad \sum_{i=1}^{n} P\left(x_{i}\right) \log _{2} \frac{1}{Q\left(x_{i}\right)}-\sum_{i=1}^{n} P\left(x_{i}\right) \log _{2} \frac{1}{P\left(x_{i}\right)}
i=1∑nP(xi)log2Q(xi)1−i=1∑nP(xi)log2P(xi)1 根据log的运算法则变形 (
P
P
P 和
Q
Q
Q相同时,
K
L
K L
KL 等于零, 表示分布相同):
∑
i
=
1
n
P
(
x
i
)
log
2
P
(
x
i
)
Q
(
x
i
)
\quad \sum_{i=1}^{n} P\left(x_{i}\right) \log _{2} \frac{P\left(x_{i}\right)}{Q\left(x_{i}\right)}
i=1∑nP(xi)log2Q(xi)P(xi) 还是用机器学习里更常用的真实标签分布
y
\mathrm{y}
y和模型预估标签分布
y
^
\hat{y}
y^来表示:
K
L
(
y
∥
y
^
)
=
∑
i
y
i
log
1
y
^
i
−
∑
i
y
i
log
1
y
i
=
∑
i
y
i
log
y
i
y
^
i
K L(y \| \hat{y})=\sum_{i} y_{i} \log \frac{1}{\hat{y}_{i}}-\sum_{i} y_{i} \log \frac{1}{y_{i}}=\sum_{i} y_{i} \log \frac{y_{i}}{\hat{y}_{i}}
KL(y∥y^)=i∑yilogy^i1−i∑yilogyi1=i∑yilogy^iyi 交叉熵减去真实分布的熵, 其实就是表示预测误差带来了多少额外 bit的使用。机器学习中,一旦训练数据集定了后, 真实分布的熵是个常数,所以, 最小化交叉熵和最小化KL散度得到的结果等价。
顺便提一下,KL散度是不对称的,即 D K L ( p ∥ q ) ≠ D K L ( q ∥ p ) D_{K L}(p \| q) \neq D_{K L}(q \| p) DKL(p∥q)=DKL(q∥p), 因此选择作为衡量两个分布的差距时要慎重选择。还有其他形式的散度,可以参考这篇不错的文章机器学习中的散度。
深入理解熵、交叉熵、KL散度、极大似然估计与最大后验估计
知识提炼理解
机器学习中的散度
KL散度(Kullback-Leibler Divergence)介绍及详细公式推导
Chapter 1: Information Measures: Entropy and Divergence