为了叠加地构建模型,使每个新组件都能纠正集成模型截至目前的误差,我们需要一个系统方法来确定进行何种修正。这就是优化技术发挥作用的地方,其中最重要的一种是梯度下降。尽管您可能在通过调整权重参数训练线性回归或神经网络等模型时接触过梯度下降,但它在梯度提升中的应用略有不同但相互关联。在看到它如何应用于提升算法之前,理解其核心机制很重要。目标:最小化损失监督学习的核心在于最小化损失函数,通常表示为 $L(y, F(x))$。此函数量化了真实目标值 ($y$) 与我们模型 ($F(x)$) 所做预测之间的差异。常见例子包括回归中的均方误差(MSE)或分类中的对数损失。我们的目标是找到一个模型 $F(x)$,使其在整个训练数据上的损失值尽可能小。直观理解:沿着坡度下降把损失函数想象成一片有山丘和山谷的地形,其中任意点的高度代表给定模型配置的损失值。我们想找到这片地形中的最低点,即损失函数的最小值。梯度下降提供了一个简单的迭代策略:从某个点(初始模型)开始。确定从当前点出发最陡峭的下降方向。沿着该方向迈出一小步。重复步骤2和3,直到无法再向下移动(我们已达到一个最小值,希望是全局最小值)。如何找到最陡峭的下降方向?微积分告诉我们,损失函数的梯度,表示为 $\nabla L$,指向最陡峭的上升方向。因此,要向下移动,我们只需沿着梯度的反方向移动,即沿着 $-\nabla L$。更新规则在优化模型参数 $\theta$ 时,第 $t$ 次迭代的基本梯度下降更新规则是:$$ \theta_{t+1} = \theta_t - \eta \nabla L(\theta_t) $$让我们分解理解一下:$\theta_t$: 当前迭代中的模型参数集合。$\nabla L(\theta_t)$: 损失函数关于参数 $\theta$ 的梯度,在当前值 $\theta_t$ 处求得。该向量指示了改变参数以最快速度增加损失的方向。$\eta$: 学习率,一个小的正标量。这个超参数控制着我们在负梯度方向上迈出步长的大小。$\theta_{t+1}$: 下一次迭代的更新参数集合。该过程重复进行,迭代调整参数以逐步降低损失。学习率 ($\eta$)学习率 $\eta$ 的选择对算法性能很重要:如果 $\eta$ 过大: 我们可能会越过最小值,可能导致损失剧烈波动甚至增加,从而导致发散。如果 $\eta$ 过小: 向最小值收敛会非常缓慢,需要多次迭代和大量计算时间。找到合适的学习率通常需要实验和调优。在梯度提升中,这个学习率通常被称为收缩率,它在控制学习过程和充当一种正则化形式方面发挥双重作用,我们稍后会进行说明。{"layout": {"title": "梯度下降中学习率的影响", "xaxis": {"title": "参数值"}, "yaxis": {"title": "损失"}, "legend": {"traceorder": "reversed"}, "width": 600, "height": 400}, "data": [{"x": [-3, -2, -1, 0, 1, 2, 3, 4, 5], "y": [9, 4, 1, 0, 1, 4, 9, 16, 25], "mode": "lines", "name": "损失函数 (L = x^2)", "line": {"color": "#adb5bd"}}, {"x": [4, 3.2, 2.56, 2.048, 1.638, 1.311, 1.048, 0.839, 0.671, 0.537], "y": [16, 10.24, 6.55, 4.19, 2.68, 1.72, 1.10, 0.70, 0.45, 0.28], "mode": "markers+lines", "name": "合适的 \u03b7 (例如,0.2)", "marker": {"color": "#40c057", "size": 7}, "line": {"dash": "dot", "color": "#40c057"}}, {"x": [4, 3.92, 3.84, 3.76, 3.68, 3.61, 3.54, 3.47, 3.40, 3.33], "y": [16, 15.37, 14.75, 14.14, 13.54, 12.96, 12.53, 12.04, 11.56, 11.09], "mode": "markers+lines", "name": "较小的 \u03b7 (例如,0.02)", "marker": {"color": "#339af0", "size": 7}, "line": {"dash": "dot", "color": "#339af0"}}, {"x": [4, -2, 1, -0.5, 0.25], "y": [16, 4, 1, 0.25, 0.0625], "mode": "markers+lines", "name": "较大的 \u03b7 (例如,0.75) - 越过最小值", "marker": {"color": "#ff922b", "size": 7}, "line": {"dash": "dot", "color": "#ff922b"}}, {"x": [4, -4, 4, -4, 4], "y": [16, 16, 16, 16, 16], "mode": "markers+lines", "name": "过大的 \u03b7 (例如,1.0) - 发散", "marker": {"color": "#f03e3e", "size": 7}, "line": {"dash": "dot", "color": "#f03e3e"}}]}一个简化的1D示例 ($L=x^2$) 展示了不同的学习率 ($\eta$) 如何影响梯度下降从 $x=4$ 开始所走的步长。目标是达到 $x=0$。合适的学习率能有效收敛,较小的学习率收敛缓慢,较大的学习率会越过最小值,而过大的学习率会导致发散。尽管基本更新规则使用在整个数据集上计算的梯度(批量梯度下降),但存在变体。随机梯度下降(SGD) 基于单个数据点计算梯度,而小批量梯度下降使用数据的一个小部分。这些方法的计算成本可能更低,有时有助于逃离浅层局部最小值,尽管标准的GBM通常在整个数据集上计算梯度,除非明确使用了随机子采样。函数空间中的梯度下降那么,这与叠加地构建树的集成模型有何关联呢?梯度提升不是优化一组固定的参数 $\theta$,而是在函数空间中进行优化。我们从一个初始简单模型开始(例如,回归中目标值的均值)。然后在每次迭代 $m$ 中,我们希望找到一个新函数 $h_m(x)$(我们的基本学习器,通常是决策树)将其添加到当前集成 $F_{m-1}(x)$ 中,以便整体损失降低:$$ F_m(x) = F_{m-1}(x) + \eta h_m(x) $$梯度提升在此处使用了梯度下降的思想:它计算损失函数 $L(y, F(x))$ 相对于当前模型预测 $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)} $$这些负梯度 $r_{im}$ 通常被称为伪残差,代表了在函数空间中,给定当前集成模型的预测,损失对于每个数据点下降最快的“方向”。算法随后拟合新的基本学习器 $h_m(x)$ 以近似这些伪残差。本质上,我们正在使用梯度下降来指导集成模型的序列构建,告诉我们下一个树应该侧重于纠正哪些误差(由损失的负梯度定义)。将提升算法视为函数空间中的梯度下降,这是贯穿本课程所讨论算法的核心思想。我们将在下一章中推导通用的梯度提升机算法时,进一步使其规范化。目前,重要的收获是梯度下降提供了优化机制,通过添加基本学习器来修正剩余误差,正如损失函数的梯度所指明的那样,从而迭代改进集成模型。