梯度提升树(GBDT)原理与公式拆解

梯度提升树(Gradient Boosting Decision Tree,简称 GBDT)由 Friedman 提出,是集成学习领域的经典算法。在深度学习尚未兴起的年代,它几乎是结构化数据建模的首选方案,无论是金融风控、广告点击率预测,还是推荐系统排序等核心业务场景,都展现出稳定且卓越的性能。

即便如今深度学习广泛普及,许多互联网公司的核心业务依然高度依赖 GBDT 相关的模型体系。而且,想要掌握 XGBoost、LightGBM 等主流进阶算法,先吃透 GBDT 的核心原理会事半功倍,能更轻松理解后续算法的优化思路与设计逻辑。因此,GBDT 在当下依然具有极高的学习价值,值得每一位数据领域的学习者深入钻研。

1. 初步理解

GBDT 长什么样子?

GBDT 由一个初始策略 + 多个决策树组成,每个决策树叫做弱决策树或者弱学习器,整体叫做强学习器。


GBDT 如何做预测?

预测的过程是,初始策略(先验预测,训练后确定的固定常数)给出初始预测,再由多棵决策树逐步修正预测预测(后验预测,负责逐步修正),最终是将初始预测和不同弱学习器的输出相加。注意:每个弱决策树的输出还需要乘以一个系数,该系数叫做学习率。

学习率用于缩小每棵树的输出幅度,控制更新步长,防止模型因单棵树偏差而产生过大预测误差。学习率会参与到训练和预测的计算过程。


GBDT 如何进行训练?

模型先由初始预测(基准值)开始,之后每棵树依次拟合前一阶段的预测差距,逐步修正已有模型的偏差,直到达到预设的树数量或模型性能不再提升时停止训练。

模型训练的起点是初始预测(基准值),该值并非随机设定,而是由选定的损失函数推导得出。其核心目的是为后续迭代优化提供一个基础参照,尽可能降低初始偏差。例如在平方损失函数场景下,初始预测值会直接取所有样本标签的均值 , 这一选择本质是最小化平方损失的最优解,能让模型从一个相对合理的基准状态启动训练。

每一轮新树训练拟合的前一阶段模型的差距并非简单的真实值与预测值的差值,而是特指损失函数对预测值的负梯度,直观看起来,等价于真实值与预测值的差距,数学上是损失函数最小化的优化方向。

假设:两个样本,真实值分别是 86 和 98,学习率 0.1,我们模拟下训练过程:

通过这个例子大家就能理解:

  1. 训练模式:模型采用串行方式训练多棵决策树,只有当前一棵树训练完成后,才能开始训练下一棵。每一棵树都在前一棵树的基础上继续改进预测。
  2. 拟合目标:每棵新树都不是直接去拟合真实标签,而是拟合“前序模型的负梯度”——也就是当前预测结果与真实值之间的差距。换句话说,新树学的是“前面模型没学好的那部分”。
  3. 核心逻辑:模型通过逐棵树不断修正预测误差,使整体预测结果一步步逼近真实目标,从而让训练误差持续减小。
  4. 需要注意:随着树的数量增多,模型可能开始过度学习训练集中的噪声,从而导致过拟合。常用的防止手段包括限制树深度、控制学习率、使用早停等。

注意:无论 GBDT 用于回归还是分类,由于拟合目标都是负梯度(连续值),所以弱学习器都是回归决策树。

2. 目标函数

在 GBDT 的训练过程中,每新增一棵树时,我们主要关注两个核心问题:

  • 如何进行树的构建:每次划分节点时,目标是最大化训练损失的下降。由于在梯度提升框架下,每棵树都是在拟合当前模型的负梯度,因此我们可以使用平方误差增益(即类似回归树中使用的均方误差)来评估分裂效果,从而选择最优分裂点。
  • 如何确定树的输出:当节点划分完成后,需要为每个叶子节点确定输出值。需要注意的是,在 GBDT 中,叶子上的输出值并不是简单的所有样本的负梯度的平均值,它并不是最好的选择。

对于 GBDT 中的决策树而言,叶子节点的输出值不能是负梯度的简单平均。这是因为在单个决策树模型直接拟合目标值,因此输出取样本目标的均值即可最小化损失。

而在 GBDT 中,每棵树并不是直接拟合目标值,而是拟合当前模型预测的负梯度,用来逐步修正已有预测。如果此时简单取负梯度的均值作为叶子输出,当少数样本的梯度较大、而多数样本梯度较小时,会导致整体修正步长过大,使大部分样本的损失反而上升。因此,GBDT 中的决策树输出应该找到一个最优的输出值,而不是简单使用均值。

公式表示,所有训练样本的损失总和。

公式表示,模型的预测结果 \( \hat{y} \) 等于 \( m-1 \) 树的输出结果 + 当前树 \(f_{m}\)的输出结果。

这个损失函数包含了GBDT 完整的预测更新 + 残差拟合 + 损失优化联动逻辑,我们通过例子来深刻理解:

假设:目标值 100,初始预测 20,初始损失 6400,每棵新树聚焦拟合当前总预测与目标的差距(负梯度),目标是最大化总损失的下降幅度。

轮次拟合残差实际输出总预测更新当前损失损失下降幅度说明
第 1 棵树8030502500-3900损失大幅下降
第 2 棵树5010601600-900损失持续下降
第 3 棵树403090100-1500损失进一步下降

后续树循环拟合剩余残差,总预测逐步逼近目标值,总损失持续向 0 收敛。


我们的优化目标是,新增一棵树\(f_{m}\) 进一步降低损失。由于并不是随意构建一个新树就能降低损失,所以,对于新树,我们得知道该树如何输出(这个未知),以及如何构建才能降低损失(对于 GBDT 使用平方误差进行分裂构建树)。

3. 泰勒展开

由于 \( l \) 可能是任意复杂的非线性函数,并且我们要优化的 \( f_{m}(x) \) 是整个损失函数内部的一部分,直接对 \( f_{m}(x) \) 优化不现实。所以,我们需要使用泰勒二阶展开这个工具将损失函数近似成一个关于 \( f_{m}(x) \) 的二次函数,这样就能继续优化 \(f_{m}\)。

泰勒二阶展开是利用损失函数在某个已知点的一阶导和二阶导信息,去近似表示加入新树后损失表示。泰勒二阶展开公式如下:

  • \(a\) 当前已知位置
  • \(x\) 要看的目标点
  • \(x-a\) 偏移量
  • \(f(a)\) 当前函数值
  • \(f^{\prime}(a)\) 当前点的一阶导
  • \(f^{\prime\prime}(a)\) 当前点的二阶导

我们对损失函数在已知点 \( m-1 \) 位置进行泰勒二阶展开:

  • \( g_{i} \) 表示第 i 样本在损失函数上的一阶导值
  • \( h_{i} \) 表示第 i 样本在损失函数上的二阶导值
  • \( f_{m}(x_{i}) \) 表示样本 \( x_{i} \)在第 m 棵树的输出值

\( l(y_i, F_{m-1}(x_i)) \) 表示还没有加入新树时的损失,是常数项,可以去掉,我们就得到了一个关于 \( f_{m}(x_{i}) \) 的公式:

这个公式表示,如果新增第 \(m\) 棵 \(f_{m}\) 树时损失的下降幅度(新损失 – 旧损失),该值越小,下降幅度越大,从而让整体 GBDT 损失下降最多。

再具体一点:我们希望通过新增树,让每个样本的预测值能够更加精准,此时损失下降幅度总和。


现在的公式,是从样本的角度来统计损失的下降幅度,需要将其转换为从叶子节点角度的损失表示:

注意:公式中的 \( \gamma \) 表示当前正在构建的树的输出值(即:叶子节点的值)

我们将公式再简化一些:

这个公式表示,新增第\(m\)棵树时,所有叶子节点所覆盖样本的损失下降幅度之和。我们希望每个叶子节点贡献的下降幅度尽可能显著,使得总体损失尽可能下降。

4. 最优输出

为了使得每个叶子节点都能尽肯能下降损失,我们需要知道叶子节点的输出 \( \gamma \) 的最优值,对 \( \gamma \) 求导,并令导数等于 0。

  • 分子中的一阶导信息,它表示本轮对输出调整的步长
  • 分母中的二阶导信息,它用来动态调整本轮输出的步长

假设我们使用 log loss、square loss 损失函数,那么叶子节点的输出值公式为:

square loss

注意:\( (y_i – \hat{y}_i^{(m-1)}) \) 表示本轮样本的负梯度。

log loss

在 GBDT 中,如果叶子节点的输出值仅依据一阶导(负梯度)来计算,那么输出值的调整仅取决于叶子内所有样本一阶导的总和。一阶导越大,表示模型需要对预测值做大幅修正。但这种做法存在一个严重问题:模型只确定了调整方向和统一步长,却完全忽略了不同样本对调整幅度的敏感程度,本质上是一刀切的优化策略。

具体来说,叶子节点覆盖的样本通常处于不同的优化状态:

  • 部分样本对预测值的微调极为敏感,即使输出值变化一点,损失就会剧烈波动
  • 另一些样本对预测值调整不敏感,适度加大输出值也不会导致损失显著变化

如果使用统一步长调整,就可能出现顾此失彼的情况:

  • 对敏感样本而言,步长过大,会使损失暴涨
  • 对不敏感样本而言,步长合理,可以使损失下降

最终可能出现敏感样本的损失增幅超过不敏感样本的损失下降,导致整体损失不降反升。

因此,优化的关键在于:不仅要明确调整方向,还要判断调整幅度是否安全

这时,损失函数的二阶导就发挥作用了,它表示输出值变化对损失的影响程度:

  • 二阶导越大,说明该样本对输出值的微小变化非常敏感,承受能力弱
  • 二阶导越小,说明输出值调整后损失变化平缓,承受能力强

基于二阶导信息,可以对叶子输出进行修正:

  • 如果叶子内样本的总二阶导较大(整体承受能力弱),就适度减小输出值,使调整更加保守,保证损失平稳下降
  • 如果总二阶导较小(整体承受能力强),就可以加大输出值,加快模型拟合进度

因此,引入二阶导信息,可以使训练过程中的损失变化更加稳定,训练更加稳健。

未经允许不得转载:一亩三分地 » 梯度提升树(GBDT)原理与公式拆解
评论 (0)

8 + 9 =