sigmoid 函数在神经网络中的位置重要吗?
Does the place of the sigmoid function matter in neural network?
我正在尝试在 python 中使用 Keras 构建一个具有自定义损失的神经网络,我在犹豫是否在最后一层使用 sigmoid 函数作为激活函数并在开始时使用 sigmoid自定义损失是相同的还是不同的。所以这就是我的意思:
我有一种感觉,在第二个模型中计算了损失,但在第一个模型中它并没有通过 sigmoid 反向传播。那正确吗?
确实,在第二种情况下,反向传播不通过 sigmoid。在损失函数内部更改数据是一件非常糟糕的事情。
之所以这样做是一件坏事,是因为那样的话,您将在输出上反向传播一个错误,这不是网络正在产生的真正错误。
用一个简单的案例来解释我自己:
你有二进制形式的标签说张量 [0, 0, 1, 0]
如果你的 sigmoid 在你的自定义损失函数中,你可能有这样的输出 [-100, 0, 20, 100],
你损失中的 sigmoid 会将它转换成看起来大约像 tihs 的东西:[0, 0.5, 1, 1]
将被反向传播的错误将是 [0, -0.5, 0, -1]
。反向传播将 不 考虑 sigmoid,您将把这个错误直接应用于输出。您可以看到误差的大小根本不反映输出误差的大小:最后一个值为 100 并且应该在负范围内,但是模型将在该层上反向传播一个 -1 的小误差。
总而言之,sigmoid 必须在网络中,以便反向传播在反向传播错误时将其考虑在内。
我正在尝试在 python 中使用 Keras 构建一个具有自定义损失的神经网络,我在犹豫是否在最后一层使用 sigmoid 函数作为激活函数并在开始时使用 sigmoid自定义损失是相同的还是不同的。所以这就是我的意思:
我有一种感觉,在第二个模型中计算了损失,但在第一个模型中它并没有通过 sigmoid 反向传播。那正确吗?
确实,在第二种情况下,反向传播不通过 sigmoid。在损失函数内部更改数据是一件非常糟糕的事情。
之所以这样做是一件坏事,是因为那样的话,您将在输出上反向传播一个错误,这不是网络正在产生的真正错误。
用一个简单的案例来解释我自己:
你有二进制形式的标签说张量 [0, 0, 1, 0]
如果你的 sigmoid 在你的自定义损失函数中,你可能有这样的输出 [-100, 0, 20, 100],
你损失中的 sigmoid 会将它转换成看起来大约像 tihs 的东西:[0, 0.5, 1, 1]
将被反向传播的错误将是 [0, -0.5, 0, -1]
。反向传播将 不 考虑 sigmoid,您将把这个错误直接应用于输出。您可以看到误差的大小根本不反映输出误差的大小:最后一个值为 100 并且应该在负范围内,但是模型将在该层上反向传播一个 -1 的小误差。
总而言之,sigmoid 必须在网络中,以便反向传播在反向传播错误时将其考虑在内。