机器学习中的各种熵

最近学习我发现对机器学习中信息熵,交叉熵,相对熵(KL散度(Kullback-Leibler Divergence))总是容易搞混,特别是连续分布的情况,因此这里简单总结一下相关知识,方便后续查阅。

这篇文章很多内容都是AI生成的,不得不说AIGC进步神速。

信息熵,交叉熵,KL散度的关系

信息熵、交叉熵和KL散度之间的关系可以从以下几个方面来理解:

  1. 信息熵:可以表示一个事件A的自信息量,也就是A包含多少信息。

  2. KL散度:可以用来表示从事件A的角度来看,事件B有多大不同,适用于衡量事件A,B之间的差异。KL散度在p(x)和q(x)相同时取到最小值0,两个概率分布越相似,则KL散度越小。KL散度包含如下性质:

    • 不对称性,即: $$D_{KL}(P||Q) \neq D_{KL}(Q||P)$$
    • 非负性,即: $$D_{KL}(P||Q) \geq 0$$
  3. 交叉熵:可以用来表示从事件A的角度来看,如何描述事件B,适用于衡量不同事件B之间的差异。对于不同的事件B,计算事件AB的KL散度时都同时减去事件A的熵(KL散度=交叉熵-熵(A)),因此,如果只是比较不同B事件之间的差异,计算交叉熵和计算KL散度是等价的。

总结起来,KL散度=交叉熵-熵。在特定情况下最小化KL散度等价于最小化交叉熵。交叉熵的运算更简单,所以用交叉熵来当做代价。

信息熵

信息熵(Information Entropy)是信息论的基本概念,用于描述信息源各可能事件发生的不确定性。它是由信息论之父克劳德·艾尔伍德·香农(Claude E. Shannon)在1948年提出的。

信息熵的计算公式为:
$$H(x) = -\sum_{i=1}^{n}P(x_i)\log_2P(x_i)$$
其中,$x$表示随机变量,$x_i$是$x$的所有可能输出,$P(x_i)$表示输出概率函数。

高斯分布的信息熵

对于一维的高斯分布,其概率密度函数为:
$$
f(x)=\frac{1}{\sqrt{2 \pi \sigma^2}} e^{-\frac{(x-\mu)^2}{2 \sigma^2}}
$$
其中, $\mu$ 是均值, $\sigma$ 是标准差。
高斯分布的熵定义为:
$$
H(X)=-\int_{-\infty}^{+\infty} f(x) \log f(x) d x
$$
将高斯分布的概率密度函数代入熵的定义,我们可以得到:
$$
H(X)=-\int_{-\infty}^{+\infty} \frac{1}{\sqrt{2 \pi \sigma^2}} e^{-\frac{(x-\mu)^2}{2 \sigma^2}} \log \left(\frac{1}{\sqrt{2 \pi \sigma^2}} e^{-\frac{(x-\mu)^2}{2 \sigma^2}}\right) d x
$$
经过一些数学变换和积分计算,我们可以得到高斯分布的熵为:
$$
H(X)=\frac{1}{2} \log \left(2 \pi e \sigma^2\right)
$$
这就是一维高斯分布的熵的计算公式。对于多维高斯分布,其熵的计算公式为:
$$
H(X)=\frac{k}{2} \log (2 \pi e|\Sigma|)
$$
其中, $k$ 是维度数, $\Sigma$ 是协方差矩阵, $|\Sigma|$ 是协方差矩阵的行列式。

交叉熵

假设我们有两个概率分布 $p$ 和 $q$,其中 $p$ 是真实的概率分布,$q$ 是模型预测的概率分布。那么,$p$ 和 $q$ 之间的交叉熵定义为:

$$
H(p, q) = -\sum_{i} p(i) \log(q(i))
$$

其中,$\sum_{i}$ 表示对所有可能的事件 $i$ 求和,$p(i)$ 是事件 $i$ 的真实概率,$\log(q(i))$ 是事件 $i$ 的预测概率的对数。

二分类问题的交叉熵

我们将实际标签表示为 $x$,预测标签表示为 $y$。对于二分类问题,交叉熵损失函数可以定义为:
$$
H(x, y) = -x \log(y) - (1 - x) \log(1 - y)
$$
这个公式的含义是:

  • 当实际标签 $x=1$(正类)时,损失函数变为 $- \log(y)$。如果预测概率 $y$ 接近 1,那么损失接近 0;如果 $y$ 接近 0,那么损失将会很大。
  • 当实际标签 $x=0$(负类)时,损失函数变为 $- \log(1 - y)$。如果预测概率 $y$ 接近 0,那么损失接近 0;如果 $y$ 接近 1,那么损失将会很大。

多分类问题的交叉熵

对于多分类问题,交叉熵损失函数可以扩展为:
$$
H(x, y) = -\sum_{i} x_i \log(y_i)
$$
其中,$x_i$ 是实际标签的第 $i$ 个类别(0 或 1),$y_i$ 是预测标签的第 $i$ 个类别(预测为第 $i$ 类的概率)。

这个公式的含义是:

  • 对于每一个类别 $i$,如果实际标签 $x_i=1$,那么损失函数包含一项 $- \log(y_i)$。如果预测概率 $y_i$ 接近 1,那么这一项的损失接近 0;如果 $y_i$ 接近 0,那么这一项的损失将会很大。
  • 所有类别的损失加起来,就得到了总的交叉熵损失。

在多分类问题中,我们的目标是预测一个实例可能属于的每个类别的概率。例如,如果我们有三个类别 A、B 和 C,我们可能会预测一个实例属于类别 A 的概率为 0.1,属于类别 B 的概率为 0.3,属于类别 C 的概率为 0.6。这就是我们的预测概率分布。

实际的标签通常表示为一种称为 “one-hot” 编码的格式。在这种格式中,正确的类别被编码为 1,所有其他类别被编码为 0。所以如果一个实例实际上属于类别 B,那么它的标签就会是 [0, 1, 0]。

交叉熵损失函数衡量的是我们的预测概率分布与实际的标签分布之间的差异。对于每个类别 $i$,交叉熵包含一项 $-x_i \log(y_i)$,其中 $x_i$ 是实际标签(0 或 1),$y_i$ 是预测标签(预测为第 $i$ 类的概率)。如果实际标签 $x_i=1$,那么这一项就变成了 $- \log(y_i)$;如果 $x_i=0$,那么这一项就消失了(因为 $-0 \log(anything) = 0$)。

所以在计算交叉熵损失时,我们实际上只关心正确类别的预测概率。如果对正确类别的预测概率越高,那么交叉熵损失就越低;反之,如果对正确类别的预测概率越低,那么交叉熵损失就越高。

正态分布问题的交叉熵

两个高斯分布之间的交叉熵可以通过以下公式计算:

假设我们有两个高斯分布 $p(x)$ 和 $q(x)$,其中 $p(x)$ 是标准高斯分布,即 $p(x) = \frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}}$,$q(x)$ 是均值为 $\mu$,方差为 $\sigma^2$ 的高斯分布,即 $q(x) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}$。

那么,$p(x)$ 对 $q(x)$ 的交叉熵可以通过以下公式计算:

$$
H(p, q) = - \int p(x) \log q(x) dx
$$

将 $p(x)$ 和 $q(x)$ 的具体形式代入上述公式,我们可以得到:

$$
H(p, q) = - \int \frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}} \log \left( \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} \right) dx
$$

这个积分可能需要一些数学技巧才能求解。在实际应用中,我们通常使用数值方法(如蒙特卡洛方法)来近似计算这个积分。

KL散度

KL散度(Kullback-Leibler Divergence)用于度量两个概率分布函数之间的“距离”。对于离散概率分布,其计算公式为:

$$
KL(P||Q) = \sum_{x} P(x) \log \frac{P(x)}{Q(x)}
$$

其中,$P$和$Q$是两个概率分布。

对于连续概率分布,其计算公式为:

$$
KL(P||Q) = \int P(x) \log \frac{P(x)}{Q(x)} dx
$$

这里的$\log$可以是自然对数,也可以是以2为底的对数。如果我们考虑$\log_2$,我们可以将其解释为“我们损失了多少位的信息”。在实际应用中,我们通常会根据具体的问题和需求来选择合适的对数底数。

高斯分布的KL散度

两个高斯分布之间的KL散度可以通过以下公式进行计算,详细的数学推导参见这里

对于一维高斯分布,假设有两个高斯分布$$N(\mu_1, \sigma_1^2)$$和$$N(\mu_2, \sigma_2^2)$$,它们之间的KL散度定义为:
$$
KL(N(\mu_1, \sigma_1^2)||N(\mu_2, \sigma_2^2)) = \log\frac{\sigma_1}{\sigma_2} - \frac{1}{2} + \frac{\sigma_2^2 + (\mu_1 - \mu_2)^2}{2\sigma_1^2}
$$

对于多元高斯分布,假设有两个多元高斯分布$$N(x|\mu_1, \Sigma_1)$$和$$N(x|\mu_2, \Sigma_2)$$,它们之间的KL散度定义为:
$$
KL(N(x|\mu_1, \Sigma_1)||N(x|\mu_2, \Sigma_2)) = \frac{1}{2}[log\frac{|\Sigma_1|}{|\Sigma_2|} - K + tr(\Sigma_2^{-1}\Sigma_1) + (\mu_1 -\mu_2)^T \Sigma_2^{-1}(\mu_1 - \mu_2)]
$$
其中,$K$是随机变量的维数,$tr$表示矩阵的迹(即对角线元素之和),$|\Sigma|$表示矩阵$\Sigma$的行列式。这些公式可以用于计算两个高斯分布之间的KL散度。


EOF