【Algorithm】梯度下降算法的数学原理

爷,独闯天下 提交于 2019-12-10 22:21:00

1.前言

在机器学习,深度学习中,我们通过定义损失函数并采用最小化损失函数的策略来优化模型中的参数。到了这个环节,其实我们面临的就是最优化问题。求解这些问题的方法也有很多,最常用就是梯度下降算法,在李航博士的《统计学习方法》中也还有牛顿法等。而针对梯度下降算法的不足,对此改进的有随机梯度下降法以及添加动量等。在本篇博文中,我们先来看看梯度下降算法的数学原理。

2.预备知识

在了解梯度下降算法之前,我们需要有一定的数学基础,例如:偏导,梯度,泰勒展开式。偏导大家应该很清楚,就不做细谈,现在让我们回忆以下梯度以及泰勒展开式的相关概念。

2.1梯度

本部分主要参考百度文库[1]。梯度:表示一函数在该点的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。这里又有一个新名词方向导数,那么什么是方向导数呢?下面我们来看看:
背景:假如我们有一个曲面(我们可以联想到这是一个山坡,zz可以看成一个高度)z=(x,y)z=(x,y),其中(x,y)D(x,y)\in D,可以将DD理解为这座山所占水平面的那块平面区域,在这块区域上有一点M0(x0,y0)DM_0(x_0,y_0)\in D,其垂直方向对应这个曲面上一点PP,从PP沿四周走,其对应得zz变化得速度也是不一样的,可大可小(别说我到山顶了,那就没意思了),然而从最陡峭得地方走zz变化是最快的,我们就是找最陡峭的。
接着上面的定义,过M0M_0做一条射线ll,可能沿着这条射线,zz的值可能越来越大,也可能越来越小。如果你想象你站在那个上坡上,你就有这种感觉。我们在ll上取一点M(x0+Δx,y0+Δy)M^\prime (x_0 + \Delta x, y_0 + \Delta y)M^\prime (x_0 + \Delta x, y_0 + \Delta y),那么MM^\prime在垂直方向对应曲面上点PP^\prime,那么PPPP^\prime对应一个高度差Δz=f(x0+Δx,y0+Δy)f(x0,y0)\Delta z= f(x_0 + \Delta x,y_0 + \Delta y) - f(x_0, y_0),如果Δz\Delta z 大于0则上升,小于0则下降。那么MMMM^\prime两点的距离为ρ=Δx2+Δy2\rho=\sqrt{{\Delta x}^2 + {\Delta y}^2},我们假设当ρ0\rho \rightarrow 0的时候Δzρ\frac{\Delta z}{\rho}存在,那么我们就认为此极限就为z=f(x,y)z=f(x,y)M0M_0点沿射线ll的方向导数,记为zlM0\frac{\partial z}{\partial l }|_{M_0}。那么方向导数如何计算呢:我们假设射线ll在水平趋于中与x,yx,y轴的夹角分别为α,β\alpha, \beta,那么MM沿ll的方向导数如下式(式 1) :
zlM0=zxcosα+zycosβ={fx,fy}{cosα,cosβ}\frac{\partial z}{\partial l }|_{M_0}=\frac{\partial z}{\partial x} \cos \alpha + \frac{\partial z}{\partial y}\cos \beta =\left \{ \frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\right \}\cdot \left \{\cos \alpha, \cos \beta \right\},关于高维方向导数以及方向导数如何计算这里不做细致推导。
下面就是主角来了,梯度。设二元函数z=f(x,y)z=f(x,y)在平面上具有一阶连续偏导数,则对于每一个点P(x,y)DP(x,y) \in D都可以定义一个向量{fx,fy}\left \{ \frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\right \},该函数称为z=f(x,y)z=f(x,y)在点P(x,y)P(x,y)的梯度(求偏导后,把PP点的值带入即可),记作:grad(x,y)grad(x,y)f(x,y)\nabla f(x,y)
推导:在式1中我们已经知道方向导数的计算,最终的结果也可看成两个向量相乘,即a={fx,fy}\vec{a} =\left \{ \frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\right \}与$ \vec{b} = \left {\cos \alpha, \cos \beta \right}相乘,我们设这两个向量之间的夹角为\theta$,那么方向导数的结果可以写成:
ab=ab×cosθ \vec{a} \cdot \vec{b}=|\vec{a}||\vec{b}|\times \cos \theta
我们假定向量根据梯度的概念我们知道梯度为方向导数的最大值,而b\vec b可以看成是单位向量,即模为1,也就是说,当θ=0\theta = 0的时候,方向导数取最大,也就得到梯度值,那么梯度就与b\vec{b}无关了,就是{fx,fy}\left \{ \frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\right \}.

2.2 泰勒展开式

本部分内容参见百度百科[2]。泰勒公式是将一个在x=x0x=x_0处具有 nn阶导数的函数f(x)f(x)利用关于(xx0)(x-x_0)nn次多项式逼近函数的方法。
定义:若函数f(x)f(x)在包含x0x_0的某个区间[a,b][a,b]上具有nn阶导数,且在开区间(a,b)(a,b)上具有(n+1)(n+1)阶导数,则对闭区间[a,b][a,b]上任意一点,成立下式:
f(x)=f(x0)0!+f(x)1!(xx0)++f(n)(x0)n!+Rn(x) f(x)=\frac{f(x_0)}{0!}+\frac{f^\prime(x)}{1!}(x-x_0)+\cdots +\frac{f^{(n)}(x_0)}{n!}+R_n(x)
其中,f(n)(x0)f^{(n)}(x_0)表示f(x,y)f(x,y)nn阶导数,等号后的多项式称为函数f(x)f(x)x0x_0处的泰勒展开式,剩余的Rn(x)R_n(x)是泰勒公式的余项,是(xx0)n(x-x_0)^n的高阶无穷小。

梯度下降算法

原理
假设目标函数为L(w,b)L(w,b),在求目标函数最小值时,为求的目标函数的一个凸函数,在最优化中被表示为:
minL(w,b) min L(w,b)
根据导数的定义,函数L(w,b)L(w,b)的导函数就是目标函数在变量w,bw,b上的变化率。在多元的情况下,目标函数在某点的梯度ΔL(w,b)=(Lw,Lb)\Delta L(w,b)=\left ( \frac{\partial L}{\partial w},\frac{\partial L}{\partial b} \right )是由各个分量的偏导数构成的向量,负梯度方向是L(w,b)L(w,b)减小最快的方向。
我们拿二维情况下函数f(x)f(x)的梯度如下图为例。

函数 f(x)的梯度
当需要求f(x)f(x)的最小值时,我们可以先任意选取一个函数的初始点x0x_0,让其沿着负梯度方向走,依次x1,x2,,xnx_1,x_2,\cdots, x_n,这样即可最快到达极小值。
推导
先将f(x)f(x)x=xkx=x_k处进行一阶泰勒展开,则有:
f(x)f(xk)+Δf(xk)(xxk) f(x) \approx f(x_k) + \Delta f(x_k)(x-x_k)
我们再取x=xk+1x=x_{k+1}则有:
f(xk+1)f(xk)+Δf(xk)(xk+1xk) f(x_{k+1}) \approx f(x_k) + \Delta f(x_k)(x_{k+1}-x_k)
将其整理如下:
f(xk+1)f(xk)Δf(xk)(xk+1xk) f(x_{k+1})-f(x_k) \approx \Delta f(x_k)(x_{k+1}-x_k)
我们要找最小值,也就是使得f(x)f(x)的值逐渐减小,那么则有f(xk+1)f(xk)f(x_{k+1}) \leq f(x_k)恒成立,结合上式即等价于要使f(xk)(xk+1xk)0f^\prime(x_k)(x_{k+1}-x_k) \leq 0恒成立。
其中xk+1xkx_{k+1}-x_k是一个微小的矢量,我们令xk+1xk=ηvx_{k+1}-x_k=\eta \mathbf vv\mathbf vxk+1xkx_{k+1}-x_k的单位向量(下一步要走的),η\eta是一个标量,也就是我们经常说的步长或者学习率
那么也就有vΔf(xk)0\mathbf v \Delta f(x_k) \leq 0,由于两者都是向量,要想使两个向量的数量积小于等于0,则有:
vΔf(xk)=vΔf(xk)cosα0 \mathbf v \Delta f(x_k) = |\mathbf v||\Delta f(x_k)|\cdot \cos \alpha \leq 0
则有:cosα0\cos \alpha \leq 0,两个向量的夹角为钝角或者垂直,当两者夹角为平角(180度)时,即前进方向和梯度方向恰好相反,数量积此时最小。那么v\mathbf v就是与Δf(x)\Delta f(x)反向的单位向量,则有:
v=Δf(xk)Δf(xk) \mathbf v= -\frac{\Delta f(x_k)}{|\Delta f(x_k)|}
进而有:
xk+1xk=ηv=η(Δf(xk)Δf(xk))=ηΔf(xk) x_{k+1} - x_k = \eta \mathbf v =\eta \left( - \frac{\Delta f(x_k)}{|\Delta f(x_k)|} \right) = - \eta ^\prime \Delta f(x_k)
其中η=ηΔf(xk)\eta^\prime= \frac{\eta}{|\Delta f(x_k)|}.
于是我们就得到了我们常用的梯度下降算法:
xk+1=xkλΔf(xk) x_{k+1} = x_k - \lambda \Delta f(x_k)
之类的形式了。
对于多变量的梯度下降算法的推导可以参见[3].

参考文献

  1. 百度词条:梯度 .https://baike.baidu.com/item/%E6%A2%AF%E5%BA%A6/13014729?fr=aladdin
  2. 百度词条:泰勒公式 https://baike.baidu.com/item/%E6%B3%B0%E5%8B%92%E5%85%AC%E5%BC%8F/7681487?fr=aladdin
  3. https://blog.csdn.net/weixin_42278173/article/details/81511646

个人订阅号

关注订阅号,快速获取人工智能,算法,数学,编程,工程开发知识!
AIAS编程有道
自然语言处理爱好者

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!