【发布时间】: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