基于指数梯度更新的步长自适应学习率.

在训练过程中调整学习率能够提高模型表现。作者提出了一种基于指数梯度更新的自适应参数更新方法;基于该方法作者设计了一种带动量的漏斗型随机梯度下降算法,在更新时维护一个全局步长和一个梯度坐标的增益因子,这两个参数通过指数梯度更新来更新。

1. 指数梯度更新

在最小化无约束函数$\mathcal{L}(\theta)$时,常使用梯度更新算法:

\[\theta_{t+1} = \theta_t-\eta \nabla_{\theta}\mathcal{L}(\theta_t)\]

有时优化函数带有约束。对于非负约束(即要求参数非负),可以使用指数梯度更新(exponentiated gradient update, EGU):

\[\theta_{t+1} = \theta_t \odot \exp(-\eta \nabla_{\theta}\mathcal{L}(\theta_t))\]

⚪ 指数梯度更新等价于指数变换的梯度更新

对于非负约束优化中的非负参数$\theta$,设$\theta = e^{\phi}$,则问题转换为任意参数$\phi$的无约束优化问题,从而应用梯度更新:

\[\phi_{t+1} = \phi_t-\eta \nabla_{\phi}\mathcal{L(e^{\phi_t})} \\ = \phi_t-\eta [\nabla_{e^{\phi}}\mathcal{L(e^{\phi_t})}\nabla_{\phi}e^{\phi_t}] \\ = \phi_t-\eta e^{\phi_t} \nabla_{e^{\phi}}\mathcal{L(e^{\phi_t})} \\ = \phi_t-\eta' \nabla_{e^{\phi}}\mathcal{L(e^{\phi_t})}\]

上式两端取对数得:

\[e^{\phi_{t+1}} = e^{\phi_t-\eta' \nabla_{e^{\phi}}\mathcal{L(e^{\phi_t})}} \\ = e^{\phi_t}e^{-\eta' \nabla_{e^{\phi}}\mathcal{L(e^{\phi_t})}}\]

注意到$e^{\phi_t}=\theta_t$,因此上式即为指数梯度更新表达式:

\[\theta_{t+1} = \theta_t \odot \exp(-\eta' \nabla_{\theta}\mathcal{L}(\theta_t))\]

2. 基于指数梯度更新的参数自适应

标准的梯度更新公式如下:

\[\theta_{t+1} = \theta_t-\eta \nabla_{\theta_t}\mathcal{L} = \theta_t-\eta g_t\]

如果希望自适应地调整更新步长大小,可以引入一个和梯度$g_t$尺寸相同的非负变量$\nu$,逐点作用于非负梯度(Hadamard积):

\[\theta_{t+1} = \theta_t-\eta \nu_{t+1} \odot g_t\]

由于自适应参数$\nu$是非负的,因此采用指数梯度更新:

\[\nu_{t+1} = \nu_t \odot \exp(-\gamma \nabla_{\nu_t}\mathcal{L})\]

根据链式法则:

\[\nabla_{\nu_t}\mathcal{L} = \nabla_{\theta_t}\mathcal{L} \odot \nabla_{\nu_t}\theta_t \\ = -\eta g_{t-1} \odot \nabla_{\theta_t}\mathcal{L} = -\eta g_{t-1} \odot g_t\]

因此参数$\nu$的更新公式为:

\[\nu_{t+1} = \nu_t \odot \exp(\gamma \eta g_{t-1} \odot g_t)\]

将上式中的$\gamma \eta$合成为一个参数$\gamma$,则整个模型的更新公式如下:

\[\nu_{t+1} = \nu_t \odot \exp(\gamma g_{t-1} \odot g_t) \\ \theta_{t+1} = \theta_t-\eta \nu_{t+1} \odot g_t\]

如果初始化$\nu_1=1$,则参数$\nu$的计算:

\[\nu_{t+1} = \nu_t \odot \exp(\gamma g_{t-1} \odot g_t) \\ = \nu_{t-1} \odot \exp(\gamma g_{t-2} \odot g_{t-1}) \odot \exp(\gamma g_{t-1} \odot g_t) \\ = \nu_{t-1} \odot \exp(\gamma g_{t-2} \odot g_{t-1}+\gamma g_{t-1} \odot g_t) \\ = \exp(\gamma \sum_{k=1}^{t}g_{k-1}\odot g_k)\]

注意到如果某梯度分量的相邻两步更新经常同号,则累加项为正,学习率的调节因子$\nu$大于$1$,即在梯度更新中如果梯度符号一直没改变,则可以适当扩大学习率。反之如果梯度符号经常改变,则累加项为负,调节因子$\nu$小于$1$,即适当缩小学习率。这种步长更新方式类似于RProp

3. 带动量的漏斗型随机梯度下降

作者对带动量的梯度更新算法进行了改进,动量更新的原型如下:

\[m_{t} = \beta m_{t-1}+(1-\beta)g_t \\ \theta_{t+1} = \theta_t-\eta m_{t}\]

作者引入了两个步长自适应参数,其中坐标增益(per-coordinate gain)向量$p$用于预先调节梯度向量,而步长尺度(step-size scale)超参数$s$用于对更新步长进行全局缩放。

基于上述自适应超参数的漏斗型(funnel)梯度更新算法为:

\[\nu_{t+1} = \mu \nu_{t}+\eta(p_{t+1}\odot g_t) \\ \theta_{t+1} = \theta_t-s_{t+1} \nu_{t+1}\]

坐标增益向量$p$和步长尺度$s$都是非负参数,使用指数梯度更新:

\[p_{t+1} = p_t \odot \exp(\gamma_p m_{t-1} \odot g_t)\] \[s_{t+1} = s_t \cdot \exp(\gamma_s \nu_t \cdot g_t)\]

4. 实验分析

作者构造了一个MNIST的旋转数据集,随着训练时间的推移,数据集中的分布会发生变化(旋转角度改变)。该数据集用于模仿实际应用中由于用户偏好改变造成的新的数据流(如推荐系统)。在这种环境下,优化算法应该能够适应不断变化的数据分布。

实验结果表明,当训练集的分布发生变化时,使用funnel算法能够更快地适应分布变化,并更快地恢复较高的准确率。作者还展示了更新过程中的全局学习率以及不同坐标的增益因子的变化情况。

作者进一步展示了对网络不同层的参数所维护的步长因子和坐标因子的变化情况。funnel算法对于不同层学习到自适应的学习率衰减策略。