在第4章4.4.3节介绍损失函数的时候,列出了几项常见的损失函数,其中就有神经网络中常用的以相对熵和交叉熵构建的损失函数。那么什么是相对熵和交叉熵呢?下面就分别进行介绍。
设某离散型随机变量有两个概率分布 和 ,它们之间的相对熵(relative entropy)定义为:
在信息论中,通常会按照7.3节(7.3.2)式的约定,写作:
在上述定义中约定: , , (基于连续性),即若存在
使得 ,有 。
由于相对熵最早是由Solomon Kullback和Richard Leibler在1951年提出的,所以相对熵也称为KL散度(Kullback–Leibler divergence)——这就是符号 下角标的来源。“divergence”翻译为“散度”,它也反应出了(7.4.2)式所定义的相对熵的作用:度量两个概率分布的差异(“分散程度”),或者说两个分布之间的距离,但是,此处的“距离”和两个向量的距离不同,因为一般情况下 ,即相对熵具有不对称性。
下面选用Kullback在《Information Theory and Statistics》中的一个示例,说明相对熵的应用和意义。设分布 是二项分布( ),分布 Q 是均匀分布。如果随机变量的取值分别为 ,即 ,在分类问题中,表示三个不同的类别。如表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的概率分布,计算相对熵 和 的值(Kullback在书中使用的是自然对数,这里稍作修改,依然是以 为底,最终所得结果单位是比特)。
以上计算结果证实了相对熵的不对称性。用手工计算方法了解了基本原理之后,也要知晓用程序计算相对熵的方法,依然使用scipy库提供的entropy()
函数。
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)式,两个分布 和 是针对同一个随机变量而言,这点特别要注意,不是两个随机变量的概率分布。对此,可以借用机器学习的模型训练过程理解。
在机器学习中,训练集的样本,并非是总体,可以认为是从总体中按照随机的原则独立抽样得到的(即独立同分布,independent and identically distributed,简称:i.i.d),那么训练集样本的概率分布与总体的概率分布就可以近似 ——总体的概率分布才是真实的,但我们通常不知道它(只有上帝知道)。将训练集数据用于模型,从而估计出模型参数,即得到了一种概率分布,记作 。然后使用 进行预测,得到预测值。
这样对同一个训练集样本,就有了两个概率分布 和 。前面已经论述了 ,如果将(7.4.1)式中的分布 视为 ,代表数据集的真实分布; 视为 ,称为假设分布或模型分布。就可以用相对熵度量它们之间的差异,从而评估模型的优劣。所以在第4章4.4.3节中给出了一个KL散度损失函数。
由(7.4.1)式可得:
(7.4.3)式的结果中, 表示模型分布的信息, 表示真实分布的信息,二者之差可以理解为用模型预测损失的信息,令 ,则:
这说明相对熵是按概率 损失的信息的期望(在(7.4.4)中使用了数学期望的性质(E5):
。同样,也可以将相对熵的定义(7.4.1)式写成:
其含义为按概率 的 和 的对数商的期望。不论是(7.4.4)式,还是(7.4.5)式,都说明相对熵是一种数学期望,能够用它度量当真实分布 、模型分布为 时的无效性。按照(7.4.4)式,我们期望损失更少的信息——该式表达的就是期望,即无效性更小,则相对熵越小。当相对熵为 时, ,并且可以证明 (详细证明请参阅本书在线资料)。
在(7.4.3)式基础上,还可以得到:
(7.4.6)式中等号右边第一项 即为分布 的熵的负数,根据7.2节的(7.2.3)式 ,得 ;第二项与熵类似,但对数的计算对象是另外一个分布函数,我们将它定义为交叉熵(cross entropy):
于是(7.4.6)式可以写成:
不要忘记,我们所假设的真实分布 是 ,又因为训练集样本已知,它熵 即不再变化。于是,由(7.4.8)式知,可以用交叉熵 判断相对熵 的情况——比较(7.4.1)式和(7.4.4)式,交叉熵的形式更简单。例如,有一个能够识别四种图片的模型——称为“四类别分类器”,能够识别“狗、猫、马、牛”,假设输入了一张图,经过分类器之后输出了预测值,如图7-4-1所示。
图 7-4-1
根据图中的预测值 和真实值 ,利用(7.2.18)式,可以计算交叉熵:
假设对分类器进行了优化,输出的预测值变为 ,此时交叉熵为: 显然 ,根据(7.4.5),则得到 ,即优化之后的分类器预测效果更好——通过上述假设的输出数据,凭直觉也能判断分类器的好坏。由此可以想到,正如第4章4.4.3节所列举的,可以用交叉熵作为损失函数,令其最小化,亦即相对熵最小化。
我们先探讨一种简单而常见的分类器——二分类的分类器(binary classification),用符号 表示分类器中待定的参数,预测值 ,相应地真实值标签 。训练集样本相对总体符合 i.i.d 要求, ,为输入数据; 为模型中真实参数 ; 中的
取值为 或 ; 对应的预测值简写成 。
由于二分类器的输出结果服从伯努利分布即
对照(7.4.7)式,可得其交叉熵:
将(7.4.9)式视为预测值与真实值之间的损失函数,设训练集中的样本数量为 ,由此交叉熵损失函数可构建代价函数(参阅第4章4.4.3节):
如果对(7.4.10)式求最小值,即可估计待定参数 的值,从而确定模型的具体形式。
二分类的交叉熵的交叉熵为损失函数,常用于Logistic回归和神经网络,在第4章4.4.3节中,曾使用Pytorch提供的函数实现了交叉熵损失函数,下面的程序演示中用的是scikit-learn库的log_loss()
函数,对模型的预测值和真实进行差异评估。
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节关于最大似然估计的计算中,也出现了对数运算。那么,这个两个有什么关系吗?先说结论:最小化交叉熵与最大似然估计等价。下面就证明此结论,不过由于是纯粹数学推导,读者可以略过,只知道此结论即可。
按照最大似然估计,设估计所得参数为 (其他符号假设同前),则:
对于有 个样本的训练集,根据大数定理, ,所以,以上计算结果等价于:
由此可知,最大似然估计,即最小化相对熵,也就是最小化交叉熵。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有