GBDT 中的前向分布算法和贪婪学习

GBDT 中的前向分布算法贪婪学习 ,可以从「加法模型的本质」入手,用大白话 + 生活类比的方式讲解,全程结合 GBDT 的训练过程,零基础也能理解。

一、先铺垫:GBDT 是一种「加法模型」

前向分布算法是专门为加法模型设计的训练方法,所以我们先明确什么是加法模型。

GBDT 的最终模型可以写成这样:fM​(x)=f0​(x)+η⋅h1​(x)+η⋅h2​(x)+...+η⋅hM​(x)

  • f0(x):初始模型(比如所有样本标签的均值);
  • h1(x)∼hM(x):第 1~M 棵 CART 回归树(基学习器);
  • η:学习率,控制每棵树的贡献权重;
  • 核心特点 :最终模型 = 多个基模型的加权累加

类比:加法模型就像叠积木,最终的模型是一块一块积木(基模型)叠出来的,积木越多,模型的预测效果越好。

二、前向分布算法:加法模型的「分步训练框架」

1. 定义(大白话版)

前向分布算法的核心是:不一次性训练所有基模型,而是分步骤迭代训练 ------ 每一步只训练 1 个新的基模型,前面已经训练好的基模型全部固定不动

这个算法的目的是简化加法模型的优化难度------ 如果要同时优化 M 棵树的参数,计算量会爆炸;而分步训练,每一步只优化 1 棵树,就把复杂问题拆成了 M 个简单问题。

2. 核心步骤(结合 GBDT 理解)

我们用 GBDT 回归任务的训练过程,看前向分布算法是怎么工作的:

步骤 操作 前向分布的体现
1 初始化初始模型 f0​(x)=所有样本标签的均值 先搭好第一块「基础积木」
2 训练第 1 棵树 h1​(x):用残差 yi​−f0​(xi​) 作为新标签,找最优划分 只优化 h1​(x),f0​(x) 固定不变
3 更新模型:f1​(x)=f0​(x)+η⋅h1​(x) 叠上第 1 块新积木,形成新的模型
4 训练第 2 棵树 h2​(x):用残差 yi​−f1​(xi​) 作为新标签 只优化 h2​(x),f0​(x) 和 h1​(x) 完全固定
5 重复步骤 3-4,直到生成 M 棵树 每一步只加 1 块新积木,前面的积木绝不改动

3. 生活类比:包饺子的分步流程

前向分布算法就像包饺子

  1. 第一步:准备馅料(固定,对应 f0(x));
  2. 第二步:擀饺子皮(只做这一步,馅料固定);
  3. 第三步:包饺子(只做这一步,馅料和饺子皮固定);
  4. 第四步:煮饺子(只做这一步,前面的步骤固定)。

你不会在擀皮的时候回头改馅料,也不会在煮饺子的时候回头重新擀皮 ------每一步只做一件事,做完就固定,绝不返工,这就是前向分布算法的核心。

三、贪婪学习:每一步都选「眼前最优」的策略

1. 定义(大白话版)

贪婪学习是一种决策策略 :在每一步选择方案时,只追求当前步骤的最优解,不考虑这个选择对未来步骤的影响

它的特点是:局部最优 ≠ 全局最优 ,但胜在计算简单、速度快------ 对于 GBDT 这种需要迭代数百次的模型,贪婪策略是性价比最高的选择。

2. GBDT 中贪婪学习的体现

GBDT 每一轮训练新树 hm​(x) 时,完全遵循贪婪策略,具体表现为:

  1. 目标贪婪 :训练第 m 棵树的唯一目标,是最大程度拟合当前的残差(让这棵树的预测值和残差的平方误差最小);
  2. 选择贪婪 :在选择「哪个特征 + 哪个阈值」划分树时,只选当前能让基尼系数 / 平方误差最小的划分方案,不管这个划分会不会让后面的树更难训练。

3. 生活类比:走迷宫的「贪心策略」

假设你在一个迷宫里,目标是走到出口,你用贪婪策略的话:

  • 每到一个岔路口,你只选看起来离出口最近的那条路(当前最优);
  • 你不会提前规划整条路线,也不会考虑这条近路后面会不会是死胡同;
  • 优点:不用费脑想全局,走一步看一步,效率高;
  • 缺点:可能走进死胡同(局部最优≠全局最优),但在 GBDT 中,后续的树可以「修正」这个错误。

4. GBDT 中贪婪学习的具体例子(学生成绩数据集)

在 GBDT 训练第 1 棵树时:

  • 残差是 yi−f0(xi);
  • 遍历「学习时长」「作业完成率」两个特征的所有候选阈值;
  • 发现「学习时长 = 2.5」这个划分,能让残差的平方误差降到 0(当前最优);
  • 贪婪策略会直接选这个划分,不会考虑这个划分会不会让第 2 棵树没残差可拟合 ------ 反正第 2 棵树的事,等第 2 轮再考虑。

四、前向分布算法 & 贪婪学习:GBDT 的「黄金搭档」

概念 定位 在 GBDT 中的作用
前向分布算法 训练框架 把「同时训练 M 棵树」的复杂问题,拆成「逐次训练 1 棵树」的简单问题
贪婪学习 每一步的决策策略 让每一步训练树时,能快速找到当前最优的划分方案,保证训练效率

两者结合的效果:

  1. 高效:每一步只做一件事,且只选当前最好的选项,训练速度快;
  2. 实用:虽然是局部最优,但通过迭代多轮(增加树的数量),最终能逼近全局最优;
  3. 易实现:算法逻辑简单,工程上容易落地(这也是 GBDT 能广泛应用的原因之一)。

五、关键澄清:贪婪学习的「小缺点」

贪婪学习的「局部最优」会不会导致 GBDT 效果差?

  • 不会。因为 GBDT 是串行迭代的 ------ 即使第 m 棵树选了一个「不完美」的划分,第 m+1 棵树可以拟合这个划分带来的新残差,相当于「修正错误」;
  • 只要树的数量 M 足够多,模型就能不断修正误差,最终达到很好的预测效果。
相关推荐
leo__5202 小时前
CLEAN算法仿真程序,用于雷达信号中的杂波抑制
算法
LUCIFER2 小时前
学习随笔:摄像头采集数据后进行视频编解码的常见概念与疑问
学习·音视频
一分之二~2 小时前
二叉树--求最小深度(迭代和递归)
数据结构·c++·算法·leetcode·深度优先
老鼠只爱大米2 小时前
LeetCode经典算法面试题 #24:两两交换链表中的节点(迭代法、递归法等多种实现方案详细解析)
算法·leetcode·链表·递归·双指针·迭代·链表交换
mjhcsp2 小时前
挑战训练一个 AlphaZero 五子棋
算法·洛谷
Word码2 小时前
leetcode260.只出现一次的数字III
算法
LXY_BUAA3 小时前
《C++学习》Qt软件安装_20260123
学习
MM_MS3 小时前
Halcon图像采集助手、ROI操作和画图、ROI实现区域与轮廓之间的相互转换、区域的交集差集取反
图像处理·人工智能·数码相机·算法·目标检测·计算机视觉·视觉检测
智者知已应修善业3 小时前
【输出一个N*N的01矩阵,表示最后的汉字点阵图】2024-10-22
c语言·数据结构·c++·经验分享·笔记·算法·矩阵