神经网络研究员早就意识到肯定是最难设置的超参数之一,因为它对模型的性能有显著的影响。损失通常高度敏感域参数空间中的某些方向,而不敏感于其他。动量算法可以在一定程度缓解这些问题,但这样做的代价是引入了另一个超参数,在这种情况下,自然会会问有没有其他方法。如果我们相信方向敏感度在某种程度是轴对称的,那么每个参数社会不同的学习率,在整个学习过程中自动适应这些学习率是有道理的。
Delta-bar-delta算法是一个早期的在训练时适应模型参数各自学习率的启发方式。该方法基于一个很简单的想法,如果损失对于某个给定模型参数的偏导数保持相同的符号,那么学习率应该增加。如果对于该参数的偏导变化了符号,那么学习率应该更小。最近,提出了一些增量(或者基于小批量)的算法来自适应模型参数的学习率。
AdaGrad算法,独立地使用所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根。具有损失最大偏导的参数应在参数空间中更为平缓的斜率方向会取得更大的进步。
在凸优化背景中,AdaGrad算法具有一些令人满意的理论性质。然而,经验上已经发现,对于深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减少。AdaGrad在某些深度学习模型上效果不错,但不是全部。
Require:全局学习率\epsilon
Require:初始参数\theta
Require:小常数\delta,为了数值稳定大约设置为10^{-7}
初始化梯度累积变量r=0
while 没有达到停止准则 do 从训练中采包含m个样本\left\{x^{(1)}, \ldots, x^{(n)}\right\} 的小批量,对应目标为y^{(j)} 。 计算梯度:
g \leftarrow \frac{1}{m} \nabla_{\theta} \sum_{1} L\left(f\left(x^{(\nu)} ; \theta\right), y^{(j)}\right)
累积平方梯度:
r \leftarrow r+g \odot g
计算更新:
\Delta \theta \leftarrow \frac{\varepsilon}{5+\sqrt{r}} \odot g
(逐元素地应用除和求平方根) 应用更新:
\theta \leftarrow \theta+\Delta_{\theta}
end while
RMSProp算法修改AdaGrad以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。AdaGrad旨在应用于凸问题时快速收敛。当应用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一个局部是凸碗的区域。AdaGrad根据平方梯度的整个历史收缩学习率,可能使得学习率在达到这样的凸结构前就变得太小收敛。它就像一个初始化与该碗状结构的AdaGrad算法实例。
RMSProp的标准如下所示,结合Nesterov动量的形式如下下一个算法所示。相比于AdaGrad,使用移动平均引入了一个新的超参数\rho ,用来控制移动平均的长度范围。
Require:全局学习率\epsilon ,衰减速率\rho
Require:初始参数\theta
Require:小常数\delta,通常设为10^{-6} (用于被小数除时的数值稳定) 初始化累积变量r=0
while 没有达到停止准则 do 从训练集中采包含m个样本\left\{x^{(1)}, \ldots, x^{(m)}\right\} 的小批量,对应目标为y^{(1)} 。 计算梯度:
g \leftarrow \frac{1}{m} \nabla_{\theta} \sum_{1} L\left(f\left(x^{(j)} ; \theta\right), y^{(j)}\right)
累积平方梯度:
r \leftarrow \rho r+(1-\rho) g \odot g
计算参数更新:
\Delta_{\theta}=-\frac{\varepsilon}{\sqrt{5+r}} \odot g
(\frac{1}{\sqrt{\delta+r}} ) 应用更新:
\theta \leftarrow \theta+\Delta_{\theta}
end while
Require:全局学习率\epsilon ,衰减速率\rho ,动量系数\alpha
Requie:初始参数\theta ,初始参数v
初始化累积变量r=0
while 没有达到停止准则 do 从训练集中采包含m个样本\left\{x^{(1)}, \ldots, x^{(m)}\right\} 的小批量,对应目标为y^{(j)} 。 计算临时更新:
\widehat{\theta} \leftarrow \theta+\alpha V
计算梯度:
g \leftarrow \frac{1}{m} \nabla_{\tilde{\theta}} \sum_{1} L\left(f\left(x^{(j)} ; \widetilde{\theta}\right), y^{(\nu)}\right)
累积梯度:
r \leftarrow \rho r+(1-\rho) g \odot g
计算速度更新:
V \leftarrow \alpha V-\frac{e}{\sqrt{r}} \odot g
(\frac{1}{\sqrt{r}} 逐元素应用) 更新应用:
1+\theta \rightarrow \theta
end while
经验上,RMSProp已被证明是一种有效且实用的深度神经网络的优化算法,目前它是深度学习从业者经常采用的优化算法之一。
Require:步长\epsilon (建议默认为:0.001) Require:矩估计的指数衰减速率,\rho_1 和\rho_2 在区间[0,1)内。(建议默认为:分别为0.9和0.999) Require:用于数值稳定的最小常数\delta (建议默认为:10^{-8} ) Require:初始参数\theta 初始化一阶和二阶矩变量s=0 ,r=0
初始化时间步t=0,while 没有达到停止准则 do 从训练集中采包含m个样本\left\{x^{(1)}, \ldots, x^{(m)}\right\} 的小批量,对应目标为y^{(1)} 。 计算梯度:
g \leftarrow \frac{1}{m} \nabla_{\theta} \sum_{1} L\left(f\left(x^{(j)} ; \theta\right), y^{(j)}\right)
t \leftarrow t+1
更新有偏一阶矩估计:
s \leftarrow \rho_{1} s+\left(1-\rho_{1}\right) g
更新有偏二阶矩估计:
r \leftarrow \rho_{2} r+\left(1-\rho_{2}\right) g \circ g
修正一阶矩的偏差:
s \leftarrow \frac{s}{1-\rho_{2}^{t}}
修正二阶矩的偏差:
\Delta \theta=-\varepsilon \frac{\vec{s}}{\sqrt{\vec{r}+5}}
(逐元素应用操作)
应用更新:
\theta=\theta+\Delta \theta
end while
"Adam"这个词派生自短语“adaptive moments”。早期算法背景下,它也许最好被看做结合RMSProp和具有一些重要区别的动量的变种。首先,在Adam中,动量直接并入了梯度一阶矩(指数加权)的估计。将动量加入RMSProp最直观的方法是将动量应用于缩放后的梯度。结合缩放的动量没有明确的理论动机。其次,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩的估计。RMSProp也采用了(非中心的)二阶矩估计,然而缺失了修正因子。因此,不像Adam,RMSProp二阶矩估计可能在训练初期有很高的偏置。Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。
目前,最流行的算法并且使用很高的优化算法包括SGD、具动量的SGD、RMSProp、具动量的RMSProp、AdaDelta和Adam。此时,选择哪一个算法似乎主要取决于使用者对算法的熟悉程度(以便调剂超参数)。