信息量
事件发生的概率越小,信息量越大。
假设$
X
$是一个离散型随机变量,取值集合为$
\chi
$,概率分布函数为
则定义事件$
X=x_{0}
$的信息量为:
信息熵
信息量的期望就是熵,假设事件$
X
$有n种可能,发生$
\boldsymbol{x}_{i}
$的概率为$
p\left(x_{i}\right)
$,那么该事件的熵$
H(X)
$为:
如果发生的事件只有两种可能性,那么熵的计算转化为下列式子:
相对熵(KL散度/KL divergence)
相对熵又叫KL散度,也叫做信息增益,如果我们对于同一个随机变量$X$,有两个单独的概率分布$P(X)$和$Q(X)$,我们可以用KL散度来衡量这两个分布的差异。
在机器学习中,P分布往往用来表示样本的真实分布,即标签label,Q用来表示模型所预测的分布,那么KL散度就可以计算两个分布的差异,也就是计算损失值Loss。
可以看出,Q的分布越接近P(Q分布越拟合P),那么KL散度越小,即Loss越小,因为对数函数是凸函数,所以KL散度的值为非负数。下面给出KL散度非负的两种证明,对xi的求和变积分。
方法一:
上式用到了$\forall x \in(0,+\infty), \log x \leq x-1$,代入$\frac{q(x)}{p(x)}$就可以得到,$\log \frac{p(x)}{q(x)} \geq 1-\frac{q(x)}{p(x)}$
方法二:
上式用到了Jensen不等式,对于一个凸函数$f$,满足$f(\mathbb{E}[x]) \leq \mathbb{E}[f(x)]$,又由于$-log(·)$为凸函数,所以可得。
KL散度有时被称为KL距离,但它不满足距离的性质:
KL散度不对称,$
D_{K L}(p | q) ≠ D_{K L}(q | p)
$。KL散度不满足三角不等式。
交叉熵
将KL散度公式变形:
等式的前半部分是P分布的熵的负数,等式后半部分,就是交叉熵。
在机器学习中,我们需要评估label和predicts之间的差距,使用KL散度刚刚好,由于KL散度中的前一部分$
-H(p(x))
$,label的分布是已知且不变的常数,所以它的熵是个定值,故在计算Loss时,只需要计算交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做Loss,来优化和评估模型。
几个熵之间的关系
信息熵:表示随机变量的不确定性。
条件熵:在一个条件下,随机变量的不确定性。
相对熵:信息熵 - 条件熵,当有新的条件(信息)增加进来后,信息熵的大小降至条件熵,差值即为新的条件带来的信息增益,因此相对熵也叫信息增益。
JS散度
JS散度度量了两个概率分布的相似度,是基于KL散度的变体,解决了KL散度非对称的问题。一般地,JS散度是对称的,其取值是0到1之间。定义如下:
Wasserstein距离
KL散度和JS散度度量的问题:
我们训练模型是通过最小化损失函数来最小化两个分布的距离,如果两个分布P,Q离得很远,完全没有重叠或重叠可忽略不计的情况,这个时候模型predicts的分布变化后,两者的KL散度都没有变化(等于0),损失函数不变的话就没有梯度了,没梯度模型自然学不动了,那么KL散度值是没有意义的,而JS散度值是一个常数。这在学习算法中是比较致命的,这就意味这这一点的梯度为0,梯度消失了。
Wasserstein距离度量两个概率分布之间的距离,定义如下:
Π(P1,P2)是P1和P2分布组合起来的所有可能的联合分布的集合。对于每一个可能的联合分布γ,可以从中采样(x,y)∼γ得到一个样本x和y,并计算出这对样本的距离||x−y||,所以可以计算该联合分布γ下,样本对距离的期望值E(x,y)∼γ[||x−y||]。在所有可能的联合分布中能够对这个期望值取到的下界infγ∼Π(P1,P2)E(x,y)∼γ[||x−y||]就是Wasserstein距离。
直观上可以把E(x,y)∼γ[||x−y||]理解为在γ这个路径规划下把土堆P1挪到土堆P2所需要的消耗。而Wasserstein距离就是在最优路径规划下的最小消耗。所以Wesserstein距离又叫Earth-Mover距离。
Wasserstein距离相比KL散度、JS散度的优越性在于,即便两个分布没有重叠,Wasserstein距离仍然能够反映它们的远近;而JS散度在此情况下是常量,KL散度可能无意义。考虑如下二维空间中的两个分布
可见KL散度和JS散度都在theta等于0处突变,而Wasserstein距离是一个平滑的,如果我们要用梯度下降法优化theta这个参数,前两者根本提供不了梯度,Wasserstein距离却可以。类似地,在高维空间中如果两个分布不重叠或者重叠部分可忽略,则KL和JS既反映不了远近,也提供不了梯度,但是Wasserstein却可以提供有意义的梯度。
总结
目前分类损失函数为何多用交叉熵,而不是KL散度?
首先损失函数的功能是通过样本来计算模型分布与目标分布间的差异,在分布差异计算中,KL散度是最合适的。但在实际中,某一事件的标签label是已知不变的(例如我们设置猫的label为1,那么所有关于猫的样本都要标记为1),即目标分布的熵为常数。而根据上面KL公式可以看到,KL散度 - 目标分布熵 = 交叉熵(这里的“-”表示裁剪)。所以我们不用计算KL散度,只需要计算交叉熵就可以得到模型分布与目标分布的损失值。
从上面介绍,知道了模型分布与目标分布差异可用交叉熵代替KL散度的条件是目标分布为常数。如果目标分布是有变化的(如同为猫的样本,不同的样本,其值也会有差异,即不同的样本的分布不是定值,标签不固定,如果标签固定,即使是软分布,熵也是定值,不影响训练结果),那么就不能使用交叉熵,例如蒸馏模型的损失函数就是KL散度,因为蒸馏模型的目标分布也是一个模型,该模型针对同类别的不同样本,会给出不同的预测值(如两张猫的图片a和b,目标模型对a预测为猫的值是0.6,对b预测为猫的值是0.8)。
交叉熵:其用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出的努力的大小。这也是为什么在机器学习中的分类算法中,我们总是最小化交叉熵,因为交叉熵越低,就证明由算法所产生的策略最接近最优策略,也间接证明我们算法所算出的predicts分布越接近真实分布。
KL散度(相对熵):衡量不同策略之间的差异,所以我们使用KL散度来做模型分布的拟合损失。
延伸阅读
求Wasserstein距离的计算具体操作:Wasserstein距离用对偶形式转成另一个形式(带Lipschitz约束),然后用采样的方式得到一个估计。至于怎么加Lipschitz约束,就有原文章提的gradient clip,后续提出的gradient penalty等方法