【问题标题】:How Many Epochs Should a Neural Net Need to Learn to Square? (Testing Results Included)神经网络需要多少个 epoch 才能学会平方? (包括测试结果)
【发布时间】:2015-08-21 16:51:36
【问题描述】:

好的,让我先说一下,我很清楚这取决于许多因素,我正在寻找有经验的人的一些一般指导。

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

我的测试(结果):

  • 训练数据500 使用 Java 的 Random 随机生成介于 .001 和 .999 之间的数字
  • 网络拓扑3 层,1 个输入神经元,5 个隐藏神经元,1 个输出神经元
  • 权重:全部生成为介于 -1 和 1 之间的随机值 (java.util.Random.nextDouble() * 2 - 1;)
  • 使用偏置节点:(numOfInputs + 1) 使得 input[input.length -1] = 1
  • 激活函数:Sigmoid
  • 学习率:显示在下面的结果代码中
  • 尚未实施任何形式的动力等
  • 结果:
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]

还有其他“简单的”“事物”我应该尝试用它来训练网络以检查其学习能力吗?

【问题讨论】:

  • 您是否尝试过改变训练规模?权重的初始化范围如何?
  • 我也没有搞砸过。听说 Sigmoid 函数的权重范围为 -1 到 1 正常吗? MLP 应该擅长从稀疏数据中学习,对吗?无论哪种方式,我确信改变这些可能会产生积极或消极的影响......优化并不是我的真正目标。我的目标是查看这些结果是否表明性能良好,或者是否可能是我没有正确实现算法。
  • 你是随机函数选择一次还是在每次测试中选择数字?因为在这 500 个数字中,400 有可能是从 0.0 到 0.2(例如)。
  • 生成训练数据的函数通过以下方式一次性填充 trainingData[]: trainingInput[x] = rangeMin + (rangeMax - rangeMin) * r.nextDouble();范围最小值设置为 0.001,最大值设置为 0.999。然后,通过在 0 和 trainingData.length 之间选择一个随机生成的数字,将数据随机馈送到网络中。因此,很有可能在不同的训练运行中,某些生成的数据从未使用过,而使用的数据可能在 0.0 到 0.2 的范围内。

标签: java algorithm artificial-intelligence neural-network backpropagation


【解决方案1】:

这有点像 necroposting,但我认为对于刚接触神经网络的人来说会很高兴。

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

http://robots.stanford.edu/papers/thrun.MONK.html

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

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

我认为它比 XOR 问题更健壮(我从经验谈起,因为当我第一次实现神经网络时,我的错误实现恰好解决了 XOR 问题,但没有解决 MONK 问题)。

【讨论】:

    【解决方案2】:

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

    我使用网络 (MLP) 进行了编码(tanh,没有偏置神经元,但每个神经元的偏置值,权重初始化在 0.1 和 0.5 之间,偏置初始化为每个 0.5,1.000 个训练数据集从 0.001 到 2.0 和激活归一化(除输入层神经元以外的所有神经元的输入/激活除以父层中的神经元数量),1-5-1 个神经元)我尝试了您的问题,每次学习不到 2.000 个 epoch,平均准确率达到 95% 0.1 的比率。

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

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

    此外,如果您的学习率太高(并且您做了很多 epoch),您可能会遇到过度拟合的风险。

    【讨论】:

    • 感谢您的精彩评论...所以,差不多,我的网络上有些东西(后退道具)无法正常工作
    • 可能,是的...不过,您可以在新问题中提供特定代码 sn-ps。也许我没有太多帮助,因为我在不到一年的时间里做神经网络的东西......但谁知道;)......我相信有很多关于 stackoverflow 的专家可以真正帮助调试。
    • @ascenator 你觉得你可以take a peek at this code吗?
    • 说实话,你的代码让我很困惑。如果您尝试为复杂问题实施解决方案,代码的质量非常重要,否则您最终会在某些代码行中隐藏几个错误,并且调试将成为一场灾难。
    • 我建议您在开始调试代码之前尽可能先进行重构。例如:在我的大型课程中,比如神经网络(MLP、Elman 网络……)和其他复杂的解决方案,我遵循经验法则,注释行的数量至少是普通代码的两倍。相信我,这可以更快地消除错误。
    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2012-09-19
    • 2012-09-13
    相关资源
    最近更新 更多