我正在构建一个神经网络,我使用 sigmoid 函数作为最后单个输出神经元的激活函数。由于已知 sigmoid 函数可以采用任意数字并返回 0 到 1 之间的值,因此由于交叉熵的推导,这会在反向传播阶段导致除以零误差。我在互联网上看到建议使用带有交叉熵损失函数的 sigmoid 激活函数。
那么,这个错误是如何解决的呢?
我正在构建一个神经网络,我使用 sigmoid 函数作为最后单个输出神经元的激活函数。由于已知 sigmoid 函数可以采用任意数字并返回 0 到 1 之间的值,因此由于交叉熵的推导,这会在反向传播阶段导致除以零误差。我在互联网上看到建议使用带有交叉熵损失函数的 sigmoid 激活函数。
那么,这个错误是如何解决的呢?
交叉熵损失由下式给出:
现在0-1
我们知道 sigmoid 函数输出的0
值1
介于sigmoid(z)
+ or -infinity
尽管您的编译器给出了除以0
错误,因为非常小的浮点数四舍五入到0
,它实际上并不重要,因为它只会在 2 种情况下发生:
sigmoid(z) = 0
,在这种情况下,即使编译器无法计算(等式中的第一项),它最终也会log(0)
乘以最终答案为 0。y_i
0
sigmoid(z) = 1
,在这种情况下,即使编译器无法计算(等式中的第二项),它最终也会log(1-1)
乘以最终答案为 0。1 - y_i
0
如果您根本不想要错误,有几种方法可以解决这个问题:
0
以这样的方式编写程序,即任何乘以0
而不查看其他项。Implementation side note:
在大多数处理器 (AFAIK) 中,您无法使用手动异常处理程序绕过除以 0 错误。因此,您必须确保根本不会发生错误。
注意:假设随机权重初始化考虑到在训练开始时不会发生这样的事实或者为 0,而目标正好相反,假设由于良好的训练,输出接近目标,因此上面提到的 2 种情况将成立。
希望这可以帮助!