从梯度下降、动量法、AdaGrad、RMSProp、AdaDelta到Adam算法总结。
1.优化与深度学习
在一个深度学习问题中,我能通常会预先定义一个损失函数。有了损失函数以后,我们就可以使用优化算法试图将其最小化。在优化中,这样的损失函数通常被称作优化问题的目标函数(objective function)。一般来说,优化算法通常只考虑最小化目标函数。其实,任何最大化问题都可以很容易地转换为最小化问题,只需令目标函数的相反数作为新的目标函数即可。
由于优化算法的目标函数通常是一个基于训练数据集的损失函数,优化的目标在于降低训练误差。而深度学习的目标在于降低泛化误差。为了降低泛化误差,除了使用优化算法降低训练误差以外,还需要注意应对过拟合。
深度学习中绝大多数目标函数都复杂。因此,很多优化问题并不存在解析解,而需要使用基于数值方法的优化算法找到近似解,即数值解。为了求得最小化目标函数的数值解,我们将通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。优化在深度学习中有很多的挑战,下面是其中两个比较重要的挑战:
(1)局部最小值
(2)鞍点
局部最小值:对于目标函数 f ( x ) f(x) f(x),如果 f ( x ) f(x) f(x)在 x x x上的值比在 x x x邻近的其他点的值更小,那么 f ( x ) f(x) f(x)可能是一个局部最小值(local minimum)。如果 f ( x ) f(x) f(x)在 x x x上的值是目标函数在整个定义域上的最小值,那么 f ( x ) f(x) f(x)是全局最小值(global minimum)。
深度学习模型的目标函数可能有若干局部最优值。当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近或变成零,最终迭代求得的数值解可能只能令目标函数局部最小化而非全局最小化。
鞍点:刚刚在局部最小值中提到,梯度接近或变成零可能是由于当前解在局部最优解附近造成的。事实上,另一种可能性是当前解在鞍点(saddle point)附近。
在深度学习中,虽然找到目标函数的全局最优解很难,但这并非必要。下面将介绍深度学习中常用的优化算法,它们在很多实际问题中都能够训练出十分有效的深度学习模型。
2.梯度下降和随机梯度下降
虽然梯度下降(gradient descent)在深度学习中很少被直接使用,但理解梯度的意义以及沿着梯度反方向更新自变量可能降低目标函数值的原因是学习后续优化算法的基础。
2.1 一维梯度下降
首先以简单的一维梯度下降为例,解释梯度下降算法可能降低目标函数的原因。假设连续可导的函数 f : R → R f:\mathbb{R} \rightarrow \mathbb{R} f:R→R的输入和输出都是标量。给定绝对值足够小的数 ϵ \epsilon ϵ,根据泰勒展开公式,我们得到以下的近似:
f ( x + ϵ ) ≈ f ( x ) + ϵ f ′ ( x ) f(x+\epsilon) \approx f(x)+\epsilon {f}'(x) f(x+ϵ)≈f(x)+ϵf′(x)
这里 f ′ ( x ) {f}'(x) f′(x)是函数 f f f在 x x x处的梯度。一维函数的梯度是一个标量,也称导数。
接下来,找到一个常数 η > 0 \eta>0 η>0使得 ∣ η f ′ ( x ) ∣ |\eta{f}'(x)| ∣ηf′(x)∣足够小,那么可以将 ϵ \epsilon ϵ替换为 − η f ′ ( x ) -\eta {f}'(x) −ηf′(x)并得到:
f ( x − η f ′ ( x ) ) ≈ f ( x ) − η f ′ ( x ) 2 f(x-\eta {f}'(x)) \approx f(x)-\eta {f}'(x)^{2} f(x−ηf′(x))≈f(x)−ηf′(x)2
如果导数 f ′ ( x ) ≠ 0 {f}'(x) \neq 0 f′(x)=0,那么 η f ′ ( x ) 2 > 0 \eta {f}'(x)^{2}>0 ηf′(x)2>0,所以:
f ( x − η f ′ ( x ) ) ≤ f ( x ) f(x-\eta {f}'(x)) \leq f(x) f(x−ηf′(x))≤f(x)
这意味着,如果通过
x ← η f ′ ( x ) x \leftarrow \eta{f}'(x) x←ηf′(x)
来迭代 x x x,函数 f ( x ) f(x) f(x)的值可能会降低。因此在梯度下降中,我们先选取一个初始值 x x x和常数 η > 0 \eta > 0 η>0,然后不断通过上式来迭代 x x x,直到达到停止条件,例如 f ′ ( x ) {f}'(x) f′(x)的值已足够小或迭代次数已达到某个值。
上述梯度下降算法中的正数 η \eta η通常叫作学习率。这是一个超参数,需要人工设定,如果使用过小的学习率,会导致 x x x更新缓慢从而需要更多的迭代才能得到较好的解。
2.2 多维梯度下降
下面考虑一种更广义的情况:目标函数的输入为向量,输出为标量。假设目标函数 f : R d → R f:\mathbb{R}^{d}\rightarrow \mathbb{R} f:Rd→R的输入是一个 d d d维向量 x = [ x 1 , x 2 , . . . , x d ] T \boldsymbol{x}=[x_{1}, x_{2},...,x_{d}]^{T} x=[x1,x2,...,xd]T。目标函数 f ( x ) f(\boldsymbol{x}) f(x)有关 x \boldsymbol{x} x的梯度是一个由 d d d个偏导数组成的向量:
▽ x f ( x ) = [ ∂ f ( x ) ∂ x 1 , ∂ f ( x ) ∂ x 2 , . . . , ∂ f ( x ) ∂ x d ] T \bigtriangledown_{x}f(\boldsymbol{x})=\begin{bmatrix} \frac{\partial f(\boldsymbol{x})}{\partial x_{1}},& \frac{\partial f(\boldsymbol{x})}{\partial x_{2}}, & ... &,\frac{\partial f(\boldsymbol{x})}{\partial x_{d}} \end{bmatrix}^{T} ▽xf(x)=[∂x1∂f(x),∂x2∂f(x),...,∂xd∂f(x)]T
为表示简洁,我们用 ▽ f ( x ) \bigtriangledown f(\boldsymbol{x}) ▽f(x)代替 ▽ f x ( x ) \bigtriangledown f_{x}(\boldsymbol{x}) ▽fx(x)。梯度中每个偏导数元素 ∂ f ( x ) ∂ x i \frac{\partial f(\boldsymbol{x})}{\partial x_{i}} ∂xi∂f(x)代表着 f f f在 x \boldsymbol{x} x有关输入 x i x_{i} xi的变化率。为了测量 f f f沿着单位向量 u \boldsymbol{u} u(即∥u∥ = 1)方向上的变化率,在多元微积分中,我们定义 f f f在 x \boldsymbol{x} x上沿着 u \boldsymbol{u} u方向的方向导数为:
D u f ( x ) = lim h → 0 f ( x + h u ) − f ( x ) h D_{\boldsymbol{u}}f(\boldsymbol{x})=\lim_{h\rightarrow 0}\frac{f(\boldsymbol{x}+h\boldsymbol{u