圖神經網絡(Graph Neural Network)在社交網絡、推薦系統(tǒng)、知識圖譜上的效果初見端倪,成為近2年大熱的一個研究熱點。然而,什么是圖神經網絡?圖和神經網絡為什么要關聯?怎么關聯?
本文將以淺顯直覺的方式,介紹GNN的靈感來源,構造方法,訓練方式等,根據《Representation Learning on Networks》中GNN部分,做了具體的解讀和詮釋,并增補了一些代碼中才有的實現細節(jié),幫助初學者理解。
代碼實現:(https://github.com/leichaocn/graph_representation_learning)
目錄
卷積神經網絡的啟示
核心想法
傳播機制
傳播機制舉例
訓練的方式
一般的設計步驟
Node2Vec與GNN的對比
總結
參考文獻
卷積神經網絡的啟示
回顧對圖像的簡單卷積:

圖1.卷積網絡的基本操作(source)
如圖1所示:一幅圖(image)所抽取的特征圖(features map)里每個元素,可以理解為圖(image)上的對應點的像素及周邊點的像素的加權和(還需要再激活一下)。
同樣可以設想:一個圖(graph)所抽取的特征圖(也就是特征向量)里的每個元素,也可以理解為圖(graph)上對應節(jié)點的向量與周邊節(jié)點的向量的加權和。
澄清幾個概念:
特征向量:一條數據(image、word、node等)的數字化表示,是機器學習任務的必備輸入。
embedding:更好的特征向量,蘊含潛在語義信息,是來自network訓練后的結果,如果能找到優(yōu)秀的embedding,將有效提升后面機器學習任務的性能表現。例如從word2vec網絡中抽出的word embedding向量,“北京”“巴黎”這兩個詞就比較相似,因為都是首都;從CNN網絡中抽出的image embedding,暹羅貓、無耳貓兩個圖片的向量就比較相似,因為都有貓。
features map :由cnn生成的特征向量,也就是image embedding。image 經過一層CNN前向傳播后的輸出,是一個二維的矩陣,只要進行拉直(flatten),就轉變?yōu)榱艘痪S的特征向量。類似于全連接神經網絡網絡里每一層里都能獲取的一維的特征向量。
這種遷移聯想值得好好體會。
體會明白后,那具體怎么做呢?
核心想法
正如上面討論的,歸納為一句話:用周圍點的向量傳播出自己的Embedding。
一個非常簡單的例子就能搞明白。

圖2.一個圖(graph)的例子(source)
對于圖2來說,要計算節(jié)點A的Embedding,我們有以下的兩條想法:
- 節(jié)點A的Embedding,是它的鄰接節(jié)點B、C、D的Embedding傳播的結果
- 而節(jié)點B、C、D的Embedding,又是由它們各自的鄰接節(jié)點的Embedding傳播的結果。
但是你可能會說,這樣不斷追溯,何時能結束?所以為了避免無窮無盡,我們就做兩層,可以構造圖3的傳播關系。

圖3.由兩層傳播生成節(jié)點A的Embedding(source)
第0層即輸入層,為每個節(jié)點的初始向量(根據所處領域里特征數據進行構建),不妨稱為初始Embedding。
-
第一層
節(jié)點B的Embedding來自它的鄰接點A、C的Embedding的傳播。
節(jié)點C的Embedding來自它的鄰接點A、B、C、D的Embedding的傳播。
節(jié)點D的Embedding來自它的鄰接點A的Embedding的傳播。
-
第二層
節(jié)點A的Embedding來自它的鄰接點B、C、D的Embedding的傳播。
好了,大概可能有點感覺了,可是傳播到底是什么?圖中的小方塊里到底在什么什么?
(注意:圖中所有的方塊代表的操作均相同,大小、顏色的差異沒有任何含義)
傳播機制
小方塊里做的就兩件事:
-
收集(Aggregation)
簡言之,就是對上一層的所有鄰接節(jié)點的Embedding,如何進行匯總,獲得一個Embedding,供本層進行更新。
-
更新(Update)
即對本層已“收集完畢”的鄰接點數據,是否添加自身節(jié)點的上一層Embedding,如果是如何添加,如何激活,等等方式,最終輸出本層的Embedding。
表達成數學公式,即下面這個式子:

先解釋其中的符號含義:表示節(jié)點的Embedding,下標
或
表示節(jié)點的索引,上標
表示第幾層的意思,
表示激活函數,
和
表示矩陣,
表示節(jié)點
的鄰接點集合,
表示收集操作。
這個公式的右邊就做了兩件事:
- 收集:即
部分
- 更新:除了
外的其他部分。
這個公式太抽象,我們舉例說明三種常見的圖神經網絡,看看是如何設計的。
傳播機制舉例
基礎版本

1)收集
即直接對上一層所有節(jié)點的Embedding求平均。
2)更新
即為用收集完畢的Embedding與本節(jié)點上一層的Embedding進行了加權和,然后再激活。顯然,由于上一層Embedding與本層Embedding維度相同,所以和
為方陣。
圖卷積網絡(Graph Convolutional Networks)

1)收集
由可知,收集的輸入Embeddings不僅僅包括節(jié)點
的鄰接點們的Embedding,還包括節(jié)點
自身的Embedding,而分母變成了
,是一種更復雜的加權和,不僅考慮了節(jié)點
的鄰接點的個數,還考慮了每個鄰接點
自身的鄰接接個數。(基礎版本中的平均是最簡單的加權和)
2)更新
顯然比基礎版本簡單多了,不再考慮節(jié)點自己的上一層Embedding,直接讓收集好的Embedding乘上矩陣
后再激活完事。
之所以叫圖卷積網絡,是因為和卷積網絡的套路類似,對自己和周邊節(jié)點(像素)進行加權求和。
GraphSAGE

這不就是咱們上面提到的那個概念公式?是的,GraphSAGE由于其變體較多,所以需要用這個最抽象的公式來概括它。
1)收集
可以有如下的收集方式:
-
直接平均
這是最簡單的收集方式

- 池化

- LSTM

2)更新
收集好的Embedding經過矩陣變換,節(jié)點
自己上一層的Embedding經過矩陣
變換,我們即可得到兩個Embedding,把它倆給按列拼接起來。
這里要注意:它倆不是相加;矩陣和矩陣
都不是方陣,均自帶降維功能。
輸出是
維,
是
維,但是經過軍陣變換后,它倆都成了
維,經過拼接,又恢復成
維。
訓練的方式
無監(jiān)督的訓練
跑不同的Aggregation和Update方法,結合自定義的損失函數,都可以訓練出這些權重。這里的自定義損失函數,需要根據你對節(jié)點Embedding的最終期望,讓它附加上一個什么樣的效果來設計。
例如word2vec利用序列中的上下文信息,用一個詞預測周圍詞,構造分類損失來訓練。圖的無監(jiān)督訓練也可以用一個節(jié)點預測周圍節(jié)點,構造分類損失來訓練。當然,還有其他的無監(jiān)督套路,這個視頻不錯(18min~21min):https://www.bilibili.com/video/av53422483/
在無監(jiān)督任務中,獲取經過神經網絡優(yōu)化的Embedding,就是我們的目的。
有監(jiān)督的訓練
如果我們想要實現節(jié)點分類,那么我們就需要有帶標簽的訓練數據,設計損失函數,即可進行訓練。
例如,我們有一批帶label的圖結構的數據,已經標記好了哪些是水軍,哪些是普通用戶。我們就可以構造如下的交叉熵損失函數。

圖4.有監(jiān)督訓練中損失函數的構造(source)
-
轉換矩陣
注意其中的
即節(jié)點
的Embedding,
是節(jié)點
的label,那
是什么鬼?
如剛才我們討論的,圖神經網絡的傳播結果,是所有節(jié)點經過“傳播”優(yōu)化的Embedding,這些Embedding的維度均為
維(在初始化時定義好的),而我們分類任務可能是
類,所以,需要再前向傳播的最后一層,加入矩陣,把
維的輸出映射成
維的輸出,這樣才能讓交叉熵損失函數對應起來。
由于我們列舉的是二分類任務,圖4中也用的是二分類的交叉熵損失,因此只需要1維輸出足矣,所以在這里的
為1,
為一個向量(可視為把
維壓縮為1維的特殊矩陣)。
在有監(jiān)督任務中,獲取經過神經網絡優(yōu)化的Embedding,還需要進行分類。所以Embedding不是目的,只是實現分類的手段。
一般的設計步驟
綜上,各類圖神經網絡架構主要區(qū)別是:
- 傳播機制的區(qū)別,即收集和更新的設計(圖3中小方塊)。
- 有無監(jiān)督及損失函數的區(qū)別。
設計圖神經網絡的一般步驟是:
- 定義收集與更新方式。
- 定義損失函數。
- 在一批節(jié)點上進行訓練。
- 生成Embedding,即使是模型未見過的Embedding,模型也可以對其初始化Embedding進行“傳播優(yōu)化”。
Node2Vec與GNN的對比
由于Embedding這個術語被我以廣義的方式,用了太多次,很容易導致混淆,所以這里對Embedding在不同狀態(tài)時做一個總結。

總結
圖神經網絡是以鄰接點Embedding的淺層傳播來訓練Embedding。
改變Aggregation和update的方式,可以構造不同的圖神經網絡;
既可以用無監(jiān)督的方式獲得Embedding,也可以用有監(jiān)督的方式直接訓練分類任務。
參考文獻
[1] Jure Leskovec, 《Graph Representation Learning》
[2] Jure Leskovec, 《Representation Learning on Networks》