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

1.前言

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

2.预备知识

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

2.1梯度

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

2.2 泰勒展开式

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

梯度下降算法

原理
假设目标函数为 L ( w , b ) L(w,b) ,在求目标函数最小值时,为求的目标函数的一个凸函数,在最优化中被表示为:
m i n L ( w , b ) min L(w,b)
根据导数的定义,函数 L ( w , b ) L(w,b) 的导函数就是目标函数在变量 w , b w,b 上的变化率。在多元的情况下,目标函数在某点的梯度 Δ L ( w , b ) = ( L w , L b ) \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) 的最小值时,我们可以先任意选取一个函数的初始点 x 0 x_0 ,让其沿着负梯度方向走,依次 x 1 , x 2 , , x n x_1,x_2,\cdots, x_n ,这样即可最快到达极小值。
推导
先将 f ( x ) f(x) x = x k x=x_k 处进行一阶泰勒展开,则有:
f ( x ) f ( x k ) + Δ f ( x k ) ( x x k ) f(x) \approx f(x_k) + \Delta f(x_k)(x-x_k)
我们再取 x = x k + 1 x=x_{k+1} 则有:
f ( x k + 1 ) f ( x k ) + Δ f ( x k ) ( x k + 1 x k ) f(x_{k+1}) \approx f(x_k) + \Delta f(x_k)(x_{k+1}-x_k)
将其整理如下:
f ( x k + 1 ) f ( x k ) Δ f ( x k ) ( x k + 1 x k ) f(x_{k+1})-f(x_k) \approx \Delta f(x_k)(x_{k+1}-x_k)
我们要找最小值,也就是使得 f ( x ) f(x) 的值逐渐减小,那么则有 f ( x k + 1 ) f ( x k ) f(x_{k+1}) \leq f(x_k) 恒成立,结合上式即等价于要使 f ( x k ) ( x k + 1 x k ) 0 f^\prime(x_k)(x_{k+1}-x_k) \leq 0 恒成立。
其中 x k + 1 x k x_{k+1}-x_k 是一个微小的矢量,我们令 x k + 1 x k = η v x_{k+1}-x_k=\eta \mathbf v v \mathbf v x k + 1 x k x_{k+1}-x_k 的单位向量(下一步要走的), η \eta 是一个标量,也就是我们经常说的步长或者学习率
那么也就有 v Δ f ( x k ) 0 \mathbf v \Delta f(x_k) \leq 0 ,由于两者都是向量,要想使两个向量的数量积小于等于0,则有:
v Δ f ( x k ) = v Δ f ( x k ) 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 ( x k ) Δ f ( x k ) \mathbf v= -\frac{\Delta f(x_k)}{|\Delta f(x_k)|}
进而有:
x k + 1 x k = η v = η ( Δ f ( x k ) Δ f ( x k ) ) = η Δ f ( x k ) 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 ( x k ) \eta^\prime= \frac{\eta}{|\Delta f(x_k)|} .
于是我们就得到了我们常用的梯度下降算法:
x k + 1 = x k λ Δ f ( x k ) 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编程有道
自然语言处理爱好者

发布了150 篇原创文章 · 获赞 220 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/meiqi0538/article/details/103483283