神经网络中的交叉熵误差函数


113

MNIST对于ML初学者中,他们将交叉熵定义为

Hy(y):=iyilog(yi)

yi是类别i的预测概率值iyi是该类别的真实概率。

问题1

yi(在log(yi))可以为0 是否不是问题?当然,这意味着我们的分类器非常差。但是请考虑我们数据集中的错误,例如1标记为的“显而易见”错误3。它会崩溃吗?我们选择的模型(最后激活softmax)是否基本上不会为正确的类别给出概率0?

问题2

我了解到交叉熵定义为

Hy(y):=i(yilog(yi)+(1yi)log(1yi))

什么是正确的?您对这两个版本都有教科书参考吗?这些函数的特性如何不同(作为神经网络的误差函数)?



另请参阅:Kullback-Leibler Divergence解释的博客文章。
Piotr Migdal

Answers:


98

解释交叉熵的一种方法是在模型下将其视为数据的(负)对数似然。yiyi

即,假设您有一些固定的模型(也称为“假设”),它为类预测它们的假设出现概率。假设你现在看到(实际上)类的实例,类的实例,类的实例等。根据你的模型这种情况发生的可能性: 取对数并更改符号: n{1,2,,n}y1,y2,,ynk11k22knn

P[data|model]:=y1k1y2k2ynkn.
logP[data|model]=k1logy1k2logy2knlogyn=ikilogyi
N = k 1 + k 2 + + k n y ' i = k i 如果现在将右手总和除以观察值,并将经验概率表示为,则会得到交叉熵: N=k1+k2++knyi=ki/N
1NlogP[data|model]=1Nikilogyi=iyilogyi=:H(y,y)

此外,给定模型的数据集的对数似然可解释为“编码长度”的度量-如果您的编码方案基于假设,则您期望花费在编码该信息上的位数。

这是由于观察到,概率为的独立事件至少需要位才能对其进行编码(假设有效编码),因此表达式 实际上是编码的预期长度,其中事件的编码长度是使用“假设的”分布来计算的,而期望值则超过了实际值。yilog2yi

iyilog2yi,

最后,我真的不想使用“预期编码长度的度量”,而是使用非正式术语“意外度量”。如果您需要很多位来编码分发中的预期事件,那么分发对您来说“真的很令人惊讶”。

考虑到这些直觉,可以将您的问题的答案视为:

  • 问题1。是。每当相应的同时不为零时yi,就会出现问题。它对应于您的模型认为某个类的发生概率为零,而该类却在现实中突然出现的情况。结果,模型的“惊奇”无限大:您的模型没有考虑到该事件,现在需要无限多个位来对其进行编码。这就是为什么交叉熵无限大的原因。

    为避免此问题,您需要确保模型不会对某些不可能发生的事情做出粗鲁的假设。实际上,人们倾向于使用S形或“ softmax”函数作为其假设模型,它们的保守程度足以为每个选择留出至少一些机会。

    如果您使用其他假设模型,则要由您来进行正则化(也称为“平滑”),以便它不会在不应该假设的位置假设零。

  • 问题2。在此公式中,通常假设为或,而是相应输入的模型概率假设。如果仔细观察,您会发现它只是二进制数据的,相当于此答案中第二个等式。yi01yilogP[data|model]

    因此,严格来说,尽管它仍然是对数似然的,但在语法上并不等同于交叉熵。什么提到的这样的表达,当有些人意味着交叉熵是,它是,事实上,一个总和超过二元交叉熵数据集中各点: 其中和必须解释为相应的二进制分布和。

    iH(yi,yi),
    yiyi(yi,1yi)(yi,1yi)


1
您能否提供定义?在这里,他们将其定义为当前类标签的一次性分发。有什么区别?yi=kiN
Lenar Hoyt

1
在MNIST TensorFlow教程中,他们还根据一键矢量定义了它。
Lenar Hoyt

@LenarHoyt当,等效于一热。您可以根据项目的经验(实际)分类概率将一热点视为一项编码。k i / NN=1ki/N
THN

“独立事件需要...对其进行编码”-您能解释一下吗?
亚历克斯(Alex)

@Alex这可能需要更长的解释才能正确理解-阅读Shannon-Fano码以及最佳编码与Shannon熵方程的关系。要使事情变得愚蠢,如果一个事件的概率为1/2,那么最好的选择就是使用一点来编码它。如果概率为1/4,则应花费2位对其进行编码,以此类推。通常,如果事件集的概率形式为1/2 ^ k,则应将它们的长度设为k-这样,您的代码将接近香农最佳长度。
KT。

22

您使用的第一个logloss公式用于多类日志丢失,其中下标列举了示例中的不同类。该公式假定每个示例中的单个为1,其余均为0。ÿ iyi

这意味着公式仅捕获目标类上的错误。它会丢弃您可能认为“假阳性”的任何错误概念,并且不关心除真实类的预测概率以外的预测概率如何分布。

另一个假设是每个示例的预测。softmax图层会自动执行此操作-如果您使用其他功能,则需要缩放输出以满足该约束。iyi=1

问题1

是不是该问题(在)可能是0? l o g y iyilog(yi)

是的,这可能是个问题,但通常不是实际问题。随机初始化的softmax层极不可能输出0任何类别的精确值。但是有可能,因此值得考虑。首先,不要为任何评估,因为负类始终为错误贡献0。其次,在实际代码中,您可以将值限制为类似于数值稳定性之类的值-在许多情况下不是必需的,但这是明智的防御性编程。ý ' = 0log(yi)yi=0log( max( y_predict, 1e-15 ) )

问题2

我了解到交叉熵定义为Hy(y):=i(yilog(yi)+(1yi)log(1yi))

此公式通常用于具有一个输出预测两个类别的网络(通常对于1输出为正类别成员资格,对于0输出为负类别)。在那种情况下,可能只有一个值-您可能会损失超过的总和。ii

如果将这样的网络修改为具有两个相对的输出,并使用softmax加上第一个logloss定义,则可以看到实际上是相同的误差度量,但是将两个类别的误差度量折叠到一个输出中。

如果有多个类可以预测成员资格,并且这些类不是排他性的,即一个示例可以同时是任何或所有类,那么您将需要使用第二种表述。对于不是数字识别的情况(一个手写数字只能有一个“真”类)


请注意,第二个公式的表述有些含糊-从理论上讲它可以仅假设一个类,然后将列举这些示例。i
尼尔·斯莱特

抱歉,我提出的问题与我想知道的有所不同。我看不到,但是在却是因为。您能调整一下答案吗?y i = 0 log y ilog(yi)=0yi=0log(yi)
马丁·托马

@NeilSlater如果类不是互斥的,则每个输入的输出向量可能包含多个1,是否应该使用第二个公式?
媒体

1
@Media:并非如此。但是,您希望查看诸如分层分类之类的内容。。。
尼尔·斯莱特

1
@Javi:在OP的问题是地面实况,因此通常为0或1。这是那就是SOFTMAX输出。但是,由于浮点舍入,实际上可能最终为零。这确实发生了。 ÿ ÿ yiyiyi
尼尔·斯莱特

11

给定,您想优化机器学习方法,以使尽可能接近。 ý p - [R Ë d Ç Ť ý - [R ù ëytrueypredictytrue

第一个问题:

上面的答案已经解释了您的第一个公式的背景,即信息论中定义的交叉熵。

从信息论以外的观点来看:

您可以检查一下自己,第一个公式对假阳性没有惩罚(真相为假,但是您的模型预测它是正确的),而第二个公式对假阳性也有惩罚。因此,选择第一个公式还是第二个公式会影响您的指标(也就是您要用来评估模型的统计量)。

用外行话来说:

如果您想接受几乎所有的好人成为您的朋友,但又愿意接受一些坏人成为您的朋友,则可以使用第一个公式作为标准。

如果您想惩罚自己接受一些坏人成为您的朋友,但同时您的好人接受率可能低于第一个条件,请使用第二个公式。

虽然,我想我们大多数人都很关键,所以我想选择第二个(因为许多ML包都假设交叉熵是什么)。

第二个问题:

每个类别的每个样本的交叉熵:

ytruelog(ypredict)

整个数据集的整个类的交叉熵:

inkKytrue(k)log(ypredict(k))

因此,当只有两个类(K = 2)时,您将拥有第二个公式。


5

这些问题由本教程使用softmax处理。

对于1),您是正确的,因为softmax保证输入为非指数,因此它保证输出非零。对于没有这种保证的激活(例如relu),可以在每个输出中添加一个很小的正项来避免该问题,这很简单。

至于2),显然它们并不相同,但是我给出的softmax公式解决了这个问题。如果您不使用softmax,这将导致您学习巨大的偏差项,对于任何输入,每个类别的猜测值均为1。但是,由于它们将所有类的softmax归一化,因此使正确类的输出最大化的唯一方法是,相对于不正确的类,它要大一些。


“您是正确的,softmax保证输出非零”-我知道理论上是这样。实际上,是否可能由于数字问题而变为0?
马丁·托马

好问题。我假设如果输入对于浮点精度太小,则幂函数输出0.0的可能性非常大。但是我想大多数实现的确会添加微小的正项以保证非零输入。
jamesmf 2015年

0

(在)可以为0 是否不是问题?yilog(yi)

是的,因为未定义,但实际上可以使用避免此问题。log(0)log(yi+ϵ)

什么是正确的?
(a)或 (b)吗?Hy(y):=iyilog(yi)
Hy(y):=i(yilog(yi)+(1yi)log(1yi))

(a)对于多类别预测是正确的(实际上是双重求和),(b)与(a)对于两类别预测是相同的。两者都是交叉熵。

例:

假设每个训练数据都具有标签,并且模型预测。xici{0,1}ci[0,1]

对于5个数据点,真实标签和模型预测为: cici

(ci,ci)={(0,0.1),(0,0.4),(0,0.8),(1,0.8),(1,0.2)} (1),

将向量和定义为 yiyi

  • yik:=1如果,否则 ci=k:=0

  • yik:=p(k|xi)是属于类别的概率,由模型估算。xik

表示法中的示例(1)变为: (yi,yi)

(yi,yi)={([1,0],[0.9,0.1]), ([1,0],[0.6,0.4]), ([1,0],[0.2,0.8]), ([0,1],[0.2,0.8]), ([0,1],[0.8,0.2])}

(a)和(b)的计算均如下:

Hy(y)=1/5([log(0.9)+log(0.6)+log(0.2)]ci=0+[log(0.8)+log(0.2)]ci=1)=0.352

派生:

假设存在到多个类。 对于训练点,等效于,在位置为1,在其他位置为0。当,我们希望模型的输出接近1。因此,可以将损失定义为,则给出。所有类别的损失可以合并为:1K
(xi,ci)ci=kyi=[0,..,1,0,..]kthyik=1yik=p(k|xi)(xi,k)log(yik)yik1log(yik)0

L(yi,yi)=k=1Kyiklog(yik)

当,将所有其他类别损失禁用为,因此例如,当true标签为,损失将是是:yik=1kk0log(yik)=0yim=1

L(yi,yi)=log(yim)

所有训练点的最终公式是:

Hy(y)=(xi,yi)k=1Kyiklog(yik)

对于二进制分类,我们有(真实标签)和(模型预测),因此(a)可以重写为:yi0=1yi1yi0=1yi1

Hy(y)=(xi,yi)yi1log(yi1)+yi0log(yi0)=(xi,yi)yi1log(yi1)+(1yi1)log(1yi1)

与(b)相同。

类的交叉熵(a)(一次求和)

类的交叉熵(a)为:

Hy(y)=k=1Kyklog(yk)

此版本不能用于分类任务。让我们重用上一个示例中的数据:

(ci,ci)={(0,0.1),(0,0.4),(0,0.8),(1,0.8),(1,0.2)}

类的经验概率为:,而,y0=3/5=0.6y1=0.4

通过模型估算的类别概率为:,并且y0=3/5=0.6y1=0.4

(a)的计算公式为:。y0logy0y1logy1=0.6log(0.6)0.4log(0.4)=0.292

未正确分类两个数据点和,但是正确估计了和!(0,0.8)(1,0.2)y0y1

如果所有5个点均正确分类为:,
(ci,ci)={(0,0.1),(0,0.4),(0,0.2),(1,0.8),(1,0.8)}

(a)仍然保持不变,因为再次被估计为。y0y0=3/5

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.