Gradient Descent 背后的数学原理

本文通过泰勒级数展开深入浅出地介绍了梯度下降算法的数学原理,详细推导了梯度下降公式的由来。

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


一 前言

   Gradient Descent 大家都耳熟能详,即使是刚接触机器学习不到一周的初学者也早已经听过了梯度下降的大名,让每个人解释什么是Gradient Descent,大家多多少少也能说出来,但是背后的数学推理相信大家很少见到,在这里小编就毛遂自荐,尽自己所能说一说Gradient Descent 的公式是如何推理出来的。在本文中梯度、局部最优、全剧最优、鞍点等等一些基本的知识就不说了,相信大家心中都有大致的轮廓。


二 泰勒级数展开 Talyor Series

   说梯度下降之前我们先来说一说泰勒级数,泰勒展开在微积分中我们是学过的。
   现假设有一个一元函数 h(x),该函数在 x = x 0 x = x_0 x=x0附近可无限微分的话,此时我们可以在该点对函数进行泰勒展开 (注意这个前提, x x x需要尽可能的接近 x 0 x_0 x0),展开的结果如下图所示:

在这里插入图片描述
   展开后,二阶及更高阶导的部分统称余项,记为: σ ( x − x 0 ) \sigma(x - x_0) σ(xx0) 余项是一个无穷小量,一般不考虑,所以我们直接写成: h ( x ) ≈ h ( x 0 ) + h ( x 0 ) ′ ( x − x 0 ) h(x) \approx h(x_0) + h(x_0)'(x - x_0) h(x)h(x0)+h(x0)(xx0)。从几何意义上来理解,泰勒公式是利用多项式函数来逼近原函数,由于多项式函数可以任意次求导,易于计算,且便于求解极值或者判断函数的性质。

   上面说的是一元函数的泰勒级数展开,其实多元函数的泰勒级数展开是一样的,示意图如下:
在这里插入图片描述
  上面举的是一个二元函数的例子,同样我们只保留到一阶偏导的部分,剩余的部分略去。这里再次强调该二元函数能够使用泰勒级数进行展开的前提,那就是(x, y) 需要在 ( x 0 , y 0 x_0, y_0 x0,y0)的附近一个很小的邻域内。


三 公式推导

   假设现在我们的损失函数有两个参数分别为 θ 1 \theta_1 θ1, θ 2 \theta_2 θ2,也就是说loss 函数可以写成 L ( θ 1 , θ 2 ) L(\theta_1, \theta_2) L(θ1,θ2) 的形式,在平面上画出loss 函数的等高线,如下图右侧所示,现在我们在等高线图中任意选择一个点(a, b) 作为初始点,以该点为圆心,以一个很小的长度为半径画圆,接下来我们要做的是在圆中选择一个点,从圆心走向这个点,从而使得loss下降,然后在以这个新的点为圆心画圆,不断重复之前的步骤,这样不断的前行,最终到达loss最低的点。
在这里插入图片描述
   这里的loss函数是一个二元函数,并且以(a, b)为原点,足够小的距离为半径画圆,满足泰勒展开的条件,因此我们在选定的 (a, b) 这个点将函数进行泰勒展开,公式如下
L ( θ ) ≈ L ( a , b ) + ∂ L ( a , b ) ∂ θ 1 ( θ 1 − a ) + ∂ L ( a , b ) ∂ θ 2 ( θ 2 − b ) L(\theta) \approx L(a, b) + \frac{\partial L(a, b)}{\partial \theta_1} (\theta_1 - a) + \frac{\partial L(a, b)}{\partial \theta_2} (\theta_2 - b) L(θ)L(a,b)+θ1L(a,b)(θ1a)+θ2L(a,b)(θ2b)

损失函数的泰勒展开
损失函数的泰勒展开

  上面的公式中很多都是常量,我们可以暂时用字母来表示:L(a, b) 表示在(a, b)的损失值,显然是一个常数,我们用 s 表示, ∂ L ( a , b ) ∂ θ 1 \frac{\partial L(a, b)}{\partial \theta_1} θ1L(a,b) 表示损失函数 L L L θ 1 \theta_1 θ1的偏导数在 (a, b) 点的取值, ∂ L ( a , b ) ∂ θ 2 \frac{\partial L(a, b)}{\partial \theta_2} θ2L(a,b) 表示损失函数 L L L θ 2 \theta_2 θ2的偏导数在 (a, b) 点的取值,这两个显然也是常数,我们分别用 u , v u, v u,v 表示。现在函数可以简化成下面的形式
L ( θ 1 , θ 2 ) ≈ s + u ( θ 1 − a ) + v ( θ 2 − b ) L(\theta_1, \theta_2) \approx s + u(\theta_1 - a) + v(\theta_2 - b) L(θ1,θ2)s+u(θ1a)+v(θ2b)

  问题也就转换为:在 ( θ 1 − a ) 2 (\theta_1 - a)^2 (θ1a)2 + ( θ 2 − b ) 2 (\theta_2 - b)^2 (θ2b)2 ⩽ d \leqslant d d 的圆内找到一组 θ 1 , θ 2 \theta_1, \theta_2 θ1,θ2,使得上面函数的值最小

  为了便于观察,我们进一步化简:令 Δ θ 1 = θ 1 − a , Δ θ 2 = θ 2 − b \Delta\theta_1 = \theta_1 - a, \Delta\theta_2 = \theta_2 - b Δθ1=θ1a,Δθ2=θ2b, 故 原式转换为: L ( θ 1 , θ 2 ) ≈ s + u Δ θ 1 + v Δ θ 2 L(\theta_1, \theta_2) \approx s + u\Delta\theta_1 + v\Delta\theta_2 L(θ1,θ2)s+uΔθ1+vΔθ2,我们要做的就是让 L ( θ 1 , θ 2 ) L(\theta_1, \theta_2) L(θ1,θ2)的值尽可能的小,其中s是一个常数,不考虑, u Δ θ 1 + v Δ θ 2 u\Delta\theta_1 + v\Delta\theta_2 uΔθ1+vΔθ2的值才是我们需要关注的。

  假设现在有两个向量a = (u, v),b = ( Δ θ 1 , Δ θ 2 \Delta\theta_1, \Delta\theta_2 Δθ1,Δθ2),不难发现,我们之前要算的 u Δ θ 1 + v Δ θ 2 u\Delta\theta_1 + v\Delta\theta_2 uΔθ1+vΔθ2的值,不就是这两个向量的内积吗!!!!,要使得这个内积尽可能的小,则向量b = ( Δ θ 1 , Δ θ 2 \Delta\theta_1, \Delta\theta_2 Δθ1,Δθ2)的方向就需要和向量a = (u, v)的方向相反,并且向量b的长度尽可能的长 (那就是圆的半径呀!)

   所以 [ Δ θ 1 , Δ θ 2 ] [\Delta\theta_1, \Delta\theta_2] [Δθ1,Δθ2] [ u , v ] [u, v] [u,v]之间就有如下图下方所示的关系 (latex写矩阵太麻烦了,就不写了,大家直接看下图吧),稍稍做一下变换就可以得到 [ θ 1 , θ 2 [ [\theta_1, \theta_2[ [θ1,θ2[ [ u , v ] [u, v] [u,v]之间的关系,其中 η \eta η是两个向量长度的比值。

在这里插入图片描述
   仔细观察上图中最下方 ( Δ θ 1 , Δ θ 2 ) (\Delta\theta_1, \Delta\theta_2) (Δθ1,Δθ2) ( u , v ) (u, v) (u,v)的公式,这里的(u, v)我们之前不是说过是常量,所以我们为了简便替换过来了吗?好,我们现在将原来的带入进来,得到如下结果:
在这里插入图片描述

  最终替换回来之后,我们惊奇的发现,这不就是我们之前看到的梯度下降公式的一般形式吗!!!! 惊不惊喜!!!! (见上图)但在得到这样的结果时,我们仍要保持冷静的头脑,需要知道这一切成立的前提:以(a, b)为原点画圆时,圆的半径需要足够的小,换句话说就是,Gradient Dsecent 时learning rate 要尽可能的小,只有这样,我们才能进行泰勒展开,也才有了后面的这些操作。如果loss 函数比较平滑的话,learning rate 大一点还没关系,但是如果loss 函数非常陡峭时,learning rate 的取值就需要很小心了。


四 结束语

  1. 本文中的所有图片均来自于台湾大学李宏毅教授 2020 machine learning 课程中的PPT。
  2. 小编目前毕竟还是本科生,若文章有问题,欢迎大家在评论区中指出。
  3. 文章编写不易,若对您有帮助,希望您可以点一个小小的赞。路漫漫其修远兮,吾将上下而求索,与君共勉 !!!
### 梯度下降算法背后数学原理 梯度下降是一种用于最小化损失函数的迭代优化算法,在机器学习领域广泛应用。其基本思想是从初始猜测出发,沿着负梯度的方向逐步调整参数值,直到达到局部或全局最小点。 #### 函数极小化的直观理解 对于给定的目标函数 \( f(\theta) \),其中 \( \theta \) 表示待求解的一组参数向量,梯度下降旨在找到使 \( f(\theta) \) 达到最小值的 \( \theta^* \)[^1]。假设存在一个连续可微分的成本函数,则可以通过计算该成本函数相对于各个参数的部分导数来获得梯度矢量: \[ g_i=\frac{\partial}{\partial \theta_{i}}f(\theta), i=0,\ldots,n-1 \] 这里 \( n \) 是参数的数量,\( g_i \) 则代表第 \( i \) 个维度上的偏导数值。整个过程可以被描述为沿最陡峭斜率方向前进的过程,即每次更新都朝着使得误差减少最快的方向迈进[^3]。 #### 迭代公式及其几何意义 具体来说,每一次迭代都会按照下面这个简单的规则修改权重: \[ \theta^{(t+1)} := \theta^{(t)}-\alpha\nabla_\theta J(\theta)| _{θ=θ(t)}, t = 0, ..., T-1 \] 这里的 \( α>0 \) 称作步长(也叫学习速率),它决定了每一步应该走多远;而 \( ∇_θJ(θ) \) 就是指上述提到过的梯度矢量。随着迭代次数增加 (\(T→∞\)) ,如果选择合适的步长并满足一定条件的话,最终能够收敛于某个稳定状态下的最优解附近[^2]。 #### 收敛性质分析 值得注意的是,并不是所有的目标函数都能保证通过这种方式一定能得到全局最优解。当面对复杂的非凸问题时,可能会陷入鞍点或是次优区域无法自拔。因此实际应用当中还需要结合其他策略比如引入动量项、自适应调节学习率等方式提高鲁棒性和效率。 ```python import numpy as np def gradient_descent(x_start, learning_rate, num_iterations): x = x_start for iteration in range(num_iterations): grad_at_x = compute_gradient(x) x -= learning_rate * grad_at_x return x def compute_gradient(x): # 假设这是一个简单二次方程作为例子 return 2*x - 4 # 使用实例 optimal_point = gradient_descent(-5, 0.1, 100) print(f"The optimal point found is {optimal_point}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值