我正在使用这篇文章来实现带有反向传播的神经网络,但在计算误差时遇到了问题。简而言之,我的Sigmoid函数将所有节点输出压缩到了1.0,这导致误差计算返回0:
error = (expected - actual) * (1 - actual) * actual ^^ 这个项导致乘以0
因此,我的误差总是0。
我怀疑问题出在我的Sigmoid实现上,它返回了1.0,而不是渐进地逼近但不达到1.0:
# rubydef sigmoid(x) 1/(1+Math.exp(-x))end
我是否正确理解Sigmoid永远不应该达到1.0,还是我还有其他错误?
回答:
在数学背景下,你是对的,Sigmoid永远不应该达到1.0。然而,在实际编程环境中,Math.exp(-x)最终会变得非常小,以至于它与0的差异可以忽略不计,你会得到1.0的结果。根据x的范围,这样的结果并不令人惊讶。
为了使用Sigmoid方法,你应该使每个节点的输入权重之和大约为1。这将使Sigmoid的输出合理,并使你的权重更快地收敛。