交叉熵损失的解释


35

假设我建立了一个用于分类的NN。最后一层是具有softmax激活的密集层。我有五个不同的班级来分类。假设有一个训练示例,true label[1 0 0 0 0]预测为[0.1 0.5 0.1 0.1 0.2]。我将如何计算此示例的交叉熵损失?

Answers:


50

交叉熵公式考虑在两个分布,,真实分布,和,所估计的分布,在离散的变量定义和由下式给出p(x)q(x)x

H(p,q)=xp(x)log(q(x))

对于神经网络,计算独立于以下内容:

  • 使用了哪种层。

  • 使用哪种类型的激活-尽管许多激活将与计算不兼容,因为它们的输出不能解释为概率(即,它们的输出为负,大于1或不等于1)。Softmax通常用于多类分类,因为它可以保证良好的概率分布函数。

对于神经网络,通常会看到以是地面真实向量,而(或直接从最后一层输出直接获取的其他值)形式写的方程式为估计。仅举一个例子,它看起来像这样:yÿy^

L=ylog(y^)

其中是矢量点积。

您的示例地面真理赋予第一个值所有概率,而其他值均为零,因此我们可以忽略它们,而仅使用估算值中的匹配项yÿy^

L=(1×log(0.1)+0×log(0.5)+...)

L=log(0.1)2.303

评论要点

这就是说,无论预测为还是?损失都是相同的。[0.1,0.5,0.1,0.1,0.2][0.1,0.6,0.1,0.1,0.1]

是的,这是多类对数损失的关键功能,它仅奖励/惩罚正确类别的概率。该值与剩余概率在不正确类别之间的分配方式无关。

您经常会看到在所有示例中平均的该方程式是成本函数。在描述中并不总是严格遵循它,但是损失函数通常是较低级别,描述单个实例或组件如何确定错误值,而成本函数是较高级别,并且描述了如何评估整个系统的优化性。基于大小为数据集的多类日志丢失的成本函数可能看起来像这样:N

J=1N(i=1Nyilog(y^i))

许多实现都需要将基本真理值进行一次热编码(使用单个true类),因为这样可以进行一些额外的优化。但是,原则上,如果不是这种情况,则可以计算并优化交叉熵损失。


1
好的。也就是说,无论预测是[0.1 0.5 0.1 0.1 0.2]还是[0.1 0.6 0.1 0.1 0.1],损失都是一样的?
Nain17年

@Nain:对于您的示例来说是正确的。交叉熵损失不取决于不正确的类概率的值是多少。
尼尔·斯莱特

8

尼尔的答案是正确的。但是,我认为重要的是要指出,尽管损失不取决于不正确类别之间的分布(仅取决于正确类别与其余类别之间的分布),但是此损失函数的梯度确实会根据不同方式对不正确类别产生不同的影响他们错了。因此,当您在机器学习中使用交叉输入时,您将为[0.1 0.5 0.1 0.1 0.2]和[0.1 0.6 0.1 0.1 0.1]改变权重。这是因为正确类别的分数被所有其他类别的分数归一化以将其变为概率。


3
您能举例说明一下吗?
Nain

@Lucas Adams,能否举个例子?
koryakinp

EACH logit z(或参数w本身)的每个y_i(softmax输出)的导数取决于每个y_i。medium.com/@aerinykim/…–
亚伦

2

让我们看看损耗的梯度如何表现...我们将交叉熵作为损耗函数,由

H(p,q)=i=1np(xi)log(q(xi))=(p(x1)log(q(x1))++p(xn)log(q(xn))

从这里开始..我们想知道关于的导数: xi 由于所有其他项都因该差异而被取消。我们可以将这个方程式进一步 推近∂

xiH(p,q)=xip(xi)log(q(xi)).
xiH(p,q)=p(xi)1q(xi)q(xi)xi.

由此可见,我们仍然只对真实的类(对有值)进行惩罚。否则我们只有零梯度。p(xi)

我确实想知道软件包如何处理预测值0,而真实值却大于零...因为在这种情况下,我们要除以零。


我认为您要使用的是派生wrt参数,而不是wrt x_i。
亚伦

1

让我们从理解信息论中的熵开始:假设您想传达一串字母“ aaaaaaaa”。您可以轻松地将其设置为8 *“ a”。现在,使用另一个字符串“ jteikfqa”。是否有压缩的方式来传达这个字串?没有那里。我们可以说第二个字符串的熵更大,因为要传达它,我们需要更多的“位”信息。

这个类比也适用于概率。如果您有一组项目(例如水果),则这些水果的二进制编码为log2(n),其中n是水果的数量。对于8个水果,您需要3位,依此类推。看待这个另一种方法是,给定某人随机选择一个水果的概率是1/8,则减少不确定性,如果选择了水果是log2(1/8),其为3。更具体地,

i=1818log2(18)=3
这个熵告诉我们有关某些概率分布的不确定性;概率分布的不确定性/变化越大,熵就越大(例如,对于1024个水果,它将是10)。

顾名思义,在“交叉”熵中,我们关注于解释两个不同概率分布中的差异所需的位数。最好的情况是两个分布都是相同的,在这种情况下,需要的位数最少,即简单的熵。用数学术语来说

H(y,y^)=iyiloge(y^i)

y^y

底线:用外行的话来说,可以将交叉熵视为两个概率分布之间的距离,以解释该距离所需的信息量(位)为单位。这是定义损失的一种好方法,这种损失随着概率向量彼此越来越接近而降低。


0

我不同意卢卡斯。上面的值已经是概率。请注意,原始帖子指示这些值具有softmax激活。

该错误仅在“热”类上传播回来,并且如果其他类内的概率在彼此之间转移,则概率Q(i)不会改变。


2
卢卡斯是正确的。使用OP所描述的架构,则所有logit(与输出相对)的梯度都不为零,因为softmax函数将它们全部连接起来。因此,“热”类别中的[错误的梯度]会传播到所有输出神经元。
尼尔·斯莱特

尼尔和卢卡斯+1
亚伦

-1

问题在于概率来自“复杂”函数,该函数将其他输出合并到给定值中。结果是相互关联的,因此通过这种方式,我们不是针对实际结果而推导,而是针对每个结果,根据最后激活函数(softmax)的所有输入推导。

我在deepnotes.io/softmax-crossentropy上找到了一个很好的描述,其中作者表明实际的导数是p一世-ÿ一世

gombru.github.io/2018/05/23/cross_entropy_loss上的其他简洁描述。

我认为使用简单的S形作为最后一个激活层将导致批准答案,但是使用softmax表示不同的答案。


1
欢迎使用Stack Exchange。但是,您写的内容似乎无法回答OP关于计算交叉熵损失的问题。
user12075
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.