信息论-交叉熵

发布时间 2023-04-18 10:08:54作者: KouweiLee

信息论

参考教程:22.11. Information Theory — Dive into Deep Learning 1.0.0-beta0 documentation (d2l.ai)

信息代表事件的意外程度,或者说事件的抽象可能性

  • self-information

一个事件包含多少信息量,可以看有几个bit数。self-information就代表一个事件的bit数:

\[I(X) = -log_2(p) \]

例如序列"0010"的self-information为:

\[I(\text{"0010"}) = - \log (p(\text{"0010"})) = - \log \left( \frac{1}{2^4} \right) = 4 \text{ bits}. \]

self-attention只能衡量一个离散事件如"0010"的信息量,可以看到,事件的概率越小,信息量越大。要想更广泛的描述信息量,我们引入熵的概念:

熵的定义

给定一个随机变量\(X\), 遵循概率分布\(P\),概率分布函数为\(p(x)\),则我们通过熵来衡量\(X\)的信息量:

\[H(X) = - E_{x \sim P} [\log p(x)]. \label{2} \]

如果\(X\)是离散的,则熵为:

\[H(X) = - \sum_i p_i \log p_i \text{, where } p_i = P(X_i). \]

如果\(X\)是连续的,则熵为:

\[H(X) = - \int_x p(x) \log p(x) \; dx. \]

代码为:

def entropy(p):
    entropy = - p * torch.log2(p)
    # Operator `nansum` will sum up the non-nan number
    out = sum(entropy) #求和
    return out

熵的公式\(\eqref{2}\)可以理解为:self-information的平均和。因为self-information就代表了一个事件的信息量,也就是惊异程度,那么取该事件每个独立部分的信息量的平均值,就可以认为是整个事件的信息量。

交叉熵

交叉熵衡量两个分布的相似程度。越相似,那么信息量越少,交叉熵越小。因此,可以应用在下面这个例子。

给定一个真实的分布\(P\),其分布函数为\(p(x)\)。我们要为其估计一个分布\(Q\),其分布函数为\(q(x)\)。那么分布\(P\)和分布\(Q\)的交叉熵为:

\[\mathrm{CE}(P, Q) = - E_{x \sim P} [\log(q(x))]. \]

写成离散形式即为:

\[\mathrm{CE}(P, Q) = - \sum_{i}p(x_i) [\log(q(x_i))]. \]

可以看到,分布越相同,即p大的时候q大,那么CE会越小。相反,分布越不同,即p大的时候q小,那么\(-log\ q\)更大,那么交叉熵越大。

对于分类问题,随机变量\(X=(x_1,...,x_n)\)表示n个样本,每个\(p(x_i)=\frac{1}{n}\)。因此给定标签和预测概率,则交叉熵为:

def cross_entropy(y_hat, y):
    ce = -torch.log(y_hat[range(len(y_hat)), y])
    return ce.mean()

labels = torch.tensor([0, 2])
preds = torch.tensor([[0.3, 0.6, 0.1], [0.2, 0.3, 0.5]])

cross_entropy(preds, labels)