交叉熵损失函数

相对熵可以写成如下形式:

交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式。与二次代价函数相比,它能更有效地促进ANN的训练。在介绍交叉熵代价函数之前,本文先简要介绍二次代价函数,以及其存在的不足。

多分类交叉熵损失函数公式_多分类交叉熵损失函数公式含义多分类交叉熵损失函数公式_多分类交叉熵损失函数公式含义


多分类交叉熵损失函数公式_多分类交叉熵损失函数公式含义


ANN的设计目的之一是为了使机器可以像人一样学习知识。人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大。比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐。同理,我们希望:ANN在训练时,如果预测值与实际值的误越大,那么在反向传播训练的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛。然而,如果使用二次代价函数训练ANN,看到的实际效果是,如果误越大,参数调整的幅度可能更小,训练更缓慢。

以一个神经元的二类分类训练为例,进行两次实验(ANN常用的激活函数为sigmoid函数,该实验也采用该函数):输入一个相同的样本数据x=1.0(该样本对应的实际分类y=0);两次实验各自随机初始化参数,从而在各自的次前向传播后得到不同的输出值,形成不同的代价(误):

实验1:次输出值为0.82

实验2:次输出值为0.98

在实验1中,随机初始化参数,使得次输出值为0.82(该样本对应的实际值为0);经过300次迭代训练后,输出值由0.82降到0.09,逼近实际值。而在实验2中,次输出值为0.98,同样经过300迭代训练,输出值只降到了0.20。

从两次实验的代价曲线中可以看出:实验1的代价随着训练次数增加而快速降低,但实验2的代价在一开始下降得非常缓慢;直观上看,初始的误越大,收敛得越缓慢。

其实,误大导致训练缓慢的原因在于使用了二次代价函数。二次代价函数的公式如下:

如图所示,实验2的初始输出值(0.98)对应的梯度明显小于实验1的输出值(0.82),因此实验2的参数梯度下降得比实验1慢。这就是初始的代价(误)越大,导致训练越慢的原因。与我们的期望不符,即:不能像人一样,错误越大,改正的幅度越大,从而学习得越快。

可能有人会说,那就选择一个梯度不变化或变化不明显的激活函数不就解决问题了吗?图样图森破,那样虽然简单粗暴地解决了这个问题,但可能会引起其他更多更麻烦的问题。而且,类似sigmoid这样的函数(比如tanh函数)有很多其中,N 是训练集的数据量,下图是引入正则化带来的良好的性质:优点,非常适合用来做激活函数,具体请自行google之

说起交叉熵损失函数「Cross Entropy Loss」,脑海中立马浮现出它的公式:

我们已经对这个交叉熵函数非常熟悉,大多数情况下都是直接拿来使用就好。但是它是怎么来的?为什么它能表征真实样本标签和预测概率之间的值?上面的交叉熵函数是否有其它变种?也许很多朋友还不是很清楚!没关系,接下来我将尽可能以最通俗的语言回答上面这几个问题。

Sigmoid 函数的表达式和图形如下所示:

其中 s 是模型上一层的输出,Sigmoid 函数有这样的特点:s = 0 时,g(s) = 0.5;s >> 0 时, g ≈ 1,s << 0 时,g ≈ 0。显然,g(s) 将前一级的线性输出映射到 [0,1] 之间的数值概率上。这里的 g(s) 就是交叉熵公式中的模型预测输出 。

我们说了,预测输出即 Sigmoid 函数的输出表征了当前样本标签为 1 的概率:

很明显,当前样本标签为 0 的概率就可以表达成:

重点来了,如果我们从极大似然性的角度出发,把上面两种情况整合到一起:

也即,当真实样本标签 y = 0 时,上面式子项就为 1,概率等式转化为:

当真实样本标签 y = 1 时,上面式子第二项就为 1,概率等式转化为:

两种情况下概率表达式跟之前的完全一致,只不过我们把两种情况整合在一起了。重点看一下整合之后的概率表达式,我们希望的是概率 P(y|x) 越大越好。首先,我们对 P(y|x) 引入 log 函数,因为 log 运算并不会影响函数本身的单调性。则有:

我们希望 log P(y|x) 越大越好,反过来,只要 log P(y|x) 的负值 -log P(y|x) 越小就行了。那我们就可以引入损失函数,且令 Loss = -log P(y|x)即可。则得到损失函数为:

非常简单,我们已经推导出了单个样本的损失函数,是如果是计算 N 个样本的总的损失函数,只要将 N 个 Loss 叠加起来就可以了:

可能会有读者说,我已经知道了交叉熵损失函数的推导过程。但是能不能从更直观的角度去理解这个表达式呢?而不是仅仅记住这个公式。好问题!接下来,我们从图形的角度,分析交叉熵函数,加深大家的理解。

首先,还是写出单个样本的交叉熵损失函数:

我们知道,当 y = 1 时:

这时候,L 与预测输出的关系如下图所示:

看了 L 的图形,简单明了!横坐标是预测输出,纵坐标是交叉熵损失函数 L。显然,预测输出越接近真实样本标签 1,损失函数 L 越小;预测输出越接近 0,L 越大。因此,函数的变化趋势完全符合实际需要的情况。当 y = 0 时:

这时候,L 与预测输出的关系如下图所示:

同样,预测输出越接近真实样本标签 0,损失函数 L 越小;预测函数越接近 1,L 越大。函数的变化趋势也完全符合实际需要的情况。

从上面两种图,可以帮助我们对交叉熵损失函数有更直观的理解。无论真实样本标签 y 是 0 还是 1,L 都表征了预测输出与 y 的距。

另外,重点提一点的是,从图形中我们可以发现:预测输出与 y 得越多,L 的值越大,也就是说对当前模型的 “ 惩罚 ” 越大,而且是非线性增大,是一种类似指数增长的级别。这是由 log 函数本身的特性所决定的。这样的好处是模型会倾向于让预测输出更接近真实样本标签 y。

什么?交叉熵损失函数还有其它形式?没错!我刚才介绍的是一个典型的形式。接下来我将从另一个角度推导新的交叉熵损失函数。

这种形式下设真实样本的标签为 +1 和 -1,分别表示正类和负类。有个已知的知识点是Sigmoid 函数具有如下性质:

这个性质我们先放在这,待会有用。

好了,我们之前说了 y = +1 时,下列等式成立:

如果 y = -1 时,并引入 Sigmoid 函数的性质,下列等式成立:

重点来了,因为 y 取值为 +1 或 -1,可以把 y 值带入,将上面两个式子整合到一起:

接下来,同样引入 log 函数,得到:

好咯,L 就是我要推导的交叉熵损失函数。如果是 N 个样本,其交叉熵损失函数为:

接下来,我们从图形化直观角度来看。当 y = +1 时:

这时候,L 与上一层得分函数 s 的关系如下图所示:

横坐标是 s,纵坐标是 L。显然,s 越接近真实样本标签 1,损失函数 L 越小;s 越接近 -1,L 越大。另一方面,当 y = -1 时:

这时候,L 与上一层得分函数 s 的关系如下图所示:

本文主要介绍了交叉熵损失函数的数学原理和推导过程,也从不同角度介绍了交叉熵损失函数的两种形式。种形式在实际应用中更加常见,例如神经网络等复杂模型;第二种多用于简单的逻辑回归模型。

交叉熵损失函数是什么?

同样,s 越接近真实样本标签 -1,损失函数 L 越小;s 越接近 +1,L 越大。

交叉熵损失函数CrossEntropy Loss,是分类问题中经常使用的一种损失函数。公式为:

交叉熵Cross Entropy,是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的异性信息。在信息论中,交叉熵是表示两个概率分布p,q,其中p表示真实分布,q表示非真实分布,在相同的一组中,其中,用非真实分布q来表示某个发生所需要的平均比特数。

交叉熵可在机器学习中作为损失函数,p代表真实标记的分布,q则这样,我们已经完整地实现了交叉熵损失函数的推导过程。代表训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。交叉熵作为损失函数还有一个好处是:使用sigmoid函数在梯度下降时,可以避免均方误损失函数学习速率下降的问题,这是因为学习速率是能够被输出的误所控制的。

SVM、Softmax 损失函数

要让概率,反过来,只要其负数最小即可。KL散度越小,表示 和 的分布更加接近。那么就可以定义相应的损失函数为:

损失函数具体形式多种多样,先介绍 SVM 损失函数,SVM 的损失函数想要 SVM 在正确分类上的得分始终比不正确分类上的得分高出一个边界值,定义如下:

yi 代表的是正确类别的标签。举例说明:设有3个分类,得到score=[13,-7,11],真实标签是yi=0,所以:

SVM的损失函数想要正确分类类别 yi 的分数比不正确类别分数高,而且至少要高10。如果不满足这点,就开始计算损失值。关于0的阈值:max(0,-)函数,被称为折叶损失(hinge loss)。

如果不使用正则化,那么上面的损失函数就会有问题:设有一个数据集和一个权重集 W 能够正确地分类每个数据(即所有的边界都满足,对于所有的i都有 Li=0)。问题在于 W 并不:可能有很多相似的W都能正确地分类所有的数据。

例子:如果 W 能够正确分类所有数据,即对于每个数据,损失值都是0。那么当 r > 1 时,任何数乘 rW 都能使得损失值为 0,因为这个变化将所有分值的大小都均等地扩大了,所以它们之间的值也扩大了。举个例子,如果一个正确分类的分值和举例它最近的错误分类的分值的距是15,对 W 乘以2将使得距变成30。但是整体的损失值还是为0,这就导致 W 不。

所以,通过向特定的权重 W 添加一些偏好,对其他的不添加,以此来消除模糊性。方法是向损失函数增加一个 正则化惩罚 ,最常用的正则化惩罚是 L2 范式,L2 范式通过对所有参数进行逐元素的平方惩罚来抑制大数值的权重,L2正则化可以直观理解为它对于大数值的权重向量进行严厉惩罚,倾向于更加分散的权重向量。:

上面的表达式中,将 W 中所有元素平方后求和。注意正则化函数不是数据的函数,仅基于权重。完整的目标函数如下:

将其展开完整公式是:

需要注意的是,和权重不同,偏没有这样的效果,因为它们并不控制输入维度上的影响强度。因此通常只对权重 W 正则化,而不正则化偏 b。

交叉熵是用来判定实际的输出与期望的输出的接近程度。交叉熵刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。设概率分布 p 为期望输出(标签),概率分布 q 为实际输出,H(p,q) 为交叉熵。

种交叉熵函数的形式为:

下图举例说明:

第二种交叉熵损失函数形式:

这种形式主要是针对于二分类的情况,二分类模型通常会通过 Sigmoid 函数输出一个概率值。这里只是将两种情况(标签为0和1的时候)整合在一起。但是这里注意的是,上面公式是通过极大似然估计来推导得出,在机器学习里面,基本上是把极大似然估计跟交叉熵联系在一起的同一概念。下图是极大似然估计推导过程:

再来看一下 softmax 的损失函数:

以多分类来看,交叉熵损失函数为:

对于比较常见的 one-hot 编码来看,yi 只有一个元素值为1,其他的都是0,所以 Softmax 的损失函数求和号去掉,就转换为最开始的形式。

下图有助于区分这 Softmax和SVM这两种分类器:

注意点:

1. 斯坦福CS231n assignment1:softmax损失函数求导

2. CS231n课程笔记翻译:线性分类笔记

3. 深度学习中softmax交叉熵损失函数的理解

交叉熵损失函数和focal loss

它是如何计算的呢,我们接下来一步步分析:

交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的异性。是分类问题中经常使用的一种损失函数。

一般使用交叉熵作为损失函数时,在模型的输出层总会接一个softmax函数(用来获得结果分布)。

交叉熵公式:

用来衡量真实概还记得 Sigmoid 函数的表达式吧?将 g(ys) 带入:率分布 和预测标签分布 之间的异;

要了解交叉熵就需要先了解下述概念:

信息熵:“信息是用来 消除 随机 不确定性 的东西”,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度。

信息量的大小与信息发生的概率成反比 。概率越大,信息量越小。概率越小,信息量越大。 例如: ”2018年队成功进入世界杯“ ,从直觉上来看,这句话具有很大的信息量。因为队进入世界杯的不确定性因素很大,发生的概率很小;

设某一发生的概率为P(x),其信息量表示为:

信息熵也被称为熵,用来表示所有信息量的期望;

期望是试验中每次可能结果的概率乘以其结果的总和。

所以信息量的熵可表示为:(这里的X X X 是一个离散型随机变量)

直接上公式

比如在一个三分类任务中(例如,猫狗马分类器), 分别代表猫,狗,马。

例如一张猫的真实分布 和 ,计算KL散度:

前者 表示信息熵,后者即为交叉熵, KL散度 = 交叉熵 - 信息熵

交叉熵公式为:

交叉熵等于KL散度加上一个常量(信息熵),且公式相比KL散度更加容易计算,所以在机器学习中常常使用交叉熵损失函数来计算loss就行了。

Focal Loss的引入主要是为了解决难易样本数量不平衡(注意,有区别于正负样本数量不平衡)的问题,实际可以使用的范围非常广泛。

本文的作者认为, 易分样本(即,置信度高的样本)对模型的提升效果非常小,模型应该主要关注与那些难分样本 。一个简单的思想: 把高置信度(p)样本的损失再降低一些不就好了吗!

focal loss函数公式:

其中, 为类别权重,用来权衡正负样本不均衡问题; 表示难分样本权重,用来衡量难分样本和易分样本;

交叉熵损失函数该怎么求导?

我们知道,在二分类问题模型:例如逻辑回归「Logistic Regression」、神经网络「Neural Network」等,真实样本的标签为 [0,1],分别表示负类和正类。模型的通常会经过一个 Sigmoid 函数,输出一个概率值,这个概率值反映了预测为正类的可能性:概率越大,可能性越大。

交叉熵损失函数是深度学习中常用的一种损失函数,用于衡量模型预测结果与真实标签之间的异。在训练神经网络时,我们需要通过优化算法来最小化交叉熵损失函数。为了实现这一目标,我们需要计算交叉熵损失函数的导数。本文将详细介绍如何求导交叉熵损失函数。 首先,我们需要了解交叉熵损失函数的定义。交叉熵损失函数通常表示为:

输出结果为:

H(p,q)=-∑p(x)logq(x) 其中,p(x)表示真实标签的概率分布,q(x)表示模型预测的概率分布。注意,这里的对数是以e为底的对数。

接下来,我们分别从离散和连续两种情况来求导交叉熵损失函数。 1.离散情况

在离散情况下,交叉熵损失函数可以表示为: H(p,q)=-∑p(x)logq(x)

其中,p(x)和q(x)都是离散的概率分布。在这种情况下,我们可以使用链式法则来求导交叉熵损失函数。具体步骤如下: 首先,我们需要计算p(x)关于q(x)的偏导数:

_p/_q=_p/_x_x/_q=p(x)(1-p(x))/q(x) 然后,我们需要计算q(x)关于x的偏导数:

_q/_x=_q/_y_y/_x=y(1-y)/(1+e^-y) ,我们可以使用链式法则求导交叉熵损失函数:

_H/_q=∑p(x)_p/_q_q/_x=∑p(x)p(x)(1-p(x))/q(x)y(1-y)/(1+e^-y)=-∑p(x)y(1-y)/(1+e^-y) 2.连续情况

在连续情况下,交叉熵损失函数可以表示为: H(p,q)=-∫p(x)logq(x)dx

其中,p(x)和q(x)都是连续的概率密度函数。在这种情况下,我们可以使用分部积分法来求导交叉熵损失函数。具体步骤如下: 首先,我们需要计算p(x)关于q(x)的偏导数:

_p/_q=_p/_x_x/_q=p(x)(1-p(x))/q(x)^2 然后,我们需要计算q(x)关于x的偏导数:

_q/_x=_q/_y_y/_x=y(1-y)/(1+e^-y)^2 ,我们可以使用分部积分法求导交叉熵损失函数:

_H/_q=-∫p(x)logq(x)dx+∫p(x)x(1-x)/q(x)^2dx=-∫p(x)logq(x)dx+∫p(x)x(1-x)/(1+e^-y)^2dy=-∫p(x)logq(x)dx+∫p(x)x(1-x)/(1+e^-y)^2(1+e^-y)^2dy=-∫p(x)logq(x)dx+∫p(x)x(1-x)/(1+e^-y)^4dy

[损失函数]——交叉熵

得到 loss 的如下计算公式:

在了解交叉熵之前我们需要关于熵的一些基本知识,可以参考我的上一篇 博客 [1] 。

信息熵的定义为离散随机的出现概率 [2] 。当一个出现的概率更高的时候,我们认为该会传播的更广,因此可以使用信息熵来衡量信息的价值。

当一个信源具有多种不同的结果,记为:U1,U2,...,Un,每个相互,对应的概率记为:P1,P2,...,Pn。信息熵为各个方式概率的期望,公式为:

对于二分类问题,当一种发生的概率为p时,另一种发生的概率就为(1-p),因此,对于二分类问题的信息熵计算公式为:

相对熵(relative entropy),又被称为Kullback-Leibler散度(Kullback-leibler divergence),是两个概率分布间异的一种度量 [3] 。在信息论中,相对熵等于两个概率分布的信息熵的值。

相对熵的计算公式为:

其中 代表的真实概率, 代表的预测概率。例如三分类问题的标签为 ,预测标签为 。

因此该公式的字面上含义就是真实的信息熵与理论拟合的的香农信息量与真实的概率的乘积的的累加。[4]

当p(x)和q(x)相等时相对熵为0,其它情况下大于0。证明如下:

KL散度在 Pytorch 中的使用方法为:

在使用过程中, reduction 一般设置为 batchmean 这样才符合数学公式而不是 mean ,在以后的版本中 mean 会被替换掉。

此外,还要注意 log_target 参数,因为在计算的过程中我们往往使用的是log softmax函数而不是softmax函数来避免underflow和overflow问题,因此我们要提前了解target是否经过了log运算。

torch.nn.KLDivLoss() 会传入两个参数 (input, target) , input 是模型的预测输出, target 是样本的观测标签。

下面我们用一个例子来看看 torch.nn.KLDivLoss() 是如何使用的:

输出结果如下:

等式的前一项为真实的熵,后一部分为 交叉熵 [4] :

在机器学习中,使用KL散度就可以评价真实标签与预测标签间的异,但由于KL散度的项是个定值,故在优化过程中只关注交叉熵就可以了。一般大多数机器学习算选择交叉熵作为损失函数。

交叉熵在pytorch中可以调用如下函数实现:

其计算方法如下所示 [5] :

设batch size为4,待分类标签如果对于同一个随机变量 有两个单独的概率分布 和 ,则我们可以使用KL散度来衡量这两个概率分布之间的异。有3个,隐藏层的输出为:

经过 softmax 激活函数之后得到预测值:

softmax函数的输出结果每一行相加为1。

设这一个mini batch的标签为

根据交叉熵的公式:

代表真实标签,在真实标签中,除了对应类别其它类别的概率都为0,实际上,交叉熵可以简写为:

所以该mini batch的loss的计算公式为(别忘了除以batch size,我们求得的是mini batch的平均loss):

因此,我们还需要计算一次对数:

计算结果为:

根据交叉熵的计算公式,loss的最终计算等式为:

运算结果和pytorch内置的交叉熵函数相同:

结果为:

除了 torch.nn.CrosEntropyLoss() 函数外还有一个计算交叉熵的函数 torch.nn.BCELoss() 。与前者不同,该函数是用来计算二项分布(0-1分布)的交叉熵,因此输出层只有一个神经元(只能输出0或者1)。其公式为:

在pytorch中的函数为:

用一个实例来看看如何使用该函数:

首先输入是:

需要经过 sigmoid 函数得到一个输出

然后我们根据二项分布交叉熵的公式:

和pytorch的内置函数计算结果相同。

另外,需要注意的是, 当使用交叉熵作为损失函数的时候,标签不能为onehot形式,只能是一维的向量 ,例如,当batch size是5时,这一个batch的标签只能时[0,1,4,2,6]这样的形式。