【问题标题】:Neural Network: calculating errors during backpropagation神经网络:计算反向传播期间的误差
【发布时间】:2012-09-30 20:09:38
【问题描述】:

我正在使用this article 来实现具有反向传播的神经网络,但在计算错误时遇到了麻烦。简而言之,我的 sigmoid 函数将我的所有节点输出压缩为 1.0,然后导致错误计算返回 0:

error = (expected - actual) * (1 - actual) * actual
                                    ^^ this term causes multiply by 0

所以我的错误总是 0。

我怀疑问题出在我的 sigmoid 实现上,它返回 1.0,而不是渐近地限制在 1.0 以下:

# ruby
def sigmoid(x)
  1/(1+Math.exp(-x))
end

sigmoid 实际上不应该达到 1.0,我是正确的,还是我有其他问题?

【问题讨论】:

  • 是的,你的函数应该总是低于 1。我认为一些舍入问题可能是罪魁祸首......

标签: artificial-intelligence computer-science neural-network


【解决方案1】:

在数学上下文中,sigmoid 永远不应该达到 1.0,这是正确的。然而,在实际的编程环境中,Math.exp(-x) 最终会变得非常小,以至于它与 0 之间的差异可以忽略不计,您将得到 1.0 的结果。根据 x 的范围,这不会是令人惊讶的结果。

为了使用 sigmoid 方法,您应该使每个节点的传入权重总和大约为 1。这将使 sigmoid 的输出合理,并让您的权重更快地收敛。

【讨论】:

  • 大约 0..300。它很大,因为我有大量的输入和隐藏节点。我正在尝试使用 8 位输出结果对 20x20 位图进行分类。
  • 所以对于 300,指数函数将非常小,以至于它可能为 0,而您将得到 1.0 的结果。对于 0 当然不应该是这种情况。
  • Wolfram alpha 甚至认为结果是 1.0,因为指数项是如此之小wolframalpha.com/input/?i=1%2F%281%2Be^%28-300%29%29 在大约 -37 处,1.0 和正确答案之间的差异将低于double 类型的精度(可能是 ruby​​ 使用的)。 wolframalpha.com/input/?i=log+base+2+%281-1%2F%281%2Be^%28-37%29%29%29 抱歉,链接搞砸了,你必须复制/粘贴。
  • 是的,同意精度。有没有更合适的方法来计算我的输入范围的 sigmoid?还是我最好完全取消 sigmoid 并使用阈值激活?
  • 在 ruby​​ 中,您可以使用 bigdecimal ruby-doc.org/stdlib-1.9.3/libdoc/bigdecimal/rdoc/index.html (我想,只是用谷歌搜索了那个)。您应该问问自己,这些极小的差异是否真的相关,以及您的范围是否合适。在 x=37 时,您说的是千万亿分之一。
猜你喜欢
  • 2013-12-23
  • 2011-11-20
  • 2018-05-08
  • 2019-11-06
  • 2018-03-14
  • 2018-05-20
  • 2015-03-03
  • 2012-02-21
  • 2011-01-05
相关资源
最近更新 更多