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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

一?前言

在大規(guī)模圖上學(xué)習(xí)節(jié)點embedding,在很多任務(wù)中非常有效,如學(xué)習(xí)節(jié)點拓?fù)浣Y(jié)構(gòu)的 DeepWalk 以及同時學(xué)習(xí)鄰居特征和拓?fù)浣Y(jié)構(gòu)的semi-GCN。

但是現(xiàn)在大多數(shù)方法都是直推式學(xué)習(xí), 不能直接泛化到未知節(jié)點。這些方法是在一個固定的圖上直接學(xué)習(xí)每個節(jié)點embedding,但是大多情況圖是會演化的,當(dāng)網(wǎng)絡(luò)結(jié)構(gòu)改變以及新節(jié)點的出現(xiàn),直推式學(xué)習(xí)需要重新訓(xùn)練(復(fù)雜度高且可能會導(dǎo)致embedding會偏移),很難落地在需要快速生成未知節(jié)點embedding的機(jī)器學(xué)習(xí)系統(tǒng)上。

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

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

二 GraphSage 原理

可視化例子:下圖是GraphSAGE 生成目標(biāo)節(jié)點(紅色)embededing并供下游任務(wù)預(yù)測的過程

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

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

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

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


3. 將embedding作為全連接層的輸入,預(yù)測目標(biāo)節(jié)點的標(biāo)簽。

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

算法過程:?

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

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

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

鄰居的定義:

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

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

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

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

?

GraphSAGE的實現(xiàn)? 完整代碼git倉庫中淺夢大佬的實現(xiàn)

以MEAN aggregator簡單講下聚合函數(shù)的實現(xiàn)

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層采樣得到的頂點集合及其對應(yīng)的鄰接點集合。
  • 首先通過embedding_lookup操作獲取得到頂點和鄰接點的第K-1層的向量表示。然后通過concat將他們拼接成一個(batch_size,1+neighbour_size,embeding_size)的張量,使用reduce_mean對每個維度求均值得到一個(batch_size,embedding_size)的張量。
  • 最后經(jīng)過一次非線性變換得到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表示每一層抽樣的鄰居頂點的數(shù)量,n_hidden為聚合函數(shù)內(nèi)部非線性變換時的參數(shù)矩陣的維度,n_classes表示預(yù)測的類別的數(shù)量,aggregator_type為使用的聚合函數(shù)的類別。

    ?

    三 GraphSage的聚合

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

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

    聚合函數(shù)

    1. 平均聚合器 Mean aggregator

    先對鄰居embedding中每個維度取平均(原始第4,5行),然后與目標(biāo)節(jié)點embedding拼接后進(jìn)行非線性轉(zhuǎn)換。

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

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

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

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

    ?

    2. 池化聚合器 Pooling aggregator:

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

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

    ?

    3. LSTM聚合器 LSTM aggregator:

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

    ?

    四 GraphSage的訓(xùn)練與預(yù)測

    那么GraphSAGE是如何學(xué)習(xí)聚合器的參數(shù)以及權(quán)重矩陣W

    1 有監(jiān)督的情況下,可以使用每個節(jié)點的預(yù)測lable和真實lable的交叉熵作為損失函數(shù)。對所有的節(jié)點進(jìn)行一個分類任務(wù),假如是二分類,那么損失函數(shù)就是一個交叉熵?fù)p失

    訓(xùn)練的過程,我們可以把多個節(jié)點的embedding作為一個batch,如下圖是3個節(jié)點對應(yīng)的embedding

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

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

    2 無監(jiān)督的情況下,可以假設(shè)相鄰的節(jié)點的embedding表示盡可能相近,因此可以設(shè)計出如下的損失函數(shù),損失函數(shù)定義如下:

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

    GraphSage通過聚合其附近的節(jié)點,為不可見的節(jié)點生成可表示的嵌入。它允許將節(jié)點嵌入應(yīng)用于涉及動態(tài)圖的領(lǐng)域,其中圖的結(jié)構(gòu)是不斷變化的。例如,Pinterest采用GraphSage的擴(kuò)展版本PinSage作為內(nèi)容發(fā)現(xiàn)系統(tǒng)的核心。

    ?

    預(yù)測時需要采樣嗎?

    其實采樣是獨立于模型的,訓(xùn)練時輸入采樣后的mini-batch進(jìn)行訓(xùn)練

    預(yù)測時,不進(jìn)行采樣直接輸入模型,即聚合節(jié)點的所有鄰接節(jié)點信息產(chǎn)生embedding,

    當(dāng)然預(yù)測時也可以進(jìn)行采樣,根據(jù)實際效果選擇即可。

    ?

    五 總結(jié)

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

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

    ?

    至此,GraphSAGE介紹完畢。我們來總結(jié)一下,GraphSAGE的一些優(yōu)點

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

    (2)聚合器和權(quán)重矩陣的參數(shù)對于所有的節(jié)點是共享的

    (3)模型的參數(shù)的數(shù)量與圖的節(jié)點個數(shù)無關(guān),這使得GraphSAGE能夠處理更大的圖

    (4)既能處理有監(jiān)督任務(wù)也能處理無監(jiān)督任務(wù)

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

    ?

    六 PinSAGE

    Pin是什么意思

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

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

    比GraphSAGE改進(jìn)了什么?

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

    聚合函數(shù): 聚合函數(shù)考慮了邊的權(quán)重;

    生產(chǎn)者-消費者模式的minibatch: 在CPU端采樣節(jié)點和構(gòu)建特征,構(gòu)建計算圖;在GPU端在子圖上進(jìn)行卷積運(yùn)算,從而可以低延遲的隨機(jī)游走構(gòu)建子圖,而不需要把整個圖存在顯存中;

    ?

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

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

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

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

    ?

    ?

    ?

    論文:Inductive Representation Learning on Large Graphs
    知乎:【Graph Neural Network】GraphSAGE: 算法原理,實現(xiàn)和應(yīng)用
    知乎:網(wǎng)絡(luò)表示學(xué)習(xí): 淘寶推薦系統(tǒng)&&GraphSAGE
    GNN 系列(三):GraphSAGE
    GraphSAGE: GCN落地必讀論文

    ?

    圖神經(jīng)網(wǎng)絡(luò)(GNN)入門之旅(四)-GraphSAGE和PinSAGE

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。