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

时间:2017-01-26 11:21:16

标签: algorithm neural-network backpropagation

我正在研究反向传播算法的实现。我到目前为止所实现的功能似乎有效,但我无法确定算法是否已经实现,这是我在网络训练测试中注意到的:

实施规范:

  • 一个包含近100000个原始数据集的数据集(3个变量作为输入,这三个变量之和的正弦作为预期输出)。
  • 网络确实有7层,所有层都使用Sigmoid激活功能

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

  • 在第四次迭代中发现错误的最低成本(错误的最低成本是140,这是正常的吗?我期待的远远低于
  • 第四次迭代后,错误的成本开始增加(我不知道它是否正常?

1 个答案:

答案 0 :(得分:2)

简短的回答是“不,很可能你的实施不正确”。由于错误成本非常高,您的网络无法进行培训。正如评论中所讨论的那样,您的网络受到vanishing gradient problem的严重影响,这在深层网络中是不可避免的。从本质上讲,您网络的第一层比后者学得慢得多。所有神经元在开始时都会得到一些随机权重,对吧?由于第一层几乎没有学到任何东西,因此大的初始错误会在整个网络中传播!

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

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

  

所以我从中了解到反向传播不能处理深度神经网络?还是有一些方法来防止这个问题?

它可以,但这绝不是一个微不足道的挑战。深度神经网络自60年代开始使用,但只有90%的研究人员提出了如何有效处理它们的方法。我建议阅读“神经网络:贸易技巧”的“高效BackProp”章节(由Y.A. LeCun等人撰写)。

以下是摘要:

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

培训网络的首选方法应如下:

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

另外,我的一般评论:

  • 如果您自己实施,请注意数值稳定性。很容易陷入麻烦。
  • 想一想架构。完全连接的多层网络很少是一个聪明的主意。不幸的是,从理论的角度来看,人工神经网络的理解很差,你可以做的最好的事情之一就是检查对他人有用的东西并学习有用的模式(使用正则化,汇集和辍学等等)。