如何在 TensorFlow 中选择交叉熵损失?

2025-02-27 09:07:00
admin
原创
56
摘要:问题描述:分类问题(例如逻辑回归或多项逻辑回归)优化交叉熵损失。通常,交叉熵层跟在softmax层之后,后者产生概率分布。在 TensorFlow 中,至少有十几种不同的交叉熵损失函数:tf.losses.softmax_cross_entropytf.losses.sparse_softmax_cross_...

问题描述:

分类问题(例如逻辑回归或多项逻辑回归)优化交叉熵损失。通常,交叉熵层跟在softmax层之后,后者产生概率分布。

在 TensorFlow 中,至少有十几种不同的交叉熵损失函数

  • tf.losses.softmax_cross_entropy

  • tf.losses.sparse_softmax_cross_entropy

  • tf.losses.sigmoid_cross_entropy

  • tf.contrib.losses.softmax_cross_entropy

  • tf.contrib.losses.sigmoid_cross_entropy

  • tf.nn.softmax_cross_entropy_with_logits

  • tf.nn.sigmoid_cross_entropy_with_logits

  • ...

哪一个仅适用于二分类,哪一个适用于多分类问题?什么时候应该使用sigmoid而不是softmax?函数与其他函数有何sparse不同,为什么只有它softmax

相关(更多数学导向)讨论:Keras 和 TensorFlow 中的所有这些交叉熵损失之间有什么区别?


解决方案 1:

初步事实

  • 从函数意义上讲,当类别数等于 2 时,S 型函数是 softmax 函数的部分情况。它们都执行相同的操作:将 logits(见下文)转换为概率。

在简单的二元分类中,两者之间没有太大区别,但是在多项分类的情况下,sigmoid 允许处理非排他性标签(又名多标签),而 softmax 处理排他性类别(见下文)。

  • 在计算概率之前,logit(也称为分数)是与类相关的原始未缩放值。就神经网络架构而言,这意味着 logit 是密集(全连接)层的输出。

Tensorflow 的命名有点奇怪:下面的所有函数都接受 logits 而不是 probabilities,并自己应用转换(这只是更有效率)。

Sigmoid 函数系列

  • tf.nn.sigmoid_cross_entropy_with_logits

  • tf.nn.weighted_cross_entropy_with_logits

  • tf.losses.sigmoid_cross_entropy

  • tf.contrib.losses.sigmoid_cross_entropy(已弃用)

如前所述,sigmoid损失函数用于二元分类。但 TensorFlow 函数更通用,当类别独立时,允许进行多标签分类。换句话说,
一次性tf.nn.sigmoid_cross_entropy_with_logits解决二元分类问题。N

标签必须是独热编码或可以包含软类概率。

tf.losses.sigmoid_cross_entropy此外,还允许设置批内权重,即使某些示例比其他示例更重要。
tf.nn.weighted_cross_entropy_with_logits允许设置类权重
(记住,分类是二元的),即使正误差大于负误差。当训练数据不平衡时,这很有用。

Softmax函数系列

  • tf.nn.softmax_cross_entropy_with_logits(1.5 版中已弃用)

  • tf.nn.softmax_cross_entropy_with_logits_v2

  • tf.losses.softmax_cross_entropy

  • tf.contrib.losses.softmax_cross_entropy(已弃用)

这些损失函数应该用于多项互斥分类,即从N多个类别中挑选一个。也适用于N = 2

标签必须是独热编码的,或者可以包含软类别概率:一个特定示例可以有 50% 的概率属于 A 类,有 50% 的概率属于 B 类。请注意,严格来说,这并不意味着它同时属于这两个类别,但可以这样解释概率。

就像在家族中一样sigmoidtf.losses.softmax_cross_entropy允许设置批次内权重,即使一些示例比其他示例更重要。据我所知,从 TensorFlow 1.3 开始,没有内置方法来设置类权重

[更新]在 tensorflow 1.5 中,引入了v2版本,并且原始损失已被弃用。它们之间的唯一区别是,在较新的版本中,反向传播发生在 logit 和标签中(此处讨论了为什么这可能有用)。softmax_cross_entropy_with_logits

稀疏函数族

  • tf.nn.sparse_softmax_cross_entropy_with_logits

  • tf.losses.sparse_softmax_cross_entropy

  • tf.contrib.losses.sparse_softmax_cross_entropy(已弃用)

与上面的普通函数一样softmax,这些损失函数应该用于多项互斥分类,即从N类别中挑选一个。不同之处在于标签编码:类别被指定为整数(类别索引),而不是独热向量。显然,这不允许软类别,但当有数千或数百万个类别时,它可以节省一些内存。但是,请注意,logits参数仍然必须包含每个类别的 logit,因此它至少会消耗[batch_size, classes]内存。

与上述类似,tf.losses版本有一个weights允许设置批量权重的参数。

采样 softmax 函数系列

  • tf.nn.sampled_softmax_loss

  • tf.contrib.nn.rank_sampled_softmax_loss

  • tf.nn.nce_loss

这些函数为处理大量类别提供了另一种选择。它们不是计算和比较精确的概率分布,而是根据随机样本计算损失估计。

参数weightsbiases指定一个单独的全连接层,用于计算所选样本的逻辑。

与上述类似,labels不是独热编码,但具有形状[batch_size, num_true]

采样函数仅适用于训练。在测试时,建议使用标准softmax损失(稀疏或独热)来获取实际分布。

另一个替代损失是tf.nn.nce_loss,它执行噪声对比估计(如果您有兴趣,请参阅这个非常详细的讨论)。我已将此函数添加到 softmax 系列中,因为 NCE 保证在极限范围内近似于 softmax。

解决方案 2:

虽然接受的答案包含的信息比所问的信息多得多,但我觉得分享一些通用的经验法则将使答案更加紧凑和直观:

  • 只有一个真正的损失函数。这就是交叉熵 (CE) 。对于二元分类的特殊情况,这种损失称为二元 CE(请注意,公式不变),对于非二元或多类情况,这种损失称为分类 CE (CCE)。稀疏函数是分类 CE 的一个特例,其中预期值不是独热编码,而是一个整数。

  • 我们有softmax公式,它是多类场景的激活。对于二分类场景,相同的公式有一个特殊名称 - sigmoid激活

  • 由于处理对数函数时有时会出现数值不稳定性(对于极值),TF 建议将激活层和损失层组合成一个函数。这个组合函数在数值上更稳定。TF 提供了这些组合函数,它们的后缀为_with_logits

有了这些,我们现在来处理一些情况。假设有一个简单的二分类问题- 图像中是否存在猫?激活和损失函数的选择是什么?它将是一个 S 形激活和一个 (二元)CE。因此,可以使用sigmoid_cross_entropy或更可取的是sigmoid_cross_entropy_with_logits。后者结合了激活和损失函数,并且应该是数值稳定的。

那么多类分类怎么样?假设我们想知道图像中是否存在猫、狗或驴。激活和损失函数的选择是什么?它将是一个 softmax 激活和一个 (分类)CE。因此,可以使用softmax_cross_entropy或更优选的softmax_cross_entropy_with_logits。我们假设预期值是独热编码 (100 或 010 或 001)。如果(出于某些奇怪的原因),情况并非如此,并且预期值是一个整数(1 或 2 或 3),则可以使用上述函数的“稀疏”对应项。

可能还有第三种情况。我们可以进行多标签分类。因此,同一张图片中可能会有一只狗一只猫。我们该如何处理这种情况?这里的诀窍是将这种情况视为多个二元分类问题 - 基本上是猫或没有猫/狗或没有狗和驴或没有驴。找出这 3 个(二元分类)中的每一个的损失,然后将它们加起来。所以本质上这归结为使用sigmoid_cross_entropy_with_logits损失。

这回答了您提出的 3 个具体问题。上面分享的功能就是所需的全部功能。您可以忽略已弃用且不应使用的 tf.contrib 系列。

解决方案 3:

然而,对于 1.5 版本,softmax_cross_entropy_with_logits_v2必须使用 ,同时将其参数与 一起使用argument key=...,例如

softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,
                                    logits=my_prediction, dim=-1, name=None)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2974  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1836  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   47  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   47  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   48  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用