论文阅读:深度森林

论文主题:《Deep Forest》

论文地址:https://arxiv.org/pdf/1702.08835.pdf

相关代码:https://github.com/kingfengji/gcForest

相关代码:https://github.com/LAMDA-NJU/Deep-Forest

深度森林是南大周志华老师前两年提出的一种基于随机森林的深度学习模型。

当前的深度学习模型大多基于深度学习神经网络(DNN),其中每一层都是可微的,在训练过程中通过反向传播调参。而本篇介绍的深度森林算法基于不可微的子模型,该算法把多个随机森林串联起来组成了深度学习模型。

作者认为深度模型的优越性主要在于:深度网络多层建构;模型特征变换;模型足够复杂。文中提出基于树模型的 gcForest 也可满足以上三点。相对于深度学习神经网络,它还有如下优势:使用较少的超参数;模型的复杂度可根据数据情况自动调整;使用模型的默认参数往往也能达到不错的学习效果。

DNN 的缺点

  • DNN 超参数太多,调参难度大,需要大量技巧
  • DNN 一般在大数据集上训练效果好,在中小数据集上表现较差,标注成本大
  • DNN 是难以解释的黑盒模型
  • DNN 需要事先设计网络结构,它的设计往往比实际需要的复杂度更高
  • 在很多数据比赛中 GBDT 类模型效果往往更好

灵感

作者设计灵感主要来源于深度学习模型和集成模型。

深度学习模型利用层层堆叠方法提升效果,因为即使给浅层网络设置很多单元,效果也不如深层网络;另外,决策树及 GBDT 决策树算法虽然也是层层推进,但效果也不如 DNN 的原因可能是它不能逐层提取更多特征,也就是说不支持模型内部特征转换(feature transformation),且这些机器学习模型只有有限的复杂度。

集成模型中多模型集成比单模型有更好泛化效果。子模型需要兼顾准确性,多样性,互补性。比如森林中设置树模型多样性常常采用的方法有:数据采样方式不同,特征不同,模型参数不同,定义的输出不同等。

实现方法

森林堆叠

gcForest 方法集成了多个森林,具体构建方法如下:

此例解决的是一个多分类问题,从左向右运行。模型输入是左侧的 Input Feature Vector,最终输出为输入 x 属于三种类别的概率;模型深度为 N 层,每层包含两个完全随机树森林和两个随机森林;每一层的输入是前层的输出和基本特征(Input Feature Vector),输出为 12 个新特征(4 模型 x3 类别)并传向后一层;使用验证集评价模型效果,当模型不再变好时停止继续训练。

多粒度扫锚

DNN 的重要优点在于识别出特征相关性,gcForest 使用给特征分组的方法加入对特征相关性的支持:

假设输入 400 维特征,设置窗口宽度 100,可取到 301 组特征,代入模型,产生 903 个输出(子模型输出 x 属于三个类别的概率 301x3=903),如果使用两个森林 ForestA 和 ForestB,则经过一层之后,输出 1806 个新特征。

再延展到更加复杂的结构:使用不同大小的滑动窗口:

示例中分别使用了大小为 100、200、300 的滑动窗口,并使用不同的森林 Forest A/B/C 分别处理,以达到更好效果(具体效果见实验部分)。

参数对比

从参数对比中可以看到,DNN 需要设计和尝试更多参数,而 gcForest 参数少,并且使用默认参数往往也能达到不错的效果。

实验

文中实验主要在 DNN 擅长的领域,如图片、音频、自然语言处理等领域,使用中大规模数据对比多模型的使用效果。

实验结果

图片分类:使用 MNIST 数据集,其中 train 60000,test 10000,对比效果如下:

人脸识别

另外,文中还对比了音乐片断分类、手势识别、影评情感分类等,详见论文。

低维数据与高维数据

文中测试了模型在三种低维数据集上的表现 LETTER:16 个特征,训练集 16000 测试集 4000;ADULT:14 个特征,训练集 32,561 测试集 16,281,YEAST:8 个特征训练集 1038 测试集 446。

也测试了在高维数据集 CIFAR-10:训练集 50000 测试集 10000 图片,共 10 个类别,8192 个特征。对比效果如下:

可以看到优化的 DNN 方法 ResNet,AlexNet 明显优于 gcForest,而 gcForest 在 DNN 以外的其它方法中效果最优;并且可以看到经过多滑动窗口和将最后一层替换成 gbdt 后,gcForest 方法也有明显改进。

运行时间

当使用 25000 实例 5000 特征,一层用时 267.1 秒。如果使用不同粒度,模型可以并行训练。

多粒度特征叠加

上图中使用多粒度特征时,将不同粒度提取的特征分别代入模型,此处实验将不同粒度提取的特征连接后统一代入模型,方法相对更简单,其效果与上述方法差别不大,模型效果对比如下:

使用方法

从 github 开源项目的 demo 中可以看到 GCForest 使用方法非常简单,类似 Sklearn 中的模型接口。

总结

文中讨论的 gcForest 在目前很多深度学习领域表现也不错,并非想使用它去取代目前的 DNN 模型,而是提出了另一种深度学习的实现方法和可能性。