引言?
圖神經網絡GNN是深度學習的一個分支。
深度學習的四個分支對應了四種常見的數據格式,前饋神經網絡FNN處理表格數據,表格數據可以是特征向量,卷積神經網絡CNN處理圖像數據,循環神經網絡RNN處理時序數據,圖神經網絡GNN處理圖數據。
這里的FNN指的是如下圖所示的帶有輸入層,隱藏層,輸出層的網絡。
但這四種對應關系并不是一成不變。
如果將圖像拉直成向量,同樣可以用FNN來處理。
聲音文本這類時序數據,用RNN類型的網絡最適合,但如果你把一個句子當作一個1*N的矩陣,那就可以用CNN處理了,只不過,CNN需要堆疊多個層來抓取時序數據中的上下文信息,這在圖像領域被稱為感受野。
注意:雖然可以通過一定的技巧把句子表示成矩陣然后用CNN處理,但從本質上來說,CNN還是不如RNN更適合處理時序數據。
如果將圖像劃分成patch,這些pathces組成序列,同樣也可以用Transformer處理,這就是Vision Transformer:ViT。
而今天要講的GNN,既能處理表格數據,又能處理圖像,文本。
更準確地說,只要能表示成GNN兼容的圖數據結構就能用GNN處理。
今天的文章來自distill發布的一篇博文:A Gentle Introduction to Graph Neural Networks。
網址:https://distill.pub/2021/gnn-intro/
B站沐神視頻講解:https://www.bilibili.com/video/BV1iT4y1d7zP/?spm_id_from=333.999.0.0
這篇文章寫的非常好,亮點是不光有交互式圖表,還有PlayGround,可見作者是下了一番功夫的。
先科普一下什么是Playground?
Playground通常指在機器學習和人工智能領域用來交互式體驗和可視化AI模型的一種系統或平臺。
下面展示兩個AI?Playground。
https://catalog.ngc.nvidia.com/orgs/nvidia/teams/playground/models/clip
https://catalog.ngc.nvidia.com/orgs/nvidia/teams/playground/models/codellama
NVIDIA NGC或者Hugging face上有更多好玩的AI Playground,大家可以親自去體驗一下。
https://huggingface.co/
https://catalog.ngc.nvidia.com/
A Gentle Introduction to Graph Neural Networks
https://distill.pub/2021/gnn-intro/
但我不會將上面的文章原樣照搬過來,而是進行概括性的總結,大家一定一定去閱讀原文,因為原文里有大量的交互式圖表和Playground,能加速對GNN的理解。
今天的主角是GNN,而GNN處理的對象是圖Graph。跟其它神經網絡一樣,在其出現之前,都有傳統的方法來處理對應的數據結構。
但是在數據量和算力的加持下,為了完成更復雜的任務,對應的神經網絡應運而生,GNN也是如此。
后續內容主要分為四部分
1.什么樣的數據可以很自然的表示成圖
2.圖與其它類型數據的不同之處以及如何應對這種不同
3.構建一個GNN
4.構建一個Playground在真實數據上進行訓練
什么是圖?
圖是由節點和邊組成的,用于表示對象之間關系的數據結構。
圖也分為有向圖和無向圖,例如,社交媒體中,如果互相關注了則是無向圖,如果像B站這樣,我關注了你,但你并沒有關注我,則是有向圖。
節點有自己的屬性,邊有自己的屬性,整個圖也有自己的屬性,如上圖,屬性可以用標量或者向量表示。向量大小可以不一致。
前面已經透漏了GNN可以處理圖像和文本,那么圖像和文本就可以表示成圖。
先透露一下計算機如何存儲圖,一種是鄰接矩陣,一種是鄰接表。
圖像的每個像素即是一個節點,節點的屬性自然就是RGB值,相鄰像素之間用一條邊來表示相鄰關系,這里用鄰接矩陣來表示連接性。
同理,一個句子中每個字符,每個單詞,每個Token都可以看作是一個節點,相鄰節點之間可以用一條有向邊相連,這就構成了一個有向圖。
除此之外,還有很多其它數據可以表示成圖。
分子由兩個或多個原子通過共用電子對構成化學鍵而連接成一個整體,分子之間不同的連接方式構成了不同的物質。
社會是一個大家庭,所有成員和之間的關系構成了一個復雜的社交網絡。
如果能夠充分利用這個網絡,就能發揮巨大價值,例如,知識圖譜,推薦系統。
引用關系也可以組織成圖,例如,維基百科中每個網頁都會列出引用資料。
好了,到此我們已經能夠把很多事物表示成圖的形式,這樣就夠用GNN來處理了,那到底能干什么呢?
GNN主要能處理三種類型的任務。
圖層面任務
對圖的整體進行預測,GNN輸出對整個圖的預測屬性,例如,下圖中分辨出具有兩個環的圖,這就是一個針對整個圖的分類任務。
對于圖像和文本而言,圖層面的任務類似于MINIS數字分類,或者句子情感分析,例如。判斷一個句子表達的是正向情緒還是負面情緒。
頂點層面任務
GNN預測圖中每一個節點的屬性,例如,下圖,預測社交網絡中的成員是否是詐騙分子。這就是一個節點分類任務。
對于圖像和文本而言,頂點層面的任務類似于圖像分割,圖像分割不就是對每個像素分類嘛,對于文本,就是預測句子中每個單詞的詞性(例如名詞、動詞、副詞等)。
邊層面任務
邊的存在與否是一種結構屬性,也就是連接性,GNN也可以預測圖中邊的非結構屬性,什么是非結構屬性?對于一個社交網絡而言,邊代表節點之間有關系,但如何度量親疏程度呢?這就涉及邊的非結構屬性了。
預測親疏程度是一個回歸任務,下圖則是一個分類任務,每一條邊只能是watching,fighting,standing on中的一種。
后面我們會看到,這三類任務可以用一個統一的GNN網絡解決。
???????
GNN所面對的挑戰
前面對于節點,邊,圖的屬性預測GNN都能處理,但對于節點之間的連接性預測卻是一種挑戰,前面說過用鄰接矩陣來表示連接性,當節點數增加,矩陣會變得非常稀疏,內存利用率很低,
例如,下圖,僅有四個節點的隨機組合對應的鄰接矩陣就非常龐大了。
何況更多節點呢?
另外,當你將矩陣轉置后,GNN輸出結果不應該改變,因為轉置沒有改變節點之間的關系。
為了解決鄰接矩陣帶來的挑戰,鄰接列表應運而生。
到此我們已經掃清了所有障礙,接下來我們就構建一個簡單的分類網絡,來看看GNN是如何做預測的?
前面我們說過節點,邊,圖的屬性就是一堆向量,也就是前面說的表格數據,處理向量用MLP就可以了,當然你也可以用其他網絡,如上圖,節點,邊,圖各有一個MLP,所有點參數共享,也就是所有點共用一個MLP,所有邊共用一個MLP。
另外,Layner n+1與上一層相比,圖的連接性沒變,只改變了屬性。也就是可以繼續使用初始的鄰接鏈表。
上圖構成了一個GNN block,也叫做GNN層,類似CNN中的卷積層,多個GNN 層可以進行累加形成更復雜的網絡。
有了GNN block,如果要構建一個節點二分類任務,那么用下面這個網絡就夠了。
但是,如果一個圖只有邊有信息,而節點沒有存儲信息,又要對節點進行分類,該怎么辦?
此時就需要把邊的信息利用起來了,這被稱為信息聚合。
如上圖,當對一個節點進行預測時,將所有與其相連的邊的信息聚合起來作為節點的屬性。
聚合操作可以時平均值,最大值,總和。
所以,有了信息聚合后,如果只有邊的屬性,要對節點分類,網絡結構如下:
同理,有了信息聚合后,如果只有節點信息,要對邊分類,網絡結構如下:
有了信息聚合后,只有節點信息,對圖分類:
最終的GNN結構如下:
有了信息聚合,就能構建更復雜的GNN網絡,這個網絡不僅能二分類同樣適用于多分類問題。
但是你發現沒,上面這個簡單的GNN網絡并沒有利用連接性信息,每個節點以及每條邊和全局上下文都是獨立處理的。只有在聚合信息進行預測時才使用連接性。
所以,我們可以更進一步的利用聚合信息操作,這樣就能進行更復雜的預測。
那么該怎么做呢?
我們可以使用消息傳遞的方法來實現這一點,即相鄰節點或邊之間交換信息并影響彼此更新的嵌入。
如上圖,也就是在處理當前節點時,把相鄰節點的信息聚合過來。
這跟卷積操作有點像,一個特征圖的像素對應上一層的一個相鄰區域。
有了信息傳播操作后,我們的GNN網絡更新如下:
節點層面任務:
邊層面任務:
圖層面任務:
最后,展示了一個Playground,可以改變網絡的層數,聚合操作類型,以及各個屬性向量的長度,可以通過最終的模型性能來展示各個參數的影響。