【问题标题】:My neural net learns sin x but not cos x我的神经网络学习 sin x 但不学习 cos x
【发布时间】:2012-11-07 08:34:23
【问题描述】:

我已经建立了自己的神经网络,但我遇到了一个奇怪的问题。

该网络是一个非常简单的前馈 1-N-1 网络,具有反向传播学习。使用 Sigmoid 作为激活函数。

我的训练集是用 [-PI, PI] 和它们的 [0,1] 缩放正弦值之间的随机值生成的(这是因为“Sigmoid-net”只产生 [0,1] 和未缩放的值之间的值正弦函数产生的值介于 [-1,1])。

使用该训练集,网络设置为 1-10-1,学习率为 0.5,一切正常,网络学习了 sin 函数。但是..如果我对 COSINE 函数以同样的方式做所有事情,网络就不会学习它。没有任何隐藏层大小或学习率的设置。

有什么想法吗?我错过了什么吗?

编辑:我的问题似乎与this 小程序所见类似。除非首先为权重教授“更简单”的东西(例如 1400 个二次函数循环),否则它似乎不会学习正弦函数。小程序中的所有其他设置都可以保持初始状态。因此,在正弦或余弦的情况下,在找到解决方案之前,权重似乎需要一些提升以至少部分正确的方向。这是为什么呢?

【问题讨论】:

  • 它学到了什么?这可能有助于我们猜测问题出在哪里。
  • 我注意到 sin(x+0.5*PI) (等于 cos x)也不起作用。幂函数(^2、^3 等)似乎也不起作用。线性函数确实有效。代码中可能存在一些问题,而 sin[-PI, PI] -function 的成功只是一个奇怪的副作用。
  • 发布一些代码可能会对我们有所帮助。

标签: c++ neural-network trigonometry backpropagation feed-forward


【解决方案1】:

我正在努力看看这是如何工作的。

据我所知,您有 1 个输入,1 层中有 N 个节点,然后是 1 个输出。因此,网络隐藏层中的任何节点之间都没有区别。假设你有一个输入 x 和一组权重 wi。然后输出节点 y 将具有值:

y = Σi w_i x

  = x . Σi w_i

所以这总是线性的。

为了让节点能够以不同的方式学习,它们必须以不同的方式连接和/或访问不同的输入。因此,您可以提供值的输入、值的平方根(产生一些比例效应)等,并将不同的隐藏层节点连接到不同的输入,我怀疑无论如何您至少还需要一个隐藏层。

神经网络并不神奇。它为加权和生成一组特定权重。由于您可以导出一组权重来近似正弦或余弦函数,因此您必须了解神经网络需要哪些输入才能获得成功。

一个明确的例子:指数函数的Taylor series是:

exp(x) = 1 + x/1! + x^2/2! + x^3/3! + x^4/4! ...

因此,如果您提供 6 个输入音符,其中包含 1、x1、x2 等,那么一个神经网络刚刚接收到一个相应节点的每个输入,并相乘然后通过它的权重将所有这些输出馈送到输出节点将能够进行指数的 6 项泰勒展开:

in     hid     out

1 ---- h0 -\
x   -- h1 --\
x^2 -- h2 ---\
x^3 -- h3 ----- y
x^4 -- h4 ---/
x^5 -- h5 --/

没有太多的神经网络,但你明白了。

在泰勒级数的维基百科页面下方,有 sin 和 cos 的展开式,它们分别以 x 的奇次幂和 x 的偶次幂给出(想想看,sin 是奇数,cos 是偶数,并且是的,就是这么简单),所以如果你提供 x 的所有幂,我猜想 sin 和 cos 版本在交替零权重的情况下看起来非常相似。 (sin: 0, 1, 0, -1/6..., cos: 1, 0, -1/2...)

【讨论】:

  • 我对 NN 还不太了解,但我必须不同意。反向传播学习方法调整网络的所有权重,以便当前输入的一些“节点路径”将比其他路径更倾向于正确值。对多个样本执行此操作最终会导致一些隐藏节点更容易接受某些输入值,而其他一些隐藏节点更容易接受其他输入值。假设隐藏层中有足够的节点,则这些节点的总和 + 输出处的激活函数可以学习为任何输入的任何值(在 act.func 的范围内)。
【解决方案2】:

我认为您始终可以先计算正弦,然后再从外部计算余弦。我认为您在这里关心的是为什么神经网络可以学习正弦函数时不学习余弦函数。假设这个工件如果不是因为你的代码;我建议如下:

  1. 这看起来肯定是学习算法中的错误。可能是因为你的出发点。尝试从能够为第一个输入提供正确结果的权重开始,然后继续前进。
  2. 检查您的学习是否存在严重偏差 - +ve 多于 -ve
  3. 由于余弦可以通过正弦 90 减去角度来计算,因此您可以找到权重,然后在 1 步中重新计算余弦的权重。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 2017-02-28
    • 2019-03-15
    • 2011-08-17
    • 2020-10-29
    • 1970-01-01
    • 2016-11-28
    • 2013-04-22
    相关资源
    最近更新 更多