神经网络为不同的输入提供相同的输出,不学习

时间:2014-07-13 22:10:23

标签: c++ c++11 neural-network backpropagation

我有一个用标准C ++ 11编写的神经网络,我相信它正确遵循反向传播算法(基于this)。然而,如果我在算法的每个步骤中输出错误,它似乎随着时间的推移而不会发生振荡。我已经尝试完全消除动量并选择一个非常小的学习率(0.02),但它仍然以每个网络大致相同的幅度振荡(每个网络在一定范围内具有不同的幅度)。

此外,所有输入都会产生相同的输出(我发现here before发布的问题,但是对于另一种语言。作者还提到他从未使用过它。)

可以找到代码here

总结我如何实施网络:

  • Neuron将当前权重保持在他们前面的神经元,之前对这些权重的更改以及所有输入的总和。
  • Neuron可以访问它们的值(所有输入的总和),或者可以输出通过给定激活函数传递所述值的结果。
  • NeuronLayer充当Neuron容器并设置与下一层的实际连接。
  • NeuronLayer可以将实际输出发送到下一层(而不是从前一层拉出来)。
  • FFNeuralNetwork充当NeuronLayer的容器,并管理前向传播,错误计算和反向传播。他们也可以简单地处理输入。
  • FFNeuralNetwork的输入层将其加权值(值*权重)发送到下一层。之后每层中的每个神经元输出激活函数的加权结果,除非它是偏差,或者图层是输出层(偏差输出加权值,输出层只是通过激活函数传递总和)。

我是否在实施过程中犯了一个根本性的错误(对理论的误解),还是有一些我还没找到的简单错误?如果它是一个错误,它可能在哪里?

为什么即使学习率非常低,误差也会以它的量(大约+ - (0.2 + - 学习率))振荡?无论输入是什么,为什么所有输出都可以相同?

我已经过去了很多,以至于我可能会跳过某些东西,但我想我可能对该理论有一个明显的误解。

1 个答案:

答案 0 :(得分:0)

事实证明我只是盯着FFNeuralNetwork部分太多,并且意外地使用了错误的输入集来确认网络的正确性。它实际上可以正确地学习正确的学习率,动量和迭代次数。

具体来说,在main中,我使用inputs而不是较小的数组in来测试网络的输出。