【GNN】硬核!一文梳理经典图网络模型
作者?|?Chilia???????
哥倫比亞大學?nlp搜索推薦???
整理?|?NewBeeNLP
圖神經網絡已經在NLP、CV、搜索推薦廣告等領域廣泛應用,今天我們就來整體梳理一些經典常用的圖網絡模型:DeepWalk、GCN、Graphsage、GAT!
1. DeepWalk [2014]
DeepWalk是來解決圖里面節點embedding問題的。Graph Embedding技術將圖中的節點以低維稠密向量的形式進行表達,要求在原始圖中相似(不同的方法對相似的定義不同)的節點其在低維表達空間也接近。得到的表達向量可以用來進行下游任務,如節點分類(node classification),鏈接預測(link prediction)等。
1.1 DeepWalk 算法原理
雖然DeepWalk是KDD 2014的工作,但卻是我們了解Graph Embedding無法繞過的一個方法。
我們都知道在NLP任務中,word2vec是一種常用的word embedding方法,word2vec通過語料庫中的句子序列來描述詞與詞的共現關系,進而學習到詞語的向量表示。
DeepWalk的思想類似word2vec,使用圖中節點與節點的共現關系來學習節點的向量表示。那么關鍵的問題就是如何來描述節點與節點的共現關系,DeepWalk給出的方法是使用**隨機游走(RandomWalk)**的方式在圖中進行節點采樣。
RandomWalk是一種可重復訪問visited節點的深度優先遍歷算法。給定當前訪問起始節點,從其鄰居中隨機采樣節點作為下一個訪問節點,重復此過程,直到訪問序列長度 = K。獲取足夠數量的節點訪問序列后,使用skip-gram進行向量學習,這樣能夠把握節點的共現信息。這樣就得到了每個節點的embedding。
2. GCN [2016]
GCN的概念首次提出于ICLR 2017:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS。
為什么要用GCN呢?這是因為對于圖結構的數據,CNN、RNN都無法解決。
對于圖片來說,我們用卷積核來提取特征,這是因為圖片有平移不變性:一個小窗口無論移動到圖片的哪一個位置,其內部的結構都是一模一樣的,因此CNN可以實現參數共享。RNN主要用在NLP這種序列信息上。圖片,或者語言,都屬于歐式空間的數據,因此才有維度的概念,歐式空間的數據的特點就是結構很規則。
但是圖結構(拓撲結構)如社交網絡、知識圖譜、分子結構等等是十分不規則的,可以認為是無限維的一種數據,所以它沒有平移不變性。每一個節點的周圍結構可能都是獨一無二的,這種結構的數據,就讓傳統的CNN、RNN瞬間失效。
GCN,圖卷積神經網絡,實際上跟CNN的作用一樣,就是一個特征提取器,只不過它的對象是圖。GCN精妙地設計了一種從圖數據中提取特征的方法,從而讓我們可以使用這些特征去對圖數據進行:
節點分類(node classification)
圖分類(graph classification)
鏈接預測(link prediction)
2.1 GCN的核心公式
假設我們手頭有一個圖,其中有N個節點,每個節點都有自己的特征embedding,我們設這些節點的特征組成一個N×D維的矩陣 ,然后各個節點之間的關系也會形成一個N×N維的矩陣A(就是鄰接矩陣)
GCN也是一個神經網絡層,它的層與層之間的傳播方式是:
這個公式中:
, 是單位矩陣。
是度矩陣(degree matrix),D[i][i]就是節點i的度。
H是每一層的特征,對于第一層(輸入層)的話,就是矩陣 。
σ是非線性激活函數
用這個公式就可以很好地提取圖的特征。假設我們構造一個兩層的GCN,激活函數分別采用ReLU和Softmax,則整體的正向傳播的公式為:
402 Payment Required
其中, .
那么, 為什么這個公式能提取圖的特征呢?
A+I 其實是保證對于每個節點,都能夠關注到其所有鄰居節點和自己的embedding。
左右乘上度矩陣D是為了對A做一個標準化處理,讓A的每一行加起來都是1.
當然,原論文中用非常復雜的數學公式做了很多證明,由于筆者數學不好,只能如此不求甚解的來粗略理解,感興趣的同學可以自行閱讀原論文。
3. GraphSAGE
3.1. GCN的局限
GCN本身有一個局限,即沒法快速表示新節點。GCN需要把所有節點都參與訓練(整個圖都丟進去訓練)才能得到node embedding,如果新node來了,沒法得到新node的embedding。所以說,GCN是transductive的。(Transductive任務是指:訓練階段與測試階段都基于同樣的圖結構)
而GraphSAGE是inductive的。inductive任務是指:訓練階段與測試階段需要處理的graph不同。通常是訓練階段只是在子圖(subgraph)上進行,測試階段需要處理未知的頂點。
要想得到新節點的表示,需要讓新的node或者subgraph去和已經優化好的node embedding去“對齊”。然而每個節點的表示都是受到其他節點的影響(牽一發而動全身),因此添加一個節點,意味著許許多多與之相關的節點的表示都應該調整。
3.2 GraphSAGE
針對這種問題,GraphSAGE模型提出了一種算法框架,可以很方便地得到新node的表示。
3.2.1 Embedding generation(前向傳播算法)
Embedding generation算法共聚合K次,總共有K個聚合函數(aggregator),可以認為是K層,來聚合鄰居節點的信息。假如 用來表示第k層每個節點的embedding,那么如何 從 得到呢?
就是初始的每個節點embedding。
對于每個節點v,都把它隨機采樣的若干鄰居的k-1層的所有向量表示 、以及節點v自己的k-1層表示聚合成一個向量,這樣就得到了第層的表示 。這個聚合方法具體是怎么做的后面再詳細介紹。
文中描述如下:
隨著層數K的增加,可以聚合越來越遠距離的信息。這是因為,雖然每次選擇鄰居的時候就是從周圍的一階鄰居中均勻地采樣固定個數個鄰居,但是由于節點的鄰居也聚合了其鄰居的信息,這樣,在下一次聚合時,該節點就會接收到其鄰居的鄰居的信息,也就是聚合到了二階鄰居的信息了。這就像社交圖譜中“朋友的朋友”的概念。
3.2.2 聚合函數選擇
Mean Pooling:
這個比較好理解,就是當前節點v本身和它所有的鄰居在k-1層的embedding的mean,然后經過MLP+sigmoid
LSTM Aggregator:把當前節點v的鄰居隨機打亂,輸入到LSTM中。作者的想法是說LSTM的模型capacity更強。但是節點周圍的鄰居明明是沒有順序的,這樣做似乎有不妥。
Pooling Aggregator:
把節點v的所有鄰居節點都單獨經過一個MLP+sigmoid得到一個向量,最后把所有鄰居的向量做一個element-wise的max-pooling。
3.2.3 GraphSAGE的參數學習
GraphSAGE的參數就是聚合函數的參數。為了學習這些參數,需要設計合適的損失函數。
對于無監督學習,設計的損失函數應該讓臨近的節點的擁有相似的表示,反之應該表示大不相同。所以損失函數是這樣的:
其中,節點v是和節點u在一定長度的random walk上共現的節點,所以它們的點積要盡可能大;后面這項是采了Q個負樣本,它們的點積要盡可能小。這個loss和skip-gram中的negative sampling如出一轍。
對于有監督學習,可以直接使用cross-entropy loss等常規損失函數。當然,上面的這個loss也可以作為一個輔助loss。
3.3 和GCN的關系
原始GCN的方法,其實和GraphSAGE的Mean Pooling聚合方法是類似的,即每一層都聚合自己和自己鄰居的歸一化embedding表示。而GraphSAGE使用了其他capacity更大的聚合函數而已。
此外,GCN是一口氣把整個圖都丟進去訓練,但是來了一個新的節點就不免又要把整個圖重新訓一次。而GraphSAGE則是在增加了新的節點之后,來增量更新舊的節點,調整整張圖的embedding表示。只是生成新節點embedding的過程,實施起來相比于GCN更加靈活方便了。
4. GAT (Graph Attention Network)
4.1 GAT的具體做法
對于每個節點,注意力其在鄰居頂點上的注意力。對于頂點 ,逐個計算它的鄰居們和它自己之間的相似系數:
首先一個共享參數 的線性映射對于頂點的特征進行了增維,當然這是一種常見的特征增強(feature augment)方法;之后,對變換后的特征進行了拼接(concatenate);最后 a(·)把拼接后的高維特征映射到一個實數上,作者是通過單層的MLP來實現的。
然后,再對此相關系數用softmax做歸一化:
402 Payment Required
最后,根據計算好的注意力系數,把特征加權求和一下。這也是一種aggregation,只是和GCN不同,這個aggregation是帶注意力權重的。
402 Payment Required
就是輸出的節點的embedding,融合了其鄰居和自身帶注意力的權重(這里的注意力是self-attention)。
為了增強特征提取能力,用multi-head attention來進化增強一下:
4.2 與GCN的聯系
GCN與GAT都是將鄰居頂點的特征聚合到中心頂點上(一種aggregate運算)。不同的是GCN利用了拉普拉斯矩陣,GAT利用attention系數。一定程度上而言,GAT會更強,因為 頂點特征之間的相關性被更好地融入到模型中。
GAT適用于有向圖。這是因為GAT的運算方式是逐頂點的運算(node-wise),每一次運算都需要循環遍歷圖上的所有頂點來完成。逐頂點運算意味著,擺脫了拉普利矩陣的束縛,使得有向圖問題迎刃而解。也正因如此,GAT適用于inductive任務。與此相反的是,GCN是一種全圖的計算方式,一次計算就更新全圖的節點特征。
-?END?-
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【GNN】硬核!一文梳理经典图网络模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 位运算与权限,PHP中的二进制位
- 下一篇: 【NLP】文本分类还停留在BERT?对偶