梯度提升与梯度下降:区别、联系与完整原理解析

梯度提升与梯度下降:区别、联系与完整原理解析

1. 引言

在机器学习中,**梯度下降(Gradient Descent)梯度提升(Gradient Boosting)**是两个非常常见的概念。

它们的名称中都包含"梯度",因此初学者很容易产生以下疑问:

  • 梯度提升是不是梯度下降的一种?
  • 梯度提升是不是通过梯度下降训练模型?
  • 二者都在降低损失函数,它们有什么本质区别?
  • 为什么梯度提升树也会用到"负梯度"?
  • XGBoost 中的"Boosting"和神经网络中的"Gradient Descent"有什么关系?

实际上,这两个方法确实存在密切联系,但它们解决问题的层次并不相同。

可以先给出一个概括:

梯度下降是在参数空间中不断调整一个模型的参数,而梯度提升是在函数空间中不断增加新的弱学习器。

更直观地说:

  • 梯度下降解决的是:一个模型的参数应该怎样调整?
  • 梯度提升解决的是:应该怎样逐步增加多个模型,使组合模型越来越准确?

本文将从损失函数、参数空间、函数空间、残差拟合和具体计算示例等角度,完整解释梯度下降与梯度提升之间的区别和联系。


2. 什么是梯度

在理解梯度下降和梯度提升之前,首先需要理解"梯度"是什么。

假设一个函数为:

J(θ)J(\theta)J(θ)

其中:

  • JJJ 表示目标函数或损失函数;
  • θ\thetaθ 表示模型参数。

如果模型只有一个参数,那么梯度就是该函数对参数的一阶导数:

∂J(θ)∂θ\frac{\partial J(\theta)}{\partial \theta}∂θ∂J(θ)

如果模型包含多个参数:

θ=(θ1,θ2,⋯ ,θp)\boldsymbol{\theta}=(\theta_1,\theta_2,\cdots,\theta_p)θ=(θ1,θ2,⋯,θp)

那么梯度是由所有偏导数组成的向量:

∇θJ(θ)=∂J∂θ1,∂J∂θ2,⋯ ,∂J∂θpT\nabla_{\boldsymbol{\theta}}J(\boldsymbol{\theta})=\left\\frac{\\partial J}{\\partial\\theta_1},\\frac{\\partial J}{\\partial\\theta_2},\\cdots,\\frac{\\partial J}{\\partial\\theta_p}\\right^{\mathrm{T}}∇θJ(θ)=∂θ1∂J,∂θ2∂J,⋯,∂θp∂JT

梯度具有一个非常重要的几何意义:

梯度指向函数值增长最快的方向,负梯度指向函数值下降最快的方向。

因此,如果我们的目标是最小化损失函数,就可以沿着负梯度方向更新模型。

这正是梯度下降的基本思想,也是梯度提升与梯度下降产生联系的基础。


第一部分:梯度下降

3. 什么是梯度下降

梯度下降是一种数值优化算法

它的主要目标是:

通过不断调整模型参数,使损失函数逐渐减小。

假设模型为:

y^=f(x;θ)\hat{y}=f(\boldsymbol{x};\boldsymbol{\theta})y^=f(x;θ)

其中:

  • x\boldsymbol{x}x 是输入特征;
  • y^\hat{y}y^ 是预测结果;
  • θ\boldsymbol{\theta}θ 是模型参数。

为了衡量预测结果与真实结果之间的差异,需要定义损失函数:

J(θ)=1n∑i=1nL(yi,f(xi;θ))J(\boldsymbol{\theta})=\frac{1}{n}\sum_{i=1}^{n}L\left(y_i,f(\boldsymbol{x}_i;\boldsymbol{\theta})\right)J(θ)=n1i=1∑nL(yi,f(xi;θ))

梯度下降按照下面的公式更新参数:

θt+1=θ∗t−η∇∗θJ(θt)\boldsymbol{\theta}_{t+1}=\boldsymbol{\theta}*t-\eta\nabla*{\boldsymbol{\theta}}J(\boldsymbol{\theta}_t)θt+1=θ∗t−η∇∗θJ(θt)

其中:

  • ttt 表示当前迭代次数;
  • θt\boldsymbol{\theta}_tθt 表示当前参数;
  • η\etaη 表示学习率;
  • ∇θJ(θt)\nabla_{\boldsymbol{\theta}}J(\boldsymbol{\theta}_t)∇θJ(θt) 表示损失函数对参数的梯度。

4. 梯度下降到底在更新什么

梯度下降更新的是一个已经确定结构的模型内部的参数。

例如,一个一元线性回归模型为:

y^=wx+b\hat{y}=wx+by^=wx+b

这里需要学习的参数是:

θ=(w,b)\boldsymbol{\theta}=(w,b)θ=(w,b)

假设使用均方误差作为损失函数:

J(w,b)=1n∑i=1n(yi−(wxi+b))2J(w,b)=\frac{1}{n}\sum_{i=1}^{n}\left(y_i-(wx_i+b)\right)^2J(w,b)=n1i=1∑n(yi−(wxi+b))2

梯度下降分别计算损失函数对 www 和 bbb 的偏导数:

∂J∂w=−2n∑i=1nxi(yi−(wxi+b))\frac{\partial J}{\partial w}=-\frac{2}{n}\sum_{i=1}^{n}x_i\left(y_i-(wx_i+b)\right)∂w∂J=−n2i=1∑nxi(yi−(wxi+b))

∂J∂b=−2n∑i=1n(yi−(wxi+b))\frac{\partial J}{\partial b}=-\frac{2}{n}\sum_{i=1}^{n}\left(y_i-(wx_i+b)\right)∂b∂J=−n2i=1∑n(yi−(wxi+b))

之后按照负梯度方向更新参数:

wt+1=wt−η∂J∂ww_{t+1}=w_t-\eta\frac{\partial J}{\partial w}wt+1=wt−η∂w∂J

bt+1=bt−η∂J∂bb_{t+1}=b_t-\eta\frac{\partial J}{\partial b}bt+1=bt−η∂b∂J

因此,梯度下降的整个过程可以概括为:

text 复制代码
确定一个模型结构
        ↓
初始化模型参数
        ↓
计算预测结果
        ↓
计算损失函数
        ↓
计算损失函数对参数的梯度
        ↓
更新模型参数
        ↓
重复上述过程

这里始终只有一个线性回归模型,只是模型内部的 www 和 bbb 在不断变化。


5. 梯度下降的简单计算示例

考虑一个非常简单的目标函数:

J(w)=(w−3)2J(w)=(w-3)^2J(w)=(w−3)2

这个函数在 w=3w=3w=3 时取得最小值。

其导数为:

dJdw=2(w−3)\frac{\mathrm{d}J}{\mathrm{d}w}=2(w-3)dwdJ=2(w−3)

假设初始参数为:

w0=0w_0=0w0=0

学习率为:

η=0.1\eta=0.1η=0.1

第一次迭代时,梯度为:

dJdw∣w=0=2(0−3)=−6\frac{\mathrm{d}J}{\mathrm{d}w}\bigg|_{w=0}=2(0-3)=-6dwdJ w=0=2(0−3)=−6

更新参数:

w1=0−0.1×(−6)=0.6w_1=0-0.1\times(-6)=0.6w1=0−0.1×(−6)=0.6

第二次迭代时:

dJdw∣w=0.6=2(0.6−3)=−4.8\frac{\mathrm{d}J}{\mathrm{d}w}\bigg|_{w=0.6}=2(0.6-3)=-4.8dwdJ w=0.6=2(0.6−3)=−4.8

更新参数:

w2=0.6−0.1×(−4.8)=1.08w_2=0.6-0.1\times(-4.8)=1.08w2=0.6−0.1×(−4.8)=1.08

第三次迭代时:

w3=1.08−0.1×2(1.08−3)=1.464w_3=1.08-0.1\times2(1.08-3)=1.464w3=1.08−0.1×2(1.08−3)=1.464

可以看到,参数按照下面的方向逐渐移动:

text 复制代码
0 → 0.6 → 1.08 → 1.464 → ... → 3

在这个过程中:

  • 模型结构没有改变;
  • 参数 www 不断改变;
  • 损失函数逐渐减小;
  • 参数最终接近最优值 w=3w=3w=3。

6. 梯度下降的核心特点

梯度下降具有以下几个重要特点。

6.1 它是一种优化算法

梯度下降本身通常不是一个具体预测模型,而是用于求解模型参数的优化方法。

它可以用于训练:

  • 线性回归;
  • 逻辑回归;
  • 神经网络;
  • 矩阵分解模型;
  • 深度学习模型;
  • 其他可微分参数模型。

6.2 它在参数空间中搜索

对于模型:

f(x;θ)f(\boldsymbol{x};\boldsymbol{\theta})f(x;θ)

梯度下降要寻找的是一组最优参数:

θ∗=arg⁡min⁡θJ(θ)\boldsymbol{\theta}^{*}=\arg\min_{\boldsymbol{\theta}}J(\boldsymbol{\theta})θ∗=argθminJ(θ)

因此,梯度下降的搜索空间是参数空间。

例如,模型有两个参数 www 和 bbb,那么梯度下降就是在由 www 和 bbb 构成的二维参数空间中寻找最优点。

6.3 模型结构通常保持不变

在梯度下降过程中,模型参数不断变化,但模型结构通常保持不变。

例如,线性回归始终是:

y^=wx+b\hat{y}=wx+by^=wx+b

神经网络的层数和节点数量通常也不会因为一次梯度更新而改变,只是权重和偏置发生变化。


第二部分:梯度提升

7. 什么是提升方法

梯度提升属于集成学习中的提升方法。

提升方法的核心思想是:

按照顺序训练多个弱学习器,使后面的学习器重点纠正前面模型的错误。

假设有多个弱学习器:

h1(x),h2(x),⋯ ,hM(x)h_1(\boldsymbol{x}),h_2(\boldsymbol{x}),\cdots,h_M(\boldsymbol{x})h1(x),h2(x),⋯,hM(x)

最终模型由这些弱学习器相加得到:

FM(x)=F0(x)+∑m=1Mηhm(x)F_M(\boldsymbol{x})=F_0(\boldsymbol{x})+\sum_{m=1}^{M}\eta h_m(\boldsymbol{x})FM(x)=F0(x)+m=1∑Mηhm(x)

其中:

  • F0(x)F_0(\boldsymbol{x})F0(x) 是初始模型;
  • hm(x)h_m(\boldsymbol{x})hm(x) 是第 mmm 个新增的弱学习器;
  • η\etaη 是学习率;
  • MMM 是弱学习器数量。

在梯度提升树中,hm(x)h_m(\boldsymbol{x})hm(x) 通常是一棵深度较小的决策树。


8. 什么是梯度提升

梯度提升是一种加法模型构建方法

它的主要目标是:

每轮增加一个新的弱学习器,让新学习器拟合当前损失函数的负梯度,从而逐步降低整体模型的损失。

假设经过前 m−1m-1m−1 轮训练后,当前模型为:

Fm−1(x)F_{m-1}(\boldsymbol{x})Fm−1(x)

第 mmm 轮希望增加一个弱学习器:

Fm(x)=Fm−1(x)+ηhm(x)F_m(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})+\eta h_m(\boldsymbol{x})Fm(x)=Fm−1(x)+ηhm(x)

理想情况下,希望选择一个 hmh_mhm,使加入它之后整体损失最小:

hm=arg⁡min⁡h∑i=1nL(yi,Fm−1(xi)+h(xi))h_m=\arg\min_h\sum_{i=1}^{n}L\left(y_i,F_{m-1}(\boldsymbol{x}_i)+h(\boldsymbol{x}_i)\right)hm=arghmini=1∑nL(yi,Fm−1(xi)+h(xi))

但是,直接求解这个问题通常比较困难。

梯度提升采用了一种类似梯度下降的思想:计算损失函数关于当前预测值的负梯度。

第 mmm 轮中,第 iii 个样本对应的负梯度为:

rim=−∂L(yi,F(x∗i))∂F(x∗i)∗F=F∗m−1r_{im}=-\left\\frac{\\partial L(y_i,F(\\boldsymbol{x}\*i))}{\\partial F(\\boldsymbol{x}\*i)}\\right*{F=F*{m-1}}rim=−∂F(x∗i)∂L(yi,F(x∗i))∗F=F∗m−1

然后训练新的弱学习器去拟合这些负梯度:

hm(x∗i)≈r∗imh_m(\boldsymbol{x}*i)\approx r*{im}hm(x∗i)≈r∗im

最终更新组合模型:

Fm(x)=Fm−1(x)+ηhm(x)F_m(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})+\eta h_m(\boldsymbol{x})Fm(x)=Fm−1(x)+ηhm(x)

这就是梯度提升的核心过程。


9. 梯度提升到底在更新什么

梯度提升更新的不是某一个固定模型内部的参数,而是整个预测函数。

假设当前模型是:

F0(x)F_0(\boldsymbol{x})F0(x)

第一轮增加一个弱学习器:

F1(x)=F0(x)+ηh1(x)F_1(\boldsymbol{x})=F_0(\boldsymbol{x})+\eta h_1(\boldsymbol{x})F1(x)=F0(x)+ηh1(x)

第二轮继续增加弱学习器:

F2(x)=F1(x)+ηh2(x)F_2(\boldsymbol{x})=F_1(\boldsymbol{x})+\eta h_2(\boldsymbol{x})F2(x)=F1(x)+ηh2(x)

将其展开:

F2(x)=F0(x)+ηh1(x)+ηh2(x)F_2(\boldsymbol{x})=F_0(\boldsymbol{x})+\eta h_1(\boldsymbol{x})+\eta h_2(\boldsymbol{x})F2(x)=F0(x)+ηh1(x)+ηh2(x)

经过 MMM 轮以后:

FM(x)=F0(x)+η∑m=1Mhm(x)F_M(\boldsymbol{x})=F_0(\boldsymbol{x})+\eta\sum_{m=1}^{M}h_m(\boldsymbol{x})FM(x)=F0(x)+ηm=1∑Mhm(x)

因此,梯度提升是在不断向当前模型中添加新的函数。

它的训练过程可以概括为:

text 复制代码
建立初始模型
        ↓
计算当前预测结果
        ↓
计算损失函数对预测结果的负梯度
        ↓
训练一个新的弱学习器拟合负梯度
        ↓
将新学习器加入现有模型
        ↓
重新计算预测结果
        ↓
重复上述过程

第三部分:为什么梯度提升会拟合残差

10. 均方误差下的负梯度

梯度提升中经常会出现一句话:

后一棵树用于拟合前面模型的残差。

这句话在使用均方误差时是正确的,但它并不是梯度提升最一般的定义。

假设回归任务使用平方损失:

L(yi,F(xi))=12(yi−F(xi))2L(y_i,F(\boldsymbol{x}_i))=\frac{1}{2}\left(y_i-F(\boldsymbol{x}_i)\right)^2L(yi,F(xi))=21(yi−F(xi))2

对预测值 F(xi)F(\boldsymbol{x}_i)F(xi) 求偏导:

∂L∂F(xi)=F(xi)−yi\frac{\partial L}{\partial F(\boldsymbol{x}_i)}=F(\boldsymbol{x}_i)-y_i∂F(xi)∂L=F(xi)−yi

因此,负梯度为:

−∂L∂F(xi)=yi−F(xi)-\frac{\partial L}{\partial F(\boldsymbol{x}_i)}=y_i-F(\boldsymbol{x}_i)−∂F(xi)∂L=yi−F(xi)

而残差定义为:

ri=yi−y^ir_i=y_i-\hat{y}_iri=yi−y^i

因为当前预测值就是:

y^i=F(xi)\hat{y}_i=F(\boldsymbol{x}_i)y^i=F(xi)

所以:

−∂L∂F(xi)=ri-\frac{\partial L}{\partial F(\boldsymbol{x}_i)}=r_i−∂F(xi)∂L=ri

这说明:

在平方损失下,损失函数对预测值的负梯度恰好等于真实值与预测值之间的残差。

因此,新的决策树拟合残差,本质上就是在拟合当前损失函数的负梯度。


11. 拟合残差只是特殊情况

需要注意的是,只有在平方损失下,负梯度才直接等于残差。

对于其他损失函数,梯度提升拟合的是相应的负梯度或伪残差,而不一定是简单的:

yi−y^iy_i-\hat{y}_iyi−y^i

例如,对于二分类问题,可以使用逻辑损失。此时,每轮拟合的目标与当前预测概率和真实标签有关,而不再只是普通的数值残差。

因此,更准确的说法是:

梯度提升每轮拟合损失函数关于当前模型预测结果的负梯度。

而"拟合残差"是平方损失条件下的一种直观表达。


第四部分:梯度提升的计算示例

12. 一个简单的回归示例

假设有三个样本,其真实值分别为:

样本 真实值
x1x_1x1 10
x2x_2x2 20
x3x_3x3 30

使用均方误差作为损失函数。

12.1 建立初始模型

对于平方损失,初始模型通常取所有真实值的平均值:

F0(x)=10+20+303=20F_0(\boldsymbol{x})=\frac{10+20+30}{3}=20F0(x)=310+20+30=20

因此,初始模型对三个样本的预测都是:

样本 真实值 初始预测
x1x_1x1 10 20
x2x_2x2 20 20
x3x_3x3 30 20

12.2 计算第一轮负梯度

平方损失下,负梯度就是残差:

ri1=yi−F0(xi)r_{i1}=y_i-F_0(\boldsymbol{x}_i)ri1=yi−F0(xi)

因此:

r11=10−20=−10r_{11}=10-20=-10r11=10−20=−10

r21=20−20=0r_{21}=20-20=0r21=20−20=0

r31=30−20=10r_{31}=30-20=10r31=30−20=10

得到第一轮需要拟合的目标:

样本 第一轮负梯度
x1x_1x1 -10
x2x_2x2 0
x3x_3x3 10

12.3 训练第一棵弱学习器

现在训练一棵决策树 h1(x)h_1(\boldsymbol{x})h1(x),让它拟合上述负梯度。

假设第一棵树的输出为:

样本 h1(x)h_1(\boldsymbol{x})h1(x)
x1x_1x1 -8
x2x_2x2 1
x3x_3x3 9

假设学习率为:

η=0.5\eta=0.5η=0.5

更新模型:

F1(x)=F0(x)+0.5h1(x)F_1(\boldsymbol{x})=F_0(\boldsymbol{x})+0.5h_1(\boldsymbol{x})F1(x)=F0(x)+0.5h1(x)

因此,新预测值为:

F1(x1)=20+0.5×(−8)=16F_1(x_1)=20+0.5\times(-8)=16F1(x1)=20+0.5×(−8)=16

F1(x2)=20+0.5×1=20.5F_1(x_2)=20+0.5\times1=20.5F1(x2)=20+0.5×1=20.5

F1(x3)=20+0.5×9=24.5F_1(x_3)=20+0.5\times9=24.5F1(x3)=20+0.5×9=24.5

12.4 重新计算误差

更新后的残差为:

r12=10−16=−6r_{12}=10-16=-6r12=10−16=−6

r22=20−20.5=−0.5r_{22}=20-20.5=-0.5r22=20−20.5=−0.5

r32=30−24.5=5.5r_{32}=30-24.5=5.5r32=30−24.5=5.5

可以看到,相比初始残差:

text 复制代码
第一轮之前:-10,0,10
第一轮之后:-6,-0.5,5.5

整体误差已经减小。

12.5 继续训练下一棵树

第二棵树继续拟合新的负梯度:

h2(x∗i)≈r∗i2h_2(\boldsymbol{x}*i)\approx r*{i2}h2(x∗i)≈r∗i2

更新模型:

F2(x)=F1(x)+ηh2(x)F_2(\boldsymbol{x})=F_1(\boldsymbol{x})+\eta h_2(\boldsymbol{x})F2(x)=F1(x)+ηh2(x)

随着决策树不断加入,组合模型会逐渐逼近真实数据。


第五部分:梯度下降与梯度提升的联系

13. 二者都在最小化损失函数

梯度下降和梯度提升的共同目标都是:

min⁡L\min LminL

二者都希望通过迭代方式,让损失函数逐步减小。

梯度下降的更新形式为:

θt+1=θ∗t−η∇∗θJ(θt)\boldsymbol{\theta}_{t+1}=\boldsymbol{\theta}*t-\eta\nabla*{\boldsymbol{\theta}}J(\boldsymbol{\theta}_t)θt+1=θ∗t−η∇∗θJ(θt)

梯度提升的更新形式为:

Fm(x)=Fm−1(x)+ηhm(x)F_m(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})+\eta h_m(\boldsymbol{x})Fm(x)=Fm−1(x)+ηhm(x)

其中,新弱学习器近似负梯度方向:

hm(xi)≈−∂L(yi,F(x∗i))∂F(x∗i)∗F=F∗m−1h_m(\boldsymbol{x}_i)\approx-\left\\frac{\\partial L(y_i,F(\\boldsymbol{x}\*i))}{\\partial F(\\boldsymbol{x}\*i)}\\right*{F=F*{m-1}}hm(xi)≈−∂F(x∗i)∂L(yi,F(x∗i))∗F=F∗m−1

从形式上可以看到,二者都是:

text 复制代码
当前位置 + 学习率 × 下降方向

对于梯度下降:

text 复制代码
当前参数 + 学习率 × 参数空间中的负梯度

对于梯度提升:

text 复制代码
当前函数 + 学习率 × 函数空间中的近似负梯度

14. 二者都采用逐步迭代思想

梯度下降不会一次直接得到最优参数,而是进行多次小幅度更新。

梯度提升也不会一次建立一个非常复杂的模型,而是逐轮添加弱学习器。

二者都遵循下面的思想:

text 复制代码
先建立一个初始状态
        ↓
找到一个能够降低损失的方向
        ↓
沿着该方向前进一小步
        ↓
重新计算损失
        ↓
继续寻找新的下降方向

15. 二者都包含学习率

梯度下降中的学习率控制参数更新幅度:

θt+1=θt−η∇J(θt)\boldsymbol{\theta}_{t+1}=\boldsymbol{\theta}_t-\eta\nabla J(\boldsymbol{\theta}_t)θt+1=θt−η∇J(θt)

梯度提升中的学习率控制每棵新树对最终模型的贡献:

Fm(x)=Fm−1(x)+ηhm(x)F_m(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})+\eta h_m(\boldsymbol{x})Fm(x)=Fm−1(x)+ηhm(x)

学习率过大时:

  • 可能跨过最优位置;
  • 训练过程可能不稳定;
  • 容易出现过拟合或损失振荡。

学习率过小时:

  • 单次更新幅度较小;
  • 通常需要更多迭代次数;
  • 训练速度较慢;
  • 有时能够获得更好的泛化性能。

在梯度提升中,经常采用:

text 复制代码
较小的学习率 + 较多的弱学习器

例如:

text 复制代码
learning_rate = 0.05
n_estimators = 500

通常会比:

text 复制代码
learning_rate = 1.0
n_estimators = 20

更加稳定。


16. 梯度提升可以看作函数空间中的梯度下降

这是理解二者联系的关键。

传统梯度下降在参数空间中进行优化。

假设模型参数为:

θ=(θ1,θ2,⋯ ,θp)\boldsymbol{\theta}=(\theta_1,\theta_2,\cdots,\theta_p)θ=(θ1,θ2,⋯,θp)

梯度下降更新参数:

θt+1=θ∗t−η∇∗θJ\boldsymbol{\theta}_{t+1}=\boldsymbol{\theta}*t-\eta\nabla*{\boldsymbol{\theta}}Jθt+1=θ∗t−η∇∗θJ

而梯度提升不直接更新一个固定的参数向量,而是更新整个预测函数:

Fm=Fm−1+ηhmF_m=F_{m-1}+\eta h_mFm=Fm−1+ηhm

新学习器 hmh_mhm 近似表示损失函数在函数空间中的负梯度方向。

因此可以说:

梯度提升借鉴了梯度下降沿负梯度方向优化的思想,但它把优化对象从有限维参数扩展成了预测函数。

这也是"梯度提升"名称中"梯度"的来源。


第六部分:梯度下降与梯度提升的区别

17. 优化对象不同

这是二者最核心的区别。

梯度下降

梯度下降优化的是模型参数:

θ\boldsymbol{\theta}θ

例如:

  • 线性回归中的权重和偏置;
  • 逻辑回归中的回归系数;
  • 神经网络中的连接权重;
  • 深度学习模型中的卷积核参数。

梯度提升

梯度提升优化的是整体预测函数:

F(x)F(\boldsymbol{x})F(x)

它通过不断增加新的弱学习器来改进预测函数:

Fm(x)=Fm−1(x)+ηhm(x)F_m(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})+\eta h_m(\boldsymbol{x})Fm(x)=Fm−1(x)+ηhm(x)


18. 搜索空间不同

梯度下降通常在参数空间中搜索。

例如,线性回归模型:

y^=wx+b\hat{y}=wx+by^=wx+b

它需要在由 www 和 bbb 组成的参数空间中寻找最优点。

梯度提升则在函数空间中搜索。

每一轮并不是寻找某一个参数值,而是寻找一个新的函数:

hm(x)h_m(\boldsymbol{x})hm(x)

这个函数通常由一棵决策树表示。


19. 更新方式不同

梯度下降是修改已有模型的参数:

θt+1=θt−η∇J\boldsymbol{\theta}_{t+1}=\boldsymbol{\theta}_t-\eta\nabla Jθt+1=θt−η∇J

梯度提升是向已有模型中添加新的学习器:

Fm=Fm−1+ηhmF_m=F_{m-1}+\eta h_mFm=Fm−1+ηhm

因此可以用一句直观的话概括:

梯度下降是在修改原模型,梯度提升是在扩展原模型。


20. 模型数量不同

在普通梯度下降中,通常只有一个模型。

例如训练神经网络时:

text 复制代码
第1轮:更新同一个神经网络的参数
第2轮:继续更新同一个神经网络的参数
第3轮:继续更新同一个神经网络的参数

模型结构没有发生改变。

在梯度提升中,每一轮都会增加一个新的弱学习器:

text 复制代码
第1轮:初始模型 + 第1棵树
第2轮:初始模型 + 第1棵树 + 第2棵树
第3轮:初始模型 + 第1棵树 + 第2棵树 + 第3棵树

随着训练进行,模型中包含的决策树数量不断增加。


21. 梯度的求导对象不同

梯度下降通常计算损失函数对模型参数的梯度:

∇θJ(θ)\nabla_{\boldsymbol{\theta}}J(\boldsymbol{\theta})∇θJ(θ)

梯度提升计算损失函数对当前预测值的梯度:

∂L(yi,F(xi))∂F(xi)\frac{\partial L(y_i,F(\boldsymbol{x}_i))}{\partial F(\boldsymbol{x}_i)}∂F(xi)∂L(yi,F(xi))

因此,虽然二者都使用梯度,但梯度所针对的变量并不相同。


22. 对可微性的要求不同

梯度下降需要计算损失函数关于模型参数的梯度,因此模型训练过程通常需要能够对参数求导。

例如神经网络使用反向传播计算:

∂L∂w\frac{\partial L}{\partial w}∂w∂L

决策树的分裂过程通常不可直接使用普通梯度下降,因为树的结构选择是离散操作。

梯度提升并不要求对决策树的内部结构进行梯度求导。

它只需要:

  1. 计算损失函数关于预测结果的负梯度;
  2. 使用决策树拟合这些负梯度。

因此,梯度提升可以使用决策树作为基学习器,而不需要计算"损失函数对树分裂位置的导数"。


23. 应用场景不同

梯度下降常用于训练参数化模型,例如:

  • 线性回归;
  • 逻辑回归;
  • 感知机;
  • 神经网络;
  • 卷积神经网络;
  • Transformer;
  • 矩阵分解模型。

梯度提升常用于构建集成模型,例如:

  • Gradient Boosting Decision Tree;
  • Gradient Boosting Machine;
  • XGBoost;
  • LightGBM;
  • CatBoost。

24. 核心区别对照表

对比维度 梯度下降 梯度提升
英文名称 Gradient Descent Gradient Boosting
方法类型 数值优化算法 集成学习方法
主要目标 优化一个模型的参数 逐步构建多个弱学习器
优化对象 参数 θ\boldsymbol{\theta}θ 预测函数 F(x)F(\boldsymbol{x})F(x)
搜索空间 参数空间 函数空间
每轮更新 修改已有模型参数 增加一个新的弱学习器
梯度对象 损失对参数的梯度 损失对预测值的梯度
模型结构 通常保持不变 随迭代不断增加弱学习器
常见基模型 线性模型、神经网络 决策树
典型算法 SGD、Momentum、Adam GBDT、XGBoost、LightGBM、CatBoost
是否属于集成学习
是否需要多个模型 通常不需要 需要
是否使用学习率
最终结果 一组优化后的参数 多个弱学习器的加法组合

第七部分:一个形象的类比

25. 梯度下降:调整一名学生的方法

假设一名学生正在做一道数学题,但答案不正确。

老师检查后发现:

  • 计算速度太快;
  • 某个公式使用错误;
  • 中间步骤不够准确。

于是老师不断调整这名学生的解题方式。

这类似于梯度下降:

text 复制代码
始终是同一个学生
        ↓
不断调整他的解题参数
        ↓
让最终答案越来越准确

这里的学生相当于一个固定模型,解题习惯和方法参数相当于模型参数。


26. 梯度提升:组建一个纠错团队

梯度提升更像是在组建一个团队。

第一个学生先给出一个基础答案。

第二个学生不需要重新解决全部问题,而是专门纠正第一个学生的主要错误。

第三个学生继续纠正前两个学生仍然存在的误差。

最终答案由所有学生的结果组合而成:

F(x)=F0(x)+ηh1(x)+ηh2(x)+⋯+ηhM(x)F(\boldsymbol{x})=F_0(\boldsymbol{x})+\eta h_1(\boldsymbol{x})+\eta h_2(\boldsymbol{x})+\cdots+\eta h_M(\boldsymbol{x})F(x)=F0(x)+ηh1(x)+ηh2(x)+⋯+ηhM(x)

这类似于:

text 复制代码
第一个模型给出基础预测
        ↓
第二个模型修正第一个模型的误差
        ↓
第三个模型修正前两个模型剩余的误差
        ↓
所有模型共同构成最终预测

因此:

  • 梯度下降重点是调整同一个模型;
  • 梯度提升重点是不断加入新的纠错模型。

第八部分:梯度提升树是否使用梯度下降训练决策树

27. 一个常见误解

很多人会认为:

梯度提升树中的每棵决策树都是通过梯度下降训练的。

这种说法并不准确。

在梯度提升树中,梯度主要用于确定当前一轮应该拟合的目标,也就是负梯度或伪残差:

rim=−∂L(yi,F(x∗i))∂F(x∗i)∗F=F∗m−1r_{im}=-\left\\frac{\\partial L(y_i,F(\\boldsymbol{x}\*i))}{\\partial F(\\boldsymbol{x}\*i)}\\right*{F=F*{m-1}}rim=−∂F(x∗i)∂L(yi,F(x∗i))∗F=F∗m−1

之后,决策树使用自己的分裂规则去拟合这些目标。

例如,回归树通常通过寻找最优特征和分裂点,使节点内的平方误差最小:

min⁡j,s∑x∗i∈R1(j,s)(r∗im−c1)2+∑x∗i∈R2(j,s)(r∗im−c2)2\min_{j,s}\left\\sum_{\\boldsymbol{x}\*i\\in R_1(j,s)}(r\*{im}-c_1)\^2+\\sum_{\\boldsymbol{x}\*i\\in R_2(j,s)}(r\*{im}-c_2)\^2\\rightj,smin x∗i∈R1(j,s)∑(r∗im−c1)2+x∗i∈R2(j,s)∑(r∗im−c2)2

因此:

  • 梯度用于告诉新树"应该纠正什么";
  • 决策树算法负责决定"怎样划分特征空间来完成纠正";
  • 决策树的分裂结构通常不是通过普通梯度下降得到的。

第九部分:梯度下降能否出现在梯度提升内部

28. 二者不是互斥关系

虽然梯度下降和梯度提升是不同层次的方法,但它们可以同时出现在一个机器学习系统中。

例如,假设梯度提升使用神经网络作为弱学习器。

整体模型仍然采用梯度提升方式构建:

Fm(x)=Fm−1(x)+ηhm(x)F_m(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})+\eta h_m(\boldsymbol{x})Fm(x)=Fm−1(x)+ηhm(x)

但每一个神经网络弱学习器 hmh_mhm 内部可能通过梯度下降训练参数。

这时就形成了两层优化:

text 复制代码
外层:梯度提升决定新增哪个弱学习器
内层:梯度下降训练该弱学习器的参数

在常见的梯度提升树中,弱学习器是决策树,因此通常不会通过普通梯度下降优化树的分裂结构。


第十部分:XGBoost 与梯度下降的关系

29. XGBoost 属于梯度提升方法

XGBoost 的完整名称是:

text 复制代码
Extreme Gradient Boosting

它属于梯度提升树方法,而不是普通梯度下降算法。

XGBoost同样采用加法模型:

Ft(x)=Ft−1(x)+ft(x)F_t(\boldsymbol{x})=F_{t-1}(\boldsymbol{x})+f_t(\boldsymbol{x})Ft(x)=Ft−1(x)+ft(x)

其中,ftf_tft 是第 ttt 棵新增的决策树。

不过,XGBoost并不仅仅使用一阶梯度,还会对损失函数进行二阶泰勒展开:

L(t)≈∑i=1ngift(xi)+12hift2(xi)+Ω(ft)L^{(t)}\approx\sum_{i=1}^{n}\leftg_i f_t(\\boldsymbol{x}_i)+\\frac{1}{2}h_i f_t\^2(\\boldsymbol{x}_i)\\right+\Omega(f_t)L(t)≈i=1∑ngift(xi)+21hift2(xi)+Ω(ft)

其中:

gi=∂L(yi,y^i(t−1))∂y^i(t−1)g_i=\frac{\partial L(y_i,\hat{y}_i^{(t-1)})}{\partial\hat{y}_i^{(t-1)}}gi=∂y^i(t−1)∂L(yi,y^i(t−1))

hi=∂2L(yi,y^i(t−1))∂(y^i(t−1))2h_i=\frac{\partial^2 L(y_i,\hat{y}_i^{(t-1)})}{\partial(\hat{y}_i^{(t-1)})^2}hi=∂(y^i(t−1))2∂2L(yi,y^i(t−1))

这里:

  • gig_igi 是一阶梯度;
  • hih_ihi 是二阶梯度;
  • Ω(ft)\Omega(f_t)Ω(ft) 是树的复杂度正则项。

因此,XGBoost和梯度下降都使用导数信息,但二者仍然不是同一个算法。

XGBoost使用一阶和二阶导数来指导新树的建立,而梯度下降使用梯度直接更新模型参数。


第十一部分:伪代码对比

30. 梯度下降伪代码

text 复制代码
输入:训练数据、模型、学习率 η、迭代次数 T

初始化模型参数 θ

for t = 1 到 T:
    使用当前参数计算预测结果
    计算损失函数 J(θ)
    计算损失对参数的梯度 ∇J(θ)
    更新参数 θ = θ - η∇J(θ)

输出:最终参数 θ

这里每一次循环修改的是同一组参数。


31. 梯度提升伪代码

text 复制代码
输入:训练数据、损失函数、学习率 η、弱学习器数量 M

建立初始模型 F₀(x)

for m = 1 到 M:
    计算每个样本的负梯度
    训练弱学习器 hₘ(x) 拟合负梯度
    更新组合模型 Fₘ(x) = Fₘ₋₁(x) + ηhₘ(x)

输出:组合模型 Fₘ(x)

这里每一次循环都会增加一个新的弱学习器。


第十二部分:容易混淆的问题

32. 梯度提升是不是梯度下降的一种

严格来说,梯度提升不是传统意义上的梯度下降算法。

梯度下降是一类参数优化算法。

梯度提升是一类集成学习方法。

但是,从数学思想上看,梯度提升可以理解为将梯度下降从参数空间推广到了函数空间。

因此,更准确的表述是:

梯度提升借鉴了梯度下降沿负梯度方向降低损失的思想,但二者的优化对象和实现方式不同。


33. 梯度提升是不是每轮都在降低损失

理论上,每轮新增弱学习器的目标都是降低当前损失。

但实际训练中,是否能够在验证集上持续改善,还会受到以下因素影响:

  • 弱学习器拟合能力;
  • 学习率;
  • 树的深度;
  • 样本噪声;
  • 损失函数;
  • 正则化;
  • 训练轮数;
  • 过拟合。

训练集损失可能持续下降,但验证集损失可能在某个阶段后开始升高。

因此,梯度提升模型通常需要使用早停机制。


34. 梯度下降是否只能训练神经网络

不是。

梯度下降可以训练任何适合通过梯度优化参数的模型,例如:

  • 线性回归;
  • 逻辑回归;
  • 支持向量机的某些形式;
  • 神经网络;
  • 矩阵分解;
  • 概率模型;
  • 可微分物理模型。

神经网络只是梯度下降最常见的应用之一。


35. 梯度提升是否只能使用决策树

理论上不是。

梯度提升中的弱学习器可以是多种函数模型。

但是,实际应用中最常见的是浅层回归树,原因包括:

  • 决策树能够处理非线性关系;
  • 决策树能够自动学习特征交互;
  • 不要求输入特征进行标准化;
  • 能够处理连续特征和离散特征;
  • 每棵浅树都可以作为一个弱学习器;
  • 树模型容易拟合负梯度。

因此,人们通常所说的梯度提升模型,往往就是梯度提升决策树。


第十三部分:如何快速判断二者

36. 看更新对象

判断一个方法属于梯度下降还是梯度提升,最直接的方法是看每轮更新的对象。

如果每轮执行的是:

text 复制代码
修改权重、偏置或其他参数

那么通常属于梯度下降类优化。

如果每轮执行的是:

text 复制代码
训练一个新模型,并把它加入已有模型

那么通常属于梯度提升。


37. 看最终模型结构

如果最终得到的是一个模型和一组参数,例如:

y^=f(x;θ∗)\hat{y}=f(\boldsymbol{x};\boldsymbol{\theta}^{*})y^=f(x;θ∗)

通常对应梯度下降训练过程。

如果最终得到的是多个模型的加法组合:

FM(x)=F0(x)+∑m=1Mηhm(x)F_M(\boldsymbol{x})=F_0(\boldsymbol{x})+\sum_{m=1}^{M}\eta h_m(\boldsymbol{x})FM(x)=F0(x)+m=1∑Mηhm(x)

通常对应梯度提升过程。


第十四部分:综合总结

梯度下降与梯度提升都利用了负梯度能够降低损失函数的思想,但二者所处的层次不同。

梯度下降的核心是:

计算损失函数关于模型参数的梯度,并沿负梯度方向更新参数。

其更新公式为:

θt+1=θ∗t−η∇∗θJ(θt)\boldsymbol{\theta}_{t+1}=\boldsymbol{\theta}*t-\eta\nabla*{\boldsymbol{\theta}}J(\boldsymbol{\theta}_t)θt+1=θ∗t−η∇∗θJ(θt)

梯度提升的核心是:

计算损失函数关于当前预测结果的负梯度,并训练新的弱学习器拟合该负梯度。

其更新公式为:

Fm(x)=Fm−1(x)+ηhm(x)F_m(\boldsymbol{x})=F_{m-1}(\boldsymbol{x})+\eta h_m(\boldsymbol{x})Fm(x)=Fm−1(x)+ηhm(x)

二者最核心的区别可以浓缩为:

text 复制代码
梯度下降:在参数空间中移动,通过修改参数优化一个模型。
梯度提升:在函数空间中移动,通过增加弱学习器优化组合模型。

二者最核心的联系是:

text 复制代码
都通过迭代方式降低损失函数。
都使用负梯度作为改进方向。
都使用学习率控制每一步的更新幅度。
梯度提升可以看作函数空间中的梯度下降。

最后,可以用一句话记忆:

梯度下降是让一个模型不断改变自己,梯度提升是让一组模型不断增加新的纠错成员。

相关推荐
用户7783366132112 分钟前
serpbase + Cloudflare R2 边缘持久化实战
前端·人工智能
东方小月8 分钟前
从零开发一个 Coding Agent(三):EventStream 事件流通道设计与实现
前端·人工智能·后端
中微极客20 分钟前
降维算法75倍加速:从PCA到稀疏字典学习的工程实践
人工智能·学习·算法
代码青铜25 分钟前
三步给 Codex 接上一个真正的后端:无需写代码,让 AI 自动搭建完整应用
人工智能
文心快码BaiduComate1 小时前
从“提示词工程”到“技能工程”:Comate 创建Agent Skills 实战
人工智能
星栈2 小时前
MCP 从 stdio 迁到 SSE,踩了 5 个传输层坑
人工智能·后端·架构
林泽毅2 小时前
PyTRIO快速入门(二):Datum构建
人工智能·算法·产品
金斗潼关2 小时前
使用MLP神经网络模型预测质数
人工智能·深度学习·神经网络
吴佳浩2 小时前
一文讲透AI算力单位:TFLOPS、PFLOPS、TOPS、稀疏算力,到底怎么算、怎么比?
人工智能·ai编程·gpu
guoyuhan2 小时前
用 OpenAI SDK 一行代码接入国产大模型:DeepSeek/Qwen/GLM 实战指南
人工智能