我的神经网络学习sin x而不是cos x

时间:2012-11-19 12:08:43

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

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

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

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

使用该训练集,并将网络设置为1-10-1,学习率为0.5,一切都很好,并且网络应该学习sin-function。但是..如果我为COSINE -function做同样的事情,那么网络就不会学习它。没有任何隐藏图层大小或学习率的设置。

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

编辑:我的问题似乎与this applet相似。除非首先为权重教授“更容易”的东西(如1400次循环的二次函数),否则它似乎不会学习正弦函数。 applet中的所有其他设置都可以保留原来的状态。因此,在正弦或余弦的情况下,似乎在找到解决方案之前,权重需要一些增强以至少部分正确的方向。这是为什么?

2 个答案:

答案 0 :(得分:1)

我很难知道这是如何运作的。

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

y = Σ<子> I w_i x

= x . Σ<子> I w_i

所以这总是线性的。

为了使节点能够以不同方式学习,它们必须以不同方式连接和/或可以访问不同的输入。所以你可以提供值的输入,值的平方根(给出一些比例效果)等,并将不同的隐藏层节点连接到不同的输入,我怀疑你至少还需要一个隐藏层。< / p>

神经网络并不神奇。它为加权和产生一组特定权重。由于你可以推导出一组近似于正弦函数或余弦函数的设定权重,因此必须告知你神经网络需要什么输入才能获得成功的机会。

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

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

因此,如果你提供6个输入音符1,x 1 ,x 2 等,那么一个神经网络只接收到一个相应节点的每个输入,并且相乘它的重量然后将所有那些输出馈送到输出节点将能够进行指数的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 ......)

答案 1 :(得分:0)

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

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