如何在TensorFlow中选择交叉熵损失?
neural-network
python
tensorflow
7
0

分类问题(例如逻辑回归或多项式逻辑回归)可优化交叉熵损失。通常,交叉熵层跟随softmax层,从而产生概率分布。

在张量流中,至少有十二种不同的交叉熵损失函数

  • 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代替softmaxsparse函数与其他函数有何不同?为什么只有softmax

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

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

但是,对于1.5版, softmax_cross_entropy_with_logits_v2 ,在将其参数与argument key=...一起使用时,必须改用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)
收藏
评论

初步事实

  • 从功能上来说,当类的数量等于2时, S形是softmax函数的部分情况。它们都执行相同的操作:将logit(请参见下文)转换为概率。

    在简单的二进制分类中,两者之间没有太大区别,但是在多项分类的情况下,Sigmoid允许处理非排他性标签(aka multi-labels ),而softmax处理排他类(请参见下文)。

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

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

乙状结肠功能家族

如前所述, sigmoid损失函数用于二进制分类。但是tensorflow函数更通用,并且当类是独立的时,允许执行多标签分类。换句话说, tf.nn.sigmoid_cross_entropy_with_logits一次解决N二进制分类。

标签必须是一键编码的,或者可以包含软类概率。

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

Softmax功能系列

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

标签必须是一键编码的,或者必须包含软类别概率:一个特定示例可以以50%的概率属于A类,而以50%的概率属于B类。请注意,严格来讲,这并不意味着它同时属于这两个类别,而是可以用这种方式解释概率。

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

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

稀疏函数族

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

像上面一样, tf.losses版本具有weights参数,该参数允许设置批内权重。

采样的softmax函数系列

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

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

像上面一样, labels不是一键编码的,而是具有[batch_size, num_true]的形状。

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

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号