梯度下降算法详细解读

本文深入介绍了梯度下降算法,包括其生活中的类比——下山,以及数学上的导数、偏导数、方向导数和梯度的概念。梯度下降算法利用负梯度方向作为函数下降最快的方向来迭代优化损失函数,适用于机器学习模型的参数优化。文章还探讨了批量梯度下降、随机梯度下降和小批量梯度下降等不同策略的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 梯度下降算法概述

如果说在机器学习领域有哪个优化算法最广为认知,用途最广,非梯度下降算法莫属。在模型和决策都已经定义好了之后,我们要做的就是通过一个算法去最优化这个损失函数,也就是让损失函数最小化,其中最常用的一种方法就是梯度下降。

2. 生活实例

梯度下降算法最贴近生活的一个实例就是下山。假设我们在山上的某个位置,我们要如何走才能最快到达山底呢?答案很显然,沿着山腰最陡峭的方向向下走。具体方法步骤如下:

  1. 确定自己所在的地方
  2. 查看并找到四周最陡峭的方向
  3. 朝那个陡峭的方向下山一定距离(learning rate)
  4. 看是否到达山底,如果没有到达则回到1,否则到达5
  5. 到达山底,任务结束

在这里插入图片描述

3.梯度下降

梯度下降算法实际上和上面的爬山很类似了,我们可以把山体想象成一个三维空间平面,它就是我们要最优化的一个多元函数,我们的目的就是找到函数的最小值,即所谓的山底。上述的下山流程和梯度下降算法也是基本一致的,那个最陡峭的方向实际上就是函数的负梯度方向,因为梯度是函数变化最快的方向,沿着梯度向量的方向会使函数易于找到最大值,反之,沿负梯度方向也就能很快找到函数的最小值。

3.1 导数与偏导数

一般来说,导数是针对一元函数而言的,一元指的是函数只含有一个自变量,例如f(x)=x2f(x)=x^2f(x)=x2f(x)=lnxf(x)=lnxf(x)=lnx 等等函数。导数的几何意义是函数在该点的斜率,斜率越大,函数在该点的变化率越大,导函数则代表了函数沿x方向的变化率。
(x2)′=2x,(lnx)′=1x(x^2)'=2x,(lnx)'=\frac{1}{x}(x2)=2x,(lnx)=x1
偏导数一般用于多元函数(自变量个数>=2),对某个自变量求偏导时,把其他自变量看作是常数,单独对这一个自变量求导。偏导数反映的是函数沿各自自变量上正方向的变化率\color{red}{函数沿各自自变量上正方向的变化率}沿。设f(x,y)=x2y3f(x,y)=x^2y^3f(x,y)=x2y3,那么它的对应偏导数为:
∂f(x,y)∂x=2xy3,∂f(x,y)∂y=3x2y2\frac{\partial f(x,y)}{\partial x}=2xy^3,\frac{\partial f(x,y)}{\partial y}=3x^2y^2xf(x,y)=2xy3,yf(x,y)=3x2y2

3.2 方向导数和梯度

方向导数和梯度一般来说也都是针对多元函数而言的。

  • 方向导数
    方向导数一般会先选定一个方向l⃗\vec{l}l,设l⃗={cosα,cosβ}\vec{l}=\lbrace cos\alpha,cos\beta \rbracel={cosα,cosβ}为平面的一个单位向量,设z=f(x,y)z=f(x,y)z=f(x,y)(x0,y0)(x_0,y_0)(x0,y0)的某领域内有定义,若
    lim⁡t→0f(x0+tcosα,y0+tcosβ)−f(x0,y0)t∃\lim\limits_{t \rightarrow 0} \frac{f(x_0+tcos\alpha,y_0+tcos\beta)-f(x_0,y_0)}{t}\existst0limtf(x0+tcosα,y0+tcosβ)f(x0,y0)
    则该极限值就是f(x,y)f(x,y)f(x,y)(x0,y0)(x_0,y_0)(x0,y0)点沿l⃗\vec{l}l方向的导数。
    方向导数有三要素:1.函数。2.点。3.方向。\color{red}{1.函数。2.点。3.方向。}1.2.3.
    f(x,y)f(x,y)f(x,y)可微\color{red}{可微}∂f∂l⃗=fx′(x0,y0)⋅cosα+fy′(x0,y0)⋅cosβ\color{red}{\frac{\partial f}{\partial \vec{l}}=f_x'(x_0,y_0)\cdot cos\alpha+f_y'(x_0,y_0)\cdot cos\beta}lf=fx(x0,y0)cosα+fy(x0,y0)cosβ
    方向导数是偏导数的推广,偏导数是方向导数的特例。方向导数的几何意义表示函数在某个点沿某条直线方向的变化率\color{red}{函数在某个点沿某条直线方向的变化率}沿线

  • 梯度
    在微积分中,对多元函数的自变量求偏导数,求得的偏导数以向量的形式表示就是梯度。
    设二元函数f(x,y)f(x,y)f(x,y)在平面区域D内具有一阶连续偏导数,对任意一点P(x,y)P(x,y)P(x,y)都可以定义出一个向量{∂f∂x,∂f∂y}\lbrace\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\rbrace{xf,yf}=fx′(x0,y0)⋅i⃗+fy′(x0,y0)⋅j⃗=f_x'(x_0,y_0)\cdot \vec{i}+f_y'(x_0,y_0)\cdot \vec{j}=fx(x0,y0)i+fy(x0,y0)j,该函数就称为z=f(x,y)z=f(x,y)z=f(x,y)在点P(x,y)P(x,y)P(x,y)的梯度,记作gradf(x,y)\color{red}{gradf(x,y)}gradf(x,y)或者∇f(x,y)\color{red}{\nabla f(x,y)}f(x,y),因此有:
    ∇f(x,y)=gradf(x,y)={∂f∂x,∂f∂y}=fx′(x,y)⋅i⃗+fy′(x,y)⋅j⃗\color{red}{\nabla f(x,y)=gradf(x,y)=\lbrace\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\rbrace=f_x'(x,y)\cdot \vec{i}+f_y'(x,y)\cdot \vec{j}}f(x,y)=gradf(x,y)={xf,yf}=fx(x,y)i+fy(x,y)j
    其中∇\nabla称为(二维的)向量微分算子或者Nabla算子,注意:梯度gradf(x,y)是一个向量\color{red}{梯度gradf(x,y)是一个向量}gradf(x,y)

  • 梯度和方向导数的关系推导
    说了这么多,感觉还是很抽象,那么梯度和方向导数到底有什么关系呢?梯度有什么用呢?请看下面的推导:
    ∂f∂l⃗=fx′(x,y)⋅cosα+fy′(x,y)⋅cosβ={fx′(x,y),fy′(x,y)}⋅{cosα,cosβ}=gradf(x,y)⋅l⃗=∣gradf(x,y)∣⋅∣l⃗∣⋅cosθ=∣gradf(x,y)∣⋅cosθ\frac{\partial f}{\partial \vec{l}}=f_x'(x,y)\cdot cos\alpha+f_y'(x,y)\cdot cos\beta=\lbrace f_x'(x,y),f_y'(x,y) \rbrace \cdot \lbrace cos\alpha,cos\beta \rbrace =gradf(x,y) \cdot \vec{l}=\mid gradf(x,y) \mid \cdot \mid \vec{l} \mid \cdot cos\theta=\mid gradf(x,y) \mid \cdot cos\thetalf=fx(x,y)cosα+fy(x,y)cosβ={fx(x,y),fy(x,y)}{cosα,cosβ}=gradf(x,y)l=gradf(x,y)lcosθ=gradf(x,y)cosθ
    推导了半天,终于得到一个重要的关系(方向导数和梯度的关系\color{red}{方向导数和梯度的关系}):
    ∂f∂l⃗=∣gradf(x,y)∣⋅cosθ\color{red}{\frac{\partial f}{\partial \vec{l}}=\mid gradf(x,y) \mid \cdot cos\theta}lf=gradf(x,y)cosθ
    学过数学的我们都知道,θ=0\theta=0θ=0,即l⃗\vec{l}lgradf(x,y)gradf(x,y)gradf(x,y)方向一致时,z=f(x,y)z=f(x,y)z=f(x,y)沿l⃗\vec{l}l方向的方向导数最大,最大值为梯度的模。
    ∂f∂l⃗∣max=∣gradf(x,y)∣=(∂f∂x)2+(∂f∂y)2\color{red}{\frac{\partial f}{\partial \vec{l}} \mid _{max}=\mid gradf(x,y) \mid=\sqrt{(\frac{\partial f}{\partial x})^2+(\frac{\partial f}{\partial y})^2}}lfmax=gradf(x,y)=(xf)2+(yf)2
    ∂f∂l⃗∣min=−∣gradf(x,y)∣=−(∂f∂x)2+(∂f∂y)2\color{red}{\frac{\partial f}{\partial \vec{l}} \mid _{min}=-\mid gradf(x,y) \mid=-\sqrt{(\frac{\partial f}{\partial x})^2+(\frac{\partial f}{\partial y})^2}}lfmin=gradf(x,y)=(xf)2+(yf)2
    因此我们得到了:梯度方向上的方向导数为方向导数的最大值,f(x,y)f(x,y)f(x,y)增长最快,负梯度方向上的方向导数为方向导数的最小值,f(x,y)f(x,y)f(x,y)减小最快。

3.3 梯度下降算法

有了3.1和3.2的数学知识了,我们就可以学习梯度下降算法了!
学过统计学习方法的我们都知道,方法=模型+决策+算法\color{red}{方法=模型+决策+算法}=++,在模型和决策都已经确定的情况下,我们就剩下利用算法去最优化损失函数了,而梯度下降算法是一种最为常用的优化极小值算法。

  • 梯度下降算法步骤
    由于负梯度方向是函数下降最快的方向,于是我们利用梯度下降不断迭代计算模型的参数就可以使函数极小化,选取一个迭代步长(学习率),不断进项迭代,直至收敛即可。
    假设需要求f(x)=f(x1,x2,⋯ ,xn)f(x)=f(x_1,x_2,\cdots,x_n)f(x)=f(x1,x2,,xn)的最小值,步骤为:
  1. 选取一个初始值x(0)=[x1(0),⋯ ,xn(0)]x^{(0)}=[x_1^{(0)},\cdots,x_n^{(0)}]x(0)=[x1(0),,xn(0)],和一个初始值η>0\eta>0η>0(学习率)
  2. 迭代更新模型的每一个参数:x1(i+1)=x1(1)−η⋅∂f(x(i))∂x1x_1^{(i+1)}=x_1^{(1)}-\eta \cdot \frac{\partial f(x^{(i)})}{\partial x_1}x1(i+1)=x1(1)ηx1f(x(i))
    ⋯\cdots
    xn(i+1)=xn(1)−η⋅∂f(x(i))∂xnx_n^{(i+1)}=x_n^{(1)}-\eta \cdot \frac{\partial f(x^{(i)})}{\partial x_n}xn(i+1)=xn(1)ηxnf(x(i))
  3. 其中x(i)=[x1(i),⋯ ,xn(i)]x^{(i)}=[x_1^{(i)},\cdots,x_n^{(i)}]x(i)=[x1(i),,xn(i)],一旦达到收敛条件,就停止迭代

梯度下降算法中的学习率η\etaη的选取也很重要,它是每次梯度下降的一个步长,这个步长不能设置太小,更不能设置过大。设置太小可能会迭代速度过慢,到达不了最低点,设置太大容易迭代距离过大,错过了最低点。下图是不同的学习率随着迭代次数的不断增加的造成的损失值的图像
在这里插入图片描述

  • 梯度下降实例
    设函数f(x)=x12+25x22f(x)=x_1^2+25x_2^2f(x)=x12+25x22,下面来看看如何利用梯度下降算法去优化函数。
    1.首先设定初始值,x0=[0.50.5]x_0=\left[\begin{matrix}0.5\\0.5\end{matrix}\right]x0=[0.50.5],学习率η=0.01\eta=0.01η=0.01
    2.求梯度,∇f(x)=[∂f(x)∂x1∂f(x)∂x2]=[2x150x2]\nabla f(x)=\left[\begin{matrix}\frac{\partial f(x)}{\partial x_1}\\\frac{\partial f(x)}{\partial x_2}\end{matrix}\right]=\left[\begin{matrix}2x_1\\50x_2\end{matrix}\right]f(x)=[x1f(x)x2f(x)]=[2x150x2]
    3.求迭代初值时的梯度,g0=∇f(x)∣x=x0=[125]g_0=\nabla f(x)\mid _{x=x_0}=\left[\begin{matrix}1\\25\end{matrix}\right]g0=f(x)x=x0=[125]
    4.梯度下降第一次迭代,x1=x0−η⋅g0=[0.50.5]−0.01⋅[125]=[0.490.25]x_1=x_0-\eta \cdot g_0=\left[\begin{matrix}0.5\\0.5\end{matrix}\right]-0.01\cdot\left[\begin{matrix}1\\25\end{matrix}\right]=\left[\begin{matrix}0.49\\0.25\end{matrix}\right]x1=x0ηg0=[0.50.5]0.01[125]=[0.490.25]
    5.继续计算梯度值,g1=∇f(x)∣x=x1=[0.9812.5]g_1=\nabla f(x)\mid _{x=x_1}=\left[\begin{matrix}0.98\\12.5\end{matrix}\right]g1=f(x)x=x1=[0.9812.5]
    6.第二次迭代为:x2=x1−η⋅g1=[0.490.25]−0.01⋅[0.9812.5]=[0.48020.125]x_2=x_1-\eta \cdot g_1=\left[\begin{matrix}0.49\\0.25\end{matrix}\right]-0.01\cdot\left[\begin{matrix}0.98\\12.5\end{matrix}\right]=\left[\begin{matrix}0.4802\\0.125\end{matrix}\right]x2=x1ηg1=[0.490.25]0.01[0.9812.5]=[0.48020.125]
    7.剩下的就是慢慢迭代了,大家懂了如何计算就行了,不再继续演示了!

4. 梯度下降算法分类

  • 批量梯度下降(Batch Gradient Descent,BGD):在更新参数时都使用所有的样本来进行更新。

优点:全局最优解,能保证每一次更新权值,都能降低损失函数;易于并行实现。
缺点:当样本数目很多时,训练过程会很慢。

  • 随机梯度下降(Stochastic Gradient Descent,SGD):在更新参数时都使用一个样本来进行更新。每一次跟新参数都用一个样本,更新很多次。如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将参数迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次,这种方式计算复杂度太高。(上述演示的就是随机梯度下降)

优点:训练速度快;
缺点:准确度下降,并不是全局最优;不易于并行实现。从迭代的次数上来看,随机梯度下降法迭代的次数较多,在解空间的搜索过程看起来很盲目。噪音很多,使得它并不是每次迭代都向着整体最优化方向。

  • 小批量梯度下降法(Mini-batch Gradient Descen):在更新每一参数时都使用一部分样本来进行更新。为了克服上面两种方法的缺点,又同时兼顾两种方法的优点。

三种方法使用的情况:如果样本量比较小,采用批量梯度下降算法。如果样本太大,或者在线算法,使用随机梯度下降算法。在实际的一般情况下,采用小批量梯度下降算法。

谢谢你的观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值