【问题标题】:Difference in having Sigmoid activation function instead of linear activation and using sigmoid in loss具有 Sigmoid 激活函数而不是线性激活和在损失中使用 sigmoid 的区别
【发布时间】:2019-10-31 13:21:52
【问题描述】:

我对损失函数相当陌生,我有一个 800 个二元分类问题(意味着输出端的 800 个神经元不受彼此影响——每个神经元的概率为 0 或 1)。现在查看来自:https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

的文档

它似乎使用“logits”,这是具有线性激活函数的网络输出,并且 Sigmoid(二元分类所需)应用于损失函数。

我正在研究 soft-max 激活的损失函数,并应用了类似的方法。我想知道为什么不将激活函数添加到网络输出中,而损失函数接收线性输出(logits)并在损失函数中应用激活。

【问题讨论】:

  • 没什么大不了的。 sigmoid 用于损失 1) 以在其他地方为您节省一步 2) 以确保损失的每个输入都在 (0,1) 之间进行归一化。
  • @greeness 线性对数的应用在损失函数中产生了问题,这些问题在可以防止的问题中提到的帮助文件中进行了讨论。部署模型时我需要使用 Sigmoid,所以我相信它不会为我节省任何东西。 2) 它没有被规范化,损失函数的输入可以是负数,因为相同的帮助文件指定。
  • 如果您不需要那种便利(实际上对您来说很痛苦),只需使用其他预定义的损失 (tf.losses.log_loss ) 或自己制作一个。 :)
  • 我明白了,谢谢你的评论。

标签: tensorflow loss-function softmax sigmoid


【解决方案1】:

没什么大不了的。损失中使用sigmoid

  • 为您在别处节省一步
  • 确保损失的每个输入都在 (0,1) 之间进行归一化。

如果您不需要这种便利(实际上对您来说很痛苦),只需使用其他预定义的损失 (tf.losses.log_loss) 或自己制作一个。 :)

【讨论】:

    【解决方案2】:

    sigmoid/softmax 和交叉熵的简单应用在数值上是不稳定的。这是由于 sigmoid 中的 exp 和 softmax 中的 log。您可能会遇到上溢/下溢问题,这可能导致log(0) 被占用(这将导致-inf)。为避免这种情况,交叉熵函数使用直接基于 logits 的“更智能”公式,利用 log(exp(x)) == x 的事实。您应该始终使用这些函数来避免数值问题。如果您需要其他地方的实际概率,您仍然可以在这些点应用 sigmoid/softmax。

    【讨论】:

    • 我遇到了 log(0) 的问题,这就是我研究这些函数的 tensorflow 实现的原因。 @greeness 提到的 tf.losses.log_loss 也有一个 epsilon 来解决这些问题。似乎他们都实现了。
    【解决方案3】:

    非常简单的解释是它在输出中的用法:sigmoid 基本上用于二进制分类,将 0 到 1 的值视为主要类别的概率,线性用于回归问题。

    【讨论】:

      猜你喜欢
      • 2020-09-14
      • 2021-03-23
      • 2018-04-15
      • 2020-12-05
      • 1970-01-01
      • 2018-08-14
      • 2017-03-30
      • 1970-01-01
      • 2015-11-09
      相关资源
      最近更新 更多