二元交叉熵和分类交叉熵在同一问题中表现不同的原因
二元交叉熵和分类交叉熵在同一问题中表现不同的原因
技术背景
在机器学习和深度学习中,交叉熵是常用的损失函数,用于衡量模型预测结果与真实标签之间的差异。二元交叉熵(binary_crossentropy
)和分类交叉熵(categorical_crossentropy
)是两种常见的交叉熵损失函数。然而,在某些情况下,使用这两种损失函数会得到不同的模型性能,这引发了人们的疑问。
实现步骤
问题描述
在训练一个用于文本主题分类的卷积神经网络(CNN)时,使用二元交叉熵得到了约80%的准确率,而使用分类交叉熵仅得到约50%的准确率。模型结构如下:
1 |
|
模型编译
使用分类交叉熵作为损失函数进行编译:
1 |
|
使用二元交叉熵作为损失函数进行编译:
1 |
|
核心代码
验证Keras评估准确率的问题
1 |
|
最佳实践
- 分类问题类型选择合适的损失函数
- 二元分类问题:使用二元交叉熵,输出层使用
sigmoid
激活函数,目标标签可以是标量或单热编码。 - 多类分类问题(类别互斥):使用分类交叉熵,输出层使用
softmax
激活函数,目标标签需要进行单热编码。 - 多标签分类问题:使用二元交叉熵,输出层每个神经元使用
sigmoid
激活函数,目标标签可以是单热编码。
- 二元分类问题:使用二元交叉熵,输出层使用
- 明确指定准确率指标:当使用二元交叉熵进行多类分类时,为了得到正确的分类准确率,应在模型编译时明确指定
categorical_accuracy
。
常见问题
准确率计算错误
当使用二元交叉熵进行多类分类且在模型编译时仅指定metrics=['accuracy']
时,Keras会错误地推断使用binary_accuracy
,导致报告的准确率与实际分类准确率不符。解决方法是明确指定categorical_accuracy
。
激活函数与损失函数不匹配
不同的损失函数需要搭配合适的激活函数。例如,二元交叉熵通常与sigmoid
激活函数搭配,分类交叉熵通常与softmax
激活函数搭配。如果搭配错误,可能会导致模型性能不佳。
标签编码问题
使用分类交叉熵时,目标标签需要是单热编码的形式;而使用二元交叉熵时,标签编码形式取决于具体问题类型。如果标签编码不符合要求,会影响模型的训练和评估结果。
二元交叉熵和分类交叉熵在同一问题中表现不同的原因
https://119291.xyz/posts/2025-04-22.reason-different-performances-binary-categorical-crossentropy/