机器学习 | 算法模型 —— 算法训练:损失函数之交叉熵(熵/相对熵/KL散度/sigmoid/softmax)
目录
1.信息论
交叉熵(cross entropy)是深度学习中常用的一个概念,一般用来求目标与预测值之间的差距。同时,交叉熵也是信息论中的一个概念,要想了解交叉熵的本质,需要先从最基本的概念讲起。
1.1.信息量
首先是信息量。假设我们听到了两件事,分别如下:
- 事件A:巴西队进入了2020世界杯决赛圈。
- 事件B:中国队进入了2020世界杯决赛圈。
仅凭直觉来说,显而易见事件B的信息量比事件A的信息量要大。究其原因,是因为事件A发生的概率很大,事件B发生的概率很小。所以当越不可能的事件发生了,我们获取到的信息量就越大。越可能发生的事件发生了,我们获取到的信息量就越小。那么信息量应该和事件发生的概率有关。假设X是一个离散型随机变量,其取值集合为χ,概率分布函数p(x)=Pr(X=x),x∈χp(x)=Pr(X=x),x∈χ,则定义事件X=x0X=x0的信息量为:
1.2.熵
考虑另一个问题,对于某个事件,有n种可能性,每一种可能性都有一个概率p(xi)。这样就可以计算出某一种可能性的信息量。举一个例子,假设你拿出了你的电脑,按下开关,会有三种可能性,下表列出了每一种可能的概率及其对应的信息量:
序号 事件 概率p 信息量I A 电脑正常开机 0.7 -log(p(A))=0.36 B 电脑无法开机 0.2 -log(p(B))=1.61 C 电脑爆炸了 0.1 -log(p(C))=2.30 熵则表示的是所有信息量的期望:
因此,上述表格中的熵可计算为:
1.3.KL散度(相对熵)
相对熵又称KL散度,如果我们对于同一个随机变量 x 有两个单独的概率分布 P(x) 和 Q(x),我们可以使用 KL 散度来衡量这两个分布的差异(换个角度来说,也是两个分布的相似度)。即如果用P来描述目标问题,而不是用Q来描述目标问题,得到的信息增量。在机器学习中,P往往用来表示样本的真实分布,比如[1,0,0]表示当前样本属于第一类。Q用来表示模型所预测的分布,比如[0.7,0.2,0.1],直观的理解就是如果用P来描述样本,那么就非常完美。而用Q来描述样本,虽然可以大致描述,但是不是那么的完美,信息量不足,需要额外的一些“信息增量”才能达到和P一样完美的描述。如果我们的Q通过反复训练,也能完美的描述样本,那么就不再需要额外的“信息增量”,Q等价于P。
KL散度计算公式:
上述公式中,n表示事件的所有可能性。KL单独的值越小,表明两个分布之间越相似。
1.4.交叉熵
对KL散度进行变形可得:
等式的前一部分恰巧就是p的熵,等式的后一部分,就是交叉熵:
在机器学习中,我们需要评估label和predicts之间的差距,使用KL散度刚刚好,即DKL(y||y^),由于KL散度中的前一部分−H(y)不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。
2.交叉熵的类型
交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。
2.1.多分类交叉熵
多分类任务中输出的是目标属于每个类别的概率,所有类别概率的和为1,其中概率最大的类别就是目标所属的分类。 而softmax函数能将一个向量的每个分量映射到[0,1]区间,并且对整个向量的输出做了归一化,保证所有分量输出的和为1,正好满足多分类任务的输出要求。所以,在多分类中,在最后就需要将提取的到特征经过softmax函数的,输出为每个类别的概率,然后再使用交叉熵 作为损失函数。softmax函数定义如下:
其中输入向量为Z=[z1,z2,z3, ... , zk](k = 1,2,3 ... n)。直观的变换过程如下图所示:
通过前面的特征提取到的特征向量为(z1,z2,…,zk) ,将向量输入到softmax函数中,即可得到目标属于每个类别的概率,概率最大的就是预测得到的目标的类别。使用softmax函数可以将特征向量映射为所属类别的概率,可以看作是预测类别的概率分布q(ci),有:
其中,ci为某个类别。设训练数据中类别的真实概率分布为p(ci) ,那么目标分布p(ci)和预测分布q(ci)的交叉熵为:
【引例】
每个训练样本所属的类别是已知的,并且每个样本只会属于一个类别(概率为1),属于其他类别概率为0。具体的,可以假设有个三分类任务,三个类分别是:猫,猪,狗。现有一个训练样本类别为猫,则有:
通过预测得到的三个类别的概率分别为:q(cat)=0.6,q(pig)=0.2,q(dog)=0.2,计算p 和q的交叉熵为:
利用这种特性,可以将样本的类别进行重新编码,就可以简化交叉熵的计算,这种编码方式就是OneHot编码。以上述实例为例:
通过这种编码方式,在计算交叉熵时,只需要计算和训练样本对应类别预测概率的值,其他的项都是 0 * log q(ci) = 0,具体的,交叉熵计算公式变成如下:
其中ci为训练样本对应的类别,上式也被称为负对数似然(negative log-likelihood,nll)
2.2.二分类交叉熵
多分类中使用softmax函数将最后的输出映射为每个类别的概率,而在二分类中则通常使用sigmoid将输出映射为正样本的概率。这是因为二分类中,只有两个类别:{正样本,负样本},只需要求得正样本的概率q,则1−q就是负样本的概率。sigmoid函数的表示形式如下:
sigmoid的输入为Z={z1, z2} ,其输出元素的值为(0,1)范围内的值,可以表示分类为正样本的概率。二分类的交叉熵可以看作是交叉熵损失的一个特列,交叉熵为:
由于二分类仅有两个分类x1和x2,则有:
因为只有两个选择,则有p(x1)+p(x2)=1,q(x1)+q(x2)=1。设,训练样本中x1的概率为p,则x2为1−p; 预测的x1的概率为q,则x2的预测概率为1−q 。则上式可改写为:
也就是二分类交叉熵的损失函数。
3.学习过程(以二分类为例)
如上图所示,求导过程可分成三个子过程,即拆成三项偏导的乘积:
3.1.第一项求偏导
3.2.第二项求偏导
3.3.第三项求导
3.4.计算结果
得到了上述最终的偏导结果之后,接下来只需要基于反向传播的误差、学习速率、原始权重和上述公式便可以计算出更新之后的权重。
参考博客:https://zhuanlan.zhihu.com/p/35709485