前向分步算法与加法模型(Additive Model)的构建与求解
题目描述
本题目将讲解一种重要的机器学习建模与优化框架:前向分步算法 及其所构建的加法模型。加法模型(也称为加性模型)是将多个基本模型(通常称为“基学习器”)的预测结果线性相加,以构成最终预测的模型。其数学形式为:
f(x) = β₀ + β₁ * b(x; γ₁) + β₂ * b(x; γ₂) + ... + β_M * b(x; γ_M)
其中,b(x; γ_m) 是第 m 个基学习器,γ_m 是该基学习器的参数,β_m 是该基学习器的系数(权重),β₀ 是初始预测(如全局均值)。
我们的目标是:给定训练数据集 D = {(x_i, y_i)} 和指定的损失函数 L(y, f(x)),如何高效地学习出所有基学习器的参数 {γ_m} 和对应的系数 {β_m},使得总体的经验风险最小化?
这是一个复杂的全局优化问题。前向分步算法 通过一种贪心、逐次、分阶段的策略,将这一复杂的联合优化问题,分解为一系列简单的、顺序的子问题,从而实现对加法模型的逼近求解。梯度提升(Gradient Boosting)正是前向分步算法在特定损失函数(平方损失)下的一个特例,但本题目将聚焦于更一般化的前向分步框架。
解题过程
我们将分步骤、循序渐进地阐述前向分步算法如何构建和优化一个加法模型。
第一步:明确优化目标与问题拆解
我们的目标是最小化所有训练样本上的总损失:
min_{ {β_m, γ_m}_{m=1}^M } Σ_{i=1}^{N} L(y_i, f_M(x_i)), 其中 f_M(x) = β₀ + Σ_{m=1}^{M} β_m * b(x; γ_m)。
直接对 M 个模型的所有参数 {β_1, γ_1, ..., β_M, γ_M} 进行联合优化非常困难,因为参数空间巨大,且目标函数对 {γ_m} 通常是非凸的。
核心思路(拆解):我们不尝试一步到位,而是采用“每次只增加并优化一个新模型”的贪心策略。假设我们已经得到了一个由前 m-1 个基学习器组成的加法模型:
f_{m-1}(x) = β₀ + Σ_{j=1}^{m-1} β_j * b(x; γ_j)。
现在,我们希望在第 m 步,在保持前 m-1 个模型 f_{m-1}(x) 不变的情况下,新增一个基学习器 b(x; γ_m) 及其系数 β_m,来使得总损失下降最多。这形成了一个序列化的优化问题。
第二步:分步优化目标的形式化
在第 m 步,优化问题变为:
min_{β, γ} Σ_{i=1}^{N} L( y_i, f_{m-1}(x_i) + β * b(x_i; γ) )。
这里,f_{m-1}(x) 是已知的、固定的前 m-1 步的累积模型。我们需要求解的变量是当前新增模型的系数 β 和模型参数 γ。
这个优化问题仍然复杂,因为损失函数 L 是 f_{m-1} + β*b 的复合函数。为了简化,我们可以用一阶泰勒展开来近似目标函数。在当前点 f_{m-1}(x) 处,对 L 进行一阶近似。
梯度视角:考虑损失函数 L(y, f) 关于 f 的梯度(也称为伪残差)。
定义负梯度(或称伪残差)r_{im} 为:
r_{im} = - [ ∂L(y_i, f) / ∂f ]_{f = f_{m-1}(x_i)}。
这个负梯度 r_{im} 有一个非常重要的意义:它指明了对于第 i 个样本,当前模型 f_{m-1} 的预测在哪个方向上调整,可以最快速地降低损失。
第三步:基于梯度近似的简化优化
利用一阶泰勒展开,最小化 Σ_i L(y_i, f_{m-1}(x_i) + β*b(x_i; γ)) 可以近似转化为:找到一个函数 b(x; γ) 和系数 β,使得 β * b(x_i; γ) 尽可能接近负梯度 r_{im}。
具体地,我们可以分两步求解:
-
拟合新基学习器:首先找到参数
γ_m,使得新基学习器的输出b(x; γ_m)在平方误差意义下,最好地拟合当前所有样本的负梯度r_{im}。
γ_m = argmin_γ Σ_{i=1}^{N} [ r_{im} - b(x_i; γ) ]^2。这一步是关键。它意味着,我们不直接让新模型去拟合原始标签
y,而是让它去拟合当前模型预测的“残差”或“误差方向”(由负梯度表示)。对于不同的损失函数,负梯度有不同的形式。例如:- 平方损失
L(y, f) = (y-f)^2/2:负梯度r = y - f,就是普通的残差。此时,拟合负梯度就是拟合残差,这正是梯度提升决策树(GBDT)的核心。 - 绝对损失
L(y, f) = |y-f|:负梯度r = sign(y - f),是残差的符号。 - 对数损失(逻辑回归):负梯度与样本的预测错误成比例。
- 平方损失
-
确定新模型的系数:在得到最优的
γ_m后,将其代入原问题,求解最优的系数β_m:
β_m = argmin_β Σ_{i=1}^{N} L( y_i, f_{m-1}(x_i) + β * b(x_i; γ_m) )。这是一个一维的线性搜索问题,通常可以通过线搜索(Line Search)高效求解。对于某些特殊的损失函数,
β_m可以有解析解。例如,对于平方损失,β_m就是上一步拟合的线性回归系数。
第四步:完整的算法迭代流程
将以上步骤整合,就得到了前向分步算法的一般流程:
-
初始化:
- 设置初始模型
f_0(x)。通常,f_0(x)是一个常数,例如对于回归问题可能是目标值y的均值,对于分类问题可能是先验概率的对数几率。 f_0(x) = argmin_{c} Σ_{i=1}^{N} L(y_i, c)。
- 设置初始模型
-
对 m = 1 到 M(迭代增加基学习器):
a. 计算负梯度(伪残差):
对每个训练样本i = 1, ..., N,计算:
r_{im} = - [ ∂L(y_i, f) / ∂f ]_{f = f_{m-1}(x_i)}。
b. 拟合基学习器到负梯度:
使用训练数据{ (x_i, r_{im}) }来训练(拟合)一个新的基学习器b(x; γ_m),目标是最小化平方误差:
γ_m = argmin_γ Σ_i [ r_{im} - b(x_i; γ) ]^2。
c. 计算最优系数:
通过求解一维优化问题,确定新基学习器的权重:
β_m = argmin_β Σ_i L( y_i, f_{m-1}(x_i) + β * b(x_i; γ_m) )。
d. 更新加法模型:
f_m(x) = f_{m-1}(x) + β_m * b(x; γ_m)。 -
得到最终模型:
- 经过
M轮迭代后,最终的加法模型为:
f(x) = f_M(x) = f_0(x) + Σ_{m=1}^{M} β_m * b(x; γ_m)。
- 经过
第五步:算法实例与理解
让我们以平方损失 L(y, f) = 1/2 (y - f)^2 为例,直观感受这个过程:
- 初始化:
f_0(x) = mean(y),即y的均值。 - 第
m轮:
a. 计算负梯度:r_i = -∂L/∂f = y_i - f_{m-1}(x_i)。这就是普通的残差。
b. 拟合基学习器:用基学习器(如一棵决策树)去拟合当前所有样本的残差{r_i}。
c. 计算系数:对于平方损失,这一步的线搜索结果通常等价于基学习器自身预测值的缩放,有时会与基学习器的学习率(Shrinkage)合并。
d. 更新模型:将新拟合的这棵决策树(预测的是残差)加到当前模型上。新模型f_m(x)的预测值等于旧模型预测值加上这棵树对残差的预测值。
核心思想:每一步,我们不是去构建一个完美的新模型来预测 y,而是构建一个模型来预测当前累积模型的错误(残差),然后通过将这个“错误修正项”加到现有模型上来改进它。通过迭代,模型逐步逼近真实的数据生成过程。
总结:
前向分步算法通过贪心地、逐次地拟合负梯度,将一个复杂的加法模型全局优化问题,转化为一系列简单的回归问题(拟合残差/负梯度)和线性搜索问题。它不仅为梯度提升(GBDT, XGBoost, LightGBM)提供了理论基础,其“逐步修正错误”的思想在机器学习模型集成中具有深刻的启发性。该算法的关键在于损失函数的负梯度定义了当前模型需要改进的方向,而基学习器(如决策树)的强拟合能力则用于沿着这个方向前进。