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

Neural Network gives same output for different inputs, doesn't learn

本文关键字:输出 学习 输入 神经网络      更新时间:2023-10-16

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

此外,所有输入都会产生相同的输出(这是我之前在这里发现的一个问题,尽管是针对不同的语言。作者还提到,他从来没有让它工作。

代码可以在这里找到。

总结一下我是如何实现网络的:

  • Neuron s保存了前面神经元的当前权值、这些权值之前的变化以及所有输入的和。
  • Neuron可以访问它们的值(所有输入的和),也可以通过给定的激活函数输出传递该值的结果。
  • NeuronLayer s作为Neuron容器,建立与下一层的实际连接。
  • NeuronLayers可以将实际输出发送到下一层(而不是从上一层提取)。
  • FFNeuralNetwork s作为NeuronLayer s的容器,管理前向传播、误差计算和反向传播。它们也可以简单地处理输入。
  • FFNeuralNetwork的输入层将其加权值(value * weight)发送给下一层。每层中的每个神经元随后输出激活函数的加权结果,除非它是一个偏差,或者该层是输出层(偏差输出加权值,输出层只是通过激活函数传递总和)。

我在实现中犯了一个根本性的错误(对理论的误解),还是有一些我还没有发现的简单错误?如果它是一个bug,它会在哪里?

为什么即使在非常低的学习率下,误差也会以它所做的量(大约+-(0.2 +-学习率))振荡?为什么不管输入是什么,所有的输出都是一样的?

我已经看了大部分了,所以我可能会跳过一些东西,但是我想我可能对这个理论有一个明显的误解。

原来我只是盯着FFNeuralNetwork部分看得太多了,不小心用了错误的输入集来确认网络的正确性。它实际上在正确的学习率、动量和迭代次数下正确地工作。

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