内存友好的深度森林软件包开源了。现在,普通设备也可以跑得动深度森林。
周志华等人一直在推动的深度森林,是探索神经网络以外 AI 领域重要的研究方向之一,在表格数据建模任务中已初现锋芒。但是,由于基于决策树的集成模型在具体实现当中,经常会遇到内存不足,硬件效率不如神经网络等问题,是推动其大规模应用的主要瓶颈之一。
经过 LAMDA 徐轶轩等人的不懈努力,2021 年 2 月 1 日,新的深度森林软件包 DF21 在 GitHub 与开源中国同时开源了。该软件包尝试解决了这一方向在上述实际应用过程中所遇到的关键问题,未来在各类在数据建模过程中,我们也可以便捷地使用深度森林了。
据介绍,该项目目前主要由南大徐轶轩进行开发和维护,在正式发布之前它已经在 LAMDA 内部经过测试和使用。
- 项目地址:http://www.lamda.nju.edu.cn/deep-forest/
- Gitee 地址:https://gitee.com/lamda-nju/deep-forest
- Github 地址:https://github.com/LAMDA-NJU/Deep-Forest
针对这一开源项目,深度森林参与者之一(现任创新工场南京 AI 研究院执行院长,倍漾资本创始人)冯霁博士告诉机器之心,「深度森林在表格数据建模上,相对传统算法效果显著,但是之前开源的代码主要用于算法验证,以及辅助其他科研工作者进行深度森林算法相关的研究,代码本身对内存和服务器性能要求较高。
徐同学开源的这一版更为简单易用,做了很好的封装,同时进行了高性能优化,大幅降低了内存依赖,对于科研和实际落地应用都是很好的工具。」
此外,针对深度森林固有的内存消耗、只能用 CPU 训练等问题,徐轶轩告诉机器之心,「这个模型的全名是:DF21: A Practical Deep Forest for Tabular Datasets。内存消耗是 DF21 主要解决的问题——此前的 gcForest 在处理百万级别的表格型数据集上,占用的内存可能会达到上百 GB。但在新版本中,在千万级别的表格型数据集上进行训练,占用的内存约为原来的十分之一左右。」
以下为此开源项目的详细介绍。
DF21
项目介绍
本项目中的 DF21 是深度森林的 2021.2.1 实现版本。深度森林是基于决策树的深度学习模型。使用树模型学习技术(如随机森林、GBDT 等)的应用都可以尝试使用 DF21。它具有以下优势:
- 拥有比其他基于决策树的集成学习方法更好的性能
- 拥有更少的超参数,并且无需大量的调参
- 训练效率高,并且能够处理大规模的数据集
安装教程
深度森林的最新稳定版本已经发布在 PyPi (https://pypi.org/) 上,可以通过以下命令安装:
$ pip install deep-forest
关于 Nightly-Build 版本以及如何对源代码进行编译请参考官网的安装说明。
使用说明
深度森林采用了与 Scikit-Learn (https://scikit-learn.org/stable/) 类似的 API 设计。例如,下面的代码片段展示了在安装完成后,如何将深度森林利用在一个简单的数字分类数据集上:
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from deepforest import CascadeForestClassifier
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
model = CascadeForestClassifier(random_state=1)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred) * 100
print("\nTesting Accuracy: {:.3f} %".format(acc))
>>> Testing Accuracy: 98.667 %
实验
研究者使用 5 种流行的基于决策树的集成学习方法作为 baseline,在所有 baseline 上都保持决策树的数量相同,将其余超参数设置为其默认值。
分类精度
研究者在所选取的数据集上进行了测试,每个数据集的 SOTA 结果如加粗部分所示,
运行时间
训练阶段和评估阶段的运行时间。
深度森林,机器学习的新方向
深度森林的特点在于很少的超参数和自适应复杂度,在不同规模的模型上,深度森林都可以做得很好。
近十几年来,深层神经网络的发展在机器学习领域取得了显著进展。通过构建分层或「深层」结构,该模型能够在有监督或无监督的环境下从原始数据中学习良好的表征,这被认为是其成功的关键因素。成功的应用领域包括计算机视觉、语音识别、自然语言处理等。
大部分被广泛应用的深度神经网络都使用具有随机梯度下降的反向传播作为训练过程中更新参数的主力。实际上,当模型由可微分量(例如,具有非线性激活函数的加权和)组成时,反向传播似乎仍是当前的最佳选择。其他一些方法如目标传播已经被作为训练神经网络的替代方法被提出,但其效果和普及还处于早期阶段。但一些研究表明,目标传播最多可达到和反向传播一样的效果,并且实际上常常需要额外的反向传播来进行微调。换句话说,老掉牙的反向传播仍然是训练神经网络等可微分学习系统的最好方法。
另一方面,探索使用非可微模块来构建多层或深度模型的可能性的需求不仅仅是学界的兴趣所在,其在现实应用上也有很大的潜力。例如,基于树的集成(例如随机森林或梯度提升决策树(GBDT)仍然是多个领域中建模离散或表格数据的主要方式,为此在这类数据上使用树集成来获得分层分布式表征是个很有趣的研究方向。
在这样的案例中,由于不能使用链式法则来传播误差,反向传播不再可行。这引发了两个基本的问题:首先,我们是否可以用非可微组件构建多层模型,从而中间层的输出可以被当作分布式表征?其次,如果是这样,如何在没有反向传播的帮助下,联合地训练这种模型?本文的目的就在于提供这种尝试。
2017 年,周志华和冯霁等人提出了深度森林框架,这是首次尝试使用树集成来构建多层模型的工作。具体来说,通过引入细粒度的扫描和级联操作(cascading operation),该模型可以构建多层结构,该结构具备适应性模型复杂度,且能够在多种类型的任务上取得有竞争力的性能。研究者们提出的 gcForest 模型利用了集成学习多样性增强的各种策略,然而该方法仅适用于监督学习设置。
深度森林的模型框架。
同时,该论文仍然不清楚如何利用森林来构建多层模型,并明确地测试其表征学习能力。由于很多之前的研究者认为,多层分布式表征可能是深度神经网络成功的关键,为此我们应该对表征学习进行这样的探索。
2018 年,周志华等人又在研究《Multi-Layered Gradient Boosting Decision Trees》中探索了多层的决策树。该工作力求利用两个方面的优势:树集成的出色性能和分层分布式表征的表达能力(主要在神经网络中进行探索)。具体来说,该研究提出了首个多层结构,每层使用梯度提升决策树作为构造块,明确强调其表征学习能力,训练过程可以通过目标传播的变体进行联合优化。
在不断努力下,研究人员已经证明了深度森林模型可以在有监督和无监督的环境下进行训练,人们可以使用决策树来获得分层和分布式表征。
关于深度森林系列研究才刚刚开始,对于不可微分学习模块的探索,有待更多的科研人员加入。
相关资源
在相关资源推荐中,作者推荐了深度森林的相关论文与报告:
论文:Deep Forest
链接:https://arxiv.org/pdf/1702.08835.pdf
报告:周志华:An exploration to non-NN deep models based on non-differentiable modules
链接:https://aistats.org/aistats2019/0-AISTATS2019-slides-zhi-hua_zhou.pdf
在此,我们也附上机器之心先前介绍深度森林的相关内容,以供大家学习。