gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:18:27 27 4
gpt4 key购买 nike

分类问题,例如逻辑回归或多项式
逻辑回归,优化一个 交叉熵损失。
通常,交叉熵层遵循 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 ?

    相关(更面向数学)讨论: What are the differences between all these cross-entropy losses in Keras and TensorFlow? .

    最佳答案

    初步事实

  • 在功能意义上,sigmoid is a partial case of the softmax function ,当类数等于 2 时。它们都做相同的操作:将 logits(见下文)转换为概率。

    在简单的二元分类中,两者没有太大的区别,
    然而,在多项分类的情况下,sigmoid 允许处理
    具有非排他性标签(又名多标签),而 softmax 交易
    与独家类(class)(见下文)。
  • logit(也称为分数)是 raw unscaled value associated with a class ,在计算概率之前。就神经网络架构而言,这意味着 logit 是密集(全连接)层的输出。

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

  • 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 类和 B 类
    有 50% 的概率。请注意,严格来说这并不意味着
    它属于两个类别,但可以通过这种方式解释概率。

    就像在 sigmoid家庭, tf.losses.softmax_cross_entropy允许
    设置批量权重,即让一些例子比其他例子更重要。
    据我所知,从 tensorflow 1.3 开始,没有设置类权重的内置方法。

    [更新] 在 tensorflow 1.5 中, v2版本 was introduced和原来的 softmax_cross_entropy_with_logits loss 被弃用了。它们之间的唯一区别是在较新的版本中,反向传播发生在 logits 和标签中( here's a discussion 为什么这可能有用)。

    稀疏函数族
  • tf.nn.sparse_softmax_cross_entropy_with_logits
  • tf.losses.sparse_softmax_cross_entropy
  • tf.contrib.losses.sparse_softmax_cross_entropy (已弃用)

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

    如上, tf.losses版本有 weights允许的论点
    设置批量权重。

    采样的 softmax 函数族
  • tf.nn.sampled_softmax_loss
  • tf.contrib.nn.rank_sampled_softmax_loss
  • tf.nn.nce_loss

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

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

    如上, labels不是单热编码,而是具有形状 [batch_size, num_true] .

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

    另一种替代损失是 tf.nn.nce_loss ,它执行噪声对比估计(如果您有兴趣,请参阅此 very detailed discussion)。我已将此函数包含在 softmax 系列中,因为 NCE 保证在极限内逼近 softmax。

    关于python - 如何在 TensorFlow 中选择交叉熵损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47034888/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com