GBDT:梯度提升树与函数空间中的梯度下降
在集成学习的两大流派中,Boosting 的核心思想是串行训练多个弱学习器,让每一棵新树都集中纠正前面所有树留下的误差。上一篇文章我们提到,这个过程可以直观地理解为“拟合残差”。但这背后有一个容易被忽视的数学前提:只有当损失函数选用均方误差(MSE)时,“拟合残差”才严格成立。在更一般的场景下,我们需要一个更普适的框架,这就是梯度提升(Gradient Boosting)的出发点。
本文将系统梳理 GBDT(Gradient Boosting Decision Tree,梯度提升决策树)的数学原理、训练流程、在量化交易中的优势与局限,并深入解释一个初学者经常困惑的问题:模型更新时所说的“加到旧模型上”到底是什么意思。
1. 从残差到负梯度
Boosting 的原始思路可以概括为:每棵新树的目标不是直接预测原始标签,而是预测当前模型输出与真实值之间的差距,也就是残差。用公式表示:
$$r_i = y_i - F_{m-1}(x_i)$$
其中 $F_{m-1}$ 表示前 $m-1$ 棵树组合后的模型,$y_i$ 是样本 $i$ 的真实值。
这个思路在平方损失(MSE)下是完全自洽的。如果损失函数定义为:
$$L = \frac{1}{2}\sum_i (y_i - F(x_i))^2$$
那么对当前模型 $F$ 求导,可以得到:
$$\frac{\partial L}{\partial F(x_i)} = F(x_i) - y_i$$
负梯度方向就是:
$$-\frac{\partial L}{\partial F(x_i)} = y_i - F(x_i)$$
恰好等于残差。因此,在 MSE 下,“拟合残差”等价于“沿着负梯度方向更新模型”。
问题在于,量化交易中经常使用其他损失函数。例如分类任务使用对数损失(logistic loss),或者为了稳健性使用绝对误差损失(MAE)。在这些情况下,残差不再直接等于负梯度,原来的 Boosting 框架就需要扩展。
Jerome Friedman 在 2001 年提出的 GBDT 解决了这个问题:每一棵新树不再固定拟合残差,而是拟合当前损失函数关于模型输出的负梯度。负梯度指向损失函数下降最快的方向,因此无论损失函数是什么,只要可导,GBDT 都能工作。
一个直观的类比是“蒙眼下山”。假设你站在一座山的某个位置,目标是走到山谷的最低点。你看不到全局地形,只能通过脚底感知坡度。梯度指向坡面上升最快的方向,而负梯度指向下降最快的方向。每走一步,你都沿着当前最陡的下坡方向前进。GBDT 的每一棵新树,就相当于在当前模型所在的位置计算负梯度方向,然后沿着这个方向“迈出一步”。
2. GBDT 的训练流程
GBDT 的训练过程可以拆解为五个步骤,这也是 XGBoost 和 LightGBM 的共同基础。
步骤一:初始化模型。
给所有样本一个初始预测值。通常使用训练集标签的均值,例如全市场股票的平均收益率。这相当于在山腰上建立一个起点。
步骤二:计算负梯度。
根据当前模型的预测值,对每个样本计算损失函数的负梯度。这个值表示当前模型在该样本上“错得有多离谱”,以及下一步应该朝哪个方向、用多大力度修正。在 MSE 损失下,负梯度就是残差;在其他损失下,它是残差的一个推广。
步骤三:拟合负梯度。
将步骤二计算出的负梯度作为新的目标变量,用原始特征训练一棵回归树。这棵树的任务不再是预测原始标签,而是预测“负梯度”,即当前模型在每个样本上需要修正的量。
步骤四:更新模型。
将这棵新树的输出乘以一个学习率(learning rate,通常设为 0.01 到 0.1 之间),然后加到旧模型上:
$$F_m(x) = F_{m-1}(x) + \nu \cdot h_m(x)$$
其中 $h_m$ 是第 $m$ 棵树,$\nu$ 是学习率。学习率的作用是缩小每一步的步长,防止一步迈得过大导致震荡或过拟合。步长小意味着需要更多棵树,但通常能获得更好的泛化性能。
步骤五:重复迭代。
重复步骤二到四,直到达到预设的树的数量(例如 500 棵)或早停条件。最终模型是所有树的加权累加。
3. GBDT 在量化交易中的优势
在深度学习兴起之前,GBDT 是量化选股、风险预测和金融建模中最常用的模型之一。它在结构化表格数据上表现出色,主要优势体现在三个方面。
第一,自动实现高阶特征交叉。
传统线性模型(如多因子回归)只能捕捉特征与目标之间的线性关系。如果认为动量因子与波动率因子之间存在交互,必须手动构造交叉项,例如 $\text{动量} \times \text{波动率}$。随着交互阶数增加,特征工程的工作量呈指数增长。决策树天然具备高阶交互能力:根节点按波动率分裂,子节点按动量分裂,就自动学到了“低波动环境下高动量更有效”这类条件逻辑。GBDT 通过多棵树叠加,能够挖掘非常复杂的非线性关系,无需人工构造交互项。
第二,对特征尺度不敏感。
线性模型对特征量纲高度敏感,通常需要提前进行标准化(Z-score)。GBDT 基于特征的排序或分位数进行分裂,特征的绝对大小只影响切分点的位置,不影响树的结构。无论因子取值是 1 还是 100,只要相对大小关系不变,分裂结果一致。这省去了大量数据预处理的繁琐工作。
第三,内置缺失值处理能力。
金融数据经常存在缺失,例如股票停牌、数据源不完整。传统模型需要先填充缺失值,而 GBDT 在分裂时可以将缺失值自动归入增益更大的分支,不需要人工处理。这一特性提升了模型对真实数据质量的鲁棒性。
4. GBDT 的三大局限
尽管 GBDT 强大,但在大规模量化场景中,传统实现暴露出三个关键问题。
计算复杂度高。
训练每棵树时,需要在每个分裂节点遍历所有特征,并对每个特征的所有取值进行排序,逐一计算可能的切分点增益。当特征数和样本量达到千万级别时,单次训练可能需要数天,这在实际策略迭代中几乎不可接受。
缺乏正则化。
传统 GBDT 的目标函数只包含损失项,没有对树的复杂度进行约束。为了在训练集上进一步降低误差,树会持续生长,叶子节点不断增多,最终把噪声也记忆下来。这种过拟合在金融数据中尤为严重,因为金融信噪比极低。
对异常值敏感。
当使用平方损失时,误差被平方放大。假设 99 个样本的预测误差是 1%,但有一个样本因极端行情产生 50% 的误差。这个异常样本的平方误差会主导整个损失函数,模型为了迁就它而偏离对大多数样本的正确拟合,导致整体预测质量下降。
这些问题直接催生了后续的改进模型,我们将在下一篇文章中讨论 XGBoost 如何针对性地解决它们。
5. 深入加法模型:训练与预测中的“加”
初学者最容易困惑的一点是:GBDT 在训练时反复提到“将新树加到旧模型上”,这个“加”具体指什么?是否就是预测时将所有树的输出结果简单相加?答案是肯定的。为了理解这一点,需要区分两个不同的视角。
5.1 函数空间中的梯度下降
传统梯度下降(例如线性回归、神经网络的训练)更新的是参数向量。参数在当前梯度方向上移动一个步长:
$$\theta_{\text{new}} = \theta_{\text{old}} - \eta \cdot \nabla_\theta L$$
而 GBDT 中并没有一个固定的参数向量,模型本身是一组函数的累加。因此,GBDT 在函数空间中执行梯度下降。这里的“位置”是当前所有树的累加结果 $F_{m-1}$,每一步的“移动”就是添加一棵新树 $h_m$,步长是学习率 $\nu$。
所以:
$$F_m = F_{m-1} + \nu \cdot h_m$$
这个公式的每一步都是在函数空间中沿着负梯度方向前进。新树 $h_m$ 本身代表方向,学习率 $\nu$ 代表步长。
5.2 一个具体的数值例子
假设我们要预测某只股票明天的超额收益率。初始预测设为 0.0%。真实收益率为 2.0%。
第一轮:
当前预测 $F_0 = 0.0%$,残差为 $2.0%$。用因子训练第一棵树 $h_1$,该树对这只股票的输出为 1.5%。设定学习率 $\nu = 0.1$。更新模型:
$$F_1 = 0.0% + 0.1 \times 1.5% = 0.15%$$
注意,我们没有直接加 1.5%,而是乘了学习率。这是为了防止步子太大导致震荡。
第二轮:
当前预测 $F_1 = 0.15%$,新的残差为 $2.0% - 0.15% = 1.85%$。训练第二棵树 $h_2$,它对这只股票的输出为 1.0%。更新:
$$F_2 = 0.15% + 0.1 \times 1.0% = 0.25%$$
持续迭代:
每轮都计算新的负梯度,训练新树,乘以学习率后累加。最终预测 $F_M$ 是所有树输出的加权和。
5.3 预测阶段的计算
训练完成后,面对新的样本,GBDT 不再需要计算梯度或残差。预测过程就是:
- 将样本输入第 1 棵树,得到输出 $v_1$;
- 输入第 2 棵树,得到输出 $v_2$;
- 依次遍历所有树;
- 最终预测 $= \sum_{t=1}^M v_t$。
如果学习率已经在训练时乘入每棵树的叶子权重,预测时直接相加即可。在工程实现上,这就是几十到几百次独立的 if-else 条件判断和加法操作,不涉及矩阵乘法,因此预测速度非常快。这也是树模型在实盘推理中备受青睐的原因之一。
从上述两个阶段可以看出,训练时的“加”是函数空间中的梯度下降,预测时的“加”是模型输出值的直接累加。两者本质一致,只是关注点不同。训练时我们关心如何找到每棵新树,预测时我们只关心最终累加的结果。
学习率 $\nu$ 的存在是 Boosting 泛化能力的重要来源。如果每步都直接加上新树的完整输出($\nu=1$),模型容易在损失曲面上来回震荡,错过最小值点。较小的学习率虽然需要更多棵树才能收敛,但每一步更稳妥,最终模型通常对未见数据更友好。
6. 总结
GBDT 是 Boosting 思想的泛化版本:它不再局限于拟合残差,而是让每棵新树拟合当前损失函数的负梯度,从而适用于任意可导损失函数。在 MSE 下,负梯度恰好等于残差,因此残差拟合是 GBDT 的一个特例。
训练过程遵循加法模型:每次迭代根据当前模型的负梯度训练一棵回归树,再以学习率为步长将其累加到现有模型上。预测时,只需将所有树的输出求和,计算效率极高。
GBDT 在量化交易中具备自动特征交叉、对量纲不敏感、天然处理缺失值等优势,但也存在计算复杂、缺乏正则化、对异常值敏感等局限。理解这些优势和痛点,是进一步学习 XGBoost 和 LightGBM 优化思路的基础。
下一篇文章将分析 XGBoost 如何通过目标函数正则化、二阶梯度信息以及工程上的近似算法,将 GBDT 推向实用化的新高度。