当前位置: 首页 > 科技观察

TabTransformerTransformer提升多层感知器性能深度分析_0

时间:2023-03-12 06:58:19 科技观察

如今,Transformer(变形金刚)是最先进的自然语言处理(NLP)和计算机视觉(CV)架构中的关键构建块。然而,表格数据领域仍然主要由梯度提升决策树(GBDT)算法主导。因此,有些人试图弥合这一差距。其中,第一篇基于Transformer的表格数据建模论文是Huang等人发表的论文《TabTransformer:使用上下文嵌入的表格数据建模》。在2020年。本文旨在提供论文内容的基本介绍,同时深入挖掘TabTransformer模型的实现细节,并向您展示如何专门针对我们自己的数据使用TabTransformer。1.论文概述上述论文的主要思想是,如果使用转换器将常规分类嵌入转换为上下文嵌入,则可以显着提高常规多层感知器(MLP)的性能。接下来,让我们更深入地了解一下这段描述。1.CategoricalEmbeddings(分类嵌入)在深度学习模型中,使用分类特征的经典方法是训练它们的嵌入。这意味着,每个类值都有一个独特的密集向量表示,可以传递到下一层。例如,如下图所示,每个分类特征都由一个4维数组表示。然后将这些嵌入与数字特征连接起来并用作MLP的输入。具有分类嵌入的MLP2。上下文嵌入根据该论文的作者,分类嵌入缺乏上下文意义,即它们不编码分类变量之间的任何交互和关系信息。为了使嵌入更具体,建议使用NLP领域目前为此目的使用的转换器。TabTransformer中的上下文嵌入为了形象化上述想法,请考虑下图训练后的上下文嵌入。其中,突出显示了两个分类特征:关系(黑色)和婚姻状况(蓝色)。这些特征是相关的;因此,“已婚”、“丈夫”和“妻子”的值在向量空间中应该彼此接近,即使它们来自不同的变量。训练好的TabTransformerTransformer的embedding结果示例通过上图训练好的contextembedding结果,我们可以看出“已婚”的婚姻状态更接近于“丈夫”和“妻子”。",而“未婚”的分类值来自右侧的单独集群。这种类型的上下文使此类嵌入更有用,这对于简单形式的类别嵌入技术来说是不可能的。3.TabTransformer架构为了实现上述目标,论文作者提出了如下架构:TabTransformer转换器架构图(摘自Huang等人2020年发表的论文)。我们可以将该体系结构分解为5个步骤:标准化数字特征和通过变换器块前向传递分类特征嵌入N次以获得上下文嵌入将上下文分类嵌入与数字特征连接将所需的预测与MLP连接虽然模型架构非常简单,作者表示添加transformations控制器层可以显着提高计算性能。当然,所有的“魔法”都发生在这些转换器块中;所以让我们仔细看看它是如何实现的。4.TransformerArchitectureSchematic(来自Vaswanietal.2017paper)你可能以前见过Transformer架构,但为了快速介绍,请记住Transformer由编码器和解码器两部分组成(见上文)。对于TabTransformer,我们只关心将输入嵌入上下文化的编码器部分(以及将这些嵌入转换为最终输出的解码器部分)。但它究竟是如何做到的呢?答案是——多头注意力机制。5.Multi-head-attention引用我最喜欢的关于注意力机制的文章,它是这样的:“self-attention背后的关键概念是这种机制允许神经网络学习如何用最佳路由方案在各段之间调度信息输入序列。”换句话说,self-attention帮助模型弄清楚哪些输入代表某个词/类别,哪些部分更重要,哪些部分相对不重要。为此,我强烈建议阅读上面引用的文章以获得更直观的理解为什么self-focus效果这么好。多头注意力机制(选自Vaswani等人2017年发表的论文)注意力是通过3个学习矩阵——Q、K和V来计算的,它们代表查询(Query)、键(Key)和Value。首先,我们将矩阵Q和K相乘得到attention矩阵。这个矩阵被缩放并通过一个softmax层。然后我们将它与V矩阵相乘得到最终的为了更直观的理解,请考虑下面的示意图,它显示了我们如何使用矩阵Q、K和V来实现从输入嵌入到上下文嵌入的转换。自注意力过程可视化通过重复此过程h次(使用不同的Q、K、V矩阵),我们能够获得多个上下文嵌入,从而形成我们最终的多头注意力。6.简短回顾让我们总结一下上面的内容:简单的分类嵌入不包含上下文信息通过变换器编码器传递分类嵌入,我们能够将嵌入上下文化变换器部分能够将嵌入上下文化,因为它使用了多头注意机制使用矩阵Q、K和V在编码变量时找到有用的交互和相关信息。在TabTransformer中,contextualizedembedding与数字输入连接起来,并传递一个简单的MLP输出预测虽然TabTransformer背后的想法很简单,但您可能需要一些时间来掌握注意力机制。因此,我强烈建议您重新阅读上面的解释。如果您感到有点迷茫,请通读本文中所有建议的链接相关内容。我保证做完这些,你理解注意力机制的原理就不难了。7.实验结果展示结果数据(选自Huangetal.2020发表的论文)从报告结果来看,TabTransformertransformer优于所有其他深度学习表格模型,而且接近GBDT的性能水平,这是非常鼓舞人心的。该模型对于缺失数据和噪声数据也相对稳健,并且在半监督设置中优于其他模型。然而,这些数据集显然并不详尽,还有很大的改进空间,正如后来发表的一些相关论文所证实的那样。2.构建我们自己的示例程序现在,让我们最终弄清楚如何将模型应用于我们自己的数据。以下示例数据取自著名的TabularPlaygroundKaggle竞赛。为了方便使用TabTransformer转换器,我创建了一个tabtransformertf包。它可以使用pip命令安装,如下所示:pipinstalltabtransformertf并允许我们在不进行大量预处理的情况下使用该模型。1.数据预处理第一步是设置合适的数据类型,将我们的训练和验证数据转换为TF数据集。其中,有一个很好的实用程序可以在之前安装的包中执行此操作。来自tabtransformertf.utils.preprocessing导入df_to_dataset,build_categorical_prep#train_data[cancororical_features]=triar_data[cancorical_features].asty_astype(str).astype(float)val_data[NUMERIC_FEATURES]=val_data[NUMERIC_FEATURES].astype(float)#转换为TF数据集train_dataset=df_to_dataset(train_data[FEATURES+[LABEL]],LABEL,batch_size=1024)val_dataset=df_to_dataset(val_data[FEATURES+[LABEL]],LABEL,shuffle=False,batch_size=1024)下一步是为分类数据准备预处理层。该分类数据稍后将传递给我们的主模型。fromtabtransformertf.utils.preprocessingimportbuild_categorical_prepcategory_prep_layers=build_categorical_prep(train_data,CATEGORICAL_FEATURES)#输出结果为字典结构,key部分为特征名称,value部分为StringLookup层#category_prep_layers->#{'product_code':,#'attribute_0':,#'attribute_1':处理!现在,我们可以开始构建模型了。2.易于构建TabTransformer模型和初始化模型。其中,有几个参数需要指定,但最重要的参数是:embedding_dim、depth和heads。所有参数都是在超参数调整后选择的。fromtabtransformertf.models.tabtransformerimportTabTransformertabtransformer=TabTransformer(numerical_features=NUM??ERIC_FEATURES,#带有数字特征名称的列表categorical_features=CATEGORICAL_FEATURES,#带有分类特征名称的列表categorical_lookup=category_prep_layers,#DictStringLookup层与DictStringNumerical_present简单地传递digital_present2特征,#嵌入维度out_dim=1,#输出维度(二进制任务)out_activatinotallow='sigmoid',#输出层激活深度=4,#转换器块层数heads=8,#转换器块中注意力头的数量attn_dropout=0.1,#converterblock中的dropoutrateff_dropout=0.1,#最终MLP中的dropoutratemlp_hidden_??factors=[2,4],#Wedividethefinalembeddingfactorforeachlayeruse_column_embedding=True,#Ifwewant要使用列嵌入,请将其设置为true)#模型运行期间的摘要输出:#Totalnumberofparameters:1,778,884#Numberoftrainableparameters:1,774,064#Numberofnon-trainableparameters:4,820模型初始化后,我们可以像其他Keras模型一样拟合它。训练参数也是可调的,所以学习率和早停可以随意调整。LEARNING_RATE=0.0001WEIGHT_DECAY=0.0001NUM_EPOCHS=1000optimizer=tfa.optimizers.AdamW(learning_rate=LEARNING_RATE,weight_decay=WEIGHT_DECAY)tabtransformer.compile(optimizer=optimizer,lossary=tf.kerasin.losses.metrics.AUC(name="PRAUC"),curve='PR')],)out_file='./tabTransformerBasic'检查点=ModelCheckpoint(out_file,mnotallow="val_loss",verbose=1,save_best_notallow=True,mode="min")early=EarlyStopping(mnotallow="val_loss",mode="min",patience=10,restore_best_weights=True)callback_list=[checkpoint,early]history=tabtransformer.fit(train_dataset,epochs=NUM_EPOCHS,validation_data=val_dataset,callbacks=callback_list)3.最关键的指标参加评测比赛的是ROCAUC。因此,让我们将其与PRAUC指标一起输出,以评估模型的性能。val_preds=tabtransformer.predict(val_dataset)print(f"PRAUC:{average_precision_score(val_data['isFraud'],val_preds.ravel())}")print(f"ROCAUC:{roc_auc_score(val_data['isFraud'],val_preds.ravel())}")#PRAUC:0.26#ROCAUC:0.58也可以自己对测试集打分,然后将结果值提交给Kaggle官方。我现在选择的这个解决方案让我进入了前35%,这不错,但也不是很好。那么,为什么TabTransfromer在上述场景中表现不佳呢?可能有几个原因:数据集太小,深度学习模型以需要大量数据而著称。TabTransformer在表格数据示例领域容易出现过拟合。没有足够的分类特征使模型有用。3.结论本文探讨了TabTransformer的背景主要思想并展示了如何使用Tabtransformertf包来具体应用此转换器。综上所述,TabTransformer确实是一个有趣的架构,其性能明显优于当时大多数深度表格模型。它的主要优点是将分类学嵌入到语境化中,从而增强了它的表达能力。它使用分类特征的多头注意机制来做到这一点,这是转换器在表格数据领域的首次应用。TabTransformer架构的一个明显缺点是数值特征只是简单地传递到最终的MLP层。因此,它们没有语境化,它们的价值也没有在分类嵌入中考虑。在下一篇文章中,我将探讨如何修复此缺陷并进一步提高性能。译者介绍朱宪忠,社区编辑,专家博主,讲师,潍坊某高校计算机教师,自由编程资深人士。原文链接:https://towardsdatascience.com/transformers-for-tabular-data-tabtransformer-deep-dive-5fb2438da820?source=collection_home--------4------------------------------