深度森林

时间:2017/11/08

本文是 MLA2017会议上周志华关于深度森林报告的一个笔记。周志华老师花了很大一部分时间谈了谈深度森林背后的一些思考,受益良多。会议 ppt 在 MLA官网

首先,周志华回顾了深度学习的一些基本问题

深度学习是什么?

Deep Learning =? Deep neural networks (DNNs) 

当今的深度学习,当前几乎等同于深度神经网络(DNNs)。就是把神经网络的层数加深。周志华认为深度学习的内涵需要思考以下问题

1.神经网络为何要加深

对于神经网络,提升模型复杂度可以提高学习性能。当然,复杂度提高之后一方面容易出现过拟合,因此深度学习同时需要提升数据量。另一方面训练过程变得困难,因此需要很多 tricks 。

但是有一个基本问题就是,如何提升模型复杂度?

对于一个神经网络,提升复杂度有两种方式,一种是加宽(即增加每一层的 unit 数量),一种是加深(增加 layer 数量)。那就有一个问题了,为什么我们选择变深而不选择变宽?

2.神经网络为何选择变深而非变宽?

单隐层神经网络可以被证明能够逼近函数,因此加宽也可以让模型复杂度可以变得无限高。但是加宽之后效率很低,加深带来的性能提升则明显很多。

那是否可以有可能设计出一种在网络宽度上做文章的模型?周志华认为,要回答这个问题,就要思考深度学习为什么能行这个问题

3.深度模型为什么能行(为什么效果好)?

周志华认为,深度模型有三个重要的方面:


譬如图像识别过程。

其实传统机器学习方法例如决策树就是逐层加工的,但是缺乏足够的复杂度。那么采用集成方法的可以提升复杂度,譬如Boosting方法,但是还是不够复杂,因为没有特征变换过程,总是在同样的特征空间进行处理。

4.深度神经网络有何缺点?

此外,在很多任务上DNN效果并不一定好,譬如在许多 Kaggle 竞赛任务上,最后是机森林和 XGBoost 获胜。

另外,深度神经网络的训练通过BP算法,要求任务是连续可微的,离散任务变成连续再训练的过程会引入bias。

深度森林

接下来,周志华先简单介绍了深度森林: 一言以蔽之,深度森林是一种集成学习算法。一些细节:

因此,要了解深度森林,要先了解集成学习。

集成学习:如何得到一个好的 ensemble ?

每个个体不同且每个个体不能太坏!

根据 Error-ambiguity decomposition (错误-多样性分解)[Krogh & Vedelsby, NIPS’95],理论证明了如下公式:

也就是 Ensemble 的总体错误率等于每个学习器个体的平均错误率减去学习器多样性。

所以说,diversity非常重要

当然以上公式只有在使用均方误差的回归任务中可以推导出来,周志华认为虽然只有在这种情况下才能写出这样漂亮的公式,但是也对通用的 ensemble 方法有指导意义。

如何产生 diversity ?

主要有四种方法:

级联森林(Cascade Forest)

深度森林(multi-Grained Cascade Forest)是一种级联森林(Cascade Forest)结构。如下图所示。

注意图中的Forest,指的是随机森林,而蓝色的Foreset,指的是完全随机森林(Completely-random trees),是为了提供更强的 diversity。

观察图中结构,假设我们在做一个三分类任务,那我们每一层每一个随机森林都输出一个三维向量,输出每一类的预测概率。并把同一层所有的输出拼接起来送到下一层作为输入,同时值得注意的是,我们不仅把这一层的输出,还把最原始的数据也一起拼接起来,这样我们就做了一次特征变化,并保留了原始特征继续后续处理,每一层都这样,最后一层将所有随机森林输出的三维向量加和求平均算出最大的一维作为最终输出。

集成方法的集成

上面的级联森林结构中使用了多个集成方法:

关于完全随机森林,可以参见 Liu, Fei Tony, Kai Ming Ting, and Wei Fan. “Maximizing Tree Diversity by Building Complete-Random Decision Trees.” PAKDD. Vol. 2005. 2005.

多粒度扫描(Multi-grained)

接下来介绍一下 gcForest (multi-Grained Cascade Forest)中使用的多粒度扫描。周志华表示该想法完全是受到了 CNNs/RNNs 的启发。简单的把神经网络变深来增加复杂度,譬如使用 MLP,效果就会没有 CNN、LSTM 好的原因就在于 CNN、LSTM 引入了上下文扫描的机制。

滑动窗口扫描(Sliding window scanning)


譬如对于一个 400 维的输入,我们用100维的窗口去扫描他,每次扫描产生一个样本,窗口每次向下滑动,一共可以产生 301 个 100 维样本。对于这样产生的数据集我们同样可以训练出一个森林,我们把每个样本输出的三维向量拼接起来,产生 301*3*2=1806 维的向量。其中一个问题与技巧是,扫描产生的 100 维的样本只是原来样本的一部分,如果原来是一个正样本,我们也会将其作为正样本,这引入了严重的分类噪音。譬如我们一张图片我们判断有没有车,我们现在会把没车的部分也当作有车来训练,这不是在引入严重的分类噪音吗?这其实是用到了 Flipping Output 的机制,通过人为引入噪音,一定程度上增加了 diversity,这是一种输出扰动的方法。

这样一个滑动窗口扫描产生大量样本并训练出的森林就是一个 grain。

整体结构

谈完 cascade Forest 和 Multi-grain ,接下来我们就可以把他们结合起来构成一个完整的 gcForest 了。

如图,假设我们有三个 grain ,其实对于原来我们说的 cascade ,每一层就对应了三级,每一级对应了三个 grain 。我们可以增加 grain 的数量,譬如把三个 grain 提升到五个 grain,性能就会有较大提升。

参数分析

gcForest 的超参数不多:

相比深度网络,超参数少了非常多,而且对于神经网络来说,参数调整可能有一些经验,但是经验很难并不能跨任务分享,而对于 gcForest ,实践发现在所有任务上即使采用相同的参数,效果就很好。

总结与个人感想

深度森林的成功,是 ensemble 方法的一个成功,深度森林几乎用上了所有 ensemble 方法,取得了很好的效果。gcForest 提出了一种不同于 DNNs 的深度结构,不用深度神经网络却能达到相当的效果,其实正是因为周志华老师真正深刻理解了深度神经网络的为什么有效的三个方面:逐层加工、特征变换、足够的复杂度。