在MNIST对于ML初学者中,他们将交叉熵定义为
是类别i的预测概率值,是该类别的真实概率。
问题1
(在)可以为0 是否不是问题?当然,这意味着我们的分类器非常差。但是请考虑我们数据集中的错误,例如1
标记为的“显而易见”错误3
。它会崩溃吗?我们选择的模型(最后激活softmax)是否基本上不会为正确的类别给出概率0?
问题2
我了解到交叉熵定义为
什么是正确的?您对这两个版本都有教科书参考吗?这些函数的特性如何不同(作为神经网络的误差函数)?
在MNIST对于ML初学者中,他们将交叉熵定义为
是类别i的预测概率值,是该类别的真实概率。
(在)可以为0 是否不是问题?当然,这意味着我们的分类器非常差。但是请考虑我们数据集中的错误,例如1
标记为的“显而易见”错误3
。它会崩溃吗?我们选择的模型(最后激活softmax)是否基本上不会为正确的类别给出概率0?
我了解到交叉熵定义为
什么是正确的?您对这两个版本都有教科书参考吗?这些函数的特性如何不同(作为神经网络的误差函数)?
Answers:
解释交叉熵的一种方法是在模型下将其视为数据的(负)对数似然。
即,假设您有一些固定的模型(也称为“假设”),它为类预测它们的假设出现概率。假设你现在看到(实际上)类的实例,类的实例,类的实例等。根据你的模型这种情况发生的可能性:
取对数并更改符号:
此外,给定模型的数据集的对数似然可解释为“编码长度”的度量-如果您的编码方案基于假设,则您期望花费在编码该信息上的位数。
这是由于观察到,概率为的独立事件至少需要位才能对其进行编码(假设有效编码),因此表达式
实际上是编码的预期长度,其中事件的编码长度是使用“假设的”分布来计算的,而期望值则超过了实际值。
最后,我真的不想使用“预期编码长度的度量”,而是使用非正式术语“意外度量”。如果您需要很多位来编码分发中的预期事件,那么分发对您来说“真的很令人惊讶”。
考虑到这些直觉,可以将您的问题的答案视为:
问题1。是。每当相应的同时不为零时,就会出现问题。它对应于您的模型认为某个类的发生概率为零,而该类却在现实中突然出现的情况。结果,模型的“惊奇”无限大:您的模型没有考虑到该事件,现在需要无限多个位来对其进行编码。这就是为什么交叉熵无限大的原因。
为避免此问题,您需要确保模型不会对某些不可能发生的事情做出粗鲁的假设。实际上,人们倾向于使用S形或“ softmax”函数作为其假设模型,它们的保守程度足以为每个选择留出至少一些机会。
如果您使用其他假设模型,则要由您来进行正则化(也称为“平滑”),以便它不会在不应该假设的位置假设零。
问题2。在此公式中,通常假设为或,而是相应输入的模型概率假设。如果仔细观察,您会发现它只是二进制数据的,相当于此答案中第二个等式。
因此,严格来说,尽管它仍然是对数似然的,但在语法上并不等同于交叉熵。什么提到的这样的表达,当有些人意味着交叉熵是,它是,事实上,一个总和超过二元交叉熵数据集中各点:
其中和必须解释为相应的二进制分布和。
您使用的第一个logloss公式用于多类日志丢失,其中下标列举了示例中的不同类。该公式假定每个示例中的单个为1,其余均为0。ÿ “ 我
这意味着公式仅捕获目标类上的错误。它会丢弃您可能认为“假阳性”的任何错误概念,并且不关心除真实类的预测概率以外的预测概率如何分布。
另一个假设是每个示例的预测。softmax图层会自动执行此操作-如果您使用其他功能,则需要缩放输出以满足该约束。
是不是该问题(在)可能是0? l o g (y i)
是的,这可能是个问题,但通常不是实际问题。随机初始化的softmax层极不可能输出0
任何类别的精确值。但是有可能,因此值得考虑。首先,不要为任何评估,因为负类始终为错误贡献0。其次,在实际代码中,您可以将值限制为类似于数值稳定性之类的值-在许多情况下不是必需的,但这是明智的防御性编程。ý ' 我 = 0log( max( y_predict, 1e-15 ) )
我了解到交叉熵定义为
此公式通常用于具有一个输出预测两个类别的网络(通常对于1输出为正类别成员资格,对于0输出为负类别)。在那种情况下,可能只有一个值-您可能会损失超过的总和。我
如果将这样的网络修改为具有两个相对的输出,并使用softmax加上第一个logloss定义,则可以看到实际上是相同的误差度量,但是将两个类别的误差度量折叠到一个输出中。
如果有多个类可以预测成员资格,并且这些类不是排他性的,即一个示例可以同时是任何或所有类,那么您将需要使用第二种表述。对于不是数字识别的情况(一个手写数字只能有一个“真”类)
给定,您想优化机器学习方法,以使尽可能接近。 ý p - [R Ë d 我Ç Ť ý 吨- [R ù ë
上面的答案已经解释了您的第一个公式的背景,即信息论中定义的交叉熵。
您可以检查一下自己,第一个公式对假阳性没有惩罚(真相为假,但是您的模型预测它是正确的),而第二个公式对假阳性也有惩罚。因此,选择第一个公式还是第二个公式会影响您的指标(也就是您要用来评估模型的统计量)。
如果您想接受几乎所有的好人成为您的朋友,但又愿意接受一些坏人成为您的朋友,则可以使用第一个公式作为标准。
如果您想惩罚自己接受一些坏人成为您的朋友,但同时您的好人接受率可能低于第一个条件,请使用第二个公式。
虽然,我想我们大多数人都很关键,所以我想选择第二个(因为许多ML包都假设交叉熵是什么)。
每个类别的每个样本的交叉熵:
整个数据集的整个类的交叉熵:
这些问题由本教程使用softmax处理。
对于1),您是正确的,因为softmax保证输入为非指数,因此它保证输出非零。对于没有这种保证的激活(例如relu),可以在每个输出中添加一个很小的正项来避免该问题,这很简单。
至于2),显然它们并不相同,但是我给出的softmax公式解决了这个问题。如果您不使用softmax,这将导致您学习巨大的偏差项,对于任何输入,每个类别的猜测值均为1。但是,由于它们将所有类的softmax归一化,因此使正确类的输出最大化的唯一方法是,相对于不正确的类,它要大一些。
(在)可以为0 是否不是问题?
是的,因为未定义,但实际上可以使用避免此问题。
什么是正确的?
(a)或 (b)吗?
(a)对于多类别预测是正确的(实际上是双重求和),(b)与(a)对于两类别预测是相同的。两者都是交叉熵。
假设每个训练数据都具有标签,并且模型预测。
对于5个数据点,真实标签和模型预测为:
(1),
将向量和定义为
如果,否则
是属于类别的概率,由模型估算。
表示法中的示例(1)变为:
,
(a)和(b)的计算均如下:
假设存在到多个类。
对于训练点,等效于,在位置为1,在其他位置为0。当,我们希望模型的输出接近1。因此,可以将损失定义为,则给出。所有类别的损失可以合并为:
。
当,将所有其他类别损失禁用为,因此例如,当true标签为,损失将是是:
。
所有训练点的最终公式是:
。
对于二进制分类,我们有(真实标签)和(模型预测),因此(a)可以重写为:
与(b)相同。
类的交叉熵(a)(一次求和)
类的交叉熵(a)为:
,
此版本不能用于分类任务。让我们重用上一个示例中的数据:
类的经验概率为:,而,
通过模型估算的类别概率为:,并且
(a)的计算公式为:。
未正确分类两个数据点和,但是正确估计了和!
如果所有5个点均正确分类为:,
(a)仍然保持不变,因为再次被估计为。