AdaBoost通过关注自身错误来提升性能。它通过增加错误分类样本的权重来实现这一点,迫使序列中的下一个学习器更细致地关注这些样本。这种重新加权机制很有效,但它代表了一种解决错误修正问题的具体方法。梯度提升退后一步,重新审视了整个过程。它不是问“我们如何调整样本权重来修正错误?”,而是提出了一个更根本的问题:“我们如何通过顺序地向集成模型添加新模型来直接最小化给定的损失函数?”这改变了我们看待问题的角度,从一个特定算法转向了一个通用优化框架,这是一个很大的进步。新观点:用函数最小化损失其核心是,训练一个机器学习模型是一个优化问题。我们想要找到一个模型,我们称之为 $F(x)$,它能最小化损失函数 $L(y, F(x))$,该函数衡量我们的预测 $F(x)$ 和真实目标值 $y$ 之间的差异。提升算法以累加、分阶段的方式构建最终模型 $F(x)$。我们从一个简单的初始模型 $F_0(x)$ 开始,并迭代地添加新的弱学习器 $h_m(x)$ 来改进它:$$ F_m(x) = F_{m-1}(x) + h_m(x) $$任何提升算法的核心问题是,如何在每一步找到要添加的 最好 新弱学习器 $h_m(x)$。这正是梯度提升引入其主要创新之处。它将这个问题视为一种梯度下降形式,但不是在你可能熟悉的参数空间中。相反,它在 函数空间 中执行梯度下降。从参数更新到函数更新考虑标准梯度下降。为了最小化关于一组参数 $\theta$ 的损失函数 $L(\theta)$,我们计算梯度 $\nabla L$ 并向相反方向迈出小步:$$ \theta_{new} = \theta_{old} - \alpha \nabla L(\theta_{old}) $$梯度提升应用相同的逻辑。在每个阶段 $m$,我们有当前模型 $F_{m-1}(x)$。我们想找到一个新函数,即我们的弱学习器 $h_m(x)$,当它添加到 $F_{m-1}(x)$ 时,能尽可能地降低总损失。降低损失最直接的方法是将我们的新函数指向损失函数的负梯度方向。对于每个数据点 $i$,我们计算关于前一阶段预测 $F_{m-1}(x_i)$ 的损失函数的负梯度。这些被称为 伪残差:$$ r_{im} = - \left[ \frac{\partial L(y_i, F(x_i))}{\partial F(x_i)} \right]{F(x) = F{m-1}(x)} $$新的弱学习器 $h_m(x)$ 随后不是针对原始目标值 $y$ 进行训练,而是针对这些伪残差 $r_{im}$ 进行训练。实际上,弱学习器被训练来预测来自前一个模型的错误方向。将梯度与残差联系起来:一个具体例子这可能看起来很抽象,所以让我们用一个标准回归问题来具体说明。回归问题的一个常用损失函数是均方误差 (MSE),或者更精确地说,为了数学计算方便,是平方误差的一半:$$ L(y, F(x)) = \frac{1}{2} (y - F(x))^2 $$现在,我们来计算伪残差,方法是对这个损失函数关于模型的预测 $F(x)$ 求偏导:$$ \frac{\partial L}{\partial F(x)} = \frac{\partial}{\partial F(x)} \left[ \frac{1}{2} (y - F(x))^2 \right] = -(y - F(x)) $$因此负梯度是:$$ r = - \left( -(y - F(x)) \right) = y - F(x) $$这正是 残差:真实值与当前预测之间的差异。对于MSE损失,将新模型拟合到“负梯度”的抽象想法简化为非常直观的将新模型拟合到“剩余误差”的想法。这种联系使得梯度提升如此有能力。它提供了一个统一的数学框架,概括了误差拟合的想法。尽管AdaBoost使用特定的重新加权方案,但梯度提升对梯度的使用使我们能够插入任何可微分的损失函数,直接根据当前问题(无论是回归、分类还是排序)调整算法。digraph G { rankdir=TB; splines=ortho; node [shape=box, style="rounded,filled", fillcolor="#e9ecef", fontname="sans-serif", margin="0.2,0.1"]; edge [fontname="sans-serif", fontsize=10, color="#495057"]; subgraph cluster_0 { label = "AdaBoost"; bgcolor="#f8f9fa"; color="#ced4da"; style=rounded; A_start [label="初始模型\n(等权重)"]; A_train [label="训练弱学习器"]; A_eval [label="识别错误并\n增加样本权重"]; A_next [label="训练下一个学习器\n(在重新加权数据上)"]; A_start -> A_train; A_train -> A_eval; A_eval -> A_next [label="关注难处理的样本"]; A_eval -> A_train [style=invis]; // 用于布局 } subgraph cluster_1 { label = "梯度提升"; bgcolor="#f8f9fa"; color="#ced4da"; style=rounded; G_start [label="初始模型\n(例如,y的平均值)"]; G_grad [label="计算负梯度\n(伪残差)"]; G_train [label="训练弱学习器\n(在伪残差上)"]; G_update [label="更新模型预测"]; G_start -> G_grad; G_grad -> G_train [label="目标现在是梯度"]; G_train -> G_update; G_update -> G_grad [headport=e, tailport=e]; } }AdaBoost和梯度提升中顺序学习过程的比较。AdaBoost调整样本权重以关注错误,而梯度提升训练新模型来预测损失函数的梯度,从而概括了错误修正的想法。