好吧,首先我要说的是,我很清楚这取决于很多因素,我正在向有经验的人寻求一些一般准则。
我的目标是not制作一个可以为我计算数字平方的神经网络,但我认为这将是一个很好的实验,看看我是否正确实现了反向传播算法。这看起来是个好主意吗?无论如何,我担心我没有(完全)正确地实现学习算法。
我的测试(结果):
-
训练数据: 500使用 Java 的 Random 随机生成 0.001 到 0.999 之间的数字
-
网络拓扑结构: 3 Layers具有 1 个输入神经元、5 个隐藏神经元、1 个输出神经元
- 权重:全部生成 -1 到 1 之间的随机值 (java.util.Random.nextDouble() * 2 - 1;)
- 使用偏置节点:(numOfInputs + 1) 使得 input[input.length -1] = 1
-
激活函数:乙状结肠
-
学习率:如下面的结果代码所示
- 没有实施任何形式的动力等
- Results:
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]
我还应该尝试用其他“简单”“东西”来训练网络以检查其学习能力吗?
您可以做的最简单的事情之一就是计算 XOR 函数。为了测试“正常”多层感知器,这就是我通常所做的。当学习率为 0.2 时,XOR 问题在不到 100 个 epoch 的时间内通过 2 - 5 - 1 个神经元得到完美解决(平均准确度为 99%)。
使用网络(MLP),我编码了(tanh,没有偏差神经元,但每个神经元的偏差值,权重初始化在0.1和0.5之间,偏差初始化为每个0.5,1.000个训练数据集从0.001到2.0和激活归一化(输入/激活除输入层神经元之外的所有神经元除以父层中的神经元数量),1-5-1 个神经元)我尝试了你的问题,每次都在不到 2.000 个时期内获得了 95% 的平均准确率,学习率为 0.1 。
这可能有几个原因。对于我的网络 0.001 到 1.0 需要大约两倍的时间来学习。此外,提到的激活标准化(在大多数情况下)大大减少了学习特定问题所需的时期。
除此之外,我在每个神经元的偏差值而不是每层一个偏差神经元方面获得了大部分积极的体验。
此外,如果你的学习率太高(并且你做了很多时期),你可能会面临过度拟合的风险。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)