概论
学习率(learning rate)决定目标函数能否收敛到最小值,和何时收敛到最小值。如果直接设定一个学习率η,是一个很棘手的问题。学习率η设定太小,算法就会进展缓慢,设定太大,就会震荡或者发散。针对这样的问题,就产生了学习率自适应算法。
基础
牛顿法
函数 f : R d → R f: \mathbb{R}^d \rightarrow \mathbb{R} f:Rd→R的泰勒展开式,事实上我们可以把它写成
f ( x + ϵ ) = f ( x ) + ϵ ⊤ ∇ f ( x ) + 1 2 ϵ ⊤ ∇ 2 f ( x ) ϵ + O ( ∥ ϵ ∥ 3 ) . f(\mathbf{x} + \boldsymbol{\epsilon}) = f(\mathbf{x}) + \boldsymbol{\epsilon}^\top \nabla f(\mathbf{x}) + \frac{1}{2} \boldsymbol{\epsilon}^\top \nabla^2 f(\mathbf{x}) \boldsymbol{\epsilon} + \mathcal{O}(\|\boldsymbol{\epsilon}\|^3). f(x+ϵ)=f(x)+ϵ⊤∇f(x)+21ϵ⊤∇2f(x)ϵ+O(∥ϵ∥3).
为了避免繁琐的符号,我们将 H = d e f ∇ 2 f ( x ) \mathbf{H} \stackrel{\mathrm{def}}{=} \nabla^2 f(\mathbf{x}) H=def∇2f(x)定义为 f f f的Hessian,是 d × d d \times d d×d矩阵。当 d d d的值很小且问题很简单时, H \mathbf{H} H很容易计算。但是对于深度神经网络而言,考虑到 H \mathbf{H} H可能非常大, O ( d 2 ) \mathcal{O}(d^2) O(d2)个条目的存储代价会很高,
此外通过反向传播进行计算可能雪上加霜。然而,我们姑且先忽略这些考量,看看会得到什么算法。
毕竟, f f f的最小值满足 ∇ f = 0 \nabla f = 0 ∇f=0。遵循的微积分规则,通过取 ϵ \boldsymbol{\epsilon} ϵ对 f f f的导数,再忽略不重要的高阶项,我们便得到
∇ f ( x ) + H ϵ = 0 and hence ϵ = − H − 1 ∇ f ( x ) . \nabla f(\mathbf{x}) + \mathbf{H} \boldsymbol{\epsilon} = 0 \text{ and hence } \boldsymbol{\epsilon} = -\mathbf{H}^{-1} \nabla f(\mathbf{x}). ∇f(x)+Hϵ=0 and hence ϵ=−H−1∇f(x).
也就是说,作为优化问题的一部分,我们需要将Hessian矩阵 H \mathbf{H} H求逆。
举一个简单的例子,对于 f ( x ) = 1 2 x 2 f(x) = \frac{1}{2} x^2 f(x)=21x2,我们有 ∇ f ( x ) = x \nabla f(x) = x ∇f(x)=x和 H = 1 \mathbf{H} = 1 H=1。因此,对于任何 x x x,我们可以获得 ϵ = − x \epsilon = -x ϵ=−x。换言之,单单一步就足以完美地收敛,而无须任何调整。我们在这里比较幸运:泰勒展开式是确切的,因为 f ( x + ϵ ) = 1 2 x 2 + ϵ x + 1 2 ϵ 2 f(x+\epsilon)= \frac{1}{2} x^2 + \epsilon x + \frac{1}{2} \epsilon^2 f(x+ϵ)=21x2+ϵx+21ϵ2。
稀疏特征的学习率
在深度学习训练中,为了获得良好的准确性,我们希望在训练过程中降低学习率,速度通常是为 O ( t − 1 2 ) \mathcal{O}(t^{-\frac{1}{2}}) O(t−21)或更低。这种情况下,我们在训练过程中就会遇到以下情况:
- 常用特征的参数迅速收敛的最佳值,学习率相对来说降低太慢。
- 稀疏特征因为缺乏足够的观测数据收敛很慢,学习率对其来说降低太快。
为了解决这个问题,我们可以通过记录特征次数来调整对应的学习率。我们使用 η i = η 0 s ( i , t ) + c \eta_i = \frac{\eta_0}{\sqrt{s(i, t) + c}} ηi=s(i,t)+cη0的学习率,而不是 η = η 0 t + c \eta = \frac{\eta_0}{\sqrt{t + c}} η=t+cη0。 s ( i , t ) s(i, t) s(i,t)计下了我们截至 t t t时观察到功能 i i i的次数。
AdaGrad
AdaGrad算法使用先前所得梯度平方和 s ( i , t