使用 Sigmoid 激活函数而不是线性激活和在损失中使用 Sigmoid 的区别

Difference in having Sigmoid activation function instead of linear activation and using sigmoid in loss

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

它似乎使用了 "logits",这是具有线性激活函数的网络输出,并且在损失函数中应用了 Sigmoid(二进制分类所需)。

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

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

  • 在其他地方为您节省一步
  • 确保损失的每个输入都在 (0,1) 之间归一化。

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

sigmoid/softmax 和 cross-entropy 的天真应用在数值上是不稳定的。这是由于 sigmoid 中的 exp 和 softmax 中的 log。您可以 运行 解决 over/underflow 的问题,这可能导致 log(0) 之类的事情被采用(这将导致 -inf)。为避免这种情况,cross-entropy 函数使用直接基于 logits 的 "smarter" 公式,利用了 log(exp(x)) == x 这一事实。您应该始终使用这些函数来避免数值问题。如果您需要其他地方的实际概率,您仍然可以在这些点应用 sigmoid/softmax。

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