3

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

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

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

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

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

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

4

2 回答 2

1

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

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

y = Σ w_i x

  = x . Σ w_i

所以这总是线性的。

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

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

一个明确的例子:指数函数的泰勒级数是:

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...)

于 2012-11-19T13:07:07.513 回答
0

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

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