熵、KL散度(相对熵)、交叉熵
作者:互联网
目录
熵定义
\(s(x) = - \sum_iP(x_i)log_bP(x_i)\)
- 熵的定义表明了一个事件所含有的信息量,上式中\(x_i\)表示一个事件,\(P(x_i)\)表示该事件发生的概率。由定义可知,如果某事件发生概率为1,则它的熵为0。
- 独立事件的信息量可叠加。
- 由于事件发生的概率在[0,1]之间,因此熵的定义中有负号,来抵消负的对数函数值,使得最终计算得到的熵是正的。
- 需要注意的是,熵都是基于概率计算的,具体计算中跟样本取值没有关系。
KL散度(相对熵)定义
- 离散事件的KL散度定义为:
\(D_{KL}(A||B) = \sum_iP_A(x_i)log(\frac{P_A(x_i)}{P_B(x_i)}) = \sum_iP_A(x_i)logP_A(x_i) - \sum_iP_A(x_i)logP_B(x_i)\) - 连续事件的KL散度定义为:
\(D_{KL}(A||B) = \int a(x)log(\frac{a(x)}{b(x)})\) - KL散度可以用来衡量两个分布(事件)的不同,即对于两个单独的概率分布A和B,KL散度可以用来表示从事件A的角度看,事件B有多大不同,或者反过来从B的角度看,事件A有多大不同。
- KL散度不具有对称性。
交叉熵
\(H(A, B) = -\sum_i P_A(x_i)log(P_B(x_i))\)
- 交叉熵表示从事件A的角度看,如何描述事件B。
- 事件A与B的交叉熵形式上就是A与B的KL散度公式中的后半部分。
- A与B的交叉熵=A与B的KL散度-A的熵。
- 交叉熵不具有对称性。
机器学习与交叉熵
- 在机器学习的有监督分类任务中通常采用交叉熵作为损失函数,本质上是对KL散度的一种简化。
- 概率论中,随机变量是随机事件的一种数学表示,随机变量的分布则是一个函数,将随机变量的不同取值映射到该取值发生的概率上。
- 在有监督分类任务中,我们最终训练得到的分类模型本质上就是一个映射,将一个样本映射到该样本发生的概率上(通常对分类结果进行归一化,softmax),因此,训练的目的本质上就是为了学习一个映射,相当于学习一个随机变量的分布。假设每条数据样本均为独立同分布采样,我们希望学习到的分布与真实分布相同,但是由于真实分布无法获得(不可能采集到所有样本),因此用训练集的分布来代替真实分布,因此可以用训练集分布(真实分布)关于模型分布的KL散度作为损失函数,希望模型训练得到的分布尽可能与真实分布一致。
- 由于KL散度的公式中的第一项是真实分布的熵,而我们是用训练集的分布来代替的真实分布,在机器学习模型的优化过程中训练集的分布是不会改变的,无法优化。因此为了简单起见,可以只使用KL散度的第二项作为损失函数,即交叉熵作为损失函数。
- 在具体实现中,可以认为训练集中(样本,类别)-> 概率 表示了一种真实分布,当然这里的概率一般采用one-hot编码表示。比如(样本1,猫)-> 1 表示(样本1,猫)发生的概率为1,那么当然这个样本一定是属于猫这一类。在模型预测的输出中,会输出一个分类向量,分类向量每个元素分别表示样本1属于某一类的概率,计算真实概率与模型输出之间的交叉熵即可作为模型损失。
- 刚开始学机器学习时总觉得困惑的有两点,一是既然模型训练的目的是学习数据的真实分布,那么为什么计算损失的时候只计算标签和输出之间的损失,是怎么跟数据的分布联系起来的,实际上计算分布之间的差异用的就是概率,没有用到实际的样本值。二是会认为数据样本是随机变量的取值,而对应的类别是概率,但实际上数据样本和类别都是数据的一部分,标签是对应的概率,在具体实现中是没有类别对应的具体的数字的,而是以概率或者说标签来给出了类别。因此,模型输出的n维预测向量隐式表示了随机向量n个取值(虽然我们看到的只有一个数据样本,但是与隐含的n个类别一起形成了n个取值)对应的概率,且这些概率相加为1,有取值有概率,可以看成是个分布,当然可以用交叉熵来表示差异。这样问题又来了,相当于每个训练样本都对应了一个分布,然后针对每个训练样本计算交叉熵,通过拟合每个样本,最终拟合整个训练集?
标签:概率,交叉,样本,散度,KL,分布 来源: https://www.cnblogs.com/chkplusplus/p/16141720.html