如何测试我的反向传播神经网络的实现是否正确

How to test if my implementation of back propagation neural Network is correct

我正在研究反向传播算法的实现。到目前为止我已经实施的似乎有效,但我不能确定该算法是否得到很好的实施,这是我在网络训练测试期间注意到的:

实施规范:

当我运行反向传播训练过程:

简短的回答是 "no, very likely your implementation is incorrect"。您的网络没有经过训练,可以通过非常高的错误成本观察到。正如评论中所讨论的,您的网络受到 vanishing gradient problem 的严重影响,这在深度网络中是不可避免的。本质上,你网络的第一层比后面的学习得慢得多。所有的神经元一开始都会得到一些随机的权重,对吧?由于第一层几乎没有学到任何东西,因此较大的初始错误会传播到整个网络!

如何解决?从您对问题的描述来看,似乎只有一个隐藏层的前馈网络应该能够解决这个问题(如 universal approximation theorem 中所证明)。

检查例如free online book by Michael Nielsen如果您想了解更多。

so I do understand from that the back propagation can't deal with deep neural networks? or is there some method to prevent this problem?

可以,但这绝不是一个微不足道的挑战。深度神经网络从 60 年代就开始使用,但直到 90 年代,研究人员才想出如何有效地处理它们的方法。我建议阅读 "Neural Networks: Tricks of the Trade".

的 "Efficient BackProp" 章(作者 Y.A。LeCun 等人)

摘要如下:

  • 随机播放示例
  • 通过减去平均值使输入变量居中
  • 将输入变量标准化为标准差 1
  • 如果可能,对输入变量去相关。
  • 选择一个具有 sigmoid 函数的网络 f(x)=1.7159*(tanh(2/3x):它不会在 +1 / -1 处饱和,而是在这些点上具有最高增益(二阶导数最大)
  • 将目标值设置在 sigmoid 的范围内,通常为 +1 和 -1。
  • 应从均值为零且标准差由 m^(-1/2) 给出的分布中随机抽取权重,其中 m 是单元的输入数量

应按如下方式选择训练网络的首选方法:

  • 如果训练集很大(超过几百个样本)且冗余,并且如果任务是分类,请使用经过仔细调整的随机梯度,或使用随机对角 Levenberg Marquardt 方法。
  • 如果训练集不是太大,或者任务是回归,使用共轭梯度。

此外,我的一些一般性评论:

  • 如果您自己实现,请注意数值稳定性。很容易出事。
  • 想想架构。 Fully-connected multi-layer 网络很少是一个聪明的主意。不幸的是,从理论的角度来看,人们对 ANN 了解甚少,您可以做的最好的事情之一就是检查对其他人有效的方法并学习有用的模式(使用正则化、池化和丢弃层等)。