一、熵
二、相对熵(KL散度)
P表示样本的真实分布,Q表示模型所预测的分布,那么KL散度就可以计算两个分布的差异,也就是Loss损失值。Q的分布越接近P(Q分布越拟合P),那么散度值越小,即损失值越小。
有时会将KL散度称为KL距离,但它并不满足距离的性质:
不对称;
不满足三角不等式。
三、交叉熵
我们将KL散度公式进行变形:
前一部分恰巧就是p的熵,等式的后一部分,就是交叉熵:
在机器学习中,我们需要评估label和predicts之间的差距,使用KL散度刚刚好,由于KL散度中的前一部分−H(y)不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。
四、目前分类损失函数为何多用交叉熵,而不是KL散度,也不是直接用距离相关的均方差?
不使用KL散度:
由于KL散度中的前一部分−H(y)不变(目标分布的熵为常数),故在优化过程中,只需要关注交叉熵就可以了。但是如果目标分布是有变化的(如同为猫的样本,不同的样本,其值也会有差异),那么就不能使用交叉熵。例如蒸馏模型的损失函数就是KL散度,因为蒸馏模型的目标分布也是一个模型,该模型针对同类别的不同样本,会给出不同的预测值(如两张猫的图片a和b,目标模型对a预测为猫的值是0.6,对b预测为猫的值是0.8)。
不直接用距离相关的均方差:
假设神经网络的最后一层激活函数为sigmoid,它的两头异常的平,也就是说在那些地方的导数接近于0。而反向传播是需要求导的,用了均方差损失函数之后求导结果包含y(y-1) ,y接近于0或者1的时候都趋于0,会导致梯度消失,网络训练不下去(梯度弥散)。但如果用相对熵衍生出来的交叉熵作为损失函数则没有这个问题。因此虽然相对熵的距离特性不是特别好,但总归好过直接梯度消失玩不下去,因此很多用sigmoid作为激活函数的神经网络还是选择了用相对熵衍生出来的交叉熵作为损失函数。