上一篇我们看到,单棵决策树很容易过拟合,而 Bagging 通过"独立训练 + 投票"来降低方差。提升方法(Boosting) 走了另一条路:
串行地训练弱分类器,每一轮把上一轮做错的样本"加重",最后把所有弱分类器加权求和。
"弱分类器"指的是正确率只比随机猜稍好——比如一个决策树桩(stump),只做一次分裂。单独看它几乎没用,但 Schapire (1990) 证明了一个惊人的理论:
只要每个弱分类器的准确率 > 50%,用提升方法组合足够多轮后,训练误差可以指数级降到零。
这就是 PAC 学习框架下的"强可学习 ⇔ 弱可学习"等价定理。Boosting 给出了具体的构造性证明。
AdaBoost(Adaptive Boosting, Freund & Schapire 1997)是最经典的提升算法。给定训练集 {(xi,yi)}i=1N,yi∈{−1,+1}:
初始化: 所有样本等权 wi(1)=1/N。
第 m 轮:
- 用权重分布 w(m) 训练弱分类器 Gm(x)。
- 计算加权错误率:
em=i=1∑Nwi(m)⋅1[Gm(xi)=yi]
- 计算弱分类器权重:
αm=21lnem1−em
当 em<0.5 时 αm>0;错误率越低,权重越大。
- 更新样本权重:
wi(m+1)=Zmwi(m)⋅exp(−αmyiGm(xi))
其中 Zm 是归一化常数。分对的样本 yiGm(xi)=+1,权重乘以 e−αm(变小);分错的样本乘以 e+αm(变大)。
最终分类器:
H(x)=sign(m=1∑MαmGm(x))
关键直觉:错分样本权重增大 → 下一轮弱分类器被迫"关注"这些难例 → 新分类器专门修补旧的错误。
下面的可视化展示 AdaBoost 的迭代过程。每点击一次 "Add Stump",算法就找到当前权重下最优的决策树桩,并更新样本权重。注意观察:被错分的样本变得更大(权重更高),而正确分类的样本缩小。
点击 "Add Stump" 逐轮添加弱分类器。圆圈大小反映样本权重——被错分的样本权重更大。 黄色虚线是当前弱分类器,背景色是组合分类器的决策区域。
AdaBoost 最漂亮的理论结果是它的训练误差上界。设最终分类器的训练误差为 R^(H),则:
R^(H)≤m=1∏M2em(1−em)=m=1∏M1−4γm2
其中 γm=21−em 是第 m 轮比随机猜好多少。如果每轮 γm≥γ>0,则:
R^(H)≤(1−4γ2)M≤e−2γ2M
训练误差以指数速度衰减到零。只要每个弱分类器比随机好那么一点点(γ>0),堆够多轮就够了。
证明的关键在于:Zm=2em(1−em) 正好等于每轮的归一化因子,而训练误差 ≤∏Zm。
AdaBoost 的 αm 和权重更新规则看起来像"凑出来的"——背后有更深的统一解释。
前向分步加法模型(Forward Stagewise Additive Modeling) 考虑如下优化:
fmini=1∑NL(yi,f(xi)),f(x)=m=1∑Mαmb(x;γm)
其中 b(x;γm) 是基函数(弱学习器),L 是损失函数。直接优化所有 M 个 (αm,γm) 太难,前向分步的策略是:每轮只优化当前这一个 (αm,γm),固定已有的不动。
(αm,γm)=argα,γmini=1∑NL(yi,fm−1(xi)+αb(xi;γ))
当 L 取指数损失 L(y,f)=e−yf 时,前向分步恰好推出 AdaBoost 的所有公式。
具体地:第 m 步要最小化 ∑iwi(m)exp(−yiαGm(xi)),其中 wi(m)=e−yifm−1(xi)。对 α 求导令其为零,得到的正是 αm=21lnem1−em。
这揭示了 AdaBoost 的本质:它是指数损失函数下的前向分步加法模型的特例。
把前向分步的思路推广:如果损失函数不是指数损失(比如平方损失做回归、对数损失做分类),怎么办?
梯度提升(Gradient Boosting, Friedman 2001) 的核心想法:
每一轮不直接对样本加权,而是让新的弱学习器去拟合当前损失函数的负梯度。
设已有模型 fm−1,定义第 i 个样本的伪残差:
ri(m)=−∂f(xi)∂L(yi,f(xi))f=fm−1
- 平方损失:L=21(y−f)2,负梯度 =yi−fm−1(xi)——就是普通残差。
- 对数损失:负梯度是概率残差 yi−σ(fm−1(xi))。
第 m 轮:用一棵回归树 Tm 拟合伪残差 {ri(m)},然后更新:
fm(x)=fm−1(x)+η⋅Tm(x)
其中 η∈(0,1] 是学习率(shrinkage),用来控制每步的步长防止过拟合。
GBDT 与 AdaBoost 的联系:
| AdaBoost | GBDT |
|---|
| 损失函数 | 指数损失 | 任意可微损失 |
| 每轮拟合目标 | 加权分类 | 负梯度(伪残差) |
| 基学习器 | 分类器 | 回归树 |
| 更新方式 | 加权投票 | 加法模型 |
GBDT 是更一般的框架:把损失函数换成指数损失就退化回 AdaBoost。实际中 XGBoost、LightGBM、CatBoost 都是 GBDT 的高效工程实现,加了二阶近似(Newton step)、直方图加速、正则化等优化。