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


113

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

Hy′(y):=−∑iyi′log⁡(yi)

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

问题1

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

问题2

我了解到交叉熵定义为

Hy′(y):=−∑i(yi′log⁡(yi)+(1−yi′)log⁡(1−yi))

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



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

Answers:


98

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

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

P[data|model]:=y1k1y2k2…ynkn.
−log⁡P[data|model]=−k1log⁡y1−k2log⁡y2−⋯−knlog⁡yn=−∑ikilog⁡yi
N = k 1 + k 2 + ⋯ + k n y ' i = k i 如果现在将右手总和除以观察值,并将经验概率表示为,则会得到交叉熵: N=k1+k2+⋯+knyi′=ki/N
−1Nlog⁡P[data|model]=−1N∑ikilog⁡yi=−∑iyi′log⁡yi=:H(y′,y)

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

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

−∑iyi′log2⁡yi,

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

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

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

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

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

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

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

    ∑iH(yi′,yi),
    yi′yi(yi′,1−yi′)(yi,1−yi)


1
您能否提供定义?在这里,他们将其定义为当前类标签的一次性分发。有什么区别?y′i=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 i)yilog(yi)

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

问题2

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

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

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

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


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

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

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

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

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

11

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

第一个问题:

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

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

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

用外行话来说:

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

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

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

第二个问题:

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

−ytruelog⁡(ypredict)

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

∑in∑kK−ytrue(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):=−∑iyi′log⁡(yi)
Hy′(y):=−∑i(yi′log⁡(yi)+(1−yi′)log⁡(1−yi))

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

例:

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

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

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

将向量和定义为 yi′yi

  • 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)yik→1⇒−log(yik)→0

L(yi′,yi)=−∑k=1Kyik′log(yik)。

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

L(yi′,yi)=−log(yim)。

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

Hy′(y)=−∑(xi,yi′)∑k=1Kyik′log(yik)。

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

Hy′(y)=−∑(xi,yi′)yi1′log(yi1)+yi0′log(yi0)=−∑(xi,yi′)yi1′log(yi1)+(1−yi1′)log(1−yi1)

与(b)相同。

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

类的交叉熵(a)为:

Hy′(y)=−∑k=1Kyk′log(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)的计算公式为:。−y0′logy0−y1′logy1=−0.6log(0.6)−0.4log(0.4)=0.292

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

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

(a)仍然保持不变,因为再次被估计为。y0′y0=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.