偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

TabTransformer轉(zhuǎn)換器提升多層感知機(jī)性能深度解析

譯文 精選
人工智能 機(jī)器學(xué)習(xí)
本文將介紹機(jī)器學(xué)習(xí)中的一種新型的轉(zhuǎn)換器——TabTransformer,并通過(guò)具體的實(shí)例展示該轉(zhuǎn)換器的用法。

?如今,轉(zhuǎn)換器(Transformers)成為大多數(shù)先進(jìn)的自然語(yǔ)言處理(NLP)和計(jì)算機(jī)視覺(jué)(CV)體系結(jié)構(gòu)中的關(guān)鍵模塊。然而,表格式數(shù)據(jù)領(lǐng)域仍然主要以梯度提升決策樹(shù)(GBDT)算法為主導(dǎo)。于是,有人試圖彌合這一差距。其中,第一篇基于轉(zhuǎn)換器的表格數(shù)據(jù)建模論文是由Huang等人于2020年發(fā)表的論文《TabTransformer:使用上下文嵌入的表格數(shù)據(jù)建模》。

本文旨在提供該論文內(nèi)容的基本展示,同時(shí)將深入探討TabTransformer模型的實(shí)現(xiàn)細(xì)節(jié),并向您展示如何針對(duì)我們自己的數(shù)據(jù)來(lái)具體使用TabTransformer。

一、論文概述

上述論文的主要思想是,如果使用轉(zhuǎn)換器將常規(guī)的分類嵌入轉(zhuǎn)換為上下文嵌入,那么,常規(guī)的多層感知器(MLP)的性能將會(huì)得到顯著提高。接下來(lái),讓我們更為深入地理解這一描述。

1.分類嵌入(Categorical Embeddings)

在深度學(xué)習(xí)模型中,使用分類特征的經(jīng)典方法是訓(xùn)練其嵌入性。這意味著,每個(gè)類別值都有一個(gè)唯一的密集型向量表示,并且可以傳遞給下一層。例如,由下圖您可以看到,每個(gè)分類特征都使用一個(gè)四維數(shù)組表示。然后,這些嵌入與數(shù)字特征串聯(lián),并用作MLP的輸入。

圖片

帶有分類嵌入的MLP

2.上下文嵌入(Contextual Embeddings)

論文作者認(rèn)為,分類嵌入缺乏上下文含義,即它們并沒(méi)有對(duì)分類變量之間的任何交互和關(guān)系信息進(jìn)行編碼。為了將嵌入內(nèi)容更加具體化,有人建議使用NLP領(lǐng)域當(dāng)前所使用的轉(zhuǎn)換器來(lái)實(shí)現(xiàn)這一目的。

圖片

TabTransformer轉(zhuǎn)換器中的上下文嵌入

為了以可視化方式形象地展示上述想法,我們不妨考慮下面這個(gè)訓(xùn)練后得到的上下文嵌入圖像。其中,突出顯示了兩個(gè)分類特征:關(guān)系(黑色)和婚姻狀況(藍(lán)色)。這些特征是相關(guān)的;所以,“已婚(Married)”、“丈夫(Husband)”和“妻子(Wife)”的值應(yīng)該在向量空間中彼此接近,即使它們來(lái)自不同的變量。

圖片

經(jīng)訓(xùn)練后的TabTransformer轉(zhuǎn)換器嵌入結(jié)果示例

通過(guò)上圖中經(jīng)過(guò)訓(xùn)練的上下文嵌入結(jié)果,我們可以看到,“已婚(Married)”的婚姻狀況更接近“丈夫(Husband)”和“妻子(Wife)”的關(guān)系水平,而“未結(jié)婚(non-married)”的分類值則來(lái)自右側(cè)的單獨(dú)數(shù)據(jù)簇。這種類型的上下文使這樣的嵌入更加有用,而使用簡(jiǎn)單形式的類別嵌入技術(shù)是不可能實(shí)現(xiàn)這種效果的。

3.TabTransformer架構(gòu)

為了達(dá)到上述目的,論文作者提出了以下架構(gòu):

圖片

TabTransformer轉(zhuǎn)換器架構(gòu)示意圖

(摘取自Huang等人2020年發(fā)表的論文)

我們可以將此體系結(jié)構(gòu)分解為5個(gè)步驟:

  • 標(biāo)準(zhǔn)化數(shù)字特征并向前傳遞
  • 嵌入分類特征
  • 嵌入經(jīng)過(guò)N次轉(zhuǎn)換器塊處理,以便獲得上下文嵌入
  • 把上下文分類嵌入與數(shù)字特征進(jìn)行串聯(lián)
  • 通過(guò)MLP進(jìn)行串聯(lián)獲得所需的預(yù)測(cè)

雖然模型架構(gòu)非常簡(jiǎn)單,但論文作者表示,添加轉(zhuǎn)換器層可以顯著提高計(jì)算性能。當(dāng)然,所有的“魔術(shù)”發(fā)生在這些轉(zhuǎn)換器塊內(nèi)部;所以,接下來(lái)讓我們更加詳細(xì)地研究一下其中的實(shí)現(xiàn)過(guò)程。

4.轉(zhuǎn)換器

圖片

轉(zhuǎn)換器(Transformer)架構(gòu)示意

(選自Vaswani等人于2017年發(fā)表的論文)

您可能以前見(jiàn)過(guò)轉(zhuǎn)換器架構(gòu),但為了快速介紹起見(jiàn),請(qǐng)記住該轉(zhuǎn)換器是由編碼器和解碼器兩部分組成(見(jiàn)上圖)。對(duì)于TabTransformer,我們只關(guān)心將輸入的嵌入內(nèi)容上下文化的編碼器部分(解碼器部分將這些嵌入內(nèi)容轉(zhuǎn)換為最終輸出結(jié)果)。但它到底是如何做到的呢?答案是——多頭注意力機(jī)制。

5.多頭注意力機(jī)制(Multi-head-attention)

引用我最喜歡的關(guān)于注意力機(jī)制的文章的描述,是這樣的:

“自我關(guān)注(self attention)背后的關(guān)鍵概念是,這種機(jī)制允許神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)如何在輸入序列的各個(gè)片段之間以最好的路由方案進(jìn)行信息調(diào)度?!?/p>

換句話說(shuō),自我關(guān)注(self-attention)有助于模型找出在表示某個(gè)單詞/類別時(shí),輸入的哪些部分更重要,哪些部分相對(duì)不重要。為此,我強(qiáng)烈建議您閱讀一下上面引用的這篇文章,以便對(duì)自我關(guān)注為什么如此有效有一個(gè)更為直觀的理解。

圖片

多頭注意力機(jī)制

(選自Vaswani等人于2017年發(fā)表的論文)

注意力是通過(guò)3個(gè)學(xué)習(xí)過(guò)的矩陣來(lái)計(jì)算的——Q、K和V,它們代表查詢(Query)、鍵(Key)和值(Value)。首先,我們將矩陣Q和K相乘得到注意力矩陣。該矩陣被縮放并通過(guò)softmax層傳遞。然后,我們將其乘以V矩陣,得出最終值。為了更直觀地理解起見(jiàn),請(qǐng)考慮下面的示意圖,它顯示了我們?nèi)绾问褂镁仃嘠、K和V實(shí)現(xiàn)從輸入嵌入轉(zhuǎn)換到上下文嵌入。

圖片

自我關(guān)注流程可視化

通過(guò)重復(fù)該過(guò)程h次(使用不同的Q、K、V矩陣),我們就能夠得到多個(gè)上下文嵌入,它們形成我們最終的多頭注意力。

6.簡(jiǎn)短回顧

讓我們總結(jié)一下上面所介紹的內(nèi)容:

  • 簡(jiǎn)單的分類嵌入不包含上下文信息
  • 通過(guò)轉(zhuǎn)換器編碼器傳遞分類嵌入,我們就能夠?qū)⑶度肷舷挛幕?/li>
  • 轉(zhuǎn)換器部分能夠?qū)⑶度肷舷挛幕驗(yàn)樗褂昧硕囝^注意力機(jī)制
  • 多頭注意力機(jī)制在編碼變量時(shí)使用矩陣Q、K和V來(lái)尋找有用的相互作用和相關(guān)性信息
  • 在TabTransformer中,被上下文化的嵌入與數(shù)字輸入相串聯(lián),并通過(guò)一個(gè)簡(jiǎn)單的MLP輸出預(yù)測(cè)

雖然TabTransformer背后的想法很簡(jiǎn)單,但您可能需要一些時(shí)間才能掌握注意力機(jī)制。因此,我強(qiáng)烈建議您重新閱讀以上解釋。如果您感到有些迷茫,請(qǐng)認(rèn)真閱讀本文中所有建議的鏈接相關(guān)內(nèi)容。我保證,做到這些后,您就不難搞明白注意力機(jī)制的原理了。

7.試驗(yàn)結(jié)果展示

圖片

結(jié)果數(shù)據(jù)(選自Huang等人2020年發(fā)表的論文)

根據(jù)報(bào)告的結(jié)果,TabTransformer轉(zhuǎn)換器優(yōu)于所有其他深度學(xué)習(xí)表格模型,此外,它接近GBDT的性能水平,這非常令人鼓舞。該模型對(duì)缺失數(shù)據(jù)和噪聲數(shù)據(jù)也相對(duì)穩(wěn)健,并且在半監(jiān)督環(huán)境下優(yōu)于其他模型。然而,這些數(shù)據(jù)集顯然不是詳盡無(wú)遺的,正如以后發(fā)表的一些相關(guān)論文所證實(shí)的那樣,仍有很大的改進(jìn)空間。

二、構(gòu)建我們自己的示例程序

現(xiàn)在,讓我們最終來(lái)確定一下如何將模型應(yīng)用于我們自己的數(shù)據(jù)。接下來(lái)的示例數(shù)據(jù)取自著名的Tabular Playground Kaggle比賽。為了方便使用TabTransformer轉(zhuǎn)換器,我創(chuàng)建了一個(gè)tabtransformertf包。它可以使用如下pip命令進(jìn)行安裝:

pip install tabtransformertf

并允許我們使用該模型,而無(wú)需進(jìn)行大量預(yù)處理。

1.數(shù)據(jù)預(yù)處理

第一步是設(shè)置適當(dāng)?shù)臄?shù)據(jù)類型,并將我們的訓(xùn)練和驗(yàn)證數(shù)據(jù)轉(zhuǎn)換為TF數(shù)據(jù)集。其中,前面安裝的軟件包中就提供了一個(gè)很好的實(shí)用程序可以做到這一點(diǎn)。

from tabtransformertf.utils.preprocessing import df_to_dataset, build_categorical_prep

# 設(shè)置數(shù)據(jù)類型
train_data[CATEGORICAL_FEATURES] = train_data[CATEGORICAL_FEATURES].astype(str)
val_data[CATEGORICAL_FEATURES] = val_data[CATEGORICAL_FEATURES].astype(str)

train_data[NUMERIC_FEATURES] = train_data[NUMERIC_FEATURES].astype(float)
val_data[NUMERIC_FEATURES] = val_data[NUMERIC_FEATURES].astype(float)

# 轉(zhuǎn)換成TF數(shù)據(jù)集
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)

下一步是為分類數(shù)據(jù)準(zhǔn)備預(yù)處理層。該分類數(shù)據(jù)稍后將被傳遞給我們的主模型。

from tabtransformertf.utils.preprocessing import build_categorical_prep

category_prep_layers = build_categorical_prep(train_data, CATEGORICAL_FEATURES)

# 輸出結(jié)果是一個(gè)字典結(jié)構(gòu),其中鍵部分是特征名稱,值部分是StringLookup層
# category_prep_layers ->
# {'product_code': <keras.layers.preprocessing.string_lookup.StringLookup at 0x7f05d28ee4e0>,
# 'attribute_0': <keras.layers.preprocessing.string_lookup.StringLookup at 0x7f05ca4fb908>,
# 'attribute_1': <keras.layers.preprocessing.string_lookup.StringLookup at 0x7f05ca4da5f8>}

這就是預(yù)處理!現(xiàn)在,我們可以開(kāi)始構(gòu)建模型了。

2.構(gòu)建TabTransformer模型

初始化模型很容易。其中,有幾個(gè)參數(shù)需要指定,但最重要的幾個(gè)參數(shù)是:embeding_dim、depth和heads。所有參數(shù)都是在超參數(shù)調(diào)整后選擇的。

from tabtransformertf.models.tabtransformer import TabTransformer

tabtransformer = TabTransformer(
numerical_features = NUMERIC_FEATURES, # 帶有數(shù)字特征名稱的列表
categorical_features = CATEGORICAL_FEATURES, # 帶有分類特征名稱的列表
categorical_lookup=category_prep_layers, # 帶StringLookup層的Dict
numerical_discretisers=None, # None代表我們只是簡(jiǎn)單地傳遞數(shù)字特征
embedding_dim=32, # 嵌入維數(shù)
out_dim=1, # Dimensionality of output (binary task)
out_activatinotallow='sigmoid', # 輸出層激活
depth=4, # 轉(zhuǎn)換器塊層的個(gè)數(shù)
heads=8, # 轉(zhuǎn)換器塊中注意力頭的個(gè)數(shù)
attn_dropout=0.1, # 在轉(zhuǎn)換器塊中的丟棄率
ff_dropout=0.1, # 在最后MLP中的丟棄率
mlp_hidden_factors=[2, 4], # 我們?yōu)槊恳粚觿澐肿罱K嵌入的因子
use_column_embedding=True, #如果我們想使用列嵌入,設(shè)置此項(xiàng)為真
)

# 模型運(yùn)行中摘要輸出:
# 總參數(shù)個(gè)數(shù): 1,778,884
# 可訓(xùn)練的參數(shù)個(gè)數(shù): 1,774,064
# 不可訓(xùn)練的參數(shù)個(gè)數(shù): 4,820

模型初始化后,我們可以像任何其他Keras模型一樣安裝它。訓(xùn)練參數(shù)也可以調(diào)整,所以可以隨意調(diào)整學(xué)習(xí)速度和提前停止。

LEARNING_RATE = 0.0001
WEIGHT_DECAY = 0.0001
NUM_EPOCHS = 1000

optimizer = tfa.optimizers.AdamW(
learning_rate=LEARNING_RATE, weight_decay=WEIGHT_DECAY
)

tabtransformer.compile(
optimizer = optimizer,
loss = tf.keras.losses.BinaryCrossentropy(),
metrics= [tf.keras.metrics.AUC(name="PR AUC", curve='PR')],
)

out_file = './tabTransformerBasic'
checkpoint = 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.評(píng)價(jià)

競(jìng)賽中最關(guān)鍵的指標(biāo)是ROC AUC。因此,讓我們將其與PR AUC指標(biāo)一起輸出來(lái)評(píng)估一下模型的性能。

val_preds = tabtransformer.predict(val_dataset)

print(f"PR AUC: {average_precision_score(val_data['isFraud'], val_preds.ravel())}")
print(f"ROC AUC: {roc_auc_score(val_data['isFraud'], val_preds.ravel())}")

# PR AUC: 0.26
# ROC AUC: 0.58

您也可以自己給測(cè)試集評(píng)分,然后將結(jié)果值提交給Kaggle官方。我現(xiàn)在選擇的這個(gè)解決方案使我躋身前35%,這并不壞,但也不太好。那么,為什么TabTransfromer在上述方案中表現(xiàn)不佳呢?可能有以下幾個(gè)原因:

  • 數(shù)據(jù)集太小,而深度學(xué)習(xí)模型以需要大量數(shù)據(jù)著稱
  • TabTransformer很容易在表格式數(shù)據(jù)示例領(lǐng)域出現(xiàn)過(guò)擬合
  • 沒(méi)有足夠的分類特征使模型有用

三、結(jié)論

本文探討了TabTransformer背后的主要思想,并展示了如何使用Tabtransformertf包來(lái)具體應(yīng)用此轉(zhuǎn)換器。

歸納起來(lái)看,TabTransformer的確是一種有趣的體系結(jié)構(gòu),它在當(dāng)時(shí)的表現(xiàn)明顯優(yōu)于大多數(shù)深度表格模型。它的主要優(yōu)點(diǎn)是將分類嵌入語(yǔ)境化,從而增強(qiáng)其表達(dá)能力。它使用在分類特征上的多頭注意力機(jī)制來(lái)實(shí)現(xiàn)這一點(diǎn),而這是在表格數(shù)據(jù)領(lǐng)域使用轉(zhuǎn)換器的第一個(gè)應(yīng)用實(shí)例。

TabTransformer體系結(jié)構(gòu)的一個(gè)明顯缺點(diǎn)是,數(shù)字特征被簡(jiǎn)單地傳遞到最終的MLP層。因此,它們沒(méi)有語(yǔ)境化,它們的價(jià)值也沒(méi)有在分類嵌入中得到解釋。在下一篇文章中,我將探討如何修復(fù)此缺陷并進(jìn)一步提高性能。

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。

原文鏈接:https://towardsdatascience.com/transformers-for-tabular-data-tabtransformer-deep-dive-5fb2438da820?source=collection_home---------4----------------------------

責(zé)任編輯:武曉燕 來(lái)源: 51CTO技術(shù)棧
相關(guān)推薦

2010-02-04 10:05:28

Dalvik虛擬機(jī)

2020-10-14 10:25:20

深度學(xué)習(xí)機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2017-04-14 08:58:55

深度學(xué)習(xí)感知機(jī)深度網(wǎng)絡(luò)

2013-06-13 15:10:27

.NET代碼轉(zhuǎn)換

2010-06-10 14:44:33

協(xié)議轉(zhuǎn)換器

2010-06-10 14:33:03

協(xié)議轉(zhuǎn)換器

2010-06-10 15:03:13

協(xié)議轉(zhuǎn)換器

2020-09-08 13:02:00

Python神經(jīng)網(wǎng)絡(luò)感知器

2009-12-28 13:38:35

WPF類型轉(zhuǎn)換器

2021-09-04 17:26:31

SpringBoot轉(zhuǎn)換器參數(shù)

2016-10-25 13:46:25

深度學(xué)習(xí)機(jī)器學(xué)習(xí)性能提升

2025-03-06 10:41:32

2010-06-10 14:49:07

協(xié)議轉(zhuǎn)換器

2010-06-10 14:38:30

協(xié)議轉(zhuǎn)換器

2021-09-08 07:44:26

人工智能keras神經(jīng)網(wǎng)絡(luò)

2009-09-11 12:41:41

C#類型轉(zhuǎn)換

2024-05-11 08:47:36

Python工具裝飾器

2012-04-19 09:46:48

敏捷開(kāi)發(fā)大型機(jī)

2012-04-26 10:45:24

敏捷開(kāi)發(fā)

2014-01-13 09:47:35

虛擬機(jī)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)