我的神经网络学习sin x,但不学习cos x

My neural net learns sin x but not cos x

本文关键字:学习 cos sin 我的 神经网络      更新时间:2023-10-16

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

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

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

有了这个训练集,网络集为1-10-1,学习率为0.5,一切都很好,网络学习sin函数。但是。。如果我对COSINE函数做任何事情的方式都完全相同,网络就不会学习它。没有任何隐藏层大小或学习率的设置。

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

编辑:我的问题似乎与此小程序类似。除非先教一些"更容易"的权重(比如1400个二次函数循环),否则它似乎不会学习正弦函数。小程序中的所有其他设置都可以保持原样。因此,在正弦或余弦的情况下,在找到解决方案之前,似乎需要将权重提升到至少部分正确的方向。为什么会这样?

我很难理解这是怎么回事。

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

y =Σiw_i x

 = x .Σiw_i

所以这总是线性的。

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

神经网络不是魔法。它为加权和生成一组特定的权重。由于你可以导出一组权重来近似正弦或余弦函数,这必须告诉你神经网络需要什么输入才能有成功的机会。

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

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和余弦版本在交替的零权重下看起来会很相似。(sin:0,1,0,-1/6…,cos:1,0,-1/2…)

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

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