为什么带有 sigmoid 的神经网络代码与带有 softmax_cross_entropy_with_logits 的代码如此不同?

Why is the code for a neural network with a sigmoid so different than the code with softmax_cross_entropy_with_logits?

在使用神经网络进行分类时,据说:

在 TensorFlow 中计算 softmax 交叉熵的方法似乎是这样的:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y))

所以输出可以直接接最小化代码,很好

我的 sigmoid 输出代码同样基于各种教程和示例,大致如下:

p = tf.sigmoid(tf.squeeze(...))
cost = tf.reduce_mean((p - y)**2)

我本以为两者在形式上应该是相似的,因为它们以几乎相同的方式做相同的工作,但是上面的代码片段看起来几乎完全不同。此外,sigmoid 版本明确地对误差进行平方,而 softmax 则不是。 (平方是在 softmax 实现的某个地方发生的,还是发生了其他事情?)

以上其中一项是完全不正确的,还是有必要完全不同的原因?

soft-max cross-entropy成本和sigmoid的平方损失成本是完全不同的成本函数。虽然它们看起来密切相关,但它们不是一回事。

如果作业定义为"be the output layer of a classification network",那么这两个函数都是"doing the same job"。同样,您可以说 "softmax regression and neural networks are doing the same job"。的确,这两种技术都试图对事物进行分类,但方式不同。

具有 cross-entropy 成本的 softmax 层通常优于具有 l2 损失的 sigmoid。 cross-entropy 的 Softmax 有它自己的优点,比如更强的输出层梯度和概率向量的归一化,而 l2-loss 的 sigmoids 的导数更弱。您可以在 this 漂亮的书中找到很多解释。