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



我正在研究反向传播算法的实现。到目前为止,我所实现的似乎是有效的,但我不能确定算法是否得到了很好的实现,以下是我在网络训练测试中注意到的:

实施规范:

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

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

  • 在第四次迭代中发现了错误的最小代价(错误的最小成本是140,这正常吗?我原本预计会比这低很多)
  • 在第四次迭代之后,错误的成本开始增加(我不知道这是否正常?)

简短的回答是"不,很可能您的实现不正确"。您的网络没有进行训练,这可以从非常高的错误成本中看出。正如评论中所讨论的,你的网络受到消失梯度问题的严重影响,这在深度网络中是不可避免的。从本质上讲,你人际网络的前几层比后一层学习得慢得多。所有神经元在一开始都会得到一些随机权重,对吧?由于第一层几乎什么都没学到,所以大的初始错误会在整个网络中传播!

如何修复?从对问题的描述来看,似乎只有一个隐藏层的前馈网络应该能够做到这一点(正如普遍逼近定理所证明的那样)。

如果你想了解更多信息,请查看Michael Nielsen的免费在线书籍。

所以我确实理解反向传播不能处理深度神经网络?或者有什么方法可以防止这个问题?

可以,但这绝不是一个微不足道的挑战。深度神经网络从60年代就开始使用,但只有在90年代,研究人员才想出如何有效处理它们的方法。我建议阅读"神经网络:交易技巧"的"高效反向道具"一章(由Y.A.LeCun等人撰写)。

总结如下:

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

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

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

此外,我的一些一般性意见:

  • 如果您自己实现,请注意数值稳定性。惹麻烦很容易
  • 想想建筑。完全连接的多层网络很少是明智的想法。不幸的是,从理论角度来看,人们对人工神经网络的理解很差,你能做的最好的事情之一就是检查对其他人有效的方法,并学习有用的模式(包括正则化、池化和丢弃层等)

最新更新