5.1 解梯度下降法学习笔记

1.为什么需要梯度下降算法

如果我们抛开具体场景,仅从数学抽象的角度来看:每个模型都有自己的损失函数,不管是监督式学习还是非监督式学习。损失函数包含了若干个位置的模型参数,比如在多元线性回归中,损失函数: ( y − X b θ ) T ( X b θ ) (y-X_b\theta)^T(X_b\theta) (yXbθ)T(Xbθ) ,其中向量 θ \theta θ表示未知的模型参数,我们就是要找到使损失函数尽可能小的参数未知模型参数。

在学习简单线性回归时,我们使用最小二乘法来求损失函数的最小值,但是这只是一个特例。在绝大多数的情况下,损失函数是很复杂的(比如逻辑回归),根本无法得到参数估计值的表达式。因此需要一种对大多数函数都适用的方法。这就引出了“梯度算法”。

首先梯度下降(Gradient Descent, GD),不是一个机器学习算法,而是一种基于搜索的最优化方法。梯度下降(Gradient Descent, GD)优化算法,其作用是用来对原始模型的损失函数进行优化,以便寻找到最优的参数,使得损失函数的值最小。

要找到使损失函数最小化的参数,如果纯粹靠试错搜索,比如随机选择1000个值,依次作为某个参数的值,得到1000个损失值,选择其中那个让损失值最小的值,作为最优的参数值,那这样太笨了。我们需要更聪明的算法,从损失值出发,去更新参数,且要大幅降低计算次数。

梯度下降算法作为一个聪明很多的算法,抓住了参数与损失值之间的导数,也就是能够计算梯度(gradient),通过导数告诉我们此时此刻某参数应该朝什么方向,以怎样的速度运动,能安全高效降低损失值,朝最小损失值靠拢。

2.什么是梯度

简单地来说,多元函数的导数(derivative)就是梯度(gradient),分别对每个变量进行微分,然后用逗号分割开,梯度是用括号包括起来,说明梯度其实一个向量,我们说损失函数L的梯度为: ∇ L = ( ∂ L ∂ a + ∂ L ∂ b ) \nabla L=(\frac{\partial L}{\partial a}+\frac{\partial L}{\partial b}) L=(aL+bL)

我们知道导数就是变化率。梯度是向量,和参数维度一样。

假设,我们有一个二元函数 f ( x 1 , x 2 ) = x 1 2 + x 1 x 2 − 3 x 2 f(x_1,x_2)=x_1^2+x_1x_2-3x_2 f(x1,x2)=x12+x1x23x2。那么f的梯度为:
∇ L = ( ∂ L ∂ x 1 + ∂ L ∂ x 2 ) = ( 2 x 1 + x 2 , x 1 − 3 ) \nabla L=(\frac{\partial L}{\partial x_1}+\frac{\partial L}{\partial x_2})=(2x_1+x_2,x_1-3) L=(x1L+x2L)=(2x1+x2,x13)

例如在点(1,2),梯度∇f的取值为: ∇ f ( 1 , 2 ) = ( 2 + 2 , 1 − 3 ) = ( 4 , − 2 ) \nabla f(1,2)=(2+2,1-3)=(4,-2) f(1,2)=(2+2,13)=(4,2)

那么这个梯度有什么用呢?

在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向

梯度指向误差值增加最快的方向,导数为0(梯度为0向量)的点,就是优化问题的解。在上面的二元函数中,点(1,2)向着(4,2)的方向就是梯度方向 为了找到这个解,我们沿着梯度的反方向进行线性搜索,从而减少误差值。每次搜索的步长为某个特定的数值 η \eta η,直到梯度与0向量非常接近为止。更新的点 x 1 = x 0 − η x_1=x_0-\eta x1=x0η是所有点的x梯度, y 1 = y 0 − η y_1=y_0-\eta y1=y0η所有点的y梯度

3.理解梯度下降算法

很多求解最优化问题的方法,大多源自于模拟生活中的某个过程。比如模拟生物繁殖,得到遗传算法。模拟钢铁冶炼的冷却过程,得到退火算法。其实梯度下降算法就是模拟滚动,或者下山,在数学上可以通过函数的导数来达到这个模拟的效果。

梯度下降算法是一种思想,没有严格的定义。

3.1 场景假设

梯度下降就是从群山中山顶找一条最短的路走到山谷最低的地方。

既然是选择一个方向下山,那么这个方向怎么选?每次该怎么走?选方向在算法中是以随机方式给出的,这也是造成有时候走不到真正最低点的原因。如果选定了方向,以后每走一步,都是选择最陡的方向,直到最低点。

总结起来就一句话:随机选择一个方向,然后每次迈步都选择最陡的方向,直到这个方向上能达到的最低点。

梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:

一个人被困在山上,需要从山顶到山谷。但此时雾很大,看不清下山的路径。他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,随机选择一个方向,然后每次迈步都选择最陡的方向。然后每走一段距离,都反复采用同一个方法:如果发现脚下的路是下坡,就顺着最陡的方向走一步,如果发现脚下的路是上坡,就逆着方向走一步,最后就能成功的抵达山谷。

3.2 数学推导

从数学的角度出发,针对损失函数L,假设选取的初始点为 ( a 0 , b 0 ) (a_0,b_0) (a0,b0);现在将这个点稍微移动一点点,得到 ( a 1 , b 1 ) (a_1,b_1) (a1,b1)。那么根据泰勒展开式(多元函数的一阶展开式):
f ( x 1 , . . . , x n ) = f ( a 0 , . . . , a n ) + ∑ i = 1 n ∂ f ( a 1 , . . . , a n ) ∂ x i ( x i − a i ) + ο ( ∑ i ∣ x i − a i ∣ ) f(x_1,...,x_n)=f(a_0,...,a_n)+\sum_{i=1}^n \frac{\partial f(a_1,...,a_n)}{\partial x_i}(x_i-a_i)+\omicron(\sum_{i}|x_i-a_i|) f(x1,...,xn)=f(a0,...,an)+i=1nxif(a1,...,an)(xiai)+ο(ixiai)

设我们移动的“一点点”为 Δ L \Delta L ΔL ,则我们可以得到 Δ L = L ( a 1 , b 1 ) − L ( a 0 , b 0 ) \Delta L=L(a_1,b_1)-L(a_0,b_0) ΔL=L(a1,b1)L(a0,b0),将泰勒展开式代入其中,我们则得到:
Δ L = L ( a 1 , b 1 ) − L ( a 0 , b 0 ) ≈ ∂ L ∂ a Δ a + ∂ L ∂ a Δ b \Delta L=L(a_1,b_1)-L(a_0,b_0)\approx \frac{\partial L}{\partial a}\Delta a+\frac{\partial L}{\partial a}\Delta b ΔL=L(a1,b1)L(a0,b0)aLΔa+aLΔb

如果我们令移动的距离分别为: Δ a = − η ( ∂ L ∂ a ) \Delta a=-\eta(\frac{\partial L}{\partial a}) Δa=η(aL) Δ b = − η ( ∂ L ∂ b ) \Delta b=-\eta(\frac{\partial L}{\partial b}) Δb=η(bL), 其中规定 η > 0 \eta >0 η>0,则可以得到:
Δ L ≈ − η [ ( ∂ L ∂ a ) 2 + ( ∂ L ∂ b ) 2 ] ≤ 0 \Delta L\approx -\eta[(\frac{\partial L}{\partial a})^2+(\frac{\partial L}{\partial b})^2]\leq0 ΔLη[(aL)2+(bL)2]0

这就说明,我们如果按照规定的移动距离公式移动参数,那么损失函数的函数值始终是下降的,这样就达到了我们要求的“损失变小”的要求了。如果一直重复这种移动,则可以证明损失函数最终能够达到一个最小值。

那么我们就可以得到损失函数值(也就是下一步的落脚点)的迭代公式:
( a k + 1 , b k + 1 ) = ( a k + 1 − η ∂ L ∂ a , b k + 1 − η ∂ L ∂ b ) (a_{k+1},b_{k+1})=(a_{k+1}-\eta \frac{\partial L}{\partial a},b_{k+1}-\eta \frac{\partial L}{\partial b}) (ak+1,bk+1)=(ak+1ηaL,bk+1ηbL)

针对于上述公式,有一些常见的问题:

为什么要梯度要乘以一个负号?

我们已经知道:梯度的方向就是损失函数值在此点上升最快的方向,是损失增大的区域,而我们要使损失最小,因此就要逆着梯度方向走,自然就是负的梯度的方向,所以此处需要加上负号

关于参数 η \eta η:

我们已经知道,梯度对应的是下山的方向,而参数 η \eta η 对应的是步伐的长度。在学术上,我们称之为“学习率”(learning rate),是模型训练时的一个很重要的超参数,能直接影响算法的正确性和效率:

  • 首先,学习率 η \eta η不能太大。因此从数学角度上来说,一阶泰勒公式只是一个近似的公式,只有在学习率很小,也就是 Δ a , Δ b \Delta a, \Delta b Δa,Δb很小时才成立。并且从直观上来说,如果学习率 η \eta η太大,那么有可能会“迈过”最低点,从而发生“摇摆”的现象(不收敛),无法得到最低点
  • 其次,学习率 η \eta η又不能太小。如果太小,会导致每次迭代时,参数几乎不变化,收敛学习速度变慢,使得算法的效率降低,需要很长时间才能达到最低点。

3.3 致命问题

梯度算法有一个比较致命的问题:

从理论上,它只能保证达到局部最低点,而非全局最低点。在很多复杂函数中有很多极小值点,我们使用梯度下降法只能得到局部最优解,而不能得到全局最优解。那么对应的解决方案如下:首先随机产生多个初始参数集,即多组 a 0 , b 0 a_0,b_0 a0,b0;然后分别对每个初始参数集使用梯度下降法,直到函数值收敛于某个值;最后从这些值中找出最小值,这个找到的最小值被当作函数的最小值。当然这种方式不一定能找到全局最优解,但是起码能找到较好的。

对于梯度下降来说,初始点的位置,也是一个超参数。

总结

梯度算法有一个比较致命的问题:

从理论上,它只能保证达到局部最低点,而非全局最低点。在很多复杂函数中有很多极小值点,我们使用梯度下降法只能得到局部最优解,而不能得到全局最优解。那么对应的解决方案如下:首先随机产生多个初始参数集,即多组;然后分别对每个初始参数集使用梯度下降法,直到函数值收敛于某个值;最后从这些值中找出最小值,这个找到的最小值被当作函数的最小值。当然这种方式不一定能找到全局最优解,但是起码能找到较好的。

对于梯度下降来说,初始点的位置,也是一个超参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值