Typesetting math: 100%
  

一文搞懂交叉熵损失

本文从信息论和最大似然估计得角度推导交叉熵作为分类损失函数的依据。

从熵来看交叉熵损失

信息量

信息量来衡量一个事件的不确定性,一个事件发生的概率越大,不确定性越小,则其携带的信息量就越小。

X是一个离散型随机变量,其取值为集合X=x0,x1,,xn ,则其概率分布函数为p(x)=Pr(X=x),xX,则定义事件X=x0 的信息量为:

I(x0)=log(p(x0))

p(x0)=1时,该事件必定发生,其信息量为0.

熵用来衡量一个系统的混乱程度,代表系统中信息量的总和;熵值越大,表明这个系统的不确定性就越大。

信息量是衡量某个事件的不确定性,而熵是衡量一个系统(所有事件)的不确定性。

熵的计算公式

H(x)=i=1np(xi)log(p(xi))

其中,p(xi)为事件X=xi的概率,log(p(xi))为事件X=xi的信息量。

可以看出,熵是信息量的期望值,是一个随机变量(一个系统,事件所有可能性)不确定性的度量。熵值越大,随机变量的取值就越难确定,系统也就越不稳定;熵值越小,随机变量的取值也就越容易确定,系统越稳定。

相对熵 Relative entropy

相对熵也称为KL散度(Kullback-Leibler divergence),表示同一个随机变量的两个不同分布间的距离。

p(x),q(x) 分别是 离散随机变量X的两个概率分布,则pq的相对熵是:

DKL(pq)=ip(xi)log(p(xi)q(xi))

相对熵具有以下性质:

  • 如果p(x)q(x)的分布相同,则其相对熵等于0
  • DKL(pq)DKL(qp),也就是相对熵不具有对称性。
  • DKL(pq)0

总的来说,相对熵是用来衡量同一个随机变量的两个不同分布之间的距离。在实际应用中,假如p(x)是目标真实的分布,而q(x)是预测得来的分布,为了让这两个分布尽可能的相同的,就需要最小化KL散度。

交叉熵 Cross Entropy

p(x),q(x) 分别是 离散随机变量X的两个概率分布,其中p(x)是目标分布,pq的交叉熵可以看做是,使用分布q(x) 表示目标分布p(x)的困难程度:

H(p,q)=ip(xi)log1logq(xi)=ip(xi)logq(xi)

将熵、相对熵以及交叉熵的公式放到一起,

(1)H(p)=ip(xi)logp(xi)(2)DKL(pq)=ip(xi)logp(xi)q(xi)=i(p(xi)logp(xi)p(xi)logq(xi))(3)H(p,q)=ip(xi)logq(xi)

通过上面三个公式就可以得到

DKL(p,q)=H(p,q)H(p)

在机器学习中,目标的分布p(x) 通常是训练数据的分布是固定,即是H(p) 是一个常量。这样两个分布的交叉熵H(p,q) 也就等价于最小化这两个分布的相对熵DKL(pq)

p(x) 是目标分布(训练数据的分布),我们的目标的就让训练得到的分布q(x)尽可能的接近p(x),这时候就可以最小化DKL(pq),等价于最小化交叉熵H(p,q)

从最大似然看交叉熵

设有一组训练样本X={x1,x2,,xm} ,该样本的分布为p(x) 。假设使用θ 参数化模型得到q(x;θ) ,现用这个模型来估计X 的概率分布,得到似然函数

L(θ)=q(X;θ)=imq(xi;θ)

最大似然估计就是求得θ 使得L(θ) 的值最大,也就是

θML=argmaxθimq(xi;θ)

对上式的两边同时取log ,等价优化log 的最大似然估计即log-likelyhood ,最大对数似然估计

θML=argmaxθimlogq(xi;θ)

对上式的右边进行缩放并不会改变argmax 的解,上式的右边除以样本的个数m

θML=argmaxθ1mimlogq(xi;θ)

和相对熵等价

上式的最大化θML 是和没有训练样本没有关联的,就需要某种变换使其可以用训练的样本分布来表示,因为训练样本的分布可以看作是已知的,也是对最大化似然的一个约束条件。

注意上式的

1mimlogq(xi;θ)

相当于求随机变量X 的函数log(X;θ) 的均值 ,根据大数定理,随着样本容量的增加,样本的算术平均值将趋近于随机变量的期望。 也就是说

1mimlogq(xi;θ)ExP(logq(x;θ))

其中EXP 表示符合样本分布P 的期望,这样就将最大似然估计使用真实样本的期望来表示

θML=argmaxθExP(logq(x;θ))=argminθExP(logq(x;θ))

对右边取负号,将最大化变成最小化运算。

上述的推导过程,可以参考 《Deep Learning》 的第五章。 但是,在书中变为期望的只有一句话,将式子的右边除以样本数量m 进行缩放,从而可以将其变为Explogq(x;θ),没有细节过程,也可能是作者默认上面的变换对读者是一直。 确实是理解不了,查了很多文章,都是对这个变换的细节含糊其辞。一个周,对这个点一直耿耿于怀,就看了些关于概率论的科普书籍,其中共有介绍大数定理的:当样本容量趋于无穷时,样本的均值趋于其期望

针对上面公式,除以m后,1mimlogq(xi;θ) ,确实是关于随机变量函数logq(x) 的算术平均值,而x 是训练样本其分布是已知的p(x) ,这样就得到了Exp(logq(x))

DKL(pq)=ip(xi)log(p(xi)q(xi))=Exp(logp(x)q(x))=Exp(logp(x)logq(x))=Exp(logp(x))Exp(logq(x))

由于Exp(logp(x)) 是训练样本的期望,是个固定的常数,在求最小值时可以忽略,所以最小化DKL(pq) 就变成了最小化Exp(logq(x)) ,这和最大似然估计是等价的。

和交叉熵等价

最大似然估计、相对熵、交叉熵的公式如下

θML=argminθExplogq(x;θ)DKL=Explogp(x)Explogq(x)H(p,q)=imp(xi)logq(xi)=Explogq(x)θML=argminθExplogq(x;θ)DKL=Explogp(x)Explogq(x)H(p,q)=imp(xi)logq(xi)=Explogq(x)

从上面可以看出,最小化交叉熵,也就是最小化DKL ,从而预测的分布q(x) 和训练样本的真实分布p(x) 最接近。而最小化DKL 和最大似然估计是等价的。

多分类交叉熵

多分类任务中输出的是目标属于每个类别的概率,所有类别概率的和为1,其中概率最大的类别就是目标所属的分类。softmax 函数能将一个向量的每个分量映射到[0,1] 区间,并且对整个向量的输出做了归一化,保证所有分量输出的和为1,正好满足多分类任务的输出要求。所以,在多分类中,在最后就需要将提取的到特征经过softmax函数的,输出为每个类别的概率,然后再使用交叉熵 作为损失函数。

softmax函数定义如下:

Si=ezii=1nezi

其中,输入的向量为zi(i=1,2,,n)

更直观的参见下图

通过前面的特征提取到的特征向量为(z1,z2,,zk) ,将向量输入到softmax函数中,即可得到目标属于每个类别的概率,概率最大的就是预测得到的目标的类别。

Cross Entropy Loss

使用softmax函数可以将特征向量映射为所属类别的概率,可以看作是预测类别的概率分布q(ci) ,有

q(ci)=ezii=1nezi

其中ci 为某个类别。

设训练数据中类别的概率分布为p(ci) ,那么目标分布p(ci) 和预测分布q(ci)的交叉熵为

H(p,q)=ip(ci)logq(ci)

每个训练样本所属的类别是已知的,并且每个样本只会属于一个类别(概率为1),属于其他类别概率为0。具体的,可以假设有个三分类任务,三个类分别是:猫,猪,狗。现有一个训练样本类别为猫,则有:

(4)p(cat)=1(5)p(pig)=0(6)p(dog)=0

通过预测得到的三个类别的概率分别为:q(cat)=0.6,q(pig)=0.2,q(dog)=0.2 ,计算pq 的交叉熵为:

H(p,q)=(p(cat)logq(cat)+p(pig)+logq(pig)+logq(dog))=(1log0.6+0log0.2+0log0.2)=log0.6=logq(cat)

利用这种特性,可以将样本的类别进行重新编码,就可以简化交叉熵的计算,这种编码方式就是one-hot 编码。以上面例子为例,

cat=(100)pig=(010)dog=(001)

通过这种编码方式,在计算交叉熵时,只需要计算和训练样本对应类别预测概率的值,其他的项都是0logq(ci)=0

具体的,交叉熵计算公式变成如下:

Cross_Entropy(p,q)=logq(ci)

其中ci 为训练样本对应的类别,上式也被称为负对数似然(negative log-likelihood,nll)

PyTorch中的Cross Entropy

PyTorch中实现交叉熵损失的有三个函数torch.nn.CrossEntropyLosstorch.nn.LogSoftmax以及torch.nn.NLLLoss

  • torch.nn.functional.log_softmax 比较简单,输入为n维向量,指定要计算的维度dim,输出为log(Softmax(x))。其计算公式如下:

LogSoftmax(xi)=log(exp(xi)jexp(xj))

没有额外的处理,就是对输入的n维向量的每个元素进行上述运算。

  • torch.nn.functional.nll_loss 负对数似然损失(Negative Log Likelihood Loss),用于多分类,其输入的通常是torch.nn.functional.log_softmax的输出值。其函数如下
torch.nn.functional.nll_loss(input, target, weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')

input 也就是log_softmax的输出值,各个类别的对数概率。target 目标正确类别,weight 针对类别不平衡问题,可以为类别设置不同的权值;ignore_index 要忽略的类别,不参与loss的计算;比较重要的是reduction 的值,有三个取值:none 不做处理,输出的结果为向量;meannone结果求均值后输出;sumnone 结果求和后输出。

  • torch.nn.CrossEntropyLoss就是上面两个函数的组合nll_loss(log_softmax(input))

二分类交叉熵

多分类中使用softmax函数将最后的输出映射为每个类别的概率,而在二分类中则通常使用sigmoid 将输出映射为正样本的概率。这是因为二分类中,只有两个类别:{正样本,负样本},只需要求得正样本的概率q,则1q 就是负样本的概率。这也是多分类和二分类不同的地方。

sigmoid 函数的表达式如下:

σ(z)=11+ez

sigmoid的输入为z ,其输出为(0,1) ,可以表示分类为正样本的概率。

二分类的交叉熵可以看作是交叉熵损失的一个特列,交叉熵为

Cross_Entropy(p,q)=imp(xi)logq(xi)

这里只有两个类别xx1,x2 ,则有

Cross_Entropy(p,q)=(p(x1)logq(x1)+p(x2)logq(x2))

因为只有两个选择,则有p(x1)+p(x2)=1,q(x1)+q(x2)=1 。设,训练样本中x1的概率为p,则x21p; 预测的x1的概率为q,则x2的预测概率为1q 。则上式可改写为

Cross_Entropy(p,q)=(plogq+(1p)log(1q))

也就是二分类交叉熵的损失函数。

总结

相对熵可以用来度量两个分布相似性,假设分布p是训练样本的分布,q是预测得到的分布。分类训练的过程实际上就是最小化DKL(pq),由于由于交叉熵

H(p,q)=DKL(pq)+H(p)

其中,H(p)是训练样本的熵,是一个已知的常量,这样最小化相对熵就等价于最小化交叉熵。

从最大似然估计转化为最小化负对数似然

θML=argminθExplogq(x;θ)

也等价于最小化相对熵。



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   Brook_icv  阅读(54258)  评论(6编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
历史上的今天:
2016-12-19 生成特定分贝的音频波形
点击右上角即可分享
微信分享提示