我在Python中编写了一个神经网络,参考了这里的示例。看起来反向传播算法不起作用,因为在训练了1万次后,神经网络无法生成正确的值(在误差范围内)。具体来说,我在以下示例中训练它计算正弦函数:
(代码略)
输出未能接近tanh(sin(3)) = 0.140190616
。我怀疑涉及错误的索引或对齐的问题,但Numpy并未引发此类错误。有什么建议可以告诉我哪里出错了?
编辑: 我忘了添加偏置神经元。这是更新后的代码:
(代码略)
回答:
我认为您训练神经网络的方式有误。您有一个10000次迭代的循环,并且在每个周期中输入一个新样本。在这种情况下,神经网络永远不会被训练。
(该陈述是错误的!请查看更新!)
您需要做的是生成一个包含真实样本的大型数组Y = sin(X)
,将其一次性提供给您的网络,并在训练集上进行前向和后向迭代,以最小化成本函数。为了检查算法,您可能需要绘制成本函数随迭代次数的变化,并确保成本下降。
另一个重要点是权重的初始化。您的数字相当大,网络将需要很长时间才能收敛,特别是在使用低学习率时。一种好的做法是将初始权重均匀生成在某个小范围内[-eps .. eps]
。
在我的代码中,我实现了两种不同的激活函数:sigmoid()
和tanh()
。您需要根据所选的函数缩放输入:分别为[0 .. 1]
和[-1 .. 1]
。
以下是一些图像,展示了sigmoid()
和tanh()
激活函数的成本函数和结果预测:
如您所见,sigmoid()
激活的效果比tanh()
略好一些。
此外,当使用网络[1, 6, 1]
时,我得到了更好的预测结果,与具有4层的更大网络[1, 6, 4, 1]
相比。因此,神经网络的大小并不总是关键因素。以下是提到的大型网络的预测结果:
这是我的代码,附带了一些注释。我尽量在可能的情况下使用了您的符号表示法。
(代码略)