您的位置:首页 > 其它

深入了解梯度下降算法

2015-12-13 17:03 405 查看

一、目标函数:

首先明确一下本文的符号使用:向量用粗体表示,标量用普通的字母表示,例如:x\textbf{x}表示一个向量,xx表示一个标量。

梯度下降算法在优化理论中有着很重要的地位,凭借实现简单、解决最优化问题效果较好并且有很好的普适性等优点梯度下降算法在机器学习等领域具有广泛的应用。梯度下降算法通常用来解决无约束最小化问题:

minx∈Rnf(x)\begin{equation}\min_{\textbf{x}\in R^n} f(\textbf{x})\end{equation}

(注意到无约束最大化问题maxx∈Rnf(x)\max_{\textbf{x}\in R^n} f(\textbf{x})可以通过简单的在目标函数前加负号而转变成无约束最小化问题minx∈Rn−f(x)\min_{\textbf{x}\in R^n} -f(\textbf{x}),所以只需要讨论最小化问题就行)

梯度下降算法迭代更新变量x\textbf{x}的值来寻找目标函数的局部极小值,第k+1 轮迭代时变量的更新规则:

xk+1=xk+α⋅(−∇f)\begin{equation}
\textbf{x}_{k+1} = \textbf{x}_{k} + \alpha \cdot (-\nabla f)
\end{equation}

其中xk\textbf{x}_{k}是第k轮迭代后变量的值,α\alpha是更新步长,∇f\nabla f 是目标函数导数(梯度)。

二、问题列表:

要对梯度下降算法有比较全面的了解首先需要回答以下几个问题:

1、为什么负梯度方向就是目标函数减小最快的方向?

2、迭代过程中步长如何选择?

三、梯度方向:

梯度下降算法看起来很简单,直接对目标函数求导就可以了。但是肯定会有些同学有这样的疑问:为什么负梯度方向就是目标函数减小最快的方向?在此做简单的证明,更严格的证明可以查阅本文最后的参考资料。证明比较简单,不需要用到很高深的数学知识。

先从比较简单的二元函数开始,z=f(x,y)z = f(x,y),如果f(x,y)f(x,y)在(x0,y0)(x_0, y_0)点可微,则

f(x0+Δx,y0+Δy)−f(x0,y0)=f′x(x0,y0)Δx+f′y(x0,y0)Δy+o((Δx)2+(Δy)2−−−−−−−−−−−−√)\begin{equation}
f(x_0 + \Delta x, y_0 + \Delta y) - f(x_0, y_0) = f'_x(x_0, y_0)\Delta x + f'_y(x_0, y_0)\Delta y + o(\sqrt{(\Delta x)^2 + (\Delta y)^2})
\end{equation}

其中Δx\Delta x和Δy\Delta y分别是在xx轴和yy轴方向上移动的距离,也就是在迭代过程中变量的更新量;f′x(x0,y0)f'_x(x_0, y_0)和f′y(x0,y0)f'_y(x_0, y_0)分别是函数对xx和yy求偏导的结果。相信学过微积分的同学对这个式子会有映像。

我们的目标是在函数空间中移动一定的距离hh(hh趋向于零),即 h=(Δx)2+(Δy)2−−−−−−−−−−−−√h = \sqrt{(\Delta x)^2 + (\Delta y)^2} 固定的条件下使函数ff的值下降最多。

因为长度hh是固定的,所以总是可以找到某个角度

Δx=h⋅cosα¯,Δy=h⋅cosβ¯\begin{equation}
\Delta x = h \cdot cos\bar{\alpha}, \;\Delta y = h \cdot cos\bar{\beta}
\end{equation}

(cosα¯)2+(cosβ¯)2=1,cosβ¯=sinα¯,α¯+β¯=90∘\begin{equation}
(cos\bar{\alpha})^2 + (cos\bar{\beta})^2 = 1 , \; cos\bar{\beta} = sin\bar{\alpha}, \;\bar{\alpha}+\bar{\beta} = 90^\circ
\end{equation}

替换掉Δx\Delta x和Δy\Delta y

limh→0f(x0+hcosα¯,y0+hcosβ¯)−f(x0,y0)=f′x(x0,y0)hcosα¯+f′y(x0,y0)hcosβ¯=h[f′x(x0,y0)cosα¯+f′y(x0,y0)cosβ¯]=h[f′x(x0,y0),f′y(x0,y0)][cosα¯,cosβ¯]⊤\begin{equation}
\begin{split}
&\lim_{h\to 0}f(x_0 + h cos\bar{\alpha}, y_0 + h cos\bar{\beta}) - f(x_0, y_0) = f'_x(x_0, y_0)h cos\bar{\alpha} + f'_y(x_0, y_0)h cos\bar{\beta} \\
& \;\;\;\;= h[f'_x(x_0, y_0) cos\bar{\alpha} + f'_y(x_0, y_0) cos\bar{\beta}] = h[f'_x(x_0, y_0), f'_y(x_0, y_0) ][cos\bar{\alpha}, cos\bar{\beta}]^\top\\
\end{split}
\end{equation}

由于hh是固定长度的标量,为了使limh→0f(x0+hcosα¯,y0+hcosβ¯)−f(x0,y0)\lim_{h\to 0}f(x_0 + h cos\bar{\alpha}, y_0 + h cos\bar{\beta}) - f(x_0, y_0)最小,只能通过改变cosα¯cos\bar{\alpha} 和cosβ¯cos\bar{\beta}。 而α¯+β¯=90∘\bar{\alpha}+\bar{\beta} = 90^\circ ,其实就只需要确定α¯\bar{\alpha}的值。我们知道

∇f=[f′x(x0,y0),f′y(x0,y0)]\begin{equation}
\nabla f = [f'_x(x_0, y_0), f'_y(x_0, y_0) ]
\end{equation}

令u=[cosα¯,cosβ¯]\textbf{u} = [cos\bar{\alpha}, cos\bar{\beta}],所以

limh→0f(x0+hcosα¯,y0+hcosβ¯)−f(x0,y0)=h∇f⋅u⊤\begin{equation}
\lim_{h\to 0}f(x_0 + h cos\bar{\alpha}, y_0 + h cos\bar{\beta}) - f(x_0, y_0) = h \nabla f \cdot \textbf{u}^\top
\end{equation}

根据向量内积的定义,

∇f⋅u⊤=|∇f|⋅|u⊤|⋅cos<∇f,u⊤>=|∇f|⋅cos<∇f,u⊤>\begin{equation}
\nabla f \cdot \textbf{u}^\top = |\nabla f| \cdot |\textbf{u}^\top| \cdot cos<\nabla f, \textbf{u}^\top> = |\nabla f|\cdot cos<\nabla f, \textbf{u}^\top>
\end{equation}

即∇f\nabla f在向量u\textbf{u}方向上的投影。所以当∇f\nabla f和u\textbf{u}方向相同时,|∇f|⋅cos<∇f,u⊤>=|∇f||\nabla f|\cdot cos<\nabla f, \textbf{u}^\top> = |\nabla f|,函数增长最快;∇f\nabla f和u\textbf{u}方向相反时,|∇f|⋅cos<∇f,u⊤>=−|∇f||\nabla f|\cdot cos<\nabla f, \textbf{u}^\top> = -|\nabla f|,函数减小最快。



二元函数的情况已经证完了,推广到多元的情况类似,这里就不再赘述了。

四、步长选择:

步长α\alpha的选择对梯度下降算法来说很重要,α\alpha过小会导致收敛太慢;α\alpha过大容易导致发散。下面介绍几种常用的选择α\alpha的方法,其中线性搜索方法理论基础较好,但是在实际中使用没有前两种那么广泛,究其原因主要还是因为前面两种方法使用简单并且在大多数情况下都可以得到满意的效果。

固定常数:

最简单的方法就是把α\alpha固定为一个常数,并且在迭代过程中不改变α\alpha的值。这种方法要求α\alpha较小,否则容易导致发散而无法收敛。

线性变化:

另一种简单的方法是在迭代的过程中不断的减小α\alpha的值。常用的赋值方法是α=1/k\alpha = 1/k,其中k是迭代的次数。也可以加入平滑因子α=τ/(k+τ),τ∈R\alpha = \tau/(k+\tau), \tau\in R。

线性搜索(Linear Search):

线性搜索算法把步长的选择看做一个优化问题:

ϕ(α)=f(xk+αpk),α>0\begin{equation}
\phi(\alpha) = f(\textbf{x}_k + \alpha \textbf{p}_k), \; \alpha > 0
\end{equation}

其中pk\textbf{p}_k是当前函数负梯度方向,ϕ(α)\phi(\alpha)是步长α\alpha的函数,线性搜索方法利用函数ϕ(α)\phi(\alpha)找到一个合适的步长。首先介绍两个条件:Wolfe条件和Goldstein条件,它们是用来判断步长α\alpha是否足够好的准则。

有了一个合适的步长αk\alpha_k之后,就可以通过下面的式子更新变量x\textbf{x}了:

xk+1=xk+αkpk\begin{equation}
\textbf{x}_{k+1} = \textbf{x}_k + \alpha_k \textbf{p}_k
\end{equation}

1、Wolfe 条件:

Wolfe条件主要包括两点:足够下降曲率条件,在第k+1轮迭代时合适的步长αk\alpha_k的值应该同时满足这两个条件。

1、足够下降条件要求ff的函数值减小足够多

f(xk+αkpk)≤f(xk)+c1αk∇f⊤kpk,c1∈(0,1)\begin{equation}
f(\textbf{x}_k + \alpha_k \textbf{p}_k) \leq f(\textbf{x}_k ) + c_1 \alpha_k \nabla f_k^\top \textbf{p}_k , \;\;c_1\in (0,1)
\end{equation}

图中的l(α)l(\alpha)就等于f(xk)+c1αk∇f⊤kpkf(\textbf{x}_k ) + c_1 \alpha_k \nabla f_k^\top \textbf{p}_k 。如果新的变量值xk+1=xk+αkpk\textbf{x}_{k+1} = \textbf{x}_k + \alpha_k \textbf{p}_k使得函数值小于等于l(α)l(\alpha)那么这个变量值是可以接受的(acceptable)。



2、曲率条件要求变量变化不能太小,即xk+αpk\textbf{x}_k + \alpha \textbf{p}_k不能与xk\textbf{x}_k太接近,否则收敛过慢

∇f(xk+αkpk)⊤pk≥c2∇f⊤kpk,c2∈(c1,1)\begin{equation}
\nabla f(\textbf{x}_k + \alpha_k \textbf{p}_k)^\top \textbf{p}_k \geq c_2 \nabla f_k^\top \textbf{p}_k, \;\;c_2\in (c_1,1)
\end{equation}

图中的tangent虚线对应斜率∇fk\nabla f_k,其他几条虚线对应斜率c2∇fkc_2 \nabla f_k,斜率在 ∇fk\nabla f_k 和 c2∇fkc_2 \nabla f_k 之间的∇f(xk+αkpk)\nabla f(\textbf{x}_k + \alpha_k \textbf{p}_k)与pk\textbf{p}_k的内积 ∇f(xk+αkpk)⊤pk\nabla f(\textbf{x}_k + \alpha_k \textbf{p}_k)^\top \textbf{p}_k 会大于∇f⊤kpk\nabla f_k^\top \textbf{p}_k(最快下降),小于c2∇f⊤kpkc_2 \nabla f_k^\top \textbf{p}_k。所以满足曲率条件可以保证斜率∇f(xk+αkpk)\nabla f(\textbf{x}_k + \alpha_k \textbf{p}_k)不在∇fk\nabla f_k 和 c2∇fkc_2 \nabla f_k 之间。从而xk+1\textbf{x}_{k+1}不会在xk\textbf{x}_k附近(从图中可以明显观察到),避免收敛过慢。



同时满足Wolfe两个条件的图如下,图中acceptable的区域表示满足Wolfe条件的区域:



2、Goldstein 条件:

Goldstein条件和Wolfe很类似,Goldstein条件要求函数值有足够的下降,但是不要下降太多

f(xk)+(1−c)αk∇f⊤kpk≤f(xk+αkpk)≤f(xk)+cαk∇f⊤kpk,c∈(0,1/2)\begin{equation}
f(\textbf{x}_k ) + (1-c) \alpha_k \nabla f_k^\top \textbf{p}_k \leq f(\textbf{x}_k + \alpha_k \textbf{p}_k) \leq f(\textbf{x}_k ) + c \alpha_k \nabla f_k^\top \textbf{p}_k, \;\;c \in (0,1/2)
\end{equation}

两条虚直线夹角之间的α\alpha值都满足Goldstein条件。



3、Backtracking Linear Search:

在实际应用中,大多数算法都不会完整使用Wolfe条件和Glodstein条件。Backtracking线性搜索是一种比较实用的步长选择算法,它只利用了Wolfe条件的足够下降条件。具体算法如图所示:



Backtracking算法比较简单,它从一个较大的α\alpha值开始,不断按比例ρ\rho缩小直到满足足够下降条件,最终得到αk\alpha_k的值。

五、随机(stochastic)梯度下降和Mini-batch梯度下降算法:

随机梯度下降算法和Mini-batch梯度下降算法都和原始的梯度下降算法类似,只是为了减少计算量,在一次迭代中只使用一个或者几个样本来更新变量x\textbf{x}。

六、坐标下降(coordinate descent)算法:

坐标下降算法和梯度下降算法比较类似:坐标下降算法在每一次迭代中在当前点处沿一个坐标方向进行一维搜索 ,固定其他的坐标方向,找到一个函数的局部极小值。在整个过程中依次循环使用不同的坐标方向进行迭代。



七、参考资料:

Numerical Optimization (Second Edition) by Jorge Nocedal, Stephen J. Wright.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: