原項目連結:fork一下即可:https://aistudio.baidu.com/aistudio/projectdetail/5096910?contributionType=1
1.1 OGB概述
如何進一步推進圖學習的研究呢?從曆史上看,高品質和大規模的資料集在推進研究中發揮了重要的作用,例如計算機視覺領域的IMAGENET、MS COCO,自然語言處理領域的GLUE BENCHMARK、SQUAD,語言處理領域的LIBRISPEECH、CHIME等。但是,目前在圖學習研究中常用的資料集和評估程式可能會對未來的發展産生負面影響。
目前基準資料集存在的問題:
與實際應用中的圖像相比,大多數常用資料集都非常小。例如廣泛使用的Cora、Citeseer、Pubmed資料集,在節點分類任務中隻用2700至20000個節點。由于在這些小型資料集上廣泛開發了模型,是以大多數模型都無法擴充到較大的範圍;其次,較小的資料集很難去嚴格地評估需要大量資料的模型,例如圖神經網絡(GNNs)。 沒有統一且通常遵循的實驗協定。不同的研究采用自己的資料集劃分、評估名額和交叉驗證協定,是以比較各種研究報告的成績具有挑戰性。
另外,許多研究使用随機分割來生成train /test sets,這對于真實世界的應用是不現實的或無用的,并且通常導緻過于樂觀的性能結果。 是以,迫切需要一套完整的現實世界基準測試套件,該套件将來自不同領域的各種大小的資料集組合在一起。資料拆分以及評估名額很重要,是以可以以一緻且可重複的方式衡量進度。最後,基準測試還需要提供不同類型的任務,例如節點分類,連結預測和圖分類。OGB就這樣應運而生。
開放圖譜基準 (OGB) 是圖機器學習的基準資料集、資料加載器和評估器的集合。資料集涵蓋各種圖形機器學習任務和實際應用。OGB旨在提供涵蓋重要圖機器學習任務、多樣化資料集規模和豐富領域的圖資料集。
論文連結:https://arxiv.org/abs/2005.00687 OGB官網:https://ogb.stanford.edu/ GitHub位址:https://github.com/snap-stanford/ogb
- Graph ML Tasks: 涵蓋了三個基本的圖機器學習任務:節點屬性預測,連結屬性預測,圖屬性預測。
- Diverse scale: 小型圖形資料集可以在單個 GPU 中處理,而中型和大型圖形可能需要多個 GPU 或巧妙地采樣/分區技術。分為small、medium、large三個規模,具體為small:超過10萬個節點和超過100萬條邊;medium:超過100萬個節點或超過1000萬條邊;large:大約1億個節點或10億條邊。
- Rich domains: 圖資料集來自從科學領域到社會/資訊網絡的不同領域,還包括異構知識圖譜。nature:包含生物網絡和分子圖;society:包含學術圖和電子商務網絡;information:包含知識圖譜等。
看一下 OGB 現在包含的資料集和資料集的統計明細:
1.2 OGB資料集簡介
1.2.1 OGB節點屬性預測
ogbn-products:亞馬遜産品共同購買網絡。
- 節點代表在Amazon銷售的産品,兩個産品之間的邊表示産品是一起購買的。節點特征是通過從産品描述中提取詞袋特征來生成的,然後進行主成分分析将次元減小到100。
- 預測任務:在多類别分類設定中預測産品的類别,其中有47個頂級類别用于目标标簽。
- 資料集劃分:使用銷售排名(受歡迎程度)将節點劃分為訓練/驗證/測試集,根據産品的銷售排名對産品進行排序,并使用前10%作為訓練集,然後使用前2%作為驗證集,其餘用于測試集。
ogbn-proteins:蛋白質關聯網絡
- 節點代表蛋白質,邊表示蛋白質之間不同類型的有生物學意義的聯系。所有的邊都具有8維特征,其中每個次元表示單個關聯類型的強度,值在0到1之間。這些蛋白質來自8個物種。
- 預測任務:在一個多标簽二進制分類系統中預測蛋白質功能的存在,該系統中總共有112種标簽需要預測。通過112個任務的ROC-AUC分數的平均值來衡量性能。
- 資料集分割:根據蛋白質來源的物種,将蛋白質節點分成訓練/驗證/測試集。
實驗中為了簡單起見,使用傳入邊的平均邊緣特征作為節點特征。
ogbn-arxiv:論文引用網絡
- 每個節點都是一篇Arxiv論文,每條有向邊表示一篇論文引用了另一篇論文。每篇論文都有一個128維的特征向量,它是通過對标題和摘要中單詞的嵌入進行平均得到的。
- 預測任務:預測Arxiv論文的主要類别,這是一個40類的分類問題。
- 資料集分割:考慮一個基于論文發表日期的現實資料分割。建議将2017年及以前發表的論文作為訓練集,将2018年發表的論文作為驗證集,将2019年以後發表的論文作為測試集。
實驗中為了簡單起見,将有向圖轉換為無向圖。從下面的結果可以看出,探索如何考慮邊緣方向資訊以及節點時間資訊(例如論文發表的年份)以提高預測性能将是富有成效的。
ogbn-papers100M:論文引用網絡
- MAG(Microsoft Academic Graph)索引的1.11億篇論文的有向引文圖。此資料集的數量級比任何現有的節點分類資料集大。
- 預測任務:預測在Arxiv中發表的論文的子集的主題領域。有172個Arxiv主題領域,這使預測任務成為172類分類問題。
- 資料集分割:考慮一個基于論文發表日期的現實資料分割。建議将2017年及以前發表的論文作為訓練集,将2018年發表的論文作為驗證集,将2019年以後發表的論文作為測試集。
實驗中為了簡單起見,将有向圖轉換為無向圖。從下面的結果可以看出,SGC嚴重拟合不足,表明使用更具表現力的GNNs可能會同時改善訓練和測試準确性。
ogbn-mag:異構微軟學術圖(MAG)
- 由Microsoft Academic Graph (MAG)的一個子集組成的異構網絡。它包含四種類型的實體(論文、作者、機構和研究領域),以及連接配接兩種類型實體的四種有向關系。每一篇論文具有128維的特征。
- 預測任務:根據給定的内容、參考文獻、作者和作者的隸屬關系來預測每篇論文的會議地點。ogbn-mag中共有349個不同的會議地點,這使得該任務成為349類分類問題。
- 資料集分割:遵循相同的基于時間的政策。用2018年之前發表的所有論文的訓練模型,并用2018年和2019年以後發表的論文分别驗證和測試模型。
對于GCN和GRAPHSAGE,實驗中在同構子圖上應用模型。從下面的結果可以看出嗎,利用圖的異構性質對于在這個資料集上取得良好的性能是至關重要的。
1.2.2 OGB連結屬性預測
ogbl-ppa:蛋白質關聯網絡
- 節點表示來自58個不同物種的蛋白質,邊表示蛋白質之間的生物學上有意義的關聯。每個節點都包含一個58維的one-hot特征向量,該向量訓示相應蛋白質所來自的物種。
- 預測任務:在給定訓練邊的情況下預測新的關聯邊。評估基于模型對positive測試邊勝過negative測試邊的等級。具體來說,針對3,000,000個随機采樣的negative邊對驗證/測試集中的每個positive邊進行排名,并計算排名在第K位或更高(Hits@K)的positive邊的比率。發現K=100是評估模型性能的一個很好的門檻值。
- 資料集分割:根據邊的生物學吞吐量分為訓練/驗證/測試邊。
實驗結果如下所示,GNN訓練效果不佳表明,僅靠GNN無法捕獲的位置資訊對于适應訓練邊并獲得有意義的節點嵌入可能至關重要。
ogbl-collab:作者合作網絡
- 每個節點代表一個作者,邊表示作者之間的合作。 所有節點都具有128維特征,這些特征是通過平均作者發表的論文的詞嵌入獲得的。所有邊都與兩種類型的元資訊相關聯:年份和邊緣權重,代表當年發表的合作論文的數量。
- 預測任務:根據給定的過去合作來預測未來的作者合作關系。評估名額類似于ogbl-ppa,希望該模型将真實協作的等級高于虛假協作。 具體來說,在100,000個随機采樣的negative協作中對每個真實協作進行排名,并計算排名在K位或更高(Hits@K)的positive邊的比率。在初步實驗中,發現K=50是一個很好的門檻值。
- 資料集分割:根據時間拆分資料,以便在協作推薦中模拟實際應用。具體來說,将直到2017年的合作作為訓練邊,将2018年的合作作為驗證邊,并将2019年的合作作為測試邊。
實驗結果如下圖,值得注意的是,MATRIXFACTORIZATION可以達到近乎完美的訓練結果,但是即使應用大量的正則化處理,也無法将良好的結果轉移到驗證和測試拆分中。總體而言,探索将位置資訊注入GNN并開發更好的正則化方法是富有成果的。
ogbl-ddi:藥品互動網絡
- 節點代表FDA準許的或實驗藥物,邊代表藥物之間的互相作用,并且可以解釋為一種現象,其中将兩種藥物合用的聯合效果與預期的藥物彼此獨立起作用的效果有很大不同。
- 預測任務:在已知藥物互相作用的基礎上預測藥物互相作用。評估名額與ogbl-collab相似,希望該模型将真實藥物互相作用的排名高于非互相作用藥物對。具體來說,在大約100,000個随機采樣的negative藥物互相作用中對每個真實藥物互相作用進行排名,并計算在K位或更高(Hits@K)處排名的positive邊緣的比率。在初步實驗中,發現K = 20是一個很好的門檻值。
- 資料集分割:開發了一種蛋白質-靶标拆分,這意味着根據那些藥物在體内靶向的蛋白質來拆分藥物邊緣。
實驗結果如下所示,有趣的是,GNN模型和MATRIXFACTORIZATION方法都比NODE2 VEC獲得了明顯更高的訓練結果。但是,隻有GNN模型才能在某種程度上将這種性能傳遞給測試集,這表明關系資訊對于使模型推廣到看不見的互動作用至關重要。
ogbl-citation:論文引用網絡
- 從MAG提取的論文子集之間的引文網絡,與ogbn-arxiv相似,每個節點都是具有128維WORD2VEC特征的論文,該論文總結了其标題和摘要,并且每個有向邊都表示一篇論文引用了另一篇論文。所有節點還帶有表示相應論文發表年份的元資訊。
- 預測任務:根據給定的現有引用來預測缺少的引用。具體來說,對于每篇原始論文,将随機删除其兩個參考文獻,并且希望模型将缺失的兩個參考文獻的排名高于1,000個negative參考候選集。negetive引用是從源論文未引用的所有先前論文中随機抽取的。評估名額是Mean Reciprocal Rank(MRR),其中針對每份原始論文計算真實參考文獻在negative候選者中的互惠等級,然後取所有原始論文的平均值。
- 資料集分割:為了模拟引文推薦中的實際應用,會根據時間劃分邊緣(例如,使用者正在撰寫一篇新論文,并且已經引用了幾篇現有論文,但希望被推薦為其他參考)。為此,使用最新論文(2019年發表)作為要推薦參考文獻的原始論文。對于每篇原始論文,從參考文獻中删除兩篇——所得到的兩個下降邊(從原始論文指向删除的論文)指向分别用于驗證和測試。 其餘所有邊緣均用于訓練。
從下面的實驗結果可以看出,mini-batch技術的性能要比full-batch差,這與節點分類資料集(例如ogbn-products和ogbn-mag)相反,基于小批量的模型有更強的泛化性能。與用于節點預測的技術不同,這種限制為将小批處理技術應用于連結預測提出了一個獨特的挑戰。
ogbl-wikikg:Wikidata知識圖
- 從Wikidata知識庫中提取的知識圖(KG)。它包含一組三元組邊緣(頭部、關系、尾部)其捕獲了世界各實體之間的不同類型的關系。檢索了Wikidata中的所有關系語句,并過濾掉稀有實體。該KG中包含了2,500,604個實體和535個關系類型。
- 預測任務:在給定訓練邊緣的情況下預測新的三元組邊緣。評估名額遵循KG中廣泛使用的标準過濾名額。具體來說,通過用随機采樣的1,000個negative實體(頭部為500個,尾部為500個)替換其頭部或尾部來破壞每個測試三元組邊緣,同時確定生成的三元組不會出現在KG中。目标是将真實的頭部(或尾部)實體排名高于negative實體,該排名由平均互惠排名(MRR)衡量。
- 資料集分割:根據時間劃分三元組,模拟一個現實的KG完成方案,該方案旨在填充在某個時間戳上不存在的缺失三元組。具體來說,在三個不同的時間戳17(2015年5月,8月和11月)下載下傳了Wikidata,并建構了三個KG,其中僅保留最早出現在5月KG中的實體和關系類型。使用五月 KG中的三元組進行訓練,并使用八月和11月KG中的三元組分别進行驗證和測試。
實驗結果如下表所示,從表的上半部分可以看到,當使用有限的嵌入維數時,COMPLEX在四個基線中表現最佳。從表的下半部分可以看出,随着維數的增加,所有四個模型都能夠在訓練、驗證和測試集上實作更高的MRR。這表明使用足夠大的嵌入維數在此資料集中實作良好性能的重要性。
ogbl-biokg:生物醫學知識圖
- 是一個知識圖(KG),使用了大量生物醫學資料庫中的資料建立了該圖。它包含5種類型的實體:疾病(10,687個節點)、蛋白質(17,499個節點)、藥物(10,533個節點)、副作用(9,969個節點)和蛋白質功能(45,085個節點)。有51種類型的有向關系将兩種類型的實體聯系起來,包括39種藥物互相作用,8種蛋白質互相作用等 。所有關系都被模組化為有向邊,其中連接配接相同實體類型(例如蛋白質-蛋白質,藥物-藥物,功能-功能)的關系始終是對稱的,即邊是雙向的。KG中的三元組來自具有各種置信度級别的來源,包括實驗讀數,人工策劃的注釋以及自動提取的中繼資料。
- 預測任務:在給定訓練三元組的情況下預測新的三元組。評估協定ogbl-wikikg完全相同,這裡隻考慮針對相同類型的實體進行排名。例如,當破壞蛋白質類型的頭部實體時,僅考慮negative蛋白質實體。
- 資料集分割:對于此資料集,采用随機分割。雖然根據時間劃分三元組是一種有吸引力的選擇,但注意到,要獲得有關何時進行三元組的個别實驗和觀察的準确資訊非常困難。努力在OGB的未來版本中提供其他資料集拆分。
實驗結果如下圖所示,在這四個模型中,COMPLEX達到了最佳的測試MRR,而TRANSE與其他模型相比,性能明顯差。TRANSE的較差性能可以通過以下事實來解釋:TRANSE無法為該資料集中普遍存在的對稱關系模組化,例如,蛋白質-蛋白質和藥物-藥物關系都是對稱的。總體而言,進一步提高模型性能具有重大的實踐意義。 一個有前途的方向是為異構知識圖開發一種更專門的方法,該方法中存在多個節點類型,并且整個圖遵循預定義的架構。
1.2.3OGB圖屬性預測
ogbg-mol*:分子圖
- ogbg-molhiv和ogbg-molpcba是兩個大小不同的分子屬性預測資料集:ogbg-molhiv (small)和ogbg-molpcba(medium)。所有分子均使用RDKIT進行預處理。每個圖表示一個分子,其中節點表示原子,而邊表示化學鍵。輸入節點特征為9維,包含原子序數和手性,以及其他附加原子特征,例如形式電荷和原子是否在環中。輸入邊特征是3維的,包含鍵類型,鍵立體化學以及訓示鍵是否共轭的附加鍵特征。
- 預測任務:盡可能準确地預測目标分子特性,其中分子特性被标記為二進制标記,例如分子是否抑制HIV病毒複制。對于ogbg-molhiv,使用ROC-AUC進行評估。 對于ogbg-molpcba,由于類平衡嚴重偏斜(僅1.4%的資料為positive),并且資料集包含多個分類任務,是以将任務平均後的精确召回曲線(PRC)-AUC作為評估名額。
- 資料集分割:采用支架分割程式,該程式根據分子的二維結構架構風格分子。支架分割試圖将結構上不同的分子分為不同的子集,這在預期的實驗環境中提供了對模型性能的更現實的估計。總體而言,OGB與它們的資料加載器一起提供了有意義的資料拆分和改進的分子功能,進而使對MOLECULENET資料集的評估和比較更加容易和标準化。
實驗結果如下圖所示,可以看到具有附加功能的GIN和虛拟節點在兩個資料集中提供了最佳性能。
ogbg-ppa:蛋白質關聯網絡
- 從1,581個不同物種的蛋白質關聯網絡中提取的一組無向蛋白質關聯鄰域,涵蓋了37個廣泛的生物分類群。從每種物種中随機選擇了100種蛋白質,并以每個標明的蛋白質為中心建構了2-hop蛋白質關聯鄰域。然後,從每個鄰域中删除中心節點,并對鄰域進行二次采樣,以確定最終的蛋白質關聯圖足夠小(少于300個節點)。每個蛋白質關聯圖中的節點表示蛋白質,邊表示蛋白質之間的生物學上有意義的關聯。邊與7維特征相關,其中每個元素取0到1之間的值,并代表特定類型的蛋白質關聯的強度。
- 預測任務:給定一個蛋白質關聯鄰域圖,該任務是一個37-way多分類,以預測該圖源自哪個分類組。
- 資料集分割:與ogbn-proteins類似,采用物種分割方法,其中驗證和測試集中的鄰域圖是從在訓練過程中未發現但屬于37個分類組之一的物種蛋白質關聯網絡中提取的。
實驗結果如下表,類似于ogbg-mol *資料集,帶有VIRTUAL NODE的GIN提供了最佳性能。盡管如此,泛化差距仍然很大(将近30個百分點)。
ogbg-code:源代碼的抽象文法樹
- 從大約45萬個Python方法定義中獲得的抽象文法樹(AST)的集合。方法是從GITHUB上最受歡迎的項目的總共13,587個不同的存儲庫中提取的。Python方法集合來自GITHUB Code Search-Net,它是用于基于機器學習的代碼檢索的資料集和基準的集合。
- 預測任務:給定AST表示的Python方法主體及其節點特征,任務是預測組成方法名稱的子标記——節點類型(來自97種類型的池)、節點屬性(例如變量名,詞彙量為10002),AST中的深度、預周遊索引
- 資料集分割:采用項目分割,其中訓練集的AST是從GITHUB項目中獲得的,這些項目未出現在驗證和測試集中。這種劃分尊重實際情況,即在大量源代碼上訓練模型,然後将其用于在單獨的代碼庫上預測方法名稱。
1.3 OGB Package
OGB Package包旨在通過自動化資料加載和評估部分,使研究人員易于通路OGB管道。OGB與Pytorch及其關聯的圖形庫完全相容:PyG和DGL。OGB還提供了與庫無關的資料集對象,可用于任何其他Python深度學習架構(如Tensorflow和Mxnet)。下面,将解釋資料加載和評估。為簡單起見,專注于使用PyG進行圖屬性預測的任務。有關其他任務詳見官網。
OGB資料加載器:OGB Package使擷取與PyG完全相容的資料集對象變得容易僅用一行代碼即可完成操作,最終使用者隻需指定資料集的名稱即可。然後,OGB Package将下載下傳、處理、存儲并傳回所請求的資料集對象。此外,可以從資料集對象中輕松獲得标準化的資料集分割。
OGB評估器:OGB還可以通過ogb.*.Evaluator類實作标準化和可靠的評估。如下面的代買所示,最終使用者首先指定他們要評估其模型的資料集,然後使用者可以了解需要傳遞給Evaluator對象的輸入格式。輸入格式取決于資料集,例如,對于ogbg-molpcba資料集,Evaluator對象需要輸入一個字典,其中包含ytrue(存儲真實二進制标簽的矩陣)和ypred(存儲模型輸出的分數的矩陣)。最終使用者通過指定的詞典作為輸入後,評估程式對象将傳回适合手頭資料集的模型性能,例如ogbg-molpcba的PRC-AUC。
2.ERNIESage (鄰居聚合)
2.1模型概述
ERNIE-Sage 是 ERNIE SAmple aggreGatE 的簡稱,該模型可以同時模組化文本語義與圖結構資訊,有效提升 Text Graph 的應用效果。
論文連結:https://aclanthology.org/2020.textgraphs-1.11/ 論文介紹了百度 PGL 團隊設計的系統,該系統在 TextGraphs 2020 共享任務中獲得第一名。 該任務的重點是為基礎科學問題提供解釋。 給定一個問題及其相應的正确答案,被要求從大型知識庫中選擇可以解釋為什麼該問題和回答 (QA) 的答案是正确的事實。 為了解決這個問題,PGL團隊使用預訓練的語言模型來回憶每個問題的前 K 個相關解釋。 然後,他們采用基于預訓練語言模型的重新排序方法對候選解釋進行排序。 為了進一步提高排名,還開發了一種由強大的預訓練變壓器和 GNN 組成的架構,以解決多跳推理問題。
2.2 原理介紹
在很多工業應用中,往往出現如下圖所示的一種特殊的圖:Text Graph。顧名思義,圖的節點屬性由文本構成,而邊的建構提供了結構資訊。如搜尋場景下的Text Graph,節點可由搜尋詞、網頁标題、網頁正文來表達,使用者回報和超鍊資訊則可構成邊關系。
ERNIE-Sage 是 ERNIE 與 GraphSAGE 碰撞的結果,是 ERNIE SAmple aggreGatE 的簡稱,它的結構如下圖所示,主要思想是通過 ERNIE 作為聚合函數(Aggregators),模組化自身節點和鄰居節點的語義與結構關系。ERNIE-Sage 對于文本的模組化是建構在鄰居聚合的階段,中心節點文本會與所有鄰居節點文本進行拼接;然後通過預訓練的 ERNIE 模型進行消息彙聚,捕捉中心節點以及鄰居節點之間的互相關系;最後使用 ERNIESage 搭配獨特的鄰居互相看不見的 Attention Mask 和獨立的 Position Embedding 體系,就可以輕松建構 TextGraph 中句子之間以及詞之間的關系。
使用 ID 特征的 GraphSAGE 隻能夠模組化圖的結構資訊,而單獨的ERNIE隻能處理文本資訊。通過 PGL 搭建的圖與文本的橋梁,ERNIESage能夠很簡單的把 GraphSAGE 以及 ERNIE 的優點結合一起。以下面 TextGraph 的場景,ERNIESage 的效果能夠比單獨的 ERNIE 以及 GraphSAGE 模型都要好。
ERNIE-Sage 可以很輕松地在 PGL 中的消息傳遞範式中進行實作,目前提供了4個版本的 ERNIESage 模型:
- ERNIE-Sage v1: ERNIE 作用于text graph節點上;
- ERNIE-Sage v2: ERNIE 作用在text graph的邊上;
- ERNIE-Sage v3: ERNIE 作用于一階鄰居及起邊上;
- ERNIE-Sage v4: ERNIE 作用于N階鄰居及邊上;
模型效果
TextGraph 2020 效果當時的SOTA
應用場景
文本比對、Query 推薦等
2.3 如何對Text Graph進行模組化
上個項目講到的GraphSage隻關注結構資訊,無法完成語義了解,而NLP對應的預訓練模型卻反之,這時候ErnieSage就能很好實作兩者達到圖語義了解
簡單提一下Ernie 1.0核心是知識增強,通過詞級别的Masked Language Model(MLM)任務以及持續學習思想取得優異性能
Transformer基礎結構
transformer好比全連通圖,圖節點類比token外加了自注意機制。
持續學習效果
将ERNIE作用于Graph的各大元素:
- ERNIESage V1 模型核心流程---ERNIE 作用于Text Graph的Node(節點) 上
- ERNIE提取節點語義 -> GNN聚合
- 利用ERNIE獲得節點表示
- 聚合鄰居特征,進行消息傳遞
- 将目前節點和聚合後的鄰居特征進行concat,更新節點特征
- ERNIESage V2 核心代碼---------ERNIE聚合Text Graph的Edge(邊) 上資訊
- GNN send 文本id -> ERNIE提取邊語義 -> GNN recv 聚合鄰居語義 -> ERNIE提取中心節點語義并concat
為了使得大家對下面有關ERNIE模型的部分能夠有所了解,這裡先貼出ERNIE的主模型架構圖。
- 利用 ERNIE 擷取中心節點的文本特征表示
- 特征互動:中心節點和鄰居節點一同作為 ERNIE 輸入,計算互動特征
- 聚合鄰居特征
- 将目前節點和聚合後的鄰居特征 concat,更新節點特征
ERNIESage Node與ERNIESage Edge對比
大部分單塔模型優于雙塔模型因為含有特征互動資訊更充分,做連結預測問題思路:将兩個節點進行內積得到一個值,和門檻值對比假設大于0.5則邊存在
- ERNIESage V3 核心過程--------ERNIE聚合節點的1 Neighbor( 一階鄰居) 資訊
- GNN send 文本id序列 -> GNN recv 拼接文本id序列 -> ERNIE同時提取中心和多個鄰居語義表達
将中心節點的文本與所有一階鄰居節點文本進行單塔拼接,再利用 ERNIE 做消息聚合;這樣就會遇到:
- 如何確定在輸入時鄰居不帶有順序?
- 如果鄰居數量過多,如何模組化?
解決方案如下:針對問題一采用獨立位置編碼,鄰居節點編碼相同不受順序影響;針對問題提二:進行鄰居采樣
2.4 基于PGL算法實作
PGL&paddle 2.x+版本
ErnieSage可以很輕松地在基于PaddleNLP建構基于Ernie的圖神經網絡,目前PaddleNLP提供了V2版本的ErnieSage模型:
ErnieSage V2: ERNIE 作用在text graph的邊上;
核心部分包含:
- 資料集部分
- example_data - 簡單的輸入檔案,格式為每行query \t answer,可作簡單的運作執行個體使用。
- 模型檔案和配置部分
- ernie_config.json - ERNIE模型的配置檔案。
- vocab.txt - ERNIE模型所使用的詞表。
- erniebaseckpt/ - ERNIE模型參數。
- config/ - ERNIESage模型的配置檔案
- 代碼部分
- local_run.sh - 入口檔案,通過該入口可完成預處理、訓練、infer三個步驟。
- preprocessing檔案夾 - 包含dump_graph.py,在預處理部分,首先需要進行建圖,将輸入的檔案建構成一張圖。由于所研究的是Text Graph,是以節點都是文本,将文本表示為該節點對應的node feature(節點特征),處理文本的時候需要進行切字,再映射為對應的token id。
- dataset/ - 該檔案夾包含了資料ready的代碼,以便于在訓練的時候将訓練資料以batch的方式讀入。
- models/ - 包含了ERNIESage模型核心代碼。
- train.py - 模型訓練入口檔案。
- learner.py - 分布式訓練代碼,通過train.py調用。
- infer.py - infer代碼,用于infer出節點對應的embedding。
- 評價部分
- build_dev.py - 用于将的驗證集修改為需要的格式。
- mrr.py - 計算MRR值。 部分結果展示:
[2022-11-23 14:18:01,252] [ INFO] - global step 890, epoch: 27, batch: 25, loss: 0.005078, speed: 1.70 step/s
[2022-11-23 14:18:06,836] [ INFO] - global step 900, epoch: 28, batch: 3, loss: 0.004688, speed: 1.79 step/s
[2022-11-23 14:18:12,588] [ INFO] - global step 910, epoch: 28, batch: 13, loss: 0.004492, speed: 1.74 step/s
[2022-11-23 14:18:18,633] [ INFO] - global step 920, epoch: 28, batch: 23, loss: 0.005273, speed: 1.65 step/s
[2022-11-23 14:18:24,022] [ INFO] - global step 930, epoch: 29, batch: 1, loss: 0.004687, speed: 1.86 step/s
[2022-11-23 14:18:29,897] [ INFO] - global step 940, epoch: 29, batch: 11, loss: 0.004492, speed: 1.70 step/s
[2022-11-23 14:18:35,727] [ INFO] - global step 950, epoch: 29, batch: 21, loss: 0.007814, speed: 1.72 step/s
[2022-11-23 14:18:41,339] [ INFO] - global step 960, epoch: 29, batch: 31, loss: 0.012500, speed: 1.78 step/s
INFO 2022-11-23 14:18:47,170 launch.py:402] Local processes completed.
INFO 2022-11-23 14:18:47,170 launch.py:402] Local processes completed.
運作完畢後,會産生較多的檔案,這裡進行簡單的解釋。
- graph_workdir/ - 這個檔案夾主要會存儲和圖相關的資料資訊。
- output/ - 主要的輸出檔案夾,包含了以下内容:
- (1)模型檔案,根據config檔案中的saveperstep可調整儲存模型的頻率,如果設定得比較大則可能訓練過程中不會儲存模型;
- (2)last檔案夾,儲存了停止訓練時的模型參數,在infer階段會使用這部分模型參數;
- (3)part-0檔案,infer之後的輸入檔案中所有節點的Embedding輸出。
預測結果見/output part-0,部分結果展示:
1 幹部走讀之是以成為“千夫所指”,是因為這種行為增加了行政成本。 0.08133 -0.18362 0.00346 -0.01038 -0.05656 -0.05691 -0.09882 0.12029 0.05317 -0.02939 -0.14508 -0.07692 -0.02769 -0.04896 0.09963 -0.14497 -0.13574 0.02424 0.10587 -0.07323 -0.06388 0.01103 0.00944 -0.07593 -0.00731 -0.11897 0.11635 -0.05529 0.04156 0.01942 -0.07949 -0.02761 0.00033 -0.06539 0.05739 0.02487 0.03389 0.18369 0.05038 -0.02183 0.02685 0.09735 -0.13134 0.01999 -0.04034 -0.03441 0.07738 0.14992 0.06287 -0.20294 -0.05325 0.07003 0.02595 0.01826 0.12306 0.06234 -0.11179 -0.09813 0.14834 -0.16425 0.13985 0.06430 0.01662 -0.01184 0.02659 0.13431 0.05327 -0.07269 0.06539 -0.12416 -0.03247 0.12320 -0.06268 -0.06711 -0.01775 -0.02475 0.12867 0.05980 0.09311 0.11515 -0.06987 0.07372 0.09891 -0.10539 -0.03451 0.02539 -0.05701 -0.06300 0.03582 0.13427 -0.07082 -0.01588 -0.10033 0.04229 -0.02681 0.22213 0.00073 0.00075 -0.16839 0.12594 0.00807 -0.00040 -0.07686 0.08944 -0.04361 -0.13446 -0.15051 -0.08336 0.13476 -0.07999 0.00719 0.04443 -0.21426 -0.02944 0.04165 0.14448 -0.07233 -0.07226 -0.01737 -0.05904 -0.08729 0.01087 0.11581 -0.00041 -0.04341 0.01526 -0.01272 -0.15089
1 承擔縣人大常委會同市人大常委會及鄉鎮人大的工作聯系。 0.06494 -0.25502 -0.00777 -0.02933 -0.03097 -0.08472 -0.15055 0.03232 0.04819 -0.03571 -0.18642 0.01614 0.07226 0.04660 0.06138 -0.14811 -0.01807 -0.00931 0.11350 0.04235 -0.14285 0.08077 0.10746 -0.03673 -0.12217 -0.05147 0.15980 -0.02051 -0.08356 0.00127 0.02313 0.14206 0.02116 -0.02332 -0.02032 0.03704 0.04234 0.05832 -0.03426 -0.02491 0.07948 0.11802 0.10158 -0.06468 -0.11558 0.00161 0.02030 0.06531 -0.04109 -0.13033 -0.04947 0.10836 -0.06057 0.01797 0.00183 0.18616 -0.13693 -0.17120 0.02910 0.01781 0.24061 -0.03953 0.10843 0.05329 -0.08753 -0.09504 0.05383 -0.11522 0.05172 -0.02633 0.06554 0.18186 -0.03937 -0.09151 -0.01045 -0.01857 0.10766 0.04191 0.10127 -0.00513 -0.02739 -0.10974 0.07810 -0.17015 -0.07228 -0.05809 -0.08627 -0.02947 -0.01907 0.12695 -0.09196 0.03067 -0.09462 0.15618 -0.05241 0.17382 -0.06615 0.02156 0.07060 0.09616 -0.02560 0.01197 -0.00582 -0.06037 -0.11539 -0.11853 -0.16872 0.00075 0.13284 0.02941 -0.01361 -0.01200 -0.12901 0.06944 -0.03066 0.09824 -0.01635 0.04351 -0.08985 0.08947 0.00923 -0.02436 0.10783 0.00891 0.10256 0.01953 -0.06292 -0.04989
# 接下來,計算MRR得分。
# 注意,運作此代碼的前提是,已經将config對應的yaml配置檔案中的input_data參數修改為了:"train_data.txt"
# 并且注意訓練的模型是針對train_data.txt的,如果不符合,請重新訓練模型。
!python mrr.py --emb_path output/part-0
# 由于僅是為了提供一個可運作的執行個體,計算出來的MRR值可能比較小,需要的同學可以自己更換資料集來測試更多的結果。
1021it [00:00, 19102.78it/s]
46it [00:00, 68031.73it/s]
100%|█████████████████████████████████████████| 46/46 [00:00<00:00, 2397.52it/s]
MRR 0.22548099768841945
PGL&paddle 1.x+版本
提供多版本供大家學習複現,含核心模型代碼講解
項目連結:
https://aistudio.baidu.com/aistudio/projectdetail/5097085
3.UniMP(标簽遷移)
UniMP:融合标簽傳遞和圖神經網絡的統一模型
論文名:Masked Label Prediction:用于半監督分類的統一消息傳遞模型
論文連結:https://arxiv.org/abs/2009.03509
圖神經網絡(GNN)和标簽傳播算法(LPA)都是消息傳遞算法,在半監督分類中取得了優越的性能。GNN 通過神經網絡執行特征傳播來進行預測,而 LPA 使用跨圖鄰接矩陣的标簽傳播來獲得結果。然而,目前還沒有有效的方法将這兩種算法直接結合起來。為了解決這個問題,提出了一種新穎的統一消息傳遞模型 (UniMP),它可以在訓練和推理時結合特征和标簽傳播。首先,UniMP采用Graph Transformer網絡,将feature embedding和label embedding作為輸入資訊進行傳播。其次,為了在自循環輸入标簽資訊中不過度拟合地訓練網絡,UniMP 引入了一種屏蔽标簽預測政策,其中一定比例的輸入标簽資訊被随機屏蔽,然後進行預測。UniMP 在概念上統一了特征傳播和标簽傳播,并且在經驗上是強大的。它在 Open Graph Benchmark (OGB) 中獲得了新的最先進的半監督分類結果。
此外,提出UniMPlarge通過增加來擴充基本模型的寬度,并通過合并APPNPheadnum使其更深。此外,他們首先提出了一種新的基于注意力的 APPNP來進一步提高模型的性能。
APPNP:Predict then Propagate: Graph Neural Networks meet Personalized PageRank https://arxiv.org/abs/1810.05997
用于圖形半監督分類的神經消息傳遞算法最近取得了巨大成功。然而,為了對節點進行分類,這些方法僅考慮距離傳播幾步之遙的節點,并且這個使用的鄰域的大小很難擴充。在本文中,利用圖卷積網絡 (GCN) 與 PageRank 之間的關系,推導出一種基于個性化 PageRank 的改進傳播方案。利用這種傳播過程來建構一個簡單的模型、神經預測的個性化傳播 (PPNP) 及其快速近似 APPNP。模型的訓練時間與以前的模型相同或更快,其參數數量與以前的模型相同或更少。它利用一個大的、可調整的鄰域進行分類,并且可以很容易地與任何神經網絡相結合。表明,在迄今為止對類 GCN 模型所做的最徹底的研究中,該模型優于最近提出的幾種半監督分類方法。的實施可線上獲得。
3.1背景介紹
在半監督圖節點分類場景下,節點之間通過邊相連接配接,部分節點被打上标簽。任務要求模型通過監督學習的方式,拟合被标注節點資料,并對未标注的節點進行預測。如下圖所示,在一般機器學習的問題上,已标注的訓練資料在新資料的推斷上,并不能發揮直接的作用,因為資料的輸入是獨立的。然而在圖神經網絡的場景下,已有的标注資料可以從節點與節點的連接配接中,根據圖結構關系推廣到新的未标注資料中。
一般應用于半監督節點分類的算法分為圖神經網絡和标簽傳遞算法兩類,它們都是通過消息傳遞的方式(前者傳遞特征、後者傳遞标簽)進行節點标簽的學習和預測。其中經典标簽傳遞算法如LPA,隻考慮了将标簽在圖上進行傳遞,而圖神經網絡算法大多也隻是使用了節點特征以及圖的連結資訊進行分類。但是單純考慮标簽傳遞或者節點特征都是不足夠的。
百度PGL團隊提出的統一消息傳遞模型 UniMP,将上述兩種消息統一到架構中,同時實作了節點的特征與标簽傳遞,顯著提升了模型的泛化效果。UniMP以Graph Transformer模型作為基礎骨架,聯合使用标簽嵌入方法,将節點特征和部分節點标簽同時輸入至模型中,進而實作了節點特征和标簽的同時傳遞。
簡單的加入标簽資訊會帶來标簽洩漏的問題,即标簽資訊即是特征又是訓練目标。實際上,标簽大部分是有順序的,例如在引用網絡中,論文是按照時間先後順序出現的,其标簽也應該有一定的先後順序。在無法得知訓練集标簽順序的情況下,UniMP提出了标簽掩碼學習方法。UniMP每一次随機将一定量的節點标簽掩碼為未知,用部分已有的标注資訊、圖結構資訊以及節點特征來還原訓練資料的标簽。最終,UniMP在OGB上取得SOTA效果,并在論文的消融實驗上,驗證了方法的有效性。
通過:Masked Label Prediction 解決标簽洩露問題
模型結構
論文一些資料仿真展示:【資料集情況等】
3.2原理介紹
部分作者提出質疑也是值得探讨的:
3.3 基于碼源詳細闡釋
3.3.1 為何引入MaskLabel?
簡單的加入标簽資訊會帶來标簽洩漏的問題,即标簽資訊即是特征又是訓練目标。可以想象直接将标簽作為網絡輸入,要求輸出也向标簽靠攏,勢必會造成“1=1”的訓練結果,無法用于預測。
在引用網絡中,論文是按照時間先後順序出現的,其标簽也應該有一定的先後順序。在無法得知訓練集标簽順序的情況下,UniMP提出了MaskLabel學習方法。每一次随機将一定量的節點标簽掩碼為未知,用部分已有的标注資訊、圖結構資訊以及節點特征來還原訓練資料的标簽。
def label_embed_input(self, feature):
label = F.data(name="label", shape=[None, 1], dtype="int64")
label_idx = F.data(name='label_idx', shape=[None, 1], dtype="int64")
label = L.reshape(label, shape=[-1])
label_idx = L.reshape(label_idx, shape=[-1])
embed_attr = F.ParamAttr(initializer=F.initializer.NormalInitializer(loc=0.0, scale=1.0))
embed = F.embedding(input=label, size=(self.out_size, self.embed_size), param_attr=embed_attr)
feature_label = L.gather(feature, label_idx, overwrite=False)
feature_label = feature_label + embed
feature = L.scatter(feature, label_idx, feature_label, overwrite=True)
lay_norm_attr = F.ParamAttr(initializer=F.initializer.ConstantInitializer(value=1))
lay_norm_bias = F.ParamAttr(initializer=F.initializer.ConstantInitializer(value=0))
feature = L.layer_norm(feature, name='layer_norm_feature_input', param_attr=lay_norm_attr, bias_attr=lay_norm_bias)
return feature
在上面的代碼中可以看到,對于已知标簽的節點,首先将其embedding成和節點特征同樣次元(這裡是100維),然後就可以直接與節點特征相加,進而完成了标簽資訊與特征資訊的融合,一塊送入graph_transformer進行消息傳遞。
改進:這裡,最核心的一句代碼是featurelabel = featurelabel + embed,它完成了标簽和特征的融合,由此可以想到控制兩者的權重,得到:
feature_label = alpha*feature_label + (1-alpha)*embed
alpha可以設定為固定值,也可以通過學習獲得。參考modelunimplarge.py中的門控殘差連接配接:
if gate:
temp_output = L.concat([skip_feature, out_feat, out_feat - skip_feature], axis=-1)
gate_f = L.sigmoid(linear(temp_output, 1, name=name + '_gate_weight', init_type='lin'))
out_feat = skip_feature * gate_f + out_feat * (1 - gate_f)
else:
out_feat = skip_feature + out_feat
可以寫出:
temp = L.concat([feature_label,embed,feature_label-embed], axis=-1)
alpha = L.sigmoid(linear(temp, 1, name='alpha_weight', init_type='lin'))
feature_label = alpha*feature_label + (1-alpha)*embed
當然也可以直接經過一層FC後再将兩者相加:
feature_label = L.fc(feature_label, size=100) + L.fc(embed, size=100)
而做這些的目的,都是為了尋找能使标簽資訊和特征資訊融合的更好的方式。
3.3.2 Res連接配接&Dense連接配接?
(1)殘差網絡(或稱深度殘差網絡、深度殘差學習,英文ResNet)屬于一種卷積神經網絡。相較于普通的卷積神經網絡,殘差網絡采用了跨層恒等連接配接,以減輕卷積神經網絡的訓練難度。殘差網絡的一種基本子產品如下所示:
實作起來比較簡單,這裡不予贅述。
(2)DenseNet原文:Densely Connected Convolutional Networks
相比ResNet,DenseNet提出了一個更激進的密集連接配接機制:即互相連接配接所有的層,具體來說就是每個層都會接受其前面所有層作為其額外的輸入。DenseNet的網絡結構如下所示:
以下代碼實作了Dense連接配接:
dense=[feature]
for i in range(self.num_layers - 1):
ngw = pgl.sample.edge_drop(graph_wrapper, edge_dropout)
res_feature = feature
feature, _, cks = graph_transformer(str(i), ngw, feature,
hidden_size=self.hidden_size,
num_heads=self.heads,
concat=True, skip_feat=True,
layer_norm=True, relu=True, gate=True)
if dropout > 0:
feature = L.dropout(feature, dropout_prob=dropout, dropout_implementation='upscale_in_train')
dense.append(feature)
feature = L.fc(dense, size=self.hidden_size, name="concat_feature")
3.3.3 注意力機制?
注意力機制就是将注意力集中于局部關鍵資訊的機制,可以分成兩步:第一,通過全局掃描,發現局部有用資訊;第二,增強有用資訊并抑制備援資訊。SENet是一種非常經典的注意力機制下的深度學習方法。它可以通過一個小型的子網絡,自動學習得到一組權重,對特征圖的各個通道進行權重。其含義在于,某些特征通道是較為重要的,而另一些特征通道是資訊備援的;那麼,我們就可以通過這種方式增強有用特征通道、削弱備援特征通道。SENet的一種基本子產品如下所示:
值得指出的是,通過這種方式,每個樣本都可以有自己獨特的一組權重,可以根據樣本自身的特點,進行獨特的特征通道權重調整。
Unimp中的注意力機制出現在Graph Transformer以及最後的輸出層attnappnp,attnappnp的代碼為:
def attn_appnp(gw, feature, attn, alpha=0.2, k_hop=10):
"""Attention based APPNP to Make model output deeper
Args:
gw: Graph wrapper object (:code:`StaticGraphWrapper` or :code:`GraphWrapper`)
attn: Using the attntion as transition matrix for APPNP
feature: A tensor with shape (num_nodes, feature_size).
k_hop: K Steps for Propagation
Return:
A tensor with shape (num_nodes, hidden_size)
"""
def send_src_copy(src_feat, dst_feat, edge_feat):
feature = src_feat["h"]
return feature
h0 = feature
attn = L.reduce_mean(attn, 1)
for i in range(k_hop):
msg = gw.send(send_src_copy, nfeat_list=[("h", feature)])
msg = msg * attn
feature = gw.recv(msg, "sum")
feature = feature * (1 - alpha) + h0 * alpha
return feature
在調用函數時,其中的alpha為前面的graph_transformer學習到的參數,用于更好的融合各層特征。
3.4基于PGL算法實作
3.4.1 基于斯坦福 OGB (1.2.1) 基準測試
實驗基于斯坦福 OGB (1.2.1) 基準測試,
To_do list:
- UniMP_large in Arxiv
- UniMP_large in Products
- UniMP_large in Proteins
- UniMP_xxlarge
- 這裡給出giyhub官網代碼連結:https://github.com/PaddlePaddle/PGL/tree/main/ogb_examples/nodeproppred/unimp
- 因為在安裝環境中需要安裝torch,在aistudio上嘗試多次仍無法運作,下面給出代碼流程和官網結果。感興趣同學私下本地運作吧。比較吃算力!
超參數介紹:
Arxiv_dataset(Full Batch): Products_dataset(NeighborSampler): Proteins_dataset(Random Partition):
--num_layers 3 --num_layers 3 --num_layers 7
--hidden_size 128 --hidden_size 128 --hidden_size 64
--num_heads 2 --num_heads 4 --num_heads 4
--dropout 0.3 --dropout 0.3 --dropout 0.1
--lr 0.001 --lr 0.001 --lr 0.001
--use_label_e True --use_label_e True --use_label_e True
--label_rate 0.625 --label_rate 0.625 --label_rate 0.5
--weight_decay. 0.0005
結果展示:
OGB的仿真性能:
| Model | Test Accuracy | Valid Accuracy| Parameters |Hardware| | -------- | -------- | -------- |-------- |-------- | |Arxivbaseline |0.7225 ± 0.0015 |0.7367 ± 0.0012 |468,369|Tesla V100 (32GB)| |ArxivUniMP |0.7311 ± 0.0021 |0.7450 ± 0.0005 |473,489|Tesla V100 (32GB)| |ArxivUniMPlarge| 0.7379 ± 0.0014 |0.7475 ± 0.0008 |1,162,515 |Tesla V100 (32GB)| |Productsbaseline| 0.8023 ± 0.0026 |0.9286 ± 0.0017 |1,470,905 |Tesla V100 (32GB)| |ProductsUniMP |0.8256 ± 0.0031 |0.9308 ± 0.0017 |1,475,605| Tesla V100 (32GB)| |Proteinsbaseline| 0.8611 ± 0.0017| 0.9128 ± 0.0007| 1,879,664 |Tesla V100 (32GB)| |ProteinsUniMP|0.8642 ± 0.0008 |0.9175 ± 0.0007 |1,909,104| Tesla V100 (32GB)|
改進 OGBN 蛋白質的更多技巧
評估中的随機分區大小,随機分區在訓練過程中表現得像DropEdge,發現的模型可以從這種政策中受益。,但在評估中,發現較小的分區大小可以提高分數。
# To compare
python train.py --place 0 --use_label_e --log_file eval_partition_5 --eval_partition 5
python train.py --place 0 --use_label_e --log_file eval_partition_3 --eval_partition 3
使用 Self-Attention 聚合 Neighbor Feature OGBN-Proteins 中 UniMP 和其他類似 DeeperGCN 的原始代碼使用平均邊緣特征作為初始節點特征。采用這些子產品作為可學習的聚合器。為每個節點采樣大約 64 個邊,并使用變換器 [3 * (Self-Attention + Residual + ReLU + LayerNorm) + Mean Pooling] 作為聚合器來擷取初始化節點特征。簡單地稱它為CrossEdgeFeat。你可以在crossedgefeat.py 最初的 ogbn-proteins 工具獲得了大約0.9175的驗證分數和0.864的測試分數。并且通過CrossEdgeFeat,可以促進快速收斂并獲得更高的分數。
# To compare
python train.py --place 0 --use_label_e --log_file with_cross_edge_feat --cross_edge_feat 3
python train.py --place 0 --use_label_e --log_file without_cross_edge_feat --cross_edge_feat 0
訓練曲線(驗證 AUC)如下:
3.4.2 圖學習之基于PGL-UniMP算法的論文引用網絡節點分類任務[系列九]
内容過多引到下一篇項目
項目連結:https://aistudio.baidu.com/aistudio/projectdetail/5116458?contributionType=1
fork一下即可
4.OGB最新榜單部分展示
這裡就展示了節點預測的,更多的可以自行去官網檢視獲得最新模型
5.總結
通過以上兩個版本的模型代碼簡單的講解,可以知道他們的不同點,其實主要就是在消息傳遞機制的部分有所不同。ERNIESageV1版本隻作用在text graph的節點上,在傳遞消息(Send階段)時隻考慮了鄰居本身的文本資訊;而ERNIESageV2版本則作用在了邊上,在Send階段同時考慮了目前節點和其鄰居節點的文本資訊,達到更好的互動效果。
為了實作可擴充的,健壯的和可重制的圖學習研究,提出了Open Graph Benchmark (OGB)——具有規模大、領域廣、任務類别多樣化的現實圖資料集。在特定于應用程式的使用案例的驅動下,對給定的資料集采用了實際的資料分割方法。通過廣泛的基準實驗,強調OGB資料集對于圖學習模型在現實的資料分割方案下處理大規模圖并進行準确的預測提出了重大挑戰。總而言之,OGB為未來的研究提供了豐富的機會,以推動圖學習的前沿。
OGB還在不斷的擴充中,相信之後會有更多資料集,也将産生更多優秀的模型,推動圖學習的研究,了解和掌握相關内容還是很有必要的。
原項目連結:fork一下即可:https://aistudio.baidu.com/aistudio/projectdetail/5096910?contributionType=1