ML/Deep Learning Note4-交叉熵与KL散度
Published:
昨晚被Johnny Zhu问了一下交叉熵是啥东西,发现自己确实是学了如学,只学了个名字,所以重新整理一下
信息量
举个例子
事件A为小猪一天速通深度学习,事件B为小猪今天吃了三顿饭
很明显事件B绝对发生,小猪肯定要吃饭,所以我们认为理所应当,而事件A一天速通深度学习,这件事情显然不是那么可能,我们可能会问“咋学的这么快”“学了啥啊”等等,所以其中包含的信息明显比“一天吃三顿饭”多得多,这也就是事件的信息量
所以,事件发生的可能性越低,信息量越大
信息量的定义式:
假设$X$是一个离散型随机变量,其取值几何为$\chi$,概率分布函数为$p(x)$,$x\in\chi$,则定义事件$X=x_0$的信息量为:
\[I(x_0)=-log(p(x_0))\]因为概率的取值是0到1,所以函数图形如下:

(确实很符合概率越小,信息量越大的直觉)
熵
对于某个事件,有n种可能的结果,每一个结果对应一个概率,又都对应一个信息量
事件:我去旅游
| 序号 | 事件 | 概率 | 信息量 |
|---|---|---|---|
| A | 我坐高铁去的 | 0.8 | 0.22 |
| B | 我坐飞机去的 | 0.19 | 1.66 |
| C | 我坐火箭去的 | 0.01 | 4.6 |
熵用来表示所有信息量的期望,即:
\[H(X)=-\sum_{i=1}^np(x_i)log(p(x_i))\]其中n代表所有的n种可能性
0-1分布问题
当问题为0-1分布问题,即非此即彼,只有两种可能时,熵的算式可化简为:
\[H(X)=-\sum_{i=1}^np(x_i)log(p(x_i))\\\\=-p(x)log(p(x))-(1-p(x))log(1-p(x))\]KL散度(相对熵)
如果对于同一个随机变量$x$有两个单独的概率分布$P(x)$和$Q(x)$,我们可以用KL散度(Kullback-Leibler divergence)来衡量这两个分布的差异
KL散度是一种衡量两个概率分布之间差异性的度量方法
(维基百科说:在描述原来的问题时,P是第一种方法,它对应了一种概率分布,现在你要用一个新的方法Q来描述这个问题,得到了另外一个概率分布,这两个概率分布之间的信息量差值就是KL散度。
为什么要用KL散度?
机器学习中,我们不断尝试用改变函数的权重$w$和偏差$b$来拟合数据,KL散度给我们一种方法来衡量拟合预测的数据与原数据的差异,当然是差异越小越小啦(不要过拟合就行)
KL散度计算公式:
\[D_{KL}(p||q)=\sum^n_{i=1}p(x_i)log(\frac{p(x_i)}{q(x_i)})\]n为事件的所有可能性,$D_{KL}$的值越小,表示p和q的分布越接近
交叉熵
对KL散度的公式变形可得:
\[D_{KL}(p||q)=\sum^n_{i=1}p(x_i)log({p(x_i)})-\sum^n_{i=1}p(x_i)log({q(x_i)})\\\\=-H(p(X))+[-\sum^n_{i=1}p(x_i)log(q(x_i))]\]等式的前一部分恰好就是p的熵,等式的后一部分,就是交叉熵: \(H(p,q)=\sum_{i=1}^n-p(x_i)log(q(x_i))\)
为什么要引入交叉熵?
在机器学习中,我们需要评估label和predicts之间的差距,使用KL散度刚刚好,即$D_{KL}(y||\hat{y})$ 由于KL散度中的前一部分$-H(y)$不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。
参考博客:https://blog.csdn.net/tsyccnh/article/details/79163834
