基于树的集成方法:梯度提升决策树(GBDT)的数学推导、目标函数构建与优化过程
1. 题目描述
梯度提升决策树(Gradient Boosting Decision Tree, GBDT)是一种基于加法模型(Additive Model)和前向分步算法(Forward Stagewise Algorithm)的集成学习方法。它通过迭代地构建一系列决策树(通常是回归树),每一棵树都在学习前一棵树预测的残差(即梯度方向),最终将所有树的预测结果加权求和,得到最终预测。GBDT 因其高精度、可解释性强和对非线性关系的优秀建模能力,广泛应用于回归、分类和排序任务。本题将详细讲解 GBDT 的数学原理、目标函数构建、优化方法(梯度下降在函数空间的视角)以及其实现的关键步骤。
2. 解题过程
我们将 GBDT 的推导分为以下几个步骤:
2.1 问题形式化
假设训练数据集为 \(D = \{(\mathbf{x}_i, y_i)\}_{i=1}^n\),其中 \(\mathbf{x}_i \in \mathbb{R}^d\) 是特征向量,\(y_i \in \mathbb{R}\) 是标签(回归任务为例)。
GBDT 的目标是学习一个函数 \(F(\mathbf{x})\),使得损失函数 \(L(y, F(\mathbf{x}))\) 最小化。
模型采用加法形式:
\[F(\mathbf{x}) = \sum_{m=1}^M f_m(\mathbf{x}), \quad f_m \in \mathcal{F} \]
其中 \(M\) 是树的总数,\(f_m\) 是第 \(m\) 棵回归树,\(\mathcal{F}\) 是所有可能的回归树空间。
2.2 目标函数与优化策略
GBDT 采用前向分步算法,逐步添加树模型,每步添加的树旨在最小化当前模型的损失。
在第 \(m\) 步,已有模型 \(F_{m-1}(\mathbf{x})\),我们需要找到一棵新树 \(f_m\) 使得:
\[f_m = \arg\min_{f \in \mathcal{F}} \sum_{i=1}^n L\big(y_i, F_{m-1}(\mathbf{x}_i) + f(\mathbf{x}_i)\big) \]
直接优化这个目标很困难,因为 \(f\) 是树结构。GBDT 采用梯度下降的思路,但梯度是在函数空间中定义的。
关键步骤:
- 计算当前模型 \(F_{m-1}\) 在每一个样本点上的负梯度(即伪残差):
\[r_{im} = -\frac{\partial L(y_i, F(\mathbf{x}_i))}{\partial F(\mathbf{x}_i)}\bigg|_{F=F_{m-1}} \]
例如,对于平方损失 \(L(y, F) = \frac{1}{2}(y - F)^2\),负梯度为 \(r_{im} = y_i - F_{m-1}(\mathbf{x}_i)\),即残差。
-
用一棵回归树去拟合这些负梯度 \(\{(\mathbf{x}_i, r_{im})\}_{i=1}^n\)。这相当于在函数空间中进行梯度下降,每一步的方向由一棵树决定。
-
找到最优的叶节点输出值。假设第 \(m\) 棵树有 \(J\) 个叶节点,每个叶节点 \(R_{jm}\) 包含若干样本,我们需要为每个叶节点找一个输出值 \(w_{jm}\),使得损失最小:
\[w_{jm} = \arg\min_{w} \sum_{\mathbf{x}_i \in R_{jm}} L\big(y_i, F_{m-1}(\mathbf{x}_i) + w\big) \]
2.3 利用泰勒展开近似目标函数
为了更高效地求解叶节点输出值,GBDT 通常对损失函数进行二阶泰勒展开(类似于 XGBoost,但 GBDT 传统实现常用一阶梯度,现代优化如 XGBoost 和 LightGBM 引入了二阶信息)。
展开点选为 \(F_{m-1}(\mathbf{x}_i)\):
\[L(y_i, F_{m-1} + f) \approx L(y_i, F_{m-1}) + g_{im} f(\mathbf{x}_i) + \frac{1}{2} h_{im} f^2(\mathbf{x}_i) \]
其中:
\[g_{im} = \frac{\partial L(y_i, F)}{\partial F}\bigg|_{F=F_{m-1}}, \quad h_{im} = \frac{\partial^2 L(y_i, F)}{\partial F^2}\bigg|_{F=F_{m-1}} \]
这里 \(g_{im}\) 是一阶梯度,\(h_{im}\) 是二阶梯度(Hessian)。
在叶节点 \(R_{jm}\) 上,如果输出值为常数 \(w_j\),则损失近似为:
\[\tilde{L}_j = \sum_{i \in R_{jm}} \left[ L(y_i, F_{m-1}) + g_{im} w_j + \frac{1}{2} h_{im} w_j^2 \right] \]
对 \(w_j\) 求导并令导数为零,得到最优叶节点输出值:
\[w_j^* = -\frac{\sum_{i \in R_{jm}} g_{im}}{\sum_{i \in R_{jm}} h_{im}} \]
代入平方损失时,\(g_{im} = F_{m-1}(\mathbf{x}_i) - y_i\),\(h_{im} = 1\),则 \(w_j^*\) 就是该叶节点中所有样本残差的平均值。
2.4 树的生成与分裂准则
在拟合负梯度时,需要构建回归树。树的分裂通常采用贪心算法,选择特征和切分点使得分裂后的损失减少最大。
损失减少量(即增益)可计算为:
\[\text{Gain} = \frac{1}{2} \left[ \frac{(\sum_{i \in I_L} g_i)^2}{\sum_{i \in I_L} h_i + \lambda} + \frac{(\sum_{i \in I_R} g_i)^2}{\sum_{i \in I_R} h_i + \lambda} - \frac{(\sum_{i \in I} g_i)^2}{\sum_{i \in I} h_i + \lambda} \right] - \gamma \]
其中 \(I\) 是当前节点样本集,\(I_L, I_R\) 是分裂后的左右子节点样本集,\(\lambda\) 是正则化系数(控制叶节点输出值幅度),\(\gamma\) 是分裂带来的复杂度惩罚。这个公式是 XGBoost 引入的,但 GBDT 传统版本中通常只用一阶梯度信息,分裂准则基于平方误差减少。
2.5 学习率与正则化
GBDT 通过学习率(步长)\(\nu\)(通常 \(0 < \nu \leq 1\))控制每棵树的贡献,防止过拟合:
\[F_m(\mathbf{x}) = F_{m-1}(\mathbf{x}) + \nu \cdot f_m(\mathbf{x}) \]
此外,还可以通过限制树的最大深度、叶节点最小样本数、子采样(样本采样或特征采样)等实现正则化。
2.6 算法步骤总结
- 初始化模型:通常用常数初始化,例如 \(F_0(\mathbf{x}) = \arg\min_\gamma \sum_{i=1}^n L(y_i, \gamma)\)。
- 对于 \(m = 1\) 到 \(M\)(M 为树的总数):
a. 计算负梯度(伪残差):\(r_{im} = -\frac{\partial L(y_i, F)}{\partial F}\big|_{F=F_{m-1}}\)。
b. 用回归树拟合 \(\{(\mathbf{x}_i, r_{im})\}\),生成第 \(m\) 棵树的结构(叶节点区域 \(R_{jm}\))。
c. 对每个叶节点 \(j\),计算最优输出值 \(w_{jm}\)。
d. 更新模型:\(F_m(\mathbf{x}) = F_{m-1}(\mathbf{x}) + \nu \cdot \sum_{j=1}^J w_{jm} \cdot \mathbb{I}(\mathbf{x} \in R_{jm})\)。 - 输出最终模型 \(F_M(\mathbf{x})\)。
3. 关键点与扩展
- 梯度视角:GBDT 可以理解为在函数空间中进行梯度下降,每一步的“梯度方向”由一棵回归树拟合给出。
- 损失函数灵活性:只要损失函数可微,GBDT 可适用于多种任务(如回归用平方损失,分类用对数损失,排序用 pairwise 损失)。
- 与随机森林的区别:随机森林是 Bagging 思想,树之间独立;GBDT 是 Boosting 思想,树之间顺序生成,每棵树纠正前一棵树的残差。
- 优化扩展:XGBoost 和 LightGBM 是 GBDT 的高效实现,引入了二阶泰勒展开、正则化、直方图算法等优化。
通过以上步骤,GBDT 能够逐步降低偏差,构建强大的预测模型,同时通过学习率、子采样等技巧控制过拟合。