@TOC
信息论
要说到交叉熵,我们一定离不开信息论的知识,首先我们先回顾一下以下知识。
熵
熵最早源于物理中的热力学,它衡量了一个概率分布的混乱程度,或者说它包含的信息量的大小。
对于离散型随机变量,假设取之有n种情况,熵定义为:$$H\left( p\right) =E_{p}\left[ -\ln p\left( x\right) \right] =\sum ^{n}_{i=1}-p_{i}\ln pi
$$ 下面我们举例计算一下: ![请添加图片描述](https://ucc.alicdn.com/images/user-upload-01/52ea1fb020a44e73bcc113fc96bcbd36.jpeg) 对于连续性随机变量,假设概率密度函数p(x),熵被定义为:$$H\left( p\right) =f_{-n}^{+n}p\left( x\right) \ln p\left( x\right) dx$$ ## KL散度 KL散度(Kullback-Leibler Divergence)也称为相对熵,同样用于衡量两个概率分布之间的差异。其值越大,则两个概率分布的差异越大; $$\begin{aligned}D_{KL}\left( p\| q\right) =\sum _{x}p\left( x\right) \ln \dfrac{p\left( x\right) }{q\left( x\right) }\\ =\sum _{x}p\left( x\right) ( \ln p\left( x\right) -\left( \ln q\left( x\right) \right) \\ =\sum _{x}p\left( x\right) \ln p(x)-\sum _{x}p(x)\ln q(x)\\ \\ \end{aligned}$$ ## 交叉熵 交叉熵定义在两个概率分布之上,反映了他们之间的差异程度,机器学习算法在很多时候的训练目标是使得模型拟合出来的概率分布接近于真实的概率分布,因此可以用交叉熵来构造损失函数,在分类任务重应用广泛,是最常见的损失函数之一。 $$h(p,q) = -\sum_{x}p(x) \ln q(x)$$ ## 为什么交叉上可以用于计算代价 kl散度与交叉熵都可以表示衡量两个概率分布的差距,我们为什么选用交叉熵呢?我们观察KL散度公式,我们发现,**KL散度 = 交叉熵-熵**,我们在训练模型的时候,目标是使模型的概率分布接近于真实的概率分布(用训练集数据分布近似替代),因为训练集的概率分布是确定的,为了方便计算,所以可以直接用交叉熵作为优化目标。 # Pytorch版本交叉熵代码 ```python import torch y = torch.tensor([0, 2]) y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]]) def corss_entorpy(y_hat, y): return -torch.log(y_hat[range(len(y_hat)), y]) corss_entorpy(y_hat, y) ```