梯度提升与梯度下降:区别、联系与完整原理解析
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;θ)
梯度下降要寻找的是一组最优参数:
θ∗=argminθ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=argminh∑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. 二者都在最小化损失函数
梯度下降和梯度提升的共同目标都是:
minL\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
决策树的分裂过程通常不可直接使用普通梯度下降,因为树的结构选择是离散操作。
梯度提升并不要求对决策树的内部结构进行梯度求导。
它只需要:
- 计算损失函数关于预测结果的负梯度;
- 使用决策树拟合这些负梯度。
因此,梯度提升可以使用决策树作为基学习器,而不需要计算"损失函数对树分裂位置的导数"。
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
之后,决策树使用自己的分裂规则去拟合这些目标。
例如,回归树通常通过寻找最优特征和分裂点,使节点内的平方误差最小:
minj,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
都通过迭代方式降低损失函数。
都使用负梯度作为改进方向。
都使用学习率控制每一步的更新幅度。
梯度提升可以看作函数空间中的梯度下降。
最后,可以用一句话记忆:
梯度下降是让一个模型不断改变自己,梯度提升是让一组模型不断增加新的纠错成员。