首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >揭示相对熵和交叉熵的本质

揭示相对熵和交叉熵的本质

作者头像
老齐
发布2022-01-27 14:34:25
发布2022-01-27 14:34:25
1.3K0
举报
文章被收录于专栏:老齐教室老齐教室

说明:本文是《机器学习数学基础》一书选登,关于该书的详细内容,请访问:http://math.itdiffer.com

7.4 相对熵和交叉熵

在第4章4.4.3节介绍损失函数的时候,列出了几项常见的损失函数,其中就有神经网络中常用的以相对熵和交叉熵构建的损失函数。那么什么是相对熵和交叉熵呢?下面就分别进行介绍。

设某离散型随机变量有两个概率分布 P Q ,它们之间的相对熵(relative entropy)定义为:

D_{KL}(P\parallel Q) = \sum_{x\in\displaystyle{\mathcal{X}}}P(x)\log\left(\frac{P(x)}{Q(x)}\right) \quad(7.4.1)

在信息论中,通常会按照7.3节(7.3.2)式的约定,写作:

D_{KL}(p\parallel q) = \sum_{x\in\displaystyle\mathcal{X}}p(x)\log\left(\frac{p(x)}{q(x)}\right) \quad(7.4.2)

在上述定义中约定:0\log \left(\frac{0}{0}\right) = 00\log\left(\frac{0}{Q(x)}\right) =0P(x)\log\left(\frac{P(x)}{0}\right)=\infty (基于连续性),即若存在 x \in\displaystyle{\mathcal{X}}

使得 P(x) \gt 0, Q(x) = 0 ,有 D(P \parallel Q) = \infty

由于相对熵最早是由Solomon Kullback和Richard Leibler在1951年提出的,所以相对熵也称为KL散度(Kullback–Leibler divergence)——这就是符号 D_{KL}(P||Q) 下角标的来源。“divergence”翻译为“散度”,它也反应出了(7.4.2)式所定义的相对熵的作用:度量两个概率分布的差异(“分散程度”),或者说两个分布之间的距离,但是,此处的“距离”和两个向量的距离不同,因为一般情况下 D_{KL}(Q||Q)\ne D_{KL}(Q||P) ,即相对熵具有不对称性。

下面选用Kullback在《Information Theory and Statistics》中的一个示例,说明相对熵的应用和意义。设分布 P 是二项分布( n=2, p=0.4 ),分布 Q 是均匀分布。如果随机变量的取值分别为 0,1,2 ,即 \displaystyle\mathcal{X}=\{0,1,2\} ,在分类问题中,表示三个不同的类别。如表7-2-3所示,记录了每个类别对应的输出概率。

表7-2-3

x

0

1

2

P(x)

9/25

12/25

4/25

Q(x)

1/3

1/3

1/3

利用表7-2-3的概率分布,计算相对熵 D_{KL}(P||Q)D_{KL}(Q||P) 的值(Kullback在书中使用的是自然对数,这里稍作修改,依然是以 2 为底,最终所得结果单位是比特)。

\begin{split}D_{KL}(P\parallel Q) &= \sum_{x\in\displaystyle{\mathcal{X}}}P(x)\log\left(\frac{P(x)}{Q(x)}\right)\\ &=\frac{9}{25}\log\left(\frac{9/25}{1/3}\right) + \frac{12}{25}\log\left(\frac{12/25}{1/3}\right)+\frac{4}{25}\log\left(\frac{4/25}{1/3}\right)\\&=\frac{1}{25}(32\log2+55\log3-50\log5)\approx0.123\\ D_{KL}(Q\parallel P) &= \sum_{x\in\displaystyle{\mathcal{X}}}Q(x)\log\left(\frac{Q(x)}{P(x)}\right)\\&=\frac{1}{3}\log\left(\frac{1/3}{9/25}\right)+\frac{1}{3}\log\left(\frac{1/3}{12/25}\right)+\frac{1}{3}\log\left(\frac{1/3}{4/25}\right)\\&=\frac{1}{3}(6\log5-6\log3-4\log2)\approx 0.141\end{split}

以上计算结果证实了相对熵的不对称性。用手工计算方法了解了基本原理之后,也要知晓用程序计算相对熵的方法,依然使用scipy库提供的entropy()函数。

代码语言:javascript
复制
from scipy.stats import entropy

p = [9/25, 12/25, 4/25]
q = [1/3, 1/3, 1/3]

d_pq = entropy(p, q, base=2)
d_qp = entropy(q, p, base=2)

print(f"D(P||Q)={d_pq:.4f}")
print(f"D(Q||P)={d_qp:.4f}")

# 输出
D(P||Q)=0.1231
D(Q||P)=0.1406

在相对熵的定义(7.4.1)式,两个分布 P Q 是针对同一个随机变量而言,这点特别要注意,不是两个随机变量的概率分布。对此,可以借用机器学习的模型训练过程理解。

在机器学习中,训练集的样本,并非是总体,可以认为是从总体中按照随机的原则独立抽样得到的(即独立同分布,independent and identically distributed,简称:i.i.d),那么训练集样本的概率分布与总体的概率分布就可以近似P_{train} \approx P_{real} ——总体的概率分布才是真实的,但我们通常不知道它(只有上帝知道)。将训练集数据用于模型,从而估计出模型参数,即得到了一种概率分布,记作 Q_{model} 。然后使用 Q_{model} 进行预测,得到预测值。

这样对同一个训练集样本,就有了两个概率分布 P_{train}Q_{model} 。前面已经论述了 P_{train} \approx P_{real} ,如果将(7.4.1)式中的分布 P 视为 P_{train} ,代表数据集的真实分布;Q 视为 Q_{model} ,称为假设分布或模型分布。就可以用相对熵度量它们之间的差异,从而评估模型的优劣。所以在第4章4.4.3节中给出了一个KL散度损失函数。

由(7.4.1)式可得:

\begin{split}D_{KL}(P\parallel Q) &= -\sum_{x\in\displaystyle{\mathcal{X}}}P(x)\log\left(\frac{Q(x)}{P(x)}\right) \\ &=\sum_{x\in\displaystyle{\mathcal{X}}}P(x)(-\log(Q(x))-[-\log(P(x))])\end{split} \quad(7.4.3)

(7.4.3)式的结果中,-\log(Q(x)) 表示模型分布的信息,-\log(P(x)) 表示真实分布的信息,二者之差可以理解为用模型预测损失的信息,令 Z = -\log(Q(x))-[-\log(P(x))] ,则:

D_{KL}(P\parallel Q) = \sum_{x\in\displaystyle{\mathcal{X}}}P(x)Z=E_{P}(Z)=E_P( -\log(Q(X))-[-\log(P(X))]) \quad(7.4.4)

这说明相对熵是按概率 P(X) 损失的信息的期望(在(7.4.4)中使用了数学期望的性质(E5):

E[g(X)]=\sum_ig(a_i)p_i

。同样,也可以将相对熵的定义(7.4.1)式写成:

D_{KL}(P\parallel Q)=E_P\begin{bmatrix}\log\left(\frac{P(X)}{Q(X)}\right)\end{bmatrix} \quad(7.4.5)

其含义为按概率 P(X)PQ 的对数商的期望。不论是(7.4.4)式,还是(7.4.5)式,都说明相对熵是一种数学期望,能够用它度量当真实分布P 、模型分布为 Q 时的无效性。按照(7.4.4)式,我们期望损失更少的信息——该式表达的就是期望,即无效性更小,则相对熵越小。当相对熵为 0 时,P=Q ,并且可以证明 D_{KL}(P\parallel Q) \ge 0 (详细证明请参阅本书在线资料)。

在(7.4.3)式基础上,还可以得到:

D_{KL}(P\parallel Q)=\sum_{x\in\displaystyle\mathcal{X}}P((x))\log(P(x))+\begin{bmatrix}-\sum_{x\in\displaystyle\mathcal{X}}P(x)\log(Q(x))\end{bmatrix} \quad(7.4.6)

(7.4.6)式中等号右边第一项 \sum_{x\in\displaystyle\mathcal{X}}P((x))\log(P(x)) 即为分布 P 的熵的负数,根据7.2节的(7.2.3)式 H(P) =- \sum_{x\in\displaystyle\mathcal{X}}P((x))\log(P(x)) ,得 \sum_{x\in\displaystyle\mathcal{X}}P((x))\log(P(x)) = -H(P) ;第二项与熵类似,但对数的计算对象是另外一个分布函数,我们将它定义为交叉熵(cross entropy):

H(P,Q) = -\sum_{x\in\displaystyle\mathcal{X}}P(x)\log(Q(x)) \quad(7.4.7)

于是(7.4.6)式可以写成:

D_{KL}(P\parallel Q) = H(P, Q) - H(P)\quad(7.4.8)

不要忘记,我们所假设的真实分布 PP_{train} ,又因为训练集样本已知,它熵 H(P) 即不再变化。于是,由(7.4.8)式知,可以用交叉熵 H(P,Q) 判断相对熵 D_{KL}(P\parallel Q) 的情况——比较(7.4.1)式和(7.4.4)式,交叉熵的形式更简单。例如,有一个能够识别四种图片的模型——称为“四类别分类器”,能够识别“狗、猫、马、牛”,假设输入了一张图,经过分类器之后输出了预测值,如图7-4-1所示。

图 7-4-1

根据图中的预测值 \hat{\mathbf{y}}_1=\begin{bmatrix}0.775&0.116&0.039&0.070\end{bmatrix}^{\rm{T}} 和真实值 \mathbf{y} =\begin{bmatrix}1&0&0&0\end{bmatrix}^{\rm{T}} ,利用(7.2.18)式,可以计算交叉熵:

H_1(\mathbf{y}\parallel\hat{\mathbf{y}}_1) =-[1\cdot\log0.775+0\cdot\log0.116+0\cdot\log0.039+0\cdot\log0.070] \approx 0.3677

假设对分类器进行了优化,输出的预测值变为 \hat{\mathbf{y}}_2=\begin{bmatrix}0.938&0.028&0.013&0.021\end{bmatrix}^{\rm{T}} ,此时交叉熵为:H_2(\mathbf{y}\parallel\hat{\mathbf{y}}_2) = -\log0.938 \approx 0.0923 显然 H_2 \lt H_1 ,根据(7.4.5),则得到 D_{KL2}\lt D_{KL1} ,即优化之后的分类器预测效果更好——通过上述假设的输出数据,凭直觉也能判断分类器的好坏。由此可以想到,正如第4章4.4.3节所列举的,可以用交叉熵作为损失函数,令其最小化,亦即相对熵最小化。

我们先探讨一种简单而常见的分类器——二分类的分类器(binary classification),用符号\boldsymbol{\theta} 表示分类器中待定的参数,预测值 \hat{\pmb{y}} = Q(\hat{\pmb{y}}|\pmb{X}, \boldsymbol{\theta}) ,相应地真实值标签 \pmb{y}\sim P(\pmb{y}|\pmb{X}, \boldsymbol{\theta}_0) 。训练集样本相对总体符合 i.i.d 要求, \pmb{X} = \begin{bmatrix}X_1&\cdots&X_n\end{bmatrix}^{\rm{T}} ,为输入数据;\boldsymbol{\theta}_0 为模型中真实参数 ;\pmb{y} = \begin{bmatrix}y_1&\cdots&y_n\end{bmatrix} 中的 y_i

取值为 01X_i 对应的预测值简写成 y_i=q_i(X_i)=q_i

由于二分类器的输出结果服从伯努利分布即

\begin{cases}P(y_i=1|\pmb{X}_i,\boldsymbol{\theta}_0)& = y_i\\P(y_j=0|\pmb{X}_j,\boldsymbol{\theta}_0)&=1-y_i \end{cases}\qquad \begin{cases}Q(\hat{y}_i|\pmb{X}_i,\boldsymbol{\theta})&= q_i\\Q(\hat{y}_j|\pmb{X}_j,\boldsymbol{\theta})&=1-q_i \end{cases}

对照(7.4.7)式,可得其交叉熵:H(y_i,\hat{y}_i) = -y_i\log(q_i) - (1-y_i)\log(1-q_i) \quad(7.4.9)

H(y_i,\hat{y}_i) = -y_i\log(q_i) - (1-y_i)\log(1-q_i) \quad(7.4.9)

将(7.4.9)式视为预测值与真实值之间的损失函数,设训练集中的样本数量为 N ,由此交叉熵损失函数可构建代价函数(参阅第4章4.4.3节):

C =- \frac{1}{N} \sum_{i=1}^N[y_i\log(q_i) + (1-y)\log(1-q_i) \quad(7.4.10)

如果对(7.4.10)式求最小值,即可估计待定参数 \boldsymbol{\theta} 的值,从而确定模型的具体形式。

二分类的交叉熵的交叉熵为损失函数,常用于Logistic回归和神经网络,在第4章4.4.3节中,曾使用Pytorch提供的函数实现了交叉熵损失函数,下面的程序演示中用的是scikit-learn库的log_loss()函数,对模型的预测值和真实进行差异评估。

代码语言:javascript
复制
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss
import numpy as np

x = np.array([-2.2, -1.4, -.8, .2, .4, .8, 1.2, 2.2, 2.9, 4.6])
y = np.array([0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])

logr = LogisticRegression(solver='lbfgs')
logr.fit(x.reshape(-1, 1), y)

y_pred = logr.predict_proba(x.reshape(-1, 1))[:, 1].ravel()
loss = log_loss(y, y_pred)

print('x = {}'.format(x))
print('y = {}'.format(y))
print('Q(y) = {}'.format(np.round(y_pred, 2)))
print('Cross Entropy = {:.4f}'.format(loss))

# 输出
x = [-2.2 -1.4 -0.8  0.2  0.4  0.8  1.2  2.2  2.9  4.6]
y = [0. 0. 1. 0. 1. 1. 1. 1. 1. 1.]
Q(y) = [0.19 0.33 0.47 0.7  0.74 0.81 0.86 0.94 0.97 0.99]
Cross Entropy = 0.3329

用交叉熵作为损失函数,不仅仅适用于二分类,对多分类问题也适用(如第4章4.4.3节多分类交叉熵损失函数的示例)。

在交叉熵损失函数中,出现了对数运算。在第6章6.2.1节关于最大似然估计的计算中,也出现了对数运算。那么,这个两个有什么关系吗?先说结论:最小化交叉熵与最大似然估计等价。下面就证明此结论,不过由于是纯粹数学推导,读者可以略过,只知道此结论即可。

按照最大似然估计,设估计所得参数为 \hat{\boldsymbol{\theta}} (其他符号假设同前),则:

\begin{split}\hat{\boldsymbol{\theta}} &= arg \max_{\boldsymbol{\theta}}Q(\hat{\pmb{y}}|\boldsymbol{\theta})=arg\max_{\boldsymbol{\theta}}\prod_{i=1}^NQ(\hat{y}_i|\boldsymbol{\theta}) = arg\max_{\boldsymbol{\theta}}\sum_{i=1}^N\log(Q(\hat{y}_i)|\boldsymbol{\theta}) \\ &= arg\max_{\boldsymbol{\theta}}\left(\sum_{i=1}^N\log(Q(\hat{y}_i)|\boldsymbol{\theta})-\sum_{i=1}^N\log(P(y_i)|\boldsymbol{\theta}_0)\right) \\ &=arg\max_{\boldsymbol{\theta}}\sum_{i=1}^N\left(\log(Q(\hat{y}_i)|\boldsymbol{\theta})-\log(P(y_i)|\boldsymbol{\theta}_0)\right) \\ & =arg\max_{\boldsymbol{\theta}}\sum_{i=1}^N\log\left(\frac{Q(\hat{y}_i)|\boldsymbol{\theta})}{P(y_i|\boldsymbol{\theta}_0)}\right) \quad(注意下面的变换) \\ &= arg\min_{\boldsymbol{\theta}}\sum_{i=1}^N\log\left(\frac{P(y_i)|\boldsymbol{\theta}_0)}{Q(\hat{y}_i|\boldsymbol{\theta})}\right) \\ &=arg\min_{\boldsymbol{\theta}}\frac{1}{N}\sum_{i=1}^N\log\left(\frac{P(y_i)|\boldsymbol{\theta}_0}{Q(\hat{y}_i|\boldsymbol{\theta})}\right)\end{split}

对于有 N 个样本的训练集,根据大数定理, \frac{1}{N} \to E[P(\pmb{y})|\boldsymbol{\theta}_0)] ,所以,以上计算结果等价于:

\hat{\boldsymbol{\theta}} = arg\min_{\boldsymbol{\theta}}E_P\begin{bmatrix}\log\left(\frac{P(\pmb{y}|\boldsymbol{\theta}_0)}{Q(\pmb{\hat{y}}|\boldsymbol{\theta})}\right)\end{bmatrix}=arg\min_{\boldsymbol{\theta}}D_{KL}(P_{\boldsymbol{\theta}_0} \parallel Q_{\boldsymbol{\theta}})

由此可知,最大似然估计,即最小化相对熵,也就是最小化交叉熵。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明:本文是《机器学习数学基础》一书选登,关于该书的详细内容,请访问:http://math.itdiffer.com
  • 7.4 相对熵和交叉熵
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档