在梯度提升框架中,模型是按顺序构建的:模型在梯度提升框架中是顺序构建的:这里,$F_{m-1}(x)$ 是经过 $m-1$ 轮提升后的模型,$h_m(x)$ 是一个新的基础学习器(通常是决策树),它被训练用于拟合上一阶段的残差误差(或梯度),而 $\nu$(在库中常表示为 eta 或 learning_rate)是收缩参数,通常是介于 0 和 1 之间的一个小数(例如 0.01,0.1)。乍一看,$\nu$ 似乎与标准梯度下降优化算法中使用的学习率相同。它在这里的作用类似,但作用范围是函数空间。收缩会调整添加到集成模型中每个新树的贡献。通过设置 $\nu < 1$,我们刻意减慢了学习过程。我们不是让每个新树 $h_m(x)$ 完全修正之前模型 $F_{m-1}(x)$ 的误差,而只是添加其预测值的一小部分(即 $\nu$ 乘以其预测值)。这为什么对正则化有益?减少单个树的影响: 一个小的 $\nu$ 会减小每个单个树的影响。这可以防止任何单个树(它可能捕捉到训练数据中特有的噪声或特定模式)对最终预测产生过大的影响。模型对单个基础学习器的特性变得不那么敏感。需要更多树: 减慢学习过程意味着,与使用 $\nu=1$ 训练的模型相比,通常需要更多的提升轮次(即更多的树,$M$)才能在训练数据上达到相似的拟合水平。通过平均提高泛化能力: 需要更多树具有一个积极的附带效果。最终预测 $F_M(x)$ 成为大量不同基础学习器的聚合。每棵树都专注于剩余的误差,通过组合许多略有不同的视角(由于 $\nu$ 的存在,每个视角都被赋予较轻的权重),模型能够更有效地捕捉潜在信号,同时平均掉噪声。这种由收缩促进的集成效应,使得模型在未见数据上表现出更好的泛化能力。可以将其视为在函数空间的优化路径上迈出更小、更谨慎的步伐。更大的步伐(高 $\nu$)可能迅速降低训练误差,但有过度拟合最佳函数或过度学习噪声的风险。更小的步伐(低 $\nu$)进展较慢,但允许模型逐渐优化其预测,整合来自多棵树的信息,从而得到一个更平滑、更具泛化能力的最终函数。这种正则化效果被认为是隐式的,因为收缩不会根据模型复杂度向损失函数添加显式惩罚项(如L1/L2正则化那样),也不会直接约束树的结构(如设置 max_depth)。相反,它修改了提升过程本身,固有地促进了依赖于许多弱学习器协作的解决方案。下图呈现了这一原理。请注意,较低的学习率 ($\nu = 0.1$) 导致训练集上的收敛速度较慢,但与较高的学习率 ($\nu = 0.8$) 相比,它获得了更好(更低)的验证误差,而后者会迅速过拟合。{"layout": {"xaxis": {"title": "提升轮次 (M)"}, "yaxis": {"title": "误差"}, "title": "收缩(学习率)对过拟合的影响", "legend": {"title": "图例"}, "template": "plotly_white"}, "data": [{"x": [1, 5, 10, 20, 30, 40, 50, 75, 100, 150, 200, 250, 300], "y": [0.6, 0.3, 0.15, 0.08, 0.05, 0.03, 0.02, 0.01, 0.008, 0.005, 0.004, 0.003, 0.0025], "mode": "lines+markers", "name": "训练误差 (nu=0.1)", "line": {"color": "#4263eb"}}, {"x": [1, 5, 10, 20, 30, 40, 50, 75, 100, 150, 200, 250, 300], "y": [0.6, 0.4, 0.3, 0.2, 0.18, 0.16, 0.15, 0.14, 0.135, 0.13, 0.128, 0.127, 0.126], "mode": "lines+markers", "name": "验证误差 (nu=0.1)", "line": {"color": "#74c0fc", "dash": "dash"}}, {"x": [1, 5, 10, 20, 30, 40, 50, 75, 100], "y": [0.5, 0.1, 0.03, 0.01, 0.005, 0.003, 0.002, 0.001, 0.0005], "mode": "lines+markers", "name": "训练误差 (nu=0.8)", "line": {"color": "#f03e3e"}}, {"x": [1, 5, 10, 20, 30, 40, 50, 75, 100], "y": [0.5, 0.25, 0.2, 0.18, 0.22, 0.28, 0.35, 0.45, 0.55], "mode": "lines+markers", "name": "验证误差 (nu=0.8)", "line": {"color": "#ffa8a8", "dash": "dash"}}]}使用高 ($\nu=0.8$) 和低 ($\nu=0.1$) 收缩率训练的模型的训练和验证误差曲线。较低的收缩率需要更多轮次,但会产生更好的验证表现,从而减轻过拟合。在实践中,收缩几乎总是被使用(通常使用远小于 1.0 的值)。它与提升轮次 ($M$) 的数量形成了一种基本的权衡关系。一种常见做法是将 $\nu$ 设置为一个较小的值(例如 0.01 到 0.1),然后使用验证集确定最佳的 $M$ 值,通常会采用早停法(本章后面会讨论)。虽然非常小的 $\nu$ 值会因为需要大量的 $M$ 而显著增加计算时间,但由此带来的泛化能力提升通常能够弥补这一成本。收缩与其他正则化技术(如树约束和子抽样)配合使用,以构建梯度提升模型。