不求甚解哪行之TabNet


TabNet是由Google提出的一种用于处理表格型数据的神经网络方法,它的出现有望挑战树形模型对表格数据的垄断地位(XGBoost, GBDT, LGBM)。

论文地址:TabNet: Attentive Interpretable Tabular Learning
官方项目地址:TabNet官方
pytorch实现:TabNet Pytorch实现

目录

  • 决策树及其变体模型有何优势和劣势?

  • TabNet核心思想

  • TabNet Encoder(如何进行回归和分类任务学习?)

  • TabNet Decoder(如何实现自监督学习进行表征学习?)

  • 实验及调参

决策树及其变体模型有何优势和劣势?

为什么在表格型数据领域,深度学习方法还无法撼动集成决策树及其变体在该领域的统治地位?

首先树形模型具有如下优势:

1)模型具有近似超平面边界的决策流形(decision manifolds),对表格数据具有高效的表示能力(所以性能好)

2)他们的基本形式有很强的解释性(通过追踪决策结点)(这在现实生活的很多应用中都是非常重要的考量,比如金融服务)

3) 树形模型训练很快

其次之前提出的DNN结构并不太适合表格型数据,以卷积层或MLP为基础的传统DNN对于表格型数据往往参数量过大,缺乏适当的归纳偏差(inductive bias)通常导致他们无法找到表格数据决策流形的最优解。

那么决策树及其变体模型有何缺点呢?首先就是我们对特征工程的依赖。我们回想一下,为什么深度学习方法能够在图像、自然语言以及音频方面取得巨大的成功?一个很重要的原因,就是深度学习能够将原始数据编码成有意义的表示。基于反向传播算法的端到端训练能够对表格型数据进行有效的编码,从而减轻甚至消除对特征工程的需要。不仅如此,当数据集规模更大时,神经网络模型的表达能力可能具有更好的效果。

而TabNet就是要集合DNN和决策树型模型的优点,实现一个更好的处理表格型数据的方法。

TabNet核心思想

如果想让DNN具有树模型的优点,那么需要解决个一个问题就是:如何构建一个具有与树模型相似决策流行的神经网络?作者的构思如下图:

image-20201112192338712

左图是右图决策流型的神经网络实现。其中Mask层对应于特征选择,比如特征\([x_1, x_2]\)在经过mask\([1, 0]\)后选择了特征\(x_1\)。经过FC层后得到的向量为\([C_1 x_1 - C_1 a, -C_1 x_1 + C_1 a, -1, -1]\),变换后可得到\([C_1(x_1 - a), -C_1(x_1 - a), -1, -1]\)。不难发现,其中只有一个元素能够大于或等于0。经过ReLU层后,只有一个元素为正值,其余全为0,这对应于决策树的条件判断。

Encoder(TABNET FOR TABULAR LEARNING )

Encoder结构

表格数据包含类别数据和数值型数据。TabNet使用原始的数值型数据,并用可训练的embedding将类别特征映射为数值特征。Tabnet不使用全局归一化的特征,而是使用BN。每一个决策步(decision step)输入相同的\(B \times D\)的特征矩阵。\(B\)是batch size的大小,\(D\)是特征的维数。TabNet的encoding是基于多个决策步的处理。每个决策步的特征由上一决策步的输出经过Attentive transformer来决定。并输出处理过的特征表示,整合到整体的决策中。这种以序列的形式实现自上而下的注意力是受到了处理视觉与语言数据(比如视觉问答)以及强化学习的启发。

Feature selection

特征选择通过每一个决策步的Mask模块实现。选择哪些特征由决策步的Attentive transformer实现。

那么,Attentive transformer是如何实现特征的选择呢?

Attentive transformer通过学习一个mask来实现对当前决策步的特征选择。学习mask的公式如下表示:

\[M[i]=sparsemax(P[i - 1] \cdot h_i (a[i-1])). \]

公式中各符号的含义已在图中标出,下面用张量流动的顺序来说明各符号的含义:

1.首先上一决策步的Feature transformer输出张量并送给Split模块。

2.Split模块对步骤1中的张量进行切分并得到\(a[i-1]\)

3.\(a[i-1]\)经过\(h_i\)层,\(h_i\)层表示一个全连接层和一个BN层。

4.\(h_i\)层的输出和上一决策步的先验尺度\(P[i-1]\)相乘。

5.然后通过Sparsemax生成所需的\(M[i]\),进而完成特征选择。

6.\(M[i]\)更新\(P[i]\)。更新公式为:\(P[i]=\prod_{j=1}^i(\gamma-M[j])\)\(P[i]\)表示的是过去的决策步中特征的使用情况。当\(\gamma=1\)的时候,则表示强迫每个特征只能出现在一个决策步中【为什么?】\(P[0]\)初始化为全1。在自监督学习中,如果未使用某些特征,可在P[0]中置为0.

7.\(M[i]\)和feature元素相乘实现当前决策步的特征选择。

8.将选择后的特征输入当前决策步的feature transformer,并开启新的决策步循环。

了解了特征选择的过程,第二个问题就是,为什么Attentive transformer能实现特征的选择呢?

Attentive transformer有3个模块:FC+BN、Prior scales和Sparsemax。

FC+BN的作用是实现特征的线性组合,从而抽取出更高维更抽象的特征。

Prior scales根据前面的公式可以发现他其实是当前决策步在选择特征时的先验知识。一般来说,在过去的决策步中使用越多的特征,在当前决策步中的权重就越小。所以这一步相当于是根据历史出现的情况,选择当前所需的特征。

Sparsemax可以使得\(\sum_{j=1}^D M[i]_{b,j}=1\)【为什么使用sparsemax,而不是softmax?】。其中\(D\)表示特征的维数。sparsemax对每个样本\(b\)的每个特征\(j\)实现权重的分配,并使每个样本的所有特征的权重和为1,从而实现了instance-wise的特征选择。

特别地,为了控制所选特征的稀疏性,作者还以熵的形式提出了稀疏正则项,公式如下:

\[L_{sparse}=\sum_{i=1}^{N_{steps}} \sum_{b=1}^B \sum_{j=1}^D \frac{-M_{b,j}[i]}{N_{steps} \cdot B} log(M_{b,j}[i]+ \epsilon) \]

其中\(\epsilon\)是为了保证数值的稳定性。\(L_{sparse}\)会以权重\(\lambda_{sparse}\)加入到最终的损失函数中。可以发现当所选特征越密集的时候,正则项会越大。

那么,作者为什么要使用这么多手段去保证特征选择的稀疏性呢?(sparsemax以及\(L_{sparse}\))

作者认为:当数据集的大部分特征都是冗余的时候,稀疏性能够为收敛到更高的准确率提供更好的归纳偏差。我认为这里存在矛盾的地方。TabNet最大的魅力可能就在于免去表格数据繁杂的特征工程,也就是说可能做到”我有什么就输入什么“的理想状态(像CV领域一样)。但是这里的sparsemax和正则项都以特征冗余为前提,则将特征工程的活转变为了调参的活。这里能否将稀疏度本身也作为可学习的参数本身呢?

1.为什么\(\gamma=1\)时,表示每个特征只能在一个决策步中出现?

假设某个特征\(n\)第一次出现在第\(j\)个决策步,即\(M[j]_n=1\),那么\(\gamma - M[j]_n=0\)。根据\(P[i]\)的更新公式不难得到\(P[j+1]_n=0\)。又由于更新是连乘的方式,所以特征\(n\)\(j\)以后的决策步的先验尺度都为0。

2.Attentive transformer中为什么使用sparsemax,而不是softmax?

Softmax是常用的注意力机制,但是它会产生较密集的注意力。根据softmax的定义可以发现softmax的输出都大于0,对应到特征选择的场景下,就是每个特征都会选择,只是程度的问题。但是sparsemax可以通过投影到probabilistic simplex产生更为稀疏化的效果。这里借鉴稀疏序列到序列模型中的一个例图。

图中的\(z\)可以理解为投影前的特征值,把他们都投影到线段(单纯性)上后,大部分的特征都会投影到单纯性的边界上,从而形成了稀疏化的输出效果。从以下代码可以更直观得看到效果。

In [1]: import torch

In [2]: from torch.nn.functional import softmax

In [2]: from entmax import sparsemax
 
In [4]: x = torch.tensor([-2, 0, 0.5])

In [5]: softmax(x, dim=0)
Out[5]: tensor([0.0486, 0.3592, 0.5922])

In [6]: sparsemax(x, dim=0)
Out[6]: tensor([0.0000, 0.2500, 0.7500])

Feature processing

经过Mask过滤后的特征被送进了feature transformer进行特征处理。处理完成的特征被split模块切分成两部分,一部分用于当前决策步的输出,另一部分则作为下一决策步的输入信息。【为何要split,而不是共用?】用公式表示为:

\[[d[i], a[i]]=f_i (M[i] \cdot f) \]

公式各符号含义已在下图标出。

整个特征处理的流程非常清晰,下面我们来关注feature transformer的模型结构。

作者说,"为了保证复杂模型的参数有效性及鲁棒学习的能力,feature transformer应该包含在决策步间共享的层仅作用于当前决策步的层",对应到图中分别是Shared across decision steps和Decision step dependent。相比于所有参数只作用于当前决策步,这种设计参数量更少,学习更加鲁棒。而相比于每个决策步共享完全相同的参数,这种设计的参数在每一个决策步可能具有不一样的特征处理能力,使得每一决策步的特征处理更加有效。

这里有一个细节,就是在每一个残差连接后会乘上\(\sqrt{0.5}\),这是为了防止模型的方差发生剧烈变化,从而稳定训练过程,这个操作源于《Convolutional Sequence to Sequence Learning 》。

另外,作者提到,"为了加快训练,要使用large batch sizes"。而为了提升large batch sizes的性能,所有的BN层(除了作用于模型输入特征的第一层BN外)都是用的是ghost BN。ghost BN源于论文《Train longer, generalize better: closing the generalization gap in large batch training of neural networks. 》,它的提出就是为了解决在large batch size下,减小generalization gap的方法。它有两个相关的参数virtual batch size \(B_V\)以及momentum \(m_b\)。而对于输入特征而言 ,作者观察到低方差平均的好处,所以没有使用ghost BN。

Encoder的最后借鉴了树型模型聚合的思想,把所有决策步的embedding聚合成\(d_{out}\)\(\pmb {d_{out}}=\sum_{i=1}^{N_{steps}} ReLU(\pmb {d[i]})\)。最后再用一个全连接层映射到最终的输出。

Decoder(TABULAR SELF-SUPERVISED LEARNING )

作者还提出了一个decoder结构来重建encoder所学习到的表示特征。decoder同样由决策步构成,每个决策步为feature transformer加FC层。最终所有的输出相加得到最终重建的特征。

自监督的目标是随机丢掉部分样本的部分特征,并且对他们进行预测。重建的损失函数表示为:

\[\sum_{b=1}^B \sum_{j=1}^D \left|(\pmb{\hat{f}_{b,j}} - \pmb{f_{b,j}}) \cdot \pmb{S_{b,j}} / \sqrt{\sum_{b=1}^B (\pmb{f_{b,j}} - 1/B \sum_{b=1}^B \pmb{f_b,j})} \right|^2 \]

由于每个特征可能有不同的尺度,所以这里用真实数据的标准差进行正则化。这里的\(\pmb{S_{b,j}}\)是以概率\(p_s\)在每一轮迭代依照伯努利分布进行独立的抽样。

实验及调参

对于所有的数据集而言,类别性特征通过一个可学习的embedding被映射到一个1维的尺度上(有时更高维的embedding能轻微得提升性能,但是每个维度的可解释性无法很好理解)。而数值型特征没有经过预处理(这里作者提到一些特别设计的特征工程,比如logarithmic transformation of variables highly-skewed distributions 可能会进一步提高性能,但论文的实验部分暂时没有考虑这部分的内容)。

在所有数据集上的超参数搜索空间为:

hyperparameter_search_space = {
    "n_d": [8, 16, 24, 32, 64, 128], # n_a=n_d
    "n_steps": [3, 4, 5, 6, 7, 8, 9, 10],
    "gamma": [1.0, 1.2, 1.5, 2.0],
    "lambda_sparse": [0, 0.000001, 0.0001, 0.001, 0.01, 0.1],
    "batch_size": [256, 512, 1024, 2048, 4096, 8192, 16384, 32768],
    "virtual_batch_size": [256, 512, 1024, 2048, 4096],
    "momentum": [0.6, 0.7, 0.8, 0.9, 0.95, 0.98]
}

关键参数:

影响模型复杂度的参数:

  • \(N_a\).可以理解为用来决定输出的隐藏层神经元个数。\(N_a\)更大,拟合能力更强,也容易过拟合。
  • \(N_d\).可以理解为用来决定下一决策步特征选择的隐藏层神经元个数。
  • \(N_{steps}\).决策步的个数。可理解为决策树中分裂结点的次数。

特征选择能力:

  • \(\gamma\).决定历史所用特征在当前决策步的特征选择阶段的权重。
  • \(\lambda_{sparse}\)。稀疏正则项权重,用来对特征选择阶段的特征稀疏性添加约束。越大,则特征选择越稀疏。

基本学习参数:

  • Batch size
  • learning rate

模型结构:

  • feature transformer: shared decision layers
  • feature transformer: step-dependent layers

Reference

参考论文

From Softmax to Sparsemax: A Sparse Model of Attention and Multi-Label Classification

参考文章

谷歌发表于ICLR 2020,针对表列数据的注意力可解释深度学习算法

数据挖掘竞赛利器——TabNet模型浅析


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM