学习率衰减
什么是学习率衰减
加快算法学习速率的一个办法就是随着时间慢慢减小学习率,我们称之为学习率衰减(Learnign rate decay)
为什么要学习率衰减
训练初期,我们希望神经网络学习速度快,代价函数能够迅速收敛,这个时候我们会选择较大的学习率。
当我们逐渐靠近极小值时,如果依旧使用比较大的学习率,很有可能会导致“步幅过大”,参数更新过猛,导致越过了最低点,同理,当我们到达了另外一侧后,很有可能又因为学习率过高,导致依旧“步幅过大”,再次越过最低点,这样循环往复,最终这些参数构成的代价函数值只能在最低点附近不断徘徊波动,无法得到真正的最优解、无法收敛(此时的代价函数是不断震荡的),甚至发散。

因此,在训练一定程度后,我们应该减小学习率,避免上面这种情况的发生,当然如果我们继续训练,过一段时间后我们应当继续减小学习率,以保证逐步达到最优解。


学习率衰减的方法
\[ \alpha = \frac{1}{1+d\times epo}\alpha_0 \]
- \(d\)为decay-rate,即衰减率,是我们选定的一个常数
- \(epo\)为epoch-number,即迭代次数(第几次epoch)
- \(\alpha_0\)为初始学习率

- 指数衰减
\[ \alpha = \lambda^{epo}\alpha_0 \]
- \(epo\)为epoch-number,即迭代次数(第几次epoch)
- \(\alpha_0\)为初始学习率
- \(\lambda\)为我们指定的常数,\(\lambda\in(0,1)\)

\[ \alpha = \frac{k}{\sqrt{epo}}\alpha_0 \]
- \(k\)为我们指定的常数
- \(epo\)为epoch-number,即迭代次数(第几次epoch)
- \(\alpha_0\)为初始学习率

\[ \alpha = \frac{k}{\sqrt{t}}\alpha_0 \]
- \(k\)为我们指定的常数
- \(t\)为第几个iteration
- \(\alpha_0\)为初始学习率

- 离散下降的学习率
\[ \alpha = \left\{ \begin{aligned} &\alpha_0\quad epo\in[1,epo_0]\\\ &\alpha_1\quad epo\in[epo_0+1,epo_1]\\\ &\alpha_2\quad epo\in[epo_1+1,epo_2]\\\ &\cdots\cdots \end{aligned} \right. \]

比如,每训练5次,学习率衰减为原先的一半。
当然,离散下降也可以结合前面的几种方法,比如:
- 每过10个epoch,\(epo = epo+1\),\(\alpha = \lambda^{epo}\alpha_0\),即:\(\alpha = \lambda^{\lfloor \frac{epo}{10} \rfloor}\)

- 手动衰减
当我们发现学习速度下降的时候,手动减小学习率,平时的时候比如每隔一小时减小一次学习率等等。这种方式通常只有在模型比较小的时候才使用
通常情况下,优化算法时我们并不会优先考虑学习率衰减