日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[图神经网络] 图节点Node表示---GraphSAGE与PinSAGE

發布時間:2023/12/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [图神经网络] 图节点Node表示---GraphSAGE与PinSAGE 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一?前言

在大規模圖上學習節點embedding,在很多任務中非常有效,如學習節點拓撲結構的 DeepWalk 以及同時學習鄰居特征和拓撲結構的semi-GCN。

但是現在大多數方法都是直推式學習, 不能直接泛化到未知節點。這些方法是在一個固定的圖上直接學習每個節點embedding,但是大多情況圖是會演化的,當網絡結構改變以及新節點的出現,直推式學習需要重新訓練(復雜度高且可能會導致embedding會偏移),很難落地在需要快速生成未知節點embedding的機器學習系統上。

直推式(transductive)學習:從特殊到特殊,僅考慮當前數據。在圖中學習目標是學習目標是直接生成當前節點的embedding,例如DeepWalk、LINE,把每個節點embedding作為參數,并通過SGD優化,又如GCN,在訓練過程中使用圖的拉普拉斯矩陣進行計算,
歸納(inductive)學習:平時所說的一般的機器學習任務,從特殊到一般:目標是在未知數據上也有區分性。

GraphSAGE(Graph SAmple and aggreGatE)框架,通過訓練聚合節點鄰居的函數(卷積層),使GCN擴展成歸納學習任務,對未知節點起到泛化作用。

二 GraphSage 原理

可視化例子:下圖是GraphSAGE 生成目標節點(紅色)embededing并供下游任務預測的過程

1. 先對鄰居隨機采樣,降低計算復雜度(圖中一跳鄰居采樣數=3,二跳鄰居采樣數=5)

? ? ? ?采樣的階段首先選取一個點,然后隨機選取這個點的一階鄰居,再以這些鄰居為起點隨機選擇它們的一階鄰居。例如下圖中,我們要預測 0 號節點,因此首先隨機選擇 0 號節點的一階鄰居 2、4、5,然后隨機選擇 2 號節點的一階鄰居 8、9;4 號節點的一階鄰居 11、12;5 號節點的一階鄰居 13、15

2. 生成目標節點emebedding 先聚合2跳鄰居特征,生成一跳鄰居embedding,再聚合一跳鄰居embedding,生成目標節點embedding,從而獲得二跳鄰居信息。(后面具體會講)。

聚合具體來說就是直接將子圖從全圖中抽離出來,從最邊緣的節點開始,一層一層向里更新節點


3. 將embedding作為全連接層的輸入,預測目標節點的標簽。

下圖展示了鄰居采樣的優點,極大減少訓練計算量這個是毋庸置疑的,泛化能力增強這個可能不太好理解,因為原本要更新一個節點需要它周圍的所有鄰居,而通過鄰居采樣之后,每個節點就不是由所有的鄰居來更新它,而是部分鄰居節點,所以具有比較強的泛化能力

算法過程:?

外循環表示更新迭代次數,h^k_v表示更新迭代時節點v的隱向量k。在每次更新迭代中,根據一個聚集函數、前一次迭代中v和v鄰域的隱向量以及權矩陣W^k對h^k_v進行更新。

首先,(line1)算法首先初始化輸入的圖中所有節點的特征向量,(line3)對于每個節點v ,拿到它采樣后的鄰居節點N(v)后,(line4)利用聚合函數聚合鄰居節點的信息,(line5)并結合自身embedding通過一個非線性變換更新自身的embedding表示。注意到算法里面的K ,它是指聚合器的數量,也是指權重矩陣的數量,還是網絡的層數,這是因為每一層網絡中聚合器和權重矩陣是共享的

網絡的層數可以理解為需要最大訪問的鄰居的跳數(hops),比如在上圖中,紅色節點的更新拿到了它一、二跳鄰居的信息,那么網絡層數就是2。為了更新紅色節點,首先在第一層(k=1),我們會將藍色節點的信息聚合到紅色解節點上,將綠色節點的信息聚合到藍色節點上。在第二層(k=2)紅色節點的embedding被再次更新,不過這次用到的是更新后的藍色節點embedding,這樣就保證了紅色節點更新后的embedding包括藍色和綠色節點的信息,也就是兩跳信息。

鄰居的定義:

作者的做法是設置一個定值,每次選擇鄰居的時候就是從周圍的直接鄰居(一階鄰居)中均勻地采樣固定個數個鄰居。

那我就有一個疑問了?每次都只是從其一階鄰居聚合信息,為何作者說:隨著迭代,可以聚合越來越遠距離的信息呢?

后來我想了想,發現確實是這樣的。雖然在聚合時僅僅聚合了一個節點鄰居的信息,但該節點的鄰居,也聚合了其鄰居的信息,這樣,在下一次聚合時,該節點就會接收到其鄰居的鄰居的信息,也就是聚合到了二階鄰居的信息。

  • 這里需要注意的是,每一層的node的表示都是由上一層生成的,跟本層的其他節點無關,這也是一種基于層的采樣方式
  • 在圖中的“1層”,節點v聚合了“0層”的兩個鄰居的信息,v的鄰居u也是聚合了“0層”的兩個鄰居的信息。到了“2層”,可以看到節點v通過“1層”的節點u,擴展到了“0層”的二階鄰居節點。因此,在聚合時,聚合K次,就可以擴展到K階鄰居
  • 沒有這種采樣,單個batch的內存和預期運行時是不可預測的,在最壞的情況下是 O ( ∣ V ∣ )?
  • 實驗發現K不必取很大的值,當K=2時,效果就灰常好了,也就是只用擴展到2階鄰居即可。至于鄰居的個數,文中提到S1×S2<=500,即兩次擴展的鄰居數之際小于500,大約每次只需要擴展20來個鄰居即可
  • 論文里說固定長度的隨機游走其實就是隨機選擇了固定數量的鄰居

?

GraphSAGE的實現? 完整代碼git倉庫中淺夢大佬的實現

以MEAN aggregator簡單講下聚合函數的實現

features, node, neighbours = inputsnode_feat = tf.nn.embedding_lookup(features, node) neigh_feat = tf.nn.embedding_lookup(features, neighbours)concat_feat = tf.concat([neigh_feat, node_feat], axis=1) concat_mean = tf.reduce_mean(concat_feat,axis=1,keep_dims=False)output = tf.matmul(concat_mean, self.neigh_weights) if self.use_bias:output += self.bias if self.activation:output = self.activation(output)
  • 對于第K層的aggregator,features為第K-1層所有頂點的向量表示矩陣,node和neighbours分別為第k層采樣得到的頂點集合及其對應的鄰接點集合。
  • 首先通過embedding_lookup操作獲取得到頂點和鄰接點的第K-1層的向量表示。然后通過concat將他們拼接成一個(batch_size,1+neighbour_size,embeding_size)的張量,使用reduce_mean對每個維度求均值得到一個(batch_size,embedding_size)的張量。
  • 最后經過一次非線性變換得到output,即所有頂點的第K層的表示向量
  • GraphSAGE 下面是完整的GraphSAGE方法的代碼

    def GraphSAGE(feature_dim, neighbor_num, n_hidden, n_classes, use_bias=True, activation=tf.nn.relu,aggregator_type='mean', dropout_rate=0.0, l2_reg=0):features = Input(shape=(feature_dim,))node_input = Input(shape=(1,), dtype=tf.int32)neighbor_input = [Input(shape=(l,),dtype=tf.int32) for l in neighbor_num]if aggregator_type == 'mean':aggregator = MeanAggregatorelse:aggregator = PoolingAggregatorh = featuresfor i in range(0, len(neighbor_num)):if i > 0:feature_dim = n_hiddenif i == len(neighbor_num) - 1:activation = tf.nn.softmaxn_hidden = n_classesh = aggregator(units=n_hidden, input_dim=feature_dim, activation=activation, l2_reg=l2_reg, use_bias=use_bias,dropout_rate=dropout_rate, neigh_max=neighbor_num[i])([h, node_input,neighbor_input[i]])#output = hinput_list = [features, node_input] + neighbor_inputmodel = Model(input_list, outputs=output)return model

    其中feature_dim表示頂點屬性特征向量的維度,neighbor_num是一個list表示每一層抽樣的鄰居頂點的數量,n_hidden為聚合函數內部非線性變換時的參數矩陣的維度,n_classes表示預測的類別的數量,aggregator_type為使用的聚合函數的類別。

    ?

    三 GraphSage的聚合

    我們將更新某個節點的過程展開來看,如下圖分別為更新節點A和更新節點B的過程,可以看到更新不同的節點過程每一層網絡中聚合器和權重矩陣都是共享的。

    那么GraphSAGE Sample是怎么做的呢?GraphSAGE是采用定長抽樣的方法,具體來說,定義需要的鄰居個數S ,然后采用有放回的重采樣/負采樣方法達到 。保證每個節點(采樣后的)鄰居個數一致,這樣是為了把多個節點以及它們的鄰居拼接成Tensor送到GPU中進行批訓練。

    聚合函數

    1. 平均聚合器 Mean aggregator

    先對鄰居embedding中每個維度取平均(原始第4,5行),然后與目標節點embedding拼接后進行非線性轉換。

    改進版的平均聚合是采用GCN的卷積層方法(GCN的歸納式學習版本),直接對目標節點和所有鄰居embedding中每個維度取平均,后再非線性轉換。

    上式對應于偽代碼中的第4-5行,直接產生頂點的向量表示,而不是鄰居頂點的向量表示。 mean aggregator將目標頂點和鄰居頂點的第k-1層向量拼接起來,然后對向量的每個維度進行求均值的操作,將得到的結果做一次非線性變換產生目標頂點的第k層表示向量。

    與原始方程相比,它刪除了上面偽代碼第5行中的連接操作。這種操作可以看作是一種“跳躍連接”,本文稍后的部分證明了這種連接在很大程度上提高了模型的性能。

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

    ?

    2. 池化聚合器 Pooling aggregator:

    這個操作符在相鄰的集合上執行一個元素池化函數。下面是最大池化的例子:

    先對目標頂點的鄰接點表示向量進行一次非線性變換,之后進行一次pooling操作(max pooling or mean pooling),將得到結果與目標頂點的表示向量拼接,最后再經過一次非線性變換得到目標頂點的第k層表示向量。可以用均值池化或任何其他對稱池化函數替換。池化聚合器性能最好,而均值池化聚合器和最大池化聚合器性能相近。本文使用max-pooling作為默認的聚合函數。

    ?

    3. LSTM聚合器 LSTM aggregator:

    由于圖中的節點沒有任何順序,將中心節點的鄰居節點隨機打亂作為輸入序列。與平均聚合相比,LSTM聚合具有更大的表達能力。但是,重要的是LSTM并不具有排列不變性,因為它們是以順序方式處理其輸入。因此,需要將LSTM應用于節點鄰居的隨機排列,這可以使LSTM適應無序集合。

    ?

    四 GraphSage的訓練與預測

    那么GraphSAGE是如何學習聚合器的參數以及權重矩陣W

    1 有監督的情況下,可以使用每個節點的預測lable和真實lable的交叉熵作為損失函數。對所有的節點進行一個分類任務,假如是二分類,那么損失函數就是一個交叉熵損失

    訓練的過程,我們可以把多個節點的embedding作為一個batch,如下圖是3個節點對應的embedding

    參數主要有三部分,分類任務的 θ、生成embedding的 W_k?與 B_k?,這些參數對于不同的節點都是共享的

    訓練好的模型,只要是同樣的場景都可以使用,例如我們對某有機物A構建了其蛋白質結構圖,同樣適用于有機物B。在工業場景中,圖中新加一個節點也是很常見的情況,特別是社交網絡這樣的圖,我們依舊不需要重新訓練模型,直接對新加的節點使用訓練好的神經網絡進行embedding的生成即可。

    2 無監督的情況下,可以假設相鄰的節點的embedding表示盡可能相近,因此可以設計出如下的損失函數,損失函數定義如下:

    其中u和v共出現在固定長度的隨機游動中,v_n是與u不共出現的負樣本。這種損失函數鼓勵距離較近的節點進行類似的嵌入,而距離較遠的節點則在投影空間中進行分離。通過這種方法,節點將獲得越來越多的關于其鄰域的信息。

    GraphSage通過聚合其附近的節點,為不可見的節點生成可表示的嵌入。它允許將節點嵌入應用于涉及動態圖的領域,其中圖的結構是不斷變化的。例如,Pinterest采用GraphSage的擴展版本PinSage作為內容發現系統的核心。

    ?

    預測時需要采樣嗎?

    其實采樣是獨立于模型的,訓練時輸入采樣后的mini-batch進行訓練

    預測時,不進行采樣直接輸入模型,即聚合節點的所有鄰接節點信息產生embedding,

    當然預測時也可以進行采樣,根據實際效果選擇即可。

    ?

    五 總結

    為什么GCN是transductive,為啥要把所有節點放在一起訓練?
    不一定要把所有節點放在一起訓練,一個個節點放進去訓練也是可以的。無非是如果想得到所有節點的embedding,那么GCN可以把整個graph丟進去,直接得到embedding,還可以直接進行節點分類、邊的預測等任務。

    其實,通過GraphSAGE得到的節點的embedding,在增加了新的節點之后,舊的節點也需要更新,這個是無法避免的,因為,新增加點意味著環境變了,那之前的節點的表示自然也應該有所調整。只不過,對于老節點,可能新增一個節點對其影響微乎其微,所以可以暫且使用原來的embedding,但如果新增了很多,極大地改變的原有的graph結構,那么就只能全部更新一次了。從這個角度去想的話,似乎GraphSAGE也不是什么“神仙”方法,只不過生成新節點embedding的過程,實施起來相比于GCN更加靈活方便了。在學習到了各種的聚合函數之后,其實就不用去計算所有節點的embedding,而是需要去考察哪些節點,就現場去計算,這種方法的遷移能力也很強,在一個graph上學得了節點的聚合方法,到另一個新的類似的graph上就可以直接使用了。

    ?

    至此,GraphSAGE介紹完畢。我們來總結一下,GraphSAGE的一些優點

    (1)利用采樣機制,很好的解決了GCN必須要知道全部圖的信息問題,克服了GCN訓練時內存和顯存的限制,即使對于未知的新節點,也能得到其表示

    (2)聚合器和權重矩陣的參數對于所有的節點是共享的

    (3)模型的參數的數量與圖的節點個數無關,這使得GraphSAGE能夠處理更大的圖

    (4)既能處理有監督任務也能處理無監督任務

    當然,GraphSAGE也有一些缺點,每個節點那么多鄰居,GraphSAGE的采樣沒有考慮到不同鄰居節點的重要性不同,而且聚合計算的時候鄰居節點的重要性和當前節點也是不同的。

    ?

    六 PinSAGE

    Pin是什么意思

    Pinterest是一個圖片素材網站,pins是指圖片,而boards則是圖片收藏夾的意思。

    Pinterest會根據用戶的瀏覽歷史來向用戶推薦圖片

    比GraphSAGE改進了什么?

    采樣: 使用重要性(權重)采樣替代GraphSAGE的均勻采樣;

    聚合函數: 聚合函數考慮了邊的權重;

    生產者-消費者模式的minibatch: 在CPU端采樣節點和構建特征,構建計算圖;在GPU端在子圖上進行卷積運算,從而可以低延遲的隨機游走構建子圖,而不需要把整個圖存在顯存中;

    ?

    采樣時只能選取真實的鄰居節點嗎?如果構建的是一個與虛擬鄰居相連的子圖有什么優點?PinSAGE 算法將會給我們解答

    PinSAGE 算法通過多次隨機游走,按游走經過的頻率選取鄰居,例如下面以 0 號節點作為起始,隨機進行了 4 次游走

    其中 5、10、11 三個節點出現的頻率最高,因此我們將這三個節點與 0 號節點相連,作為 0 號節點的虛擬鄰居

    回到上述問題,采樣時選取虛擬鄰居有什么好處?可以快速獲取遠距離鄰居的信息。實際上如果是按照 GraphSAGE 算法的方式生成子圖,在聚合的過程中,非一階鄰居的信息可以通過消息傳遞逐漸傳到中心,但是隨著距離的增大,離中心越遠的節點,其信息在傳遞過程中就越困難,甚至可能無法傳遞到;如果按照 PinSAGE 算法的方式生成子圖,有一定的概率可以將非一階鄰居與中心直接相連,這樣就可以快速聚合到多階鄰居的信息

    ?

    ?

    ?

    論文:Inductive Representation Learning on Large Graphs
    知乎:【Graph Neural Network】GraphSAGE: 算法原理,實現和應用
    知乎:網絡表示學習: 淘寶推薦系統&&GraphSAGE
    GNN 系列(三):GraphSAGE
    GraphSAGE: GCN落地必讀論文

    ?

    圖神經網絡(GNN)入門之旅(四)-GraphSAGE和PinSAGE

    總結

    以上是生活随笔為你收集整理的[图神经网络] 图节点Node表示---GraphSAGE与PinSAGE的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。