該倉庫包含原始GAT論文的Pytorch實現(:link:Veličković等人)。
它的目的是使一般而言開始遊戲和學習GAT和GNN變得容易。
圖神經網絡是一個正在處理圖形定義的信號的神經網絡家族!
圖形可以建模許多有趣的自然現象,因此您會看到它們到處都使用:
一路走到大型雪倫對撞機(LHC)的粒子物理,假新聞檢測和清單還在不斷!
GAT是空間(卷積)GNN的代表。由於CNN在計算機視覺領域取得了巨大的成功,因此研究人員決定將其推廣到圖形,所以我們就在這裡! ?
這是GAT結構的示意圖:

如果不提及最著名的圖形數據集-Cora ,您不能僅僅開始談論GNN。
Cora中的節點代表研究論文,您猜到了這些論文之間的引用。
我添加了一個可視化Cora和進行基本網絡分析的實用程序。這就是科拉的樣子:

節點大小對應於其程度(即內/傳出邊緣的數量)。邊緣厚度大致對應於“流行”或“連接”該邊緣的方式(邊緣介紹是書呆子的術語,請查看代碼。)
這是一個顯示Cora上的學位分佈的圖:

由於我們正在處理一個無方向的圖,因此內外圖是相同的。
在底部圖(度分佈)上,您可以在[2, 4]範圍內看到一個有趣的峰值。這意味著大多數節點具有少量邊緣,但是有1個節點具有169個邊緣! (大綠節點)
一旦我們擁有一個完全訓練的GAT模型,我們就可以看到某些“節點”所學到的注意力。
節點使用注意力來決定如何匯總他們的鄰居,足夠的談話,讓我們看看:

這是Cora的節點之一,具有最多的邊緣(引用)。顏色代表同一類的節點。您可以清楚地看到此圖中的兩件事:
相似的規則適用於較小的社區。還要注意自我邊緣:


另一方面,PPI正在學習更多有趣的注意力模式:


在左側,我們可以看到6個鄰居正在受到不可忽略的關注,在右邊,我們可以看到所有註意力都集中在一個鄰居上。
最後,有2個更有趣的模式 - 左側和右側的強大自我邊緣,我們可以看到一個鄰居受到了大量的關注,而其餘的則在整個社區的其他地方平均分佈:


重要說明:僅對於第一個GAT層,所有PPI可視化才有可能。由於某種原因,第二和第三層的注意力係數幾乎是所有0(即使我獲得了已發布的結果)。
另一種理解GAT沒有學習Cora上有趣的注意力模式的方法(即它是學習const的關注)是將節點社區的注意力重量視為概率分佈,計算熵並在每個節點的社區中積累信息。
我們會喜歡Gat的注意力分佈。您可以在橙色中看到理想統一分佈的直方圖的外觀,並且可以在淺藍色的情況下看到學習的分佈 - 它們完全一樣!


我從第一層(8中)只繪製了一個注意力頭,因為它們都是一樣的!
另一方面,PPI正在學習更多有趣的注意力模式:

正如預期的那樣,由於均勻分佈的熵最高,因此均勻的分佈熵直方圖位於右側(橙色)。
好的,我們已經看到了關注!還有什麼可視化的?好吧,讓我們從GAT的最後一層可視化學習的嵌入。 GAT的輸出是形狀=(2708,7)的張量,其中2708是Cora中的節點的數量,而7是類的數量。一旦我們將這些7-DIM向量投射到2D,使用T-SNE,我們就會明白:

我們可以看到,具有相同標籤/類的節點大致聚集在一起- 使用這些表示,很容易訓練一個簡單的分類器,這將告訴我們節點所屬的類別。
注意:我也嘗試過UMAP,但沒有得到更好的結果 +如果您想使用其情節u,它具有很多依賴關係。
因此,我們討論了什麼是GNN,以及他們可以為您做什麼(其他事情)。
讓我們來運行這個東西吧!按照下一步:
git clone https://github.com/gordicaleksa/pytorch-GATcd path_to_repoconda env create (這將創建一個全新的Conda環境)。activate pytorch-gat (用於從控制台運行腳本或在IDE中設置解釋器)就是這樣!它應該在開箱即用的執行環境中進行處理,以處理依賴關係。
Pytorch Pip軟件包將與某些版本的Cuda/cudnn捆綁在一起,但強烈建議您事先安裝系統範圍的CUDA,這主要是因為GPU驅動程序。我還建議使用Minconda安裝程序作為在系統上獲得Conda的一種方式。遵循此設置的點1和第2點,並為您的系統使用最新版本的minconda和cuda/cudnn。
只需從您的Anaconda控制台運行jupyter notebook ,它將在您的默認瀏覽器中打開會話。
打開The Annotated GAT.ipynb ,您就可以玩了!
注意:如果DLL load failed while importing win32api: The specified module could not be found
只需pip uninstall pywin32 ,然後pip install pywin32或conda install pywin32就可以修復它!
您只需要鏈接您在設置部分中創建的Python環境即可。
僅供參考,我的GAT實施實現了已發表的結果:
82-83%精度0.973 Micro-F1分數(實際上甚至更高)在Cora上訓練GAT所需的一切已經設置。要運行它(從控制台)只需致電:
python training_script_cora.py
您也可能有可能:
--should_visualize可視化圖形數據--should_test以評估數據的測試部分的GAT--enable_tensorboard開始保存指標(準確性,損失)該代碼對您的評論進行了很好的評論,因此您可以(希望)了解培訓本身的工作原理。
腳本將:
models/checkpoints/models/binaries/runs/ ,只需運行tensorboard --logdir=runs即可可視化它在PPI上進行培訓也是如此,只需運行python training_script_ppi.py即可。 PPI更具GPU渴望,因此,如果您沒有至少8 GB的強大GPU,則需要添加--force_cpu標誌來訓練CPU上的GAT。您可以嘗試將批處理大小降低到1或使模型較小。
您可以通過調用tensorboard --logdir=runs並粘貼http://localhost:6006/ url到您的瀏覽器:


注意:Cora的火車拆分似乎比驗證和測試拆分查看損失和準確度指標要困難得多。
話雖如此,大多數樂趣實際上都在於playground.py 。
我添加了3個GAT實現 - 有些在概念上更容易理解有些更有效。最有趣,最難理解的是實施3。實施1和實現2在微妙的細節上有所不同,但基本上做同樣的事情。
有關如何處理代碼的建議:
如果要介紹3個實現,則只需將playground_fn變量設置為PLAYGROUND.PROFILE_GAT在playground.py中。
您可能會關心2個參數:
store_cache如果您想保存內存/時間分析結果,請設置為Trueskip_if_profiling_info_cached如果要從cache獲取分析信息,請設置為True結果將存儲在data/ in memory.dict和timing.dict字典(泡菜)中。
注意:實現#3是迄今為止最優化的一個 - 您可以在代碼中看到詳細信息。
我還添加了profile_sparse_matrix_formats如果您想對不同的矩陣稀疏格式(例如COO , CSR , CSC ,LIL, LIL ,ETC)獲得一些熟悉。
如果您想可視化T-SNE嵌入式,請注意或嵌入playground_fn變量將變量設置為PLAYGROUND.VISUALIZE_GAT ,並將visualization_type _type設置為:
VisualizationType.ATTENTION - 如果您想在節點社區中可視化注意力VisualizationType.EMBEDDING如果您想可視化嵌入(通過T -SNE)VisualizationType.ENTROPY如果您想可視化熵直方圖而且您將獲得類似這些的瘋狂可視化( VisualizationType.ATTENTION 。注意選項):


在左側,您可以在整個CORA數據集中看到最高學位的節點。
如果您想知道為什麼這些看起來像一個圓圈,那是因為我使用了layout_reingold_tilford_circular bleatout,它特別適合像圖這樣的樹(因為我們正在可視化一個節點及其鄰居,並且該子繪圖實際上是m-ary樹)。
但是您也可以使用kamada kawai (右側)等不同的圖形算法,等等。
請隨意瀏覽代碼,並從不同的GAT層中繪製注意力,從而繪製不同的節點社區或註意力頭。您也可以輕鬆地更改GAT中的層數,儘管淺GNN傾向於在小世界,同質圖數據集上執行最好的表現。
如果您想可視化Cora/PPI,只需將playground_fn設置為PLAYGROUND.VISUALIZE_DATASET ,您將從此讀數中獲得結果。
HW要求高度取決於您將使用的圖形數據。如果您只想和Cora一起玩,那麼您可以選擇2個以上的GBS GPU。
它需要(在Cora引文網絡上):
將此與最小的變壓器所需的硬件進行比較!
另一方面, PPI數據集更具GPU渴望。您將需要一個具有8+ GB的VRAM的GPU,也可以將批次尺寸降低到1,並使模型“ Slimmer”,從而嘗試減少VRAM消耗。
sparse API的實現如果您想了解如何使用Pytorch的稀疏API實施GAT,請隨時提交PR。我個人的API遇到了困難,這是在Beta中,而且是否有可能使實施與我的實施3一樣有效,這是值得懷疑的。
其次,我仍然不確定為什麼GAT在PPI上獲得報告的結果,而在更深層中存在一些明顯的數字問題,因為所有註意力係數都等於0。
如果您很難理解GAT,我在本視頻中對本文進行了深入的概述:
我還製作了該倉庫的演練視頻(重點關注潛在的痛點),並在Graph ML一般開始進行了博客! ❤️
我還有更多視頻,可以進一步幫助您了解GNN:
我發現這些存儲庫很有用(在開發此存儲庫時):
如果您發現此代碼有用,請引用以下內容:
@misc{Gordić2020PyTorchGAT,
author = {Gordić, Aleksa},
title = {pytorch-GAT},
year = {2020},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/gordicaleksa/pytorch-GAT}},
}