Graph-GraphSage

MPNN很好地歸納了空域卷積的過程,但定義在這個框架下的全部模型都有一個共同的缺陷:html

1. 卷積操做針對的對象是整張圖,也就意味着要將全部結點放入內存/顯存中,才能進行卷積操做。但對實際場景中的大規模圖而言,整個圖上的卷積操做並不現實。GraphSage[2]提出的動機之一就是解決這個問題。從該方法的名字咱們也能看出,區別於傳統的全圖卷積,GraphSage利用採樣(Sample)部分結點的方式進行學習。固然,即便不須要整張圖同時卷積,GraphSage仍然須要聚合鄰居結點的信息,即論文中定義的aggregate的操做。這種操做相似於MPNN中的消息傳遞過程。node

2. 以前的方法是固有的直推式獲得node embeddeding,不能泛化,沒法有效適應動態圖中新增節點的特性, 每每須要從頭訓練或至少局部重訓練。算法

3 缺少權值共享(Deepwalk, LINE, node2vec)。節點的embedding直接是一個N*d的矩陣, 互相之間沒有共享學習參數。網絡

4.輸入維度固定爲|V|。不管是基於skip-gram的淺層模型仍是基於autoencoder的深層模型,輸入的維度都是點集的大小。訓練過程依賴點集信息的固定網絡結構限制了模型泛化到動態圖的能力,沒法爲新加入節點生成embedding。app


GraphSage 的模型框架

 

文中不是對每一個頂點都訓練一個單獨的embeddding向量,而是訓練了一組aggregator functions,這些函數學習如何從一個頂點的局部鄰居聚合特徵信息(見圖1)。每一個聚合函數從一個頂點的不一樣的hops或者說不一樣的搜索深度聚合信息。測試或是推斷的時候,使用訓練好的系統,經過學習到的聚合函數來對徹底未見過的頂點生成embedding。函數

 一種鄰居特徵彙集的方法:性能

1.鄰居採樣(sample neighborhood)。由於每一個節點的度是不一致的,爲了計算高效, 爲每一個節點採樣固定數量的鄰居。學習

2.鄰居特徵彙集(aggregate feature information from neighbors)。經過彙集採樣到的鄰居特徵,更新當前節點的特徵。網絡第k層彙集到的 鄰居即爲BFS過程第k層的鄰居測試

3. 訓練。既能夠用得到的embedding預測節點的上下文信息(context),也能夠利用embedding作有監督訓練。

採樣方法:

  1. 在圖中隨機採樣若干個結點,結點數爲傳統任務中的batch_size。對於每一個結點,隨機選擇固定數目的鄰居結點(receptive field)(這裏鄰居不必定是一階鄰居,也能夠是二階鄰居)構成進行卷積操做的圖。
  2. 將鄰居結點的信息經過aggregate函數聚合起來更新剛纔採樣的結點。
  3. 計算採樣結點處的損失。若是是無監督任務,咱們但願圖上鄰居結點的編碼類似;若是是監督任務,便可根據具體結點的任務標籤計算損失

 arrregate函數的選擇等:

1.在實踐中,每一個節點的receptive field設置爲固定大小,且使用了均勻採樣方法簡化鄰居選擇過程。

2.做者設計了四種不一樣的彙集策略,分別是Mean、GCN、LSTM、MaxPooling。

就aggretor是GCN, 圖卷積彙集W(PX),W爲參數矩陣,P爲鄰接矩陣的對稱歸一化矩陣,X爲節點特徵矩陣。

 

GraphSage的狀態更新公式以下(下式的aggregator 是GCN, 也能夠是maxpooling arregator mean aggregator):

 

\mathbf{h}_{v}^{l+1}=\sigma(\mathbf{W}^{l+1}\cdot aggregate(\mathbf{h}_v^l,\{\mathbf{h}_u^l\}),{\forall}u{\in}ne[v])

 

 

 

 

 

 算法:

第四行表示節點vvv的任意相鄰節點的聚合信息的集合;

$h_{N(v)}^{k}$表示從節點$v$的相鄰節點獲取的信息。

AGGGEGATE表示聚合函數;

第5行,將從相鄰節點獲取的信息和和這個節點自身的信息,進行拼接;

能夠發現,對一個新加入的節點a,只須要知道其自身特徵和相鄰節點,就能夠獲得其向量表示。沒必要從新訓練獲得其餘全部節點的向量表示。固然也能夠選擇從新訓練。可是須要保存全部節點深度爲k的表示,

這個算法直觀的想法是,每次迭代,或者說每一個深度,節點從相鄰節點得到信息。隨着迭代次數的增多,節點增量地從圖中的更遠處得到更多的信息。

graphSAGE並非使用所有的相鄰節點,而是作了固定尺寸的採樣

既然新增的節點,必定會改變原有節點的表示,那麼爲何必定要獲得每一個節點的一個固定的表示呢?何不直接學習一種節點的表示方法。去學習一個節點的信息是怎麼經過其鄰居節點的特徵聚合而來的。 學習到了這樣的「聚合函數」,而咱們自己就已知各個節點的特徵和鄰居關係,咱們就能夠很方便地獲得一個新節點的表示了

GraphSAGE的核心:GraphSAGE不是試圖學習一個圖上全部node的embedding,而是學習一個爲每一個node產生embedding的映射

訓練相關:

1.爲了將算法1擴展到minibatch環境上,給定一組輸入頂點,先採樣採出須要的鄰居集合(直到深度K),而後運行內部循環(算法1的第三行)。
2.出於對計算效率的考慮,對每一個頂點採樣必定數量的鄰居頂點做爲待聚合信息的頂點。設須要的鄰居數量,即採樣數量爲S,若頂點鄰居數少於S,則採用有放回的抽樣方法,直到採樣出SSS個頂點。若頂點鄰居數大於SSS,則採用無放回的抽樣。(即採用有放回的重採樣/負採樣方法達到S)

3.文中在較大的數據集上實驗。所以,統一採樣一個固定大小的鄰域集,以保持每一個batch的計算佔用空間是固定的(即 graphSAGE並非使用所有的相鄰節點,而是作了固定size的採樣)。

 

 

 

4.這裏須要注意的是,每一層的node的表示都是由上一層生成的,跟本層的其餘節點無關,這也是一種基於層的採樣方式。
5.在圖中的「1層」,節點v聚合了「0層」的兩個鄰居的信息,v的鄰居u也是聚合了「0層」的兩個鄰居的信息。到了「2層」,能夠看到節點v經過「1層」的節點u,擴展到了「0層」的二階鄰居節點。所以,在聚合時,聚合K次,就能夠擴展到K階鄰居。

6.鄰居的定義:那就是如何選擇一個節點的鄰居以及多遠的鄰居。這裏做者的作法是設置一個定值,每次選擇鄰居的時候就是從周圍的直接鄰居(一階鄰居)中均勻地採樣固定個數個鄰居。

那我就有一個疑問了?每次都只是從其一階鄰居聚合信息,爲什麼做者說:隨着迭代,能夠聚合愈來愈遠距離的信息呢?
後來我想了想,發現確實是這樣的。雖然在聚合時僅僅聚合了一個節點鄰居的信息,但該節點的鄰居,也聚合了其鄰居的信息,這樣,在下一次聚合時,該節點就會接收到其鄰居的鄰居的信息,也就是聚合到了二階鄰居的信息了。仍是拿出個人看家本領——用圖說話:

在GraphSAGE的實踐中,做者發現,K沒必要取很大的值,當K=2時,效果就灰常好了,也就是隻用擴展到2階鄰居便可。至於鄰居的個數,文中提到S1×S2<=500,即兩次擴展的鄰居數之際小於500,大約每次只須要擴展20來個鄰居便可。
這也是合情合理,例如在現實生活中,對你影響最大就是親朋好友,這些屬於一階鄰居,而後可能你偶爾從他們口中據說一些他們的同事、朋友的一些故事,這些會對你產生必定的影響,這些人就屬於二階鄰居。可是到了三階,可能基本對你不會產生什麼影響了,例如你聽你同窗說他同窗據說她同窗的什麼事蹟,是否是很繞口,繞口就對了,由於你基本不會聽到這樣的故事,你所接觸到的、聽到的、看到的,基本都在「二階」的範圍以內。
7.沒有這種採樣,單個batch的內存和預期運行時是不可預測的,在最壞的狀況下是O(∣V∣)O(|\mathcal{V}|)O(∣V∣)。
8.實驗發現,K沒必要取很大的值,當K=2時,效果就很好了。至於鄰居的個數,文中提到S1⋅S2≤500,即兩次擴展的鄰居數之際小於500,大約每次只須要擴展20來個鄰居時得到較高的性能。
論文裏說固定長度的隨機遊走其實就是隨機選擇了固定數量的鄰居.

聚合函數選取

在圖中頂點的鄰居是無序的,因此但願構造出的聚合函數是對稱的(即也就是對它輸入的各類排列,函數的輸出結果不變),同時具備較高的表達能力。 聚合函數的對稱性(symmetry property)確保了神經網絡模型能夠被訓練且能夠應用於任意順序的頂點鄰居特徵集合上。

Mean aggregator

mean aggregator將目標頂點和鄰居頂點的第k−1層向量拼接起來,而後對向量的每一個維度進行求均值的操做,將獲得的結果作一次非線性變換產生目標頂點的第k層表示向量。
文中用下面的式子替換算法1中的4行和5行獲得GCN的inductive變形:

1. 均值聚合近似等價在transducttive GCN框架[Semi-supervised classification with graph convolutional networks. In ICLR, 2016]中的卷積傳播規則

 

 

 

2.文中稱這個修改後的基於均值的聚合器是convolutional的,這個卷積聚合器和文中的其餘聚合器的重要不一樣在於它沒有算法1中第5行的CONCAT操做——卷積聚合器沒有將頂點前一層的表示

和聚合的鄰居向量.
3.
拼接操做能夠看做一個是GraphSAGE算法在不一樣的搜索深度或層之間的簡單的skip connection[Identity mappings in deep residual networks]的形式,它使得模型得到了巨大的提高

4.舉個簡單例子,好比一個節點的3個鄰居的embedding分別爲[1,2,3,4],[2,3,4,5],[3,4,5,6]按照每一維分別求均值就獲得了聚合後的鄰居embedding爲[2,3,4,5]

Mean aggregator

Pooling聚合器,它既是對稱的,又是可訓練的。Pooling aggregator 先對目標頂點的鄰居頂點的embedding向量進行一次非線性變換,以後進行一次pooling操做(max pooling or mean pooling),將獲得結果與目標頂點的表示向量拼接,最後再通過一次非線性變換獲得目標頂點的第k層表示向量.

1.max表示element-wise最大值操做,取每一個特徵的最大值
2.$\sigma$是非線性激活函數
3.全部相鄰節點的向量共享權重,先通過一個非線性全鏈接層,而後作max-pooling
4.按維度應用 max/mean pooling,能夠捕獲鄰居集上在某一個維度的突出的/綜合的表現。

參數學習

基於圖的損失函數傾向於使得相鄰的頂點有類似的表示,但這會使相互遠離的頂點的表示差別變大:

 

 

1.$Z_{u}$爲節點$u$經過GraphSAGE生成的embedding

 

2.節點v是節點u隨機遊走到達的鄰居

 

3.$\sigma$是sigmoid

 

4.Q是負樣本的數目

 

5.embedding 之間的類似度經過向量點積計算

文中輸入到損失函數的表示$z_{u}$是從包含一個頂點局部鄰居的特徵生成出來的,

而不像以前的那些方法(如DeepWalk),對每一個頂點訓練一個獨一無二的embedding,

而後簡單進行一個embedding查找操做獲得.

基於圖的有監督損失---------------可以使用交叉熵或者範數計算

經過前向傳播獲得節點u的embedding $z_{u}$,而後梯度降低(實現使用Adam優化器) 進行反向傳播優化參數

$W^{k}$和聚合函數內的參數。

新節點embedding的生成

這個$W^{k}$就是dynamic embedding的核心,由於保存下來了從節點原始的高維特徵生成低維embedding的方式。如今,若是想獲得一個點的embedding,只須要輸入節點的特徵向量,通過卷積(利用已經訓練好的$W^{k}$以及特定聚合函數聚合neighbor的屬性信息),就產生了節點的embedding。

GraphSAGE的核心:GraphSAGE不是試圖學習一個圖上全部node的embedding,而是學習一個爲每一個node產生embedding的映射

 

爲何GCN是transductive,爲啥要把全部節點放在一塊兒訓練?
不必定要把全部節點放在一塊兒訓練,一個個節點放進去訓練也是能夠的。無非是若是想獲得全部節點的embedding,那麼GCN能夠把整個graph丟進去,直接獲得embedding,還能夠直接進行節點分類、邊的預測等任務。

其實,經過GraphSAGE獲得的節點的embedding,在增長了新的節點以後,舊的節點也須要更新,這個是沒法避免的,由於,新增長點意味着環境變了,那以前的節點的表示天然也應該有所調整。只不過,對於老節點,可能新增一個節點對其影響微乎其微,因此能夠暫且使用原來的embedding,但若是新增了不少,極大地改變的原有的graph結構,那麼就只能所有更新一次了。從這個角度去想的話,彷佛GraphSAGE也不是什麼「神仙」方法,只不過生成新節點embedding的過程,實施起來相比於GCN更加靈活方便了。在學習到了各類的聚合函數以後,其實就不用去計算全部節點的embedding,而是須要去考察哪些節點,就現場去計算,這種方法的遷移能力也很強,在一個graph上學得了節點的聚合方法,到另外一個新的相似的graph上就能夠直接使用了.

核心思想:

去學習一個節點的信息是怎麼經過其鄰居節點的特徵聚合而來的。學習到了這樣的「聚合函數」,而咱們自己就已知各個節點的特徵和鄰居關係,咱們就能夠很方便地獲得一個新節點的表示了。GCN等transductive的方法,學到的是每一個節點的一個惟一肯定的embedding;而GraphSAGE方法學到的node embedding,是根據node的鄰居關係的變化而變化的,也就是說,即便是舊的node,若是創建了一些新的link,那麼其對應的embedding也會變化,並且也很方便地學到。

本站公眾號
   歡迎關注本站公眾號,獲取更多信息