Algorithm 如何测试我的反向传播神经网络实现是否正确
我正在研究反向传播算法的实现。到目前为止,我所实现的似乎是可行的,但我不能确定算法是否得到了很好的实现,以下是我在网络培训测试中注意到的: 实施规范:Algorithm 如何测试我的反向传播神经网络实现是否正确,algorithm,neural-network,backpropagation,Algorithm,Neural Network,Backpropagation,我正在研究反向传播算法的实现。到目前为止,我所实现的似乎是可行的,但我不能确定算法是否得到了很好的实现,以下是我在网络培训测试中注意到的: 实施规范: 包含近100000个原始数据的数据集(3个变量作为输入,这三个变量之和的正弦作为预期输出) 该网络有7层,所有层均使用Sigmoid激活功能 当我运行反向传播培训过程时: 在第四次迭代中发现了错误的最小代价(错误的最小代价是140,这正常吗?我预期的要比这个小得多) 在第四次迭代之后,错误的代价开始增加(我不知道这是否正常?) 简短的回答是
- 包含近100000个原始数据的数据集(3个变量作为输入,这三个变量之和的正弦作为预期输出)
- 该网络有7层,所有层均使用Sigmoid激活功能
- 在第四次迭代中发现了错误的最小代价(错误的最小代价是140,这正常吗?我预期的要比这个小得多)
- 在第四次迭代之后,错误的代价开始增加(我不知道这是否正常?)
- 洗牌
- 通过减去平均值使输入变量居中
- 将输入变量规格化为标准偏差1
- 如果可能,取消输入变量的相关
- 选择一个具有sigmoid函数
)的网络:它不会在+1/-1处饱和,而是在这些点具有最高增益(二阶导数最大)f(x)=1.7159*(tanh(2/3x)
- 在sigmoid范围内设置目标值,通常为+1和-1
- 权重应从平均值为零的分布中随机抽取,标准偏差由
给出,其中m^(-1/2)
是单位的输入数量m
- 如果训练集很大(超过几百个样本)并且是冗余的,如果任务是分类的,则使用带有仔细调整的随机梯度,或者使用随机对角Levenberg-Marquardt方法
- 如果训练集不是太大,或者任务是回归,则使用共轭梯度
- 如果你自己实现的话,注意数值的稳定性。很容易陷入麻烦
- 想想体系结构。完全连接的多层网络很少是一个明智的想法。不幸的是,从理论角度来看,对ANN的理解很差,你能做的最好的事情之一就是检查对其他人有用的东西,并学习有用的模式(使用正则化、池化和退出层等等)
- 简短的回答是“不,很可能您的实现不正确”。您的网络没有进行培训,这一点可以从非常高的错误成本中看出。正如在评论中所讨论的,您的人际网络受到严重的负面影响,这在深度人际网络中是不可避免的。本质上,网络的前几层比后几层学习慢得多。所有神经元在开始时都会得到一些随机权重,对吗?由于第一层几乎没有学习任何东西,因此较大的初始错误会传播到整个网络
如何修复它?从您对问题的描述来看,只有一个隐藏层的前馈网络应该能够做到这一点(如中所证明的)
检查,例如,您是否想了解更多信息
所以我确实理解了反向传播不能处理深层神经网络?或者有什么方法可以防止这个问题 可以,但这绝不是一个微不足道的挑战。自60年代以来,人们就开始使用深度神经网络,但直到90年代,研究人员才提出了有效处理它们的方法。我建议阅读“神经网络:交易技巧”中的“高效反向支撑”一章(由Y.A.LeCun等人撰写) 总结如下: