KevinCK:交叉熵、相对熵(KL散度)、JS散度和Wasserstein距离(推土机距离)
信息量:
昨天下雨这个事件,因为已知,那么它的信息量就为0。
明天会下雨这个事件,因为未知,那么这个事件的信息量就大。
事件发生的概率越小,(但对其进行预测,那么)其信息量越大。(比如,告诉我,赛马中哪匹是第一,信息量很大(有价值)。告诉我明天太阳会升起,信息量很小(说了等于没说))
假设
则定义
单调递减,因为,事件发生的概率越小,(但对其进行预测,那么)其信息量越大
熵:
信息量的期望就是熵:
假设 事件
(计算某随机变量的熵的前提:知道这个变量的真实分布)
0-1分布问题,熵的计算方法可以简化为如下算式:(p是成功概率)
import matplotlib.pyplot as plt #画图包
import numpy as np
x = np.linspace(0,1,50)
y = -(x * np.log(x) + (1-x)* np.log(1 - x))
plt.plot(x,y)
plt.show()
#y = -x * np.log(x)
#<stdin>:1: RuntimeWarning: divide by zero encountered in log
抛硬币,它是均匀的时候,最难预测结果,正反面的概率都是1/2,它是完全随机的!
此时熵为log2, 最大。
如果一张图,猫狗二分类,label是[0, 1],熵是-1乘log1 - 0乘log 0,等于0?
log 0,
RuntimeWarning: divide by zero encountered in log
相对熵(KL散度):
如果同一个随机变量 x 有两个单独的概率分布 P(x) 和 Q(x),可以使用 KL 散度来衡量这两个分布的差异。
P往往用来表示样本的真实分布,Q用来表示模型所预测的分布,那么KL散度就可以计算两个分布的差异,经常作为损失值。
Q的分布越接近P(Q分布越拟合P),那么散度值越小。
因为对数函数是凸函数,所以KL散度的值为非负数。(需要推一下)
有时会将KL散度称为KL距离,但它并不满足距离的性质:
- KL散度不是对称的;
- KL散度不满足三角不等式。
交叉熵:
我们将KL散度公式进行变形:
等式的前一部分恰巧就是p的熵,等式的后一部分,就是交叉熵:
计算模型分布与目标分布间的差异,KL散度是最合适的。即
由于KL散度中的前一部分−H(y)不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。
某一事件的标签是已知的,不变的(例如设置猫的label为1,那么所有关于猫的样本都要标记为1),即目标分布的熵为常数。
不用计算KL散度,只需要计算交叉熵,就可以得到模型分布与目标分布的损失值。(交叉熵代替KL散度)
2. 如果目标分布是有变化的,那么就不能使用交叉熵
例如蒸馏模型的损失函数就是KL散度,因为蒸馏模型的目标分布也是一个模型,该模型针对同类别的不同样本,会给出不同的预测值(如两张猫的图片a和b,目标模型对a预测为猫的值是0.6,对b预测为猫的值是0.8)。 (毕竟没用到ground truth?)
交叉熵和KL散度应用方式不同的另一种解释(暂时没理解):
交叉熵: 衡量在给定的真实分布下,使用 非真实分布所指定的策略 消除系统的不确定性 所需要付出的努力的大小 (模型在推断阶段,需要付出的努力是什么?)。https://towardsdatascience.com/understanding-binary-cross-entropy-log-loss-a-visual-explanation-a3ac6025181atowardsdatascience.com
最小化交叉熵,诱导由算法产生的策略 接近最优策略, KL散度(相对熵):
衡量不同策略( 模型分布?)之间的差异
熵
→把真值q换成预测概率p,得到交叉熵
→ 交叉熵 - 熵 =(定义为) KL散度
交叉熵大于等于熵【预测的分布只能接近真实分布,但永远不会严格相等?】(KL散度非负)
binary cross-entropy / log loss
cross-entropy即log loss?