基于深度森林(Deep Forest)的级联结构、多粒度扫描与级联森林构建过程
题目描述
基于深度森林(Deep Forest,又称gcForest)的算法,是周志华教授团队在2017年提出的一种深度模型替代方案。与深度神经网络(DNN)通过多层非线性变换来学习特征表示不同,深度森林旨在利用“模型集成+层级结构”来构建“深度”模型。其核心思想是通过一个级联的、由多种树集成模型组成的结构,逐层处理特征,并将每一层的输出(即预测概率分布)作为新的特征,输入到下一层,以此来实现表征学习。本题将详细讲解其核心设计:级联结构、多粒度扫描,以及模型整体的训练/构建过程。
解题过程循序渐进讲解
第一步:理解核心动机与设计理念
传统的深度神经网络(DNN)的成功很大程度上依赖于多层非线性堆叠带来的强大表征学习能力,但DNN也存在可解释性差、对超参数敏感、需要大量数据等问题。深度森林的动机是探索一种不依赖于梯度反向传播的、基于决策树集成的深度模型。
其基本设计理念是:
- 用集成学习(森林)替代神经元:每一层不是由神经元组成,而是由一个或多个“森林”(如随机森林、完全随机森林)构成。
- 用特征变换替代激活函数:每一层的输出(模型对各类别的预测概率)被连接(拼接)到原始输入特征上,形成新的、增强的特征向量,作为下一层的输入。这种概率输出可以被看作是对原始特征的一种高层、非线性变换。
- 用级联结构实现深度:通过不断堆叠这样的“森林层”,模型的“深度”得以增加,表征能力逐步增强。
第二步:剖析核心组件一:多粒度扫描(Multi-Grained Scanning)
多粒度扫描是可选的,主要用于处理具有空间或序列结构的数据(如图像、序列),其目的是在输入级联森林之前,提取多尺度的特征。
-
滑动窗口扫描:
- 对于输入数据(例如,一个
n维特征向量,或重塑后的序列/图像),我们定义不同大小的滑动窗口。例如,对于一个长度为L的一维序列,我们可以使用大小为k的窗口(k是超参数,如k=100或k=200)。 - 窗口在序列上以步长
s滑动,每次截取一个长度为k的特征子向量。对于图像,则使用二维窗口在二维空间滑动。
- 对于输入数据(例如,一个
-
局部特征学习:
- 每一个窗口截取出的特征子向量,被送入一个“森林”中进行训练和预测。这个“森林”通常是一个完全随机森林,其每棵树随机选择特征和分裂点,不进行剪枝,以增加多样性。
- 这个森林的目标是学习从局部特征块到样本标签的映射。训练完成后,对于每个样本的每个窗口,森林会输出一个
C维的概率向量(C是类别数)。
-
生成转换特征:
- 对于一个样本,经过大小为
k的窗口扫描后,会产生M个窗口(M取决于序列长度L、窗口大小k和步长s)。每个窗口经过森林,都会产生一个C维概率向量。 - 然后,我们对这
M个C维向量进行池化操作(通常是均值池化或最大池化),将它们聚合成一个C维向量。这个向量代表了在尺度k下,模型对整个样本的、基于局部信息聚合得到的判别性特征。 - 这个过程用不同大小的窗口(例如
k1=100,k2=200)重复进行。每个尺度最终都会产生一个C维的特征向量。
- 对于一个样本,经过大小为
-
最终输出:
- 将所有不同尺度生成的
C维特征向量拼接(concatenate)起来。假设有S个不同的扫描尺度,最终生成的特征向量维度就是S * C。 - 这个拼接后的特征向量,将与原始特征向量一起,作为级联森林的初始输入。多粒度扫描可以看作是模型“看”数据的多种不同“焦距”。
- 将所有不同尺度生成的
第三步:剖析核心组件二:级联森林结构(Cascade Forest Structure)
这是深度森林的主体部分。它是一个多层的、前馈的级联结构。
-
基本单元:森林层:
- 每一层包含多个不同类型的森林。标准的gcForest包含两种森林:
- 完全随机森林:每棵树随机选择特征进行分裂,直到节点纯净或样本数小于阈值。强调随机性,方差大,偏差低。
- 随机森林:使用Bagging和特征子采样,并进行分裂优化(如基尼指数)。是更经典的集成方法,偏差和方差较均衡。
- 为了增加多样性,每一层通常包含多个(例如2个)完全随机森林和多个(例如2个)随机森林。
- 每一层包含多个不同类型的森林。标准的gcForest包含两种森林:
-
特征增强与传递:
- 假设输入到第
t层的特征向量是F_t。 - 第
t层的每个森林都会独立地对F_t进行处理,并输出一个C维的类别概率向量。 - 将第
t层所有森林输出的C维概率向量拼接起来。如果有K个森林,就会得到一个K * C维的向量。 - 然后,将这个拼接后的概率向量,与原始输入特征
F_t再次拼接,形成新的特征向量F_{t+1},作为第t+1层的输入。 - 即:
F_{t+1} = [F_t, P_1, P_2, ..., P_K],其中P_i是第i个森林的输出概率向量。
- 假设输入到第
-
级联的增长:
- 这个过程一层一层地堆叠。随着层数增加,特征向量的维度会越来越大(因为每一层都会新增
K * C维特征)。这些新增的概率向量,是前一层所有森林的“集体决策”,它们编码了从当前特征表示中提炼出的、对分类任务有价值的高层信息。
- 这个过程一层一层地堆叠。随着层数增加,特征向量的维度会越来越大(因为每一层都会新增
第四步:模型的完整训练与构建过程
深度森林的训练是逐层贪婪生成的,而不是像DNN一样端到端反向传播。
-
初始化:
- 如果有预处理步骤(如多粒度扫描),先执行它。将生成的特征与原始特征拼接,形成初始特征向量
F_1。 - 如果没有,
F_1就是原始特征。
- 如果有预处理步骤(如多粒度扫描),先执行它。将生成的特征与原始特征拼接,形成初始特征向量
-
逐层训练与验证:
- 训练第1层:使用全部训练数据
(X_train, y_train),特征为F_1,训练第一层的所有森林(例如2个完全随机森林+2个随机森林)。 - 生成第2层输入:用训练好的第1层森林,对训练数据进行预测,得到每个森林的概率输出,拼接后与
F_1拼接,生成F_2。 - 训练第2层:使用训练数据
(X_train, y_train),特征为F_2,训练第2层的所有森林。 - 评估与决定是否增长:
- 这是关键一步。在训练每一层之后,需要使用一个验证集来评估当前整个级联结构的性能。
- 用验证集数据
X_val,从第一层开始,依次通过所有已训练好的层,最终得到顶层森林的预测结果(通常是取顶层所有森林输出概率的平均值),计算在验证集上的准确率。 - 终止条件:如果增加新的一层后,整个模型在验证集上的性能没有显著提升(或达到预设的最大层数),则停止增加新层。这意味着继续加深模型不会带来泛化性能的增益,从而自动决定了模型的“深度”。这是深度森林的一个关键优势,其深度可以在训练中自适应确定。
- 如果性能有提升,则用同样的方法生成
F_3,训练第3层,并再次评估,如此循环。
- 训练第1层:使用全部训练数据
-
最终预测:
- 对于一个新的测试样本,将其特征(经过相同的多粒度扫描处理)作为
F_1,输入到训练好的整个级联结构中。 - 让数据依次通过每一层的每一个森林,最终到达最顶层。
- 将最顶层所有森林输出的类别概率向量取平均,得到最终的预测概率分布。取概率最大的类别作为最终预测结果。
- 对于一个新的测试样本,将其特征(经过相同的多粒度扫描处理)作为
总结与回顾
深度森林通过以下步骤构建了一个深度模型:
- 多粒度扫描(可选):通过不同大小的滑动窗口和森林,从结构化数据中提取多尺度的局部特征表示,形成初始的增强特征。
- 级联森林结构:构建多层森林,每层包含多种树模型以增强多样性。
- 逐层特征变换:每一层的输出(类别概率)被拼接到当前特征中,作为下一层新的、更丰富的特征输入。这实现了非线性的特征转换。
- 贪婪逐层训练与验证:模型一层一层地训练,并在每一层后通过验证集性能决定是否继续加深,从而自适应地确定模型复杂度。
深度森林的优势在于其对超参数相对不敏感、模型复杂度自适应确定、可解释性相对较好(因为基于决策树),为深度学习提供了一种基于树模型集成的、无需梯度下降的、新颖的架构思路。