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