本文是跟著李沐老師的論文精度系列進行GNN的學習的,詳細鏈接請見:零基礎多圖詳解圖神經網路(GNN/GCN)【論文精讀】
該論文的標題為《A Gentle Introduction to Graph Neural Networks》,是對GNN的簡介,那么論文的第一張圖呢把滑鼠放上去某一個結點將會表示出該節點的生成程序,可以看到放于Layer1中的某個節點時,它是由Layer2中的多個節點生成,而Layer2中的這些結點又有Layer3的部分節點生成,因此只要層次夠深,那么一個節點就可以處理原始大片節點的資訊,

圖這種資料結構在當前隨處可見,因此圖神經網路如果能夠發揮對圖這種結構的良好處理能力,將會有很廣泛的應用場景,例如藥物的生成、車流量檢測、推薦系統、人物關系等等,
文章的主要內容分為四塊,分別是
- 什么樣的資料結構可以表示為圖
- 圖和別的資料結構的區別在哪,為什么要用圖神經網路
- 構建一個GNN查看內部各模塊的內容
- 提供一個GNN的操作平臺
1、什么是圖
圖實際上就是表示物體(頂點)的資訊以及它們之間的連接關系(邊),而圖的節點所包含的資訊、邊表達的資訊、以及整個圖表達的資訊都可以用向量來表示,因此就存在三種向量,
而圖又分為有向圖和無向圖,如下:

那么資料如何表示為圖呢?
1.1 圖片表示為圖
如果將每個像素點看成一個頂點,而鄰接的關系看成圖中的邊的,那么就可以用鄰接矩陣來表示這個影像了,如下:

在圖中我們可以看到,最左邊的圖呢代表每個像素它的位置,兩位數字分別代表行和列,那么它旁邊的那些像素總共有8個和它靠近,那么在第三張圖中就有8的頂點和它存在邊的連接,而如何將第三張圖表示成資料呢,就是用鄰接矩陣,可以看到鄰接矩陣的行和列每個元素都是一個頂點,如果頂點和頂點之間存在邊的關系那么將會在矩陣的對應位置用藍色的點進行標注,因此我們就將圖片表示成了一個圖,再用鄰接矩陣這種結構來表示圖了,
1.2 文本表示為圖
文本可以看成一個序列,將每個單詞看成一個頂點,而相鄰的單詞可以看成存在有向邊的連接,再用鄰接矩陣來表示,如下:

1.3 其他資料結構表示為圖
例如咖啡因分子:

人物關系圖:

空手道道館中老師與學生的關系圖:

等等,
1.4、資料表示成圖后存在哪些問題
圖上的問題大致上可以分為三類,第一類是關于整個圖的任務,第二類是關于圖中的頂點的任務,第三類任務是關于圖中的邊的任務,
-
關于整個圖的任務
例如我們將分子的結構表示成圖之后,我們要識別該圖中是否有兩個環,那么我們就可以做成一個分類任務:

-
關于頂點的屬性判斷的任務
對頂點進行劃分,劃分成兩類,例如上述提到的空手道老師的任務,兩位老師因為意見不合而決裂,那么我們所有的學生都要做出選擇哪位老師的任務,因此就是對頂點的型別進行分類的任務:

-
關于邊的屬性判斷的任務
例如在下圖中,先對各種元素進行提取成頂點,然后判斷各個頂點之間是什么關系,例如觀看、攻擊等等:

也就是對一個圖中的邊的屬性進行劃分:

1.5、將機器學習用于圖模型中將會有什么挑戰
首先,前面說到的圖的資訊、頂點的資訊、邊的資訊可以用向量來表示,這對于神經網路是由友好的,但是關于各個頂點之間的連接性應該怎么表達是一個大問題,而我們前面提到鄰接矩陣,首先它所占用的空間會非常大,其次對于這種稀疏矩陣的高效處理也是一個很大的問題,再者如果我們將矩陣中的某些列或者某些行進行交換,是不會影響鄰接矩陣所表示的含義的,如下圖:

或者看下面這個例子,對于四個頂點的圖可以有這么多可能的鄰接矩陣:

這就需要我們保證我們的網路也能夠在應對這樣的變化時做出相同的決策,
那么我們可以用到如下這種資料結構來表示:

對于每個頂點和每條邊,我們都可以用標量或者向量來表示它們的內部屬性,全域的圖也是一樣的,而對于所有的連接資訊,我們則可以維護一個連接串列的結構,其中每一個值代表每條邊對應連接的兩個節點,
2、圖神經網路(GNN)
原文中對于GNN的定義是:
A GNN is an optimizable transformation on all attributes of the graph (nodes, edges, global-context) that preserves graph symmetries (permutation invariances)
意思就是GNN 是對圖的所有屬性(節點、邊、全域背景關系)的可優化轉換,它保留了圖的對稱性(置換不變性),也就是將順序變化之后不會影響的,而這里用到的神經網路結構為message passing neural network,即資訊傳遞神經網路,它會對圖中的各種屬性向量進行轉換,但不會改變其連接性,并且其輸入和輸出都是一個圖,
2.1 最簡單的GNN

一個最簡單的GNN如上圖所示:對于圖、頂點、邊這三類屬性分類構造一個多層感知機(MLP),然后將對應的向量輸入進去后得到一個新的向量來表示新的資訊,而這并不會改變原來連接性的資訊,因此圖的結構仍然是保持不變的,那么我們如何將這些資訊轉換成我們想要的輸出呢
假設現在是對頂點的資訊進行預測,就是之前空手道的二分類任務,那么我們可以在最后一層輸出的圖后,接上一個全連接層,然后再接上一個Softmax層即可,例如我們要進行二分類任務,那我們的全連接層的輸出維度設為2即可,n分類就設為n, 需要注意的是不管有多少個頂點,它們是共享一個全連接層的,共享其中的引數,那么也就是所有的頂點共享一個全連接層,所有的邊共享一個全連接層, 全域自己就擁有一個全連接層,
那么再來看稍微復雜一點的情況,例如某個頂點我們沒有其向量該怎么辦呢,可以采用pooling技術,即將與該頂點相連的邊的向量和全域的向量進行相加,就得到了代表這個頂點的向量,那么我們就可以拿這個向量去做預測等任務了,示意圖如下:

其中紅色的箭頭代表四條邊的向量,藍色箭頭的向量代表全域的向量,那么相加就可以得到該頂點的向量了,可表示成下面的示意圖:

那么如果有頂點的向量而沒有邊的向量也是同理,只需要將該邊所連接的兩個頂點的向量和全域的向量進行相加即可,即:

而如果是擁有頂點的向量而沒有全域的向量,那么可以將全部頂點的向量加起來作為全域的向量,即:

所以不管缺乏哪一類的屬性都可以通過pooling來補齊,
因此完整的最簡單的GNN如下圖:

但這部分的問題是在GNN blocks中并沒有考慮到圖的結構資訊,這相當于對資訊的浪費,結構可能不太理想,那么要用到下面的技術,
2.2 在圖表的各部分之間傳遞資訊
這部分的思想其實很容易理解,例如在對頂點進行更新時并不是直接進入MLP之中,而是將該頂點的向量和與之相連的所有頂點的向量求和,再進入MLP之中得到該頂點的更新向量,即:

這種情況呢就是只在頂點之間進行資訊傳遞,即:

我們還可以實作更復雜的資訊傳遞,例如把頂點的資訊傳遞給邊,把邊的資訊傳遞給頂點,即下圖:

其中\(\rho _{V_n-E_n}\)代表將頂點的資訊傳遞到邊,即將邊相連的兩個頂點的向量加到邊的向量之上,而\(\rho _{E_n-V_n}\)就是將邊的資訊傳遞到頂底,即將頂點有關系的邊的向量都加到頂點的向量之上,完成之后再進入各自的MLP進行更新,這里需要注意的是這兩個順序交換是不一樣的,即下面兩種處理方式是不一樣的:

但目前也沒有特別明顯的證明哪一種更好,另外一個辦法就是兩邊同時更新,兩種方式同時實施,即:

其實從之前我們就沒有深入講解說為什么需要一個全域的向量,這是因為如果你的圖很大,有很多的節點但是連接又不夠緊密的話,那么訊息從一個頂點傳遞到遠處的頂點可能需要很久的時間或者說很多次的傳遞程序,那么便虛擬化一個頂點,可以稱為master node,該點呢與所有的頂點都相連,同時與所有的邊都相連,作為訊息傳遞的重要部分,那么對于全域向量加入了資訊傳遞的程序就可以表示為下圖,其中更新邊的資訊的時候是頂點和全域都傳遞資訊,更新頂點的資訊的時候是邊和全域都傳遞資訊,而同樣,更新全域資訊的時候也邊和頂點都傳遞資訊,

前述的pooling操作不僅僅可以求和,還可以做平均、取最大值這類操作,
3、當前技術綜述
圖除了我們前述的那種結構之外,是存在許多種其他結構的,例如下面這兩種:

第一種是具有多種的邊的型別,存在有向邊和無向邊;而第二種呢代表圖可能是多層的,即當前層的某一個頂點其實可能是一整個圖,
另外一個需要注意的點在于,如果層數較多那么后面層中的某一個頂點可能記錄的資訊就是整個圖的資訊了,那么求梯度的時候會非常復雜,因此可以嘗試的方法是每次進行采樣,采樣得到一個子圖然后再該子圖上進行訊息傳遞,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/540202.html
標籤:其他
