使用 Transformers 進(jìn)行圖分類(lèi)

在之前的博文中,我們探討了圖機(jī)器學(xué)習(xí)的一些理論知識(shí)。這一篇我們將探索如何使用 Transformers 庫(kù)進(jìn)行圖分類(lèi)。(你也可以從 此處 下載演示 notebook,跟著一起做!)
目前,Transformers 中唯一可用的圖 transformer 模型是微軟的 Graphormer,因此本文的例子將會(huì)基于該模型。我們期待看到大家會(huì)使用并集成哪些其他模型進(jìn) ??。
軟件
要學(xué)習(xí)本教程,需要安裝?datasets
?和 ?transformers
?(版本號(hào) >= 4.27.2),你可以使用?pip install -U datasets transformers
?來(lái)安裝。
數(shù)據(jù)
你可以使用自己的圖數(shù)據(jù)集,也可以使用 Hub 上已有的數(shù)據(jù)集。本文我們主要使用已有的數(shù)據(jù)集,你也可以隨時(shí) 添加你的數(shù)據(jù)集 到 Hugging Face!
數(shù)據(jù)加載
從 Hub 加載圖數(shù)據(jù)集非常簡(jiǎn)單。這里,我們加載 OGB 庫(kù)中的?ogbg-mohiv
?數(shù)據(jù)集 (該數(shù)據(jù)集是斯坦福 開(kāi)放圖基準(zhǔn) (Open Graph Benchmark,OGB) ?的一部分):
這個(gè)數(shù)據(jù)集含三個(gè)拆分,train
?、validation
?和?test
,所有這些拆分每一行都表示一個(gè)圖,每個(gè)圖包含 5 個(gè)數(shù)據(jù)列 (edge_index
、edge_attr
、y
、num_nodes
、node_feat
),你可以通過(guò)執(zhí)行?print(dataset)
?來(lái)查看。
如果你還安裝了其他圖處理庫(kù),你還可以用這些庫(kù)把圖可視化出來(lái),并進(jìn)一步檢查數(shù)據(jù)集。例如,使用 PyGeometric 和 matplotlib:
格式
在 Hub 上,圖數(shù)據(jù)集主要存儲(chǔ)為圖列表形式 (使用?jsonl
?格式)。
單個(gè)圖表示為一個(gè)字典,以下是我們圖分類(lèi)數(shù)據(jù)集的理想格式:
edge_index
?包含圖上每條邊對(duì)應(yīng)的節(jié)點(diǎn) ID,存儲(chǔ)為包含兩個(gè)節(jié)點(diǎn)列表
的列表 (即由一個(gè)源節(jié)點(diǎn)列表和一個(gè)目的節(jié)點(diǎn)列表組成的列表)。類(lèi)型: 2 個(gè)整數(shù)列表的列表。
示例: 包含四個(gè)節(jié)點(diǎn) (0、1、2 和 3) 且連接為 1->2、1->3 和 3->1 的圖將具有?
edge_index = [[1, 1, 3]、[2、3、1]]
。你可能會(huì)注意到此處不存在節(jié)點(diǎn) 0,因?yàn)樵诒緮?shù)據(jù)中它與其他節(jié)點(diǎn)無(wú)邊連接。這就是下一個(gè)屬性很重要的原因。num_nodes
?表示圖中可用節(jié)點(diǎn)的數(shù)目 (默認(rèn)情況下,假定節(jié)點(diǎn)按順序編號(hào))。類(lèi)型: 整數(shù)
示例: 在上例中,
num_nodes = 4
。y
?每個(gè)圖的預(yù)測(cè)標(biāo)簽 (可以是類(lèi)、屬性值或是不同任務(wù)的多個(gè)二分類(lèi)標(biāo)簽)。Type: 整數(shù)列表 (用于多分類(lèi)) 、浮點(diǎn)數(shù) (用于回歸) 或 0/1 列表 (用于二元多任務(wù)分類(lèi))
示例: 我們可以預(yù)測(cè)圖規(guī)模 (小 = 0,中 = 1,大 = 2)。本例中,
y = [0]
。node_feat
?包含圖中每個(gè)節(jié)點(diǎn)的可用特征 (如果存在),按節(jié)點(diǎn) ID 排序。類(lèi)型: 整數(shù)列表的列表 (可選)
例子: 如上例中的節(jié)點(diǎn)可以有一些類(lèi)型特征 (就像分子圖中的節(jié)點(diǎn)是不同的原子,不同的原子有不同的類(lèi)型一樣)。打比方,本例中?
node_feat = [[1], [0], [1], [1]]
。edge_attr
?包含圖中每條邊的可用屬性 (如果存在),按?edge_index
?排序。類(lèi)型: 整數(shù)列表的列表 (可選)
例子: 仍使用上例,邊也可以有類(lèi)型 (如分子中的鍵),如 edge_attr = [[0], [1], [1]]`。
預(yù)處理
圖 transformer 框架通常需要根據(jù)數(shù)據(jù)集進(jìn)行特定的預(yù)處理,以生成有助于目標(biāo)學(xué)習(xí)任務(wù) (在我們的案例中為分類(lèi)) 的特征和屬性。在這里,我們使用?Graphormer
?的默認(rèn)預(yù)處理,它生成進(jìn)度/出度信息、節(jié)點(diǎn)間的最短路徑以及模型感興趣的其他屬性。
我們也可以在?DataCollator
?的參數(shù)中動(dòng)態(tài)進(jìn)行預(yù)處理 (通過(guò)將?on_the_fly_processing
設(shè)置為 True)。但并非所有數(shù)據(jù)集都像?ogbg-molhiv
?那樣小,對(duì)于大圖,動(dòng)態(tài)預(yù)處理成本太高,因此需要預(yù)先進(jìn)行預(yù)處理,并存儲(chǔ)預(yù)處理后的數(shù)據(jù)供后續(xù)訓(xùn)練實(shí)驗(yàn)使用。
模型
模型加載
這里,我們加載一個(gè)已有的預(yù)訓(xùn)練模型及其 checkpoint 并在我們的下游任務(wù)上對(duì)其進(jìn)行微調(diào),該任務(wù)是一個(gè)二分類(lèi)任務(wù) (因此?num_classes = 2
)。我們還可以在回歸任務(wù) (num_classes = 1
) 或多任務(wù)分類(lèi)上微調(diào)我們的模型。
我們來(lái)看下細(xì)節(jié)。
在代碼中調(diào)用?from_pretrained
?方法來(lái)下載并緩存模型權(quán)重。由于類(lèi)的數(shù)量 (用于預(yù)測(cè)) 取決于數(shù)據(jù)集,我們將新的?num_classes
?和?ignore_mismatched_sizes
?與?model_checkpoint
?一起傳給該函數(shù)。這會(huì)觸發(fā)函數(shù)創(chuàng)建一個(gè)自定義的、特定于該下游任務(wù)的分類(lèi)頭,這個(gè)頭與原模型中的解碼器頭很可能是不同的。
我們也可以創(chuàng)建一個(gè)新的隨機(jī)初始化的模型來(lái)從頭開(kāi)始訓(xùn)練,此時(shí),我們既可以復(fù)用給定檢查點(diǎn)的超參配置,也可以自己手動(dòng)選擇超參配置。
訓(xùn)練或微調(diào)
為了簡(jiǎn)化模型訓(xùn)練,我們使用?Trainer
。我們需要定義訓(xùn)練相關(guān)的配置以及評(píng)估指標(biāo)來(lái)實(shí)例化?Trainer
。我們主要使用?TrainingArguments
類(lèi),這是一個(gè)包含所有配置項(xiàng)的類(lèi),用于定制訓(xùn)練配置。我們要給它一個(gè)文件夾名稱(chēng),用于保存模型的 checkpoint。
對(duì)于圖數(shù)據(jù)集,調(diào)整 batch size 和梯度累積步數(shù)來(lái)保證有效 batch size 夠大同時(shí)又要避免內(nèi)存不足,這件事尤為重要。
最后一個(gè)參數(shù)?push_to_hub
?允許?Trainer
?在訓(xùn)練期間定期將模型推送到 Hub,這個(gè)通常由保存步長(zhǎng)來(lái)決定。
在用于圖分類(lèi)的?Trainer
?中,對(duì)給定的圖數(shù)據(jù)集使用正確的數(shù)據(jù)整理器 (data collator) 很重要,這個(gè)數(shù)據(jù)整理器會(huì)將圖轉(zhuǎn)換為用于訓(xùn)練的 batch 數(shù)據(jù)。
訓(xùn)練完后,可以使用?push_to_hub
?將模型與所有其他訓(xùn)練相關(guān)信息一起保存到 hub。
由于此模型比較大,因此在 CPU (Intel Core i7) 上訓(xùn)練/微調(diào) 20 個(gè) epoch 大約需要一天時(shí)間。想要更快點(diǎn)的話,你可以使用強(qiáng)大的 GPU 和并行化方法,你只需在 Colab notebook 中或直接在你選擇的其他集群上啟動(dòng)代碼即可。
結(jié)束語(yǔ)
現(xiàn)在你已經(jīng)知道如何使用?transformers
?來(lái)訓(xùn)練圖分類(lèi)模型,我們希望你嘗試在 Hub 上分享你最喜歡的圖 transformer 模型的 checkpoints、模型以及數(shù)據(jù)集,以供社區(qū)的其他人使用!
英文原文:?https://hf.co/blog/graphml-classification
作者: Clémentine Fourrier
譯者: Matrix Yao (姚偉峰),英特爾深度學(xué)習(xí)工程師,工作方向?yàn)?transformer-family 模型在各模態(tài)數(shù)據(jù)上的應(yīng)用及大規(guī)模模型的訓(xùn)練推理。
排版/審校: zhongdongy (阿東)