交叉熵与稀疏交叉熵:何时使用其中一个

机器算法验证 机器学习 卷积神经网络 损失函数 信息论 交叉熵
2022-02-07 04:58:07

我正在玩卷积神经网络,使用 Keras+Tensorflow 对分类数据进行分类。我有两个损失函数可供选择:categorial_crossentropysparse_categorial_crossentropy

我对categorial_crossentropy损失函数有一个很好的直觉,它的定义如下:

J(w)=1Ni=1N[yilog(y^i)+(1yi)log(1y^i)]

在哪里,

  • w指的是模型参数,例如神经网络的权重
  • yi是真正的标签
  • yi^是预测的标签

两个标签都使用 one-hot 编码方案。

问题:

  • 上述损失函数如何变化sparse_categorial_crossentropy
  • 它背后的数学直觉是什么?
  • 什么时候使用一个而不是另一个?
4个回答

分类交叉熵和稀疏分类交叉熵都具有您上面提到的相同损失函数。唯一的区别是您提到的格式(即真正的标签)。Yi

如果您的是一次性编码的,请使用 categorical_crossentropy。示例(对于 3 类分类):[1,0,0]、[0,1,0]、[0,0,1]Yi

但是,如果您的是整数,请使用 sparse_categorical_crossentropy。上述三类分类问题的示例:[1]、[2]、[3]Yi

使用完全取决于您如何加载数据集。使用稀疏分类交叉熵的一个优点是它节省了内存和计算时间,因为它只是对一个类使用单个整数,而不是整个向量。

我没有比链接更好的答案,我也遇到了同样的问题。我只想指出,损失函数(交叉熵)的公式似乎有点错误(并且可能具有误导性。)人们可能应该将括号中的第二项删除为简单的 很抱歉在这里写下我的评论,但我没有足够的声望点来发表评论......

J(w)=1Ni=1Nyilog(y^i).

您在问题中发布的公式是指binary_crossentropy,而不是categorical_crossentropy当你只有一个类时使用前者。后者是指您有多个类的情况,其公式如下所示:

J(w)=i=1Nyilog(y^i).

这种损失就像在单热编码值上提到的skadaver一样,例如[1,0,0], [0,1,0], [0,0,1]

sparse_categorical_crossentropy有点不同,它适用于整数,但这些整数必须是类索引,而不是实际值此损失仅针对基本事实指示的输出索引计算对数。因此,例如,当模型输出为[0.1, 0.3, 0.7]且基本事实为3(如果从 1 开始索引)时,损失仅计算 的对数0.7这不会改变最终值,因为在分类交叉熵的常规版本中,其他值会立即乘以零(因为 one-hot 编码特性)。多亏了它,它每个实例计算一次对数并省略求和,从而获得更好的性能。公式可能如下所示:

J(w)=log(y^y).

根据您问题的性质,听起来您有 3 个或更多类别。但是,为了完整起见,我想补充一点,如果您正在处理二进制分类,使用binary cross entropy可能更合适。

此外,请注意正确选择损失和度量,因为这可能会导致模型性能出现一些意外和奇怪的行为。