zl程序教程

您现在的位置是:首页 >  其他

当前栏目

算法工程师面试题一之梯度下降算法

面试题工程师算法 梯度 下降
2023-09-14 09:13:19 时间

总结

  • 文章来源:CSDN@LawsonAbs
  • 本文详细介绍了整个梯度下降算法的缘由,并给出了详细的背景知识
  • 关键词:机器学习;优化算法;梯度下降;

1 前言

机器学习任务通常分成三个步骤:模型表征+模型评估+优化算法。

  • 模型表征是指该用什么样的映射函数,将数据映射到一个结果;
  • 模型评估是按照某种评估准则设计的一个评估算法,用于评价这个表征模型效果如何;
  • 优化算法的目的是优化表征模型;
    优化并不仅能在感官上认识,更重要的是需要用数学量化出来,结合数学公式证明并优化整个模型表征的效果。下面结合一个通俗的例子来解释这个过程。

例1.现在有很多男男女女的配对信息,需要给出两个人的亲密程度。

分析:分别考虑如下三个问题:模型表征,模型评估,优化算法。

  • 模型表征:使用一个映射函数 f ( x ) f(x) f(x)作为模型,用 x 1 , x 2 x_1,x_2 x1,x2分别表示男女,则有 y ^ = f ( x 1 , x 2 ) \hat{y}=f(x1,x2) y^=f(x1,x2)表示出两者的亲密值。
  • 模型评估:根据原始数据集 ( x 1 , x 2 , y ) (x_1,x_2,y) (x1,x2,y),以及预测到的亲密值 y ^ \hat{y} y^ 可以设计一个模型评估准则,这个准则用于衡量映射函数的好坏,也就是表征模型的性能。这里使用MSE方法作为评估函数,也就是常说的损失函数。
  • 优化算法:因为想使得模型更好的拟合数据,所以这里得到损失之后,优化的过程就是想使得整个损失变得最小。

由上所述,可知问题就变转换成了该怎么缩小损失,从而更好地拟合模型。在这个过程中,便可使用梯度下降方法来解决这个问题。在介绍梯度下降之前,先来系统的学习一下梯度的由来。

2 背景知识

在谈及梯度的时候,我们不得不谈谈方向导数,而在谈方向导数时候,又不得不理解方向余弦。

2.1 方向余弦

方向余弦是为了方便刻画向量的方向而引出的一个概念。向量的方向可以用同方向的单位向量来表示。

l l l是一个 n n n维非零向量, l 0 = l ∣ ∣ l ∣ ∣ l_0=\frac{l}{||l||} l0=ll,即 l 0 l_0 l0 是与 l l l同方向的单位向量。取 0 ≤ α i ≤ π 0\leq\alpha_{i}\leq\pi 0αiπ,使得 l 0 = ( c o s α 1 , . . . , c o s α n ) l_0=(cos\alpha_{1},...,cos\alpha_{n}) l0=(cosα1,...,cosαn)。显然, c o s 2 α 1 + . . . + c o s 2 α n = 1 cos^2\alpha_{1}+...+cos^2\alpha_{n}=1 cos2α1+...+cos2αn=1。称:
c o s α 1 , c o s α 2 , . . . , c o s α n cos\alpha_{1},cos\alpha_{2},...,cos\alpha_{n} cosα1,cosα2,...,cosαn
为向量 l l l的方向余弦。例如,在二维空间中,向量 l l l x x x轴的夹角就是 α 1 \alpha_{1} α1,与 y y y轴的夹角就是 α 2 \alpha_{2} α2,其方向余弦就是 c o s α 1 , c o s α 2 cos\alpha{1},cos\alpha{2} cosα1,cosα2

2.2 方向导数

导数常用来衡量一个函数的变化速率。方向导数也是一样,只不过方向导数衡量的是某个方向的变化速率。这点很重要,因为通过刚才的例1分析,我们知道要把损失降到最小,但是该怎么降?于是联想是否可以在该点往y值下降(y其实就是损失)靠近,但是损失下降的方向是什么方向?这就涉及到了方向导数。下面仔细看看方向导数是个什么?该怎么定义?
定义
f f f是定义于 R n R^n Rn中某区域 D D D上的函数,点 P 0 ∈ D P_0 \in D P0D, l l l为一给定的非零向量, P P P为一动点,向量 P 0 P P_0P P0P l l l的方向始终一致。如果极限
lim ⁡ ∣ ∣ P 0 P ∣ ∣ → 0 f ( P ) − f ( P 0 ) ∣ ∣ P 0 P ∣ ∣ \lim_{||P_0P|| \to 0 } \frac{f(P)-f(P_0)}{||P_0P||} P0P0limP0Pf(P)f(P0)
存在,则称此极限为函数 f f f P 0 P_0 P0处沿 l l l方向的方向导数,记作 ∂ ( f ) ∂ ( l ) \frac{\partial(f)}{\partial(l)} (l)(f)。方向导数可以用偏导数来表示。

下面就证明这一结论。
证明 方向导数的表达式是: ∂ ( f ) ∂ ( l ) ∣ p 0 = ∂ ( f ) ∂ ( x 1 ) ∣ p 0 c o s α 1 + ∂ ( f ) ∂ ( x 2 ) ∣ p 0 c o s α 2 + . . . + ∂ ( f ) ∂ ( x 3 ) ∣ p 0 c o s α n \left.\frac{\partial(f)}{\partial(l)}\right|_{p_{0}} = \left.\frac{\partial(f)}{\partial(x_1)}\right|_{p_{0}} cos \alpha_1 + \left.\frac{\partial(f)}{\partial(x_2)}\right|_{p_{0}} cos \alpha_2 + ... + \left.\frac{\partial(f)}{\partial(x_3)}\right|_{p_{0}} cos \alpha_n (l)(f)p0=(x1)(f)p0cosα1+(x2)(f)p0cosα2+...+(x3)(f)p0cosαn

性质 接着来看方向导数的几个性质:

  • 方向导数是个值;

2.3 梯度

介绍完方向导数之后,先以二元函数 z = f ( x , y ) z=f(x,y) z=f(x,y)为例,再看看梯度的定义。
定义:设函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在平面D上有一阶连续偏导数,则在每点 ( x , y ) ∈ D (x,y) \in D (x,y)D ,都可定义一个向量:
∂ ( f ) ∂ ( x ) ∗ i ⃗ + ∂ ( f ) ∂ ( y ) ∗ j ⃗ \frac{\partial(f)}{\partial(x)} * \vec{i} + \frac{\partial(f)}{\partial(y)} * \vec{j} (x)(f)i +(y)(f)j
称这个向量为函数 z = f ( x , y ) z=f(x,y) z=f(x,y) 在点 p ( x , y ) p(x,y) p(x,y) 处的梯度,记作 g r a d f ( x , y ) grad f(x,y) gradf(x,y),即:
g r a d f ( x , y ) = ∂ ( f ) ∂ ( x ) ∗ i ⃗ + ∂ ( f ) ∂ ( y ) ∗ j ⃗ grad f(x,y) = \frac{\partial(f)}{\partial(x)} * \vec{i} + \frac{\partial(f)}{\partial(y)} * \vec{j} gradf(x,y)=(x)(f)i +(y)(f)j
也可写作
g r a d f ( x , y ) = { ∂ ( f ) ∂ ( x ) , ∂ ( f ) ∂ ( y ) } grad f(x,y) = \{\frac{\partial(f)}{\partial(x)}, \frac{\partial(f)}{\partial(y)}\} gradf(x,y)={(x)(f),(y)(f)}
如果设 e ⃗ = c o s α 1 ∗ i ⃗ + c o s α 2 ∗ j ⃗ \vec{e}=cos \alpha_1 * \vec{i} + cos \alpha_2 *\vec{j} e =cosα1i +cosα2j 是与方向 l l l同向的单位向量,则由方向导数的计算公式可知:
∂ ( f ) ∂ ( l ) = ∂ ( f ) ∂ ( x ) c o s α 1 + ∂ ( f ) ∂ ( y ) c o s α 2 = { ∂ ( f ) ∂ ( x ) , ∂ ( f ) ∂ ( y ) } ∗ { c o s α 1 , c o s α 2 } = g r a d f ( x , y ) ∗ e \begin{aligned} \frac{\partial(f)}{\partial(l)} &= \frac{\partial(f)}{\partial(x)} cos \alpha_1 + \frac{\partial(f)}{\partial(y)} cos \alpha_2 \\ &=\{ \frac{ \partial(f)} {\partial(x)} , \frac{ \partial(f)} {\partial(y)} \} * \{ cos\alpha_1 ,cos\alpha_2 \}\\ &=grad f(x,y) * e \end{aligned} (l)(f)=(x)(f)cosα1+(y)(f)cosα2={(x)(f),(y)(f)}{cosα1,cosα2}=gradf(x,y)e
这里的 g r a d ( x , y ) ∗ e grad(x,y) * e grad(x,y)e 就是一个内积,当二者方向相同时,计算结果取到最大值。也就是说:当 l l l的方向与 g r a d f ( x , y ) grad f(x,y) gradf(x,y)方向相同时,方向导数的值取最大;当 l l l的方向与梯度方向相反时,计算结果取最小。那么可以得出如下结论:
函数在某点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。

这就牵引出整个AI最为核心的内容:如果我们想优化某个问题,就可以使用梯度的这个性质,也有以下结论成立:

  • 如果我们需要优化一个函数值,想让其变得小(即minimize的过程),那么就应该朝其负梯度方向变化;
  • 如果想让其变得更大(即maxmum的过程),那么就应该朝其梯度方向变化。

梯度下降方向和等高线的切线方向有什么关系呢?

仍以二元函数 z = f ( x , y ) z=f(x,y) z=f(x,y)为例。一般说来,二元函数在集合上表示一个曲面,这曲面被平面 z = c z=c z=c(c是常数)所截得的曲线的方程是:
{ z = f ( x , y ) z = c \left \{ \begin{aligned} z& = f(x,y) \\ z&=c \end{aligned} \right. {zz=f(x,y)=c
这条曲线 l l l x O y xOy xOy平面上的投影是一个平面曲线 L L L,它在 x O y xOy xOy平面直角坐标系中的方程为 f ( x , y ) = c f(x,y)=c f(x,y)=c。因为该函数的函数值都是 c c c,所以我们称平面曲线 L L L为函数 z = f ( x , y ) z=f(x,y) z=f(x,y)的等高线。
设方程 f ( x , y ) = c f(x,y)=c f(x,y)=c确定了隐函数 y = y ( x ) y=y(x) y=y(x),将此函数代入原方程,得恒等式:

f ( x , y ( x ) ) ≡ 0 f(x,y(x)) \equiv 0 f(x,y(x))0
等式两端对x求导:

f x + f y ∗ y ′ ( x ) = 0 f_x + f_y * y'(x) = 0 fx+fyy(x)=0
得: y ′ ( x ) = − f x f y y'(x) = -\frac{f_x}{f_y} y(x)=fyfx
故等值线 f ( x , y ) = c f(x,y)=c f(x,y)=c在点 ( x , y ) (x,y) (x,y)处的法向量为: { 1 , f y f x } \{1,\frac{f_y}{f_x}\} {1,fxfy} { f x , f y } = ∇ f ( x , y ) \{f_x,f_y\} = \nabla f(x,y) {fx,fy}=f(x,y) 正好是函数 f ( x , y ) f(x,y) f(x,y) ( x , y ) (x,y) (x,y)处的梯度.因此我们可以得到梯度与等高线的关系:函数在点 ( x , y ) (x,y) (x,y)处的梯度的方向与过点的等高线在这点的法线的一个方向相同,且从数值较低的等高线指向数值较高的等高线,而梯度的模等于函数在这个法线方向的方向导数。

3 梯度下降算法

结合上面的知识,我们可以推出一个优化算法——梯度下降算法:
x 0 x^0 x0作为初始搜索点,并沿着梯度负方向构造一个新点 x 0 − α ∇ f ( x 0 ) x^0 - \alpha \nabla f(x^0) x0αf(x0),由泰勒定理可得:
f ( x 0 − α ∇ f ( x 0 ) ) = f ( x 0 ) − α ∣ ∣ ∇ f ( x 0 ) ∣ ∣ 2 + o ( α ) f(x^0 - \alpha \nabla f(x^0)) = f(x^0) - \alpha ||\nabla f(x^0)||^2 + o(\alpha) f(x0αf(x0))=f(x0)αf(x0)2+o(α)
因此,如果 ∇ f ( x 0 ) ≠ 0 \nabla f(x^0) \neq 0 f(x0)=0 ,那么当 α \alpha α 够小是,有:
f ( x 0 − α ∇ f ( x 0 ) ) ≤ f ( x 0 ) f(x^0 - \alpha \nabla f(x^0)) \leq f(x^0) f(x0αf(x0))f(x0)
成立。这意味着,从搜索目标函数极小点的角度来看, f ( x 0 − α ∇ f ( x 0 ) ) = f ( x 0 ) − α ∣ ∣ ∇ f ( x 0 ) ∣ ∣ 2 + o ( α ) f(x^0 - \alpha \nabla f(x^0)) = f(x^0) - \alpha ||\nabla f(x^0)||^2 + o(\alpha) f(x0αf(x0))=f(x0)αf(x0)2+o(α) 相对于 x 0 x^0 x0有所改善。这为极小点搜索工作提供了很好的启发。
可以设计一种方法实现以上理念。给定一个搜索点 x k x^k xk,由此点出发,根据向量 − α k ∇ f ( x k ) -\alpha_k \nabla f(x^k) αkf(xk)指定的方向和幅值运动,构造新点 x k + 1 x^{k+1} xk+1,其中, α k \alpha_k αk 是一个正实数,称为步长。这样,就可以得到一个迭代公式:
x k + 1 = x k − α k ∇ f ( x k ) x^{k+1} = x^{k} - \alpha_k \nabla f(x^{k}) xk+1=xkαkf(xk)
这称为梯度下降方法 (或简称梯度方法)。在搜索过程中,梯度不断变化,当接近极小点时,梯度应该趋近于0。 可以设定很小的步长,每次迭代都重新计算梯度;当然也可以设置很大的步长。前者的工作量非常大,而后者则容易在极小点附近产生锯齿状的收敛路径,优势在于梯度的计算次数要少一些。梯度下降方法包括很多种不同的具体算法,最常用的算法为最速下降法。

3.1 最速下降法

最速下降法是梯度方法的一种具体实现,其理念为在每次迭代中选择合适的步长 α k \alpha_k αk,使得目标函数值能够得到最大程度的减小。梯度方法便于实现,且大部分情况下能够很好地运行。
下面针对具体的函数模型给出算法的迭代过程。利用最速下降法求解函数:
f ( x 1 , x 2 , x 3 ) = ( x 1 − 4 ) 4 + ( x 2 − 3 ) 2 + 4 ( x 3 + 5 ) 4 f(x_1,x_2,x_3) = (x_1 - 4)^4 + (x_2 - 3)^2 + 4(x_3 + 5)^4 f(x1,x2x3)=(x14)4+(x23)2+4(x3+5)4
的极小点。初始搜索点为 x 0 = [ 4 , 2 , − 1 ] T x^0=[4,2,-1]^T x0=[4,2,1]T,开展3次迭代。
\subparagraph{} 目标函数的梯度为:
∇ f ( x ) = [ 4 ( x 1 − 4 ) 3 , 2 ( x 2 − 3 ) , 16 ( x 3 + 5 ) 3 ] T \nabla f(x) = [4(x_1-4)^3,2(x_2-3),16(x_3+5)^3]^T f(x)=[4(x14)3,2(x23),16(x3+5)3]T
因此, x 0 x^0 x0处的梯度为 ∇ f ( x 0 ) = [ 0 , − 2 , 1024 ] T \nabla f(x^0)=[0,-2,1024]^T f(x0)=[0,2,1024]T,确定 x 1 x^1 x1处的步长:
α 0 = arg ⁡ min ⁡ α 0 f ( x 0 − α ∇ f ( x 0 ) ) = arg ⁡ min ⁡ α 0 ≥ 0 ( 0 + ( 2 + 2 α − 3 ) 2 + 4 ( − 1 − 1024 α + 5 ) 4 ) = arg ⁡ min ⁡ α 0 ≥ 0 ϕ ( α ) \begin{aligned} \alpha_0 &= \mathop{\arg\min}_{\alpha_0} f(x^0 - \alpha \nabla f(x^0) )\\ &=\mathop{\arg\min}_{\alpha_0 \geq 0} (0+(2+2\alpha-3)^2+4(-1-1024\alpha+5)^4)\\ &=\mathop{\arg\min}_{\alpha_0 \geq 0} \phi(\alpha) \end{aligned} α0=argminα0f(x0αf(x0))=argminα00(0+(2+2α3)2+4(11024α+5)4)=argminα00ϕ(α)
应用割线法开展一维搜索,可得: α 0 = 3.967 ∗ 1 0 − 3 \alpha_0 = 3.967 * 10^{-3} α0=3.967103。于是得到新的迭代点
x 1 = x 0 − α 0 ∇ f ( x 0 ) = [ 4.0000 , 2.0008 , − 5.062 ] T x^1 = x^0 - \alpha_0 \nabla f(x^0) = [4.0000,2.0008,-5.062]^T x1=x0α0f(x0)=[4.0000,2.0008,5.062]T
如此迭代计算,可得:
α 1 = 0.500 , x 2 = x 1 − α 0 ∇ f ( x 1 ) = [ 4.0000 , 3.0000 , − 5.060 ] T \alpha_1 = 0.500, x^2 = x^1 - \alpha_0 \nabla f(x^1) = [4.0000,3.0000,-5.060]^T α1=0.500,x2=x1α0f(x1)=[4.0000,3.0000,5.060]T
α 2 = 16.29 , x 3 = x 2 − α 0 ∇ f ( x 2 ) = [ 4.0000 , 3.0000 , − 5.002 ] T \alpha_2 = 16.29, x^3 = x^2 - \alpha_0 \nabla f(x^2) = [4.0000,3.0000,-5.002]^T α2=16.29,x3=x2α0f(x2)=[4.0000,3.0000,5.002]T
根据函数表达式,可以很直观的看到 f ( x 1 , x 2 , x 3 ) f(x_1,x_2,x_3) f(x1,x2,x3)的最小值就是(4,3,-5).

3.2 固定步长梯度法

根据步长是否固定,可将梯度下降法分成固定步长梯度法和最速下降法。固定步长梯度法就是迭代更新时步长固定。这种步长固定梯度法简单实用。由于步长固定,因此,在每步迭代中,不需要开展以为搜索确定步长 α k \alpha_k αk. 显然,该方法的收敛性与步长 α \alpha α有关。

4 结论

本文的贡献在于:

  • 给出方向导数表达式的证明;
  • 推导梯度和方向导数之间的关系;
  • 证明梯度方向与等高线的切线方向垂直;
  • 给出梯度下降算法及相关系列算法,并结合实例给出迭代结果;

0. 方向余弦

在这里插入图片描述在这里插入图片描述

1.方向导数

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

3. 其它

在这里插入图片描述

在这里插入图片描述