ava*_*gen 11 backpropagation neural-network
我用Java编写了一个神经网络,现在正在研究反向传播算法.
我已经读过,权重的批量更新将导致更稳定的渐变搜索,而不是在线权重更新.
作为测试,我创建了一个100分的时间序列函数,这样x = [0..99]和y = f(x).我创建了一个神经网络,其中包含一个输入和一个输出以及2个隐藏层,其中包含10个神经元用于测试.我正在努力解决的问题是在解决这个问题时反向传播算法的学习速度.
我有100个输入点,所以当我计算dw_{ij}每个节点的重量变化时,它实际上是一个总和:
dw_{ij} = dw_{ij,1} + dw_{ij,2} + ... + dw_{ij,p}
Run Code Online (Sandbox Code Playgroud)
其中,p = 100在这种情况下.
现在重量更新变得非常巨大,因此我的错误E反弹,因此很难找到最小值.我得到一些正确行为的唯一方法是当我将学习率设置为y类似的时候0.7 / p^2.
根据样本量,是否有一些设定学习率的一般规则?
Fra*_*urt 48
http://francky.me/faqai.php#otherFAQs:
主题:backprop应该使用什么学习率?
在标准的backprop中,学习率太低会使网络学习得非常慢.学习率过高会使权重和目标函数发生分歧,因此根本没有学习.如果目标函数是二次的,如在线性模型中,可以从Hessian矩阵计算良好的学习率(Bertsekas和Tsitsiklis,1996).如果目标函数具有许多局部和全局最优,如在具有隐藏单位的典型前馈NN中那样,在训练过程中最佳学习率通常会发生显着变化,因为Hessian也会发生显着变化.尝试使用恒定的学习率训练NN通常是一个繁琐的过程,需要大量的试验和错误.有关如何在一些非常简单的网络中选择学习速率和动量与数值条件相互作用的一些示例,请参阅 ftp://ftp.sas.com/pub/neural/illcond/illcond.html
通过批量培训,无需使用恒定的学习率.实际上,没有理由使用标准的backprop,因为存在更高效,可靠和方便的批处理训练算法(参见"什么是反向支持?"下的Quickprop和RPROP以及"什么是共轭"中提到的众多训练算法.渐变,Levenberg-Marquardt等?").
已经发明了许多其他的反向变体.大多数人都遇到与标准背投相同的理论缺陷:权重变化的幅度(步长)不应该是梯度幅度的函数.在重量空间的某些区域,坡度很小,需要大步长; 当您使用小随机权重初始化网络时会发生这种情况.在重量空间的其他区域,坡度很小,您需要一个小步长; 当您接近当地最低要求时会发生这种情况.同样,大梯度可能需要一个小步骤或一个大步骤.许多算法试图调整学习速率,但是当梯度突然变化时,任何将学习速率乘以梯度以计算权重变化的算法都可能产生不稳定的行为.Quickprop和RPROP的巨大优势在于它们不会过度依赖梯度的大小.传统的优化算法不仅使用梯度而且使用二阶导数或线搜索(或其某种组合)以获得良好的步长.
通过增量训练,编制一种在训练期间自动调整学习速率的算法要困难得多.NN文献中出现了各种提案,但大多数提案都不起作用.Darken和Moody(1992)阐述了其中一些建议的问题,遗憾的是他们没有提供解决方案.LeCun,Simard和Pearlmutter(1993)以及Orr和Leen(1997)提供了一些有希望的结果,他们调整了动量而不是学习率.还有一种称为"迭代平均"或"Polyak平均"的随机近似变量(Kushner和Yin 1997),其理论上通过保持权重值的运行平均值来提供最佳收敛速度.我对这些方法没有个人经验; 如果您有任何确凿证据表明这些或其他自动设置增量培训学习率和/或动力的方法实际上适用于各种NN应用程序,请通知常见问题解答维护人员(saswss@unx.sas.com).
参考文献:
积分:
一个简单的解决方案是取一批的平均重量而不是求它.这样你就可以使用0.7的学习率(或你喜欢的任何其他值),而不必担心优化另一个参数.
有关批量更新和学习率的更多有趣信息可以在Wilson(2003)的这篇文章中找到.