Java 一个神经网络需要多少个阶段才能学会平方?(包括测试结果)

Java 一个神经网络需要多少个阶段才能学会平方?(包括测试结果),java,algorithm,artificial-intelligence,neural-network,backpropagation,Java,Algorithm,Artificial Intelligence,Neural Network,Backpropagation,好的,让我先说一句,我很清楚这取决于很多因素,我想从有经验的人那里得到一些一般性的指导 我的目标是不是制作一个可以为我计算数字平方的神经网络,但我认为这将是一个很好的实验,看看我是否正确地实现了反向传播算法。这是个好主意吗?无论如何,我担心我没有(完全)正确地实现学习算法 我的测试(结果): 训练数据:使用Java的Random 网络拓扑:3层,1个输入神经元,5个隐藏神经元,1个输出神经元 权重:全部生成为-1到1之间的随机值(java.util.random.nextDouble()*2-

好的,让我先说一句,我很清楚这取决于很多因素,我想从有经验的人那里得到一些一般性的指导

我的目标是不是制作一个可以为我计算数字平方的神经网络,但我认为这将是一个很好的实验,看看我是否正确地实现了反向传播算法。这是个好主意吗?无论如何,我担心我没有(完全)正确地实现学习算法

我的测试(结果):

  • 训练数据:使用Java的Random
  • 网络拓扑3层,1个输入神经元,5个隐藏神经元,1个输出神经元
  • 权重:全部生成为-1到1之间的随机值(java.util.random.nextDouble()*2-1;)
  • 使用偏移节点:(numOfInputs+1),以便输入[input.length-1]=1
  • 激活功能:乙状结肠
  • 学习率:如下面的结果代码所示
  • 没有任何动力等
  • 结果:

有没有其他“简单”的东西,我应该试着训练网络来检查它的学习能力?

你能做的最简单的事情之一就是计算一个异或函数。对于测试“正常”多层感知器,这是我通常做的。在学习率为0.2的情况下,使用2-5-1个神经元,XOR问题在不到100个时间段内得到完美解决(平均准确率为99%)

我用一个网络(MLP)编码(tanh,没有偏差神经元,但每个神经元的偏差值,权重初始化在0.1和0.5之间,偏差初始化为0.5,1.000个训练数据集,从0.001到2.0,以及激活归一化(除输入层神经元外,所有神经元的输入/激活均除以父层神经元的数量),1-5-1个神经元)我试过你的问题,每次在不到2000个时间段内获得95%的平均准确率,学习率为0.1

这可能有几个原因。对于我的网络,0.001到1.0需要大约两倍的时间来学习。此外,提到的激活规范化(在大多数情况下)大大减少了学习特定问题所需的时间

除此之外,我对每个神经元的偏差值有着积极的体验,而不是每层一个偏差神经元


此外,如果你的学习率太高(而且你经历了很多时代),你可能会面临过度适应的风险。

这有点过分,但我认为对于神经网络新手来说,了解这一点会很好

一般来说,对于神经网络和机器学习模型的基准测试,一个常见的选择是MONK数据集及其由Thrun、Fahlman等人撰写的相关论文,您可以在

它由一组三个简单的分类问题组成,每个问题用不同的机器学习模型来解决

如果您查看神经网络章节,您可以看到输入是如何编码的,设置了哪些超参数(如神经元数量或学习速率),以及结果是什么,因此您可以轻松地从那里对自己的实现进行基准测试


我认为它比XOR问题更健壮(我是根据经验说的,因为当我第一次实现一个神经网络时,我的错误实现碰巧解决了XOR问题,但没有解决MONK问题)。

你有没有尝试过改变训练大小?权重的初始化范围如何?我都没有搞错。我听说乙状结肠功能的重量范围为-1到1是正常的?MLP应该擅长从稀疏数据中学习,对吗?不管怎样,我相信改变这些都会有积极或消极的影响。。。优化并不是我真正的目标。我的目标是看看这些结果是否表明了良好的性能,或者可能是我没有正确地实现算法。你的随机函数是在每次测试中选择一次数字还是在每次测试中选择一次数字?因为在这500个数字中,400有可能是从0.0到0.2(例如)。我必须生成训练数据的函数通过以下方式一次填充训练数据[]:trainingInput[x]=rangeMin+(rangeMax-rangeMin)*r.nextDouble();最小范围设置为.001,最大范围设置为.999。然后,通过在0和trainingData.length之间选择一个随机生成的数字,通过网络随机输入数据。因此,在不同的训练运行中,很有可能从未使用某些生成的数据,并且使用的数据可能在0.0到0.2范围内。感谢您的宝贵意见。。。所以,基本上,我的NetApp上有些东西(back-prop)无法正常工作。也许,是的……不过,你可以在一个新问题中提供特定的代码片段。也许我帮不了多少忙,因为我做神经网络的工作还不到一年……但谁知道呢;)。。。我相信有很多关于stackoverflow的专家可以真正帮助调试。@ascenator你认为你可以吗?老实说,你的代码看起来让我很困惑。如果您试图实现复杂问题的解决方案,那么代码的质量是非常重要的,否则在某些代码行中会隐藏一些错误,调试将成为一场灾难。我建议您在开始调试代码之前,首先尽可能多地重构。例如:在我的大班里,像神经网络(MLP,Elman网络,…)和其他复杂的解决方案,我遵循经验法则,注释行的数量至少是普通代码的两倍。相信我,这可以更快地消除bug。
Epochs: 10,000

Learning Rate .25
0.5 = [0.24203878039631344]
0.9 = [0.7942587190918747]
0.1 = [-0.005433286011774396]


Changed learning rate to 0.3

0.5 = [0.2891542106869196]
0.9 = [0.8159817287374298]
0.1 = [-0.03614377685205278]


Changed epoch to 1,000 with .25 learning rate

0.5 = [0.36399147315079117]
0.9 = [0.7585916275848852]
0.1 = [-0.02814488264341608]


Kept epoch at 1,000 with .30 learning rate

0.5 = [0.3872669778857468]
0.9 = [0.8160049820236891]
0.1 = [-0.03328304871978338]




 Epochs: 100,000:


.25 learning rate

0.5 = [0.24533230649123738]
0.9 = [0.8146287680498014]
0.1 = [0.006935561897963849]


.30 learning rate

0.5 = [0.24660900415003595]
0.9 = [0.8097729997778165]
0.1 = [0.013269893700964097]