?? 我假設本文中的圖形是未加權的(沒有邊緣權重或距離)和無方向的(節點之間沒有關聯方向)。我假設這些圖是同質的(單一類型的節點和邊;相反的是“異構”)。

圖形與常規數據的不同之處在于,它們具有神經網絡必須尊重的結構;不利用它是一種浪費。下面是一個社交媒體圖的例子,其中節點是用戶,邊緣是他們的互動(如關注/喜歡/轉發)。

與圖像的聯系

圖像本身就是一個圖表!它是一種稱為“網格圖”的特殊變體,其中所有內部節點和角節點的節點傳出邊的數量都是恒定的。圖像網格圖中存在一些一致的結構,允許對其執行簡單的類似卷積的操作。

圖像可以被認為是一個特殊的圖形,其中每個像素都是一個節點,并通過假想邊緣連接到它周圍的其他像素。當然,從這種角度查看圖像是不切實際的,因為這意味著要有一個非常大的圖形。例如,一個簡單的 CIFAR-10 圖像 32×32×332×32×3 將具有 30723072 節點和 1984 條邊。對于較大的 ImageNet 圖像 224×224×3224×224×3 ,這些數字會爆炸。

圖像可以被認為是一個特殊的圖形,其中每個像素都是一個節點,并通過假想邊緣連接到它周圍的其他像素。當然,從這種角度查看圖像是不切實際的,因為這意味著要有一個非常大的圖形。例如,一個簡單的 CIFAR-10 圖像 32×32×332×32×3 將具有 30723072 節點和 1984 條邊。對于較大的 ImageNet 圖像 224×224×3224×224×3 ,這些數字會爆炸。

然而,正如你所觀察到的,圖表并不是那么完美。不同的節點具有不同的程度(與其他節點的連接數),并且無處不在。沒有固定的結構,但結構是為圖形增加價值的原因。因此,任何在此圖上學習的神經網絡都必須在學習節點(和邊)之間的空間關系時尊重這種結構。

?? 盡管我們想在這里使用圖像處理技術,但最好有特殊的特定于圖形的方法,這些方法對于小型和大型圖形都是高效和全面的。

 圖神經網絡

單個圖神經網絡 (GNN) 層具有在圖中的每個節點上執行的一系列步驟:

  1.  消息傳遞
  2.  集合體
  3.  更新

它們共同構成了通過圖形學習的構建塊。GDL 中的創新主要涉及對這 3 個步驟的更改。

圖的節點

請記?。汗濣c表示實體或對象,例如用戶或原子。因此,此節點具有所表示實體的一系列特征屬性。這些節點屬性構成了節點的特征(即“節點特征”或“節點嵌入”)。

通常,這些特征可以使用?Rd?中的向量來表示。此向量要么是潛在維度嵌入,要么是以每個條目都是實體的不同屬性的方式構造的。

?? 例如,在社交媒體圖中,用戶節點具有年齡、性別、政治傾向、關系狀態等屬性,這些屬性可以用數字表示。

同樣,在分子圖中,原子節點可能具有化學性質,例如對水的親和力、力、能量等,也可以用數字表示。

這些節點特征是GNN的輸入,我們將在后面的章節中看到。從形式上講,每個節點都有關聯的節點?i?特征?xi∈Rd和標簽?yi(可以是連續的,也可以是離散的,就像獨熱編碼一樣)。

圖的邊(關系)

邊緣也可以具有特征?aij∈Rd′?,例如,在邊緣有意義的情況下(如原子之間的化學鍵)。我們可以將下面顯示的分子視為一個圖形,其中原子是節點,鍵是邊緣。

雖然原子節點本身具有各自的特征向量,但邊可以具有不同的邊緣特征,這些特征編碼不同類型的鍵(單鍵、雙鍵、三鍵)。不過,為了簡單起見,我將在下一篇文章中省略邊緣功能。

現在我們知道了如何在圖中表示節點和邊,讓我們從一個簡單的圖開始,其中包含一堆節點(具有節點特征)和邊。

消息傳遞

GNN以其學習結構信息的能力而聞名。通常,具有相似特征或屬性的節點會相互連接(在社交媒體設置中也是如此)。GNN利用這一事實,了解特定節點如何以及為什么相互連接,而某些節點則不連接。為此,GNN 會查看節點的鄰域。

節點的鄰域定義為由邊連接到?Ni?的一組節點?i?j?。?i?形式上,?Ni={j?:?eij∈E}?.

一個人是由他所處的圈子塑造的。類似地,GNN 可以通過查看其鄰域中的節點來了解很多關于節點?i?的信息?Ni?。為了實現源節點?i?和鄰居之間的信息共享?j?,GNN參與消息傳遞。

對于 GNN 層,消息傳遞被定義為獲取鄰居的節點特征、轉換它們并將它們“傳遞”到源節點的過程。對圖中的所有節點并行重復此過程。這樣,在這一步結束時,所有社區都會被檢查。

讓我們放大節點?66?并檢查鄰域?N6={1,?3,?4}6={1,?3,?4}?。我們獲取每個節點特征?x1?、?x3?和?x4?,并使用函數對其進行轉換,該函數?F?可以是簡單的神經網絡(MLP 或 RNN)或仿射變換?F(xj)=Wj?xj+b?。簡單地說,“消息”是從源節點傳入的轉換節點特征。

 F? 可以是簡單的仿射變換或神經網絡

現在,為了數學上的方便,讓我們說?F(xj)=Wj?xj。這里,?□?□????表示簡單的矩陣乘法。

 集合體

現在我們已經將轉換后的消息?{F(x1),F(x3),F(x4)}傳遞給了 node?66?,我們必須以某種方式聚合(“組合”)它們。可以做很多事情來將它們結合起來。常用的聚合函數包括:

Sum?=∑j∈NiWj?xj

Mean?=∑j∈NiWj?xj|Ni|

Max?=maxj∈Ni({Wj?xj})

Min?=minj∈Ni({Wj?xj})

假設我們使用一個函數?G來聚合鄰居的消息(使用總和、平均值、最大值或最小值)。最終聚合的消息可以表示如下:

ˉmi=G({Wj?xj:j∈Ni})

 更新

使用這些聚合消息,GNN層現在必須更新源節點?i的特征。在此更新步驟結束時,節點不僅應該了解自己,還應該了解其鄰居。這是通過獲取節點?i的特征向量并將其與聚合消息相結合來確保的。同樣,一個簡單的加法或串聯操作可以解決這個問題。

 使用加法:

hi=σ(K(H(xi)+ˉmi)))(6)(6)?

其中?σ是激活函數(ReLU、ELU、Tanh),?H是簡單神經網絡 (MLP) 或仿射變換,是?K另一個將添加的向量投影到另一個維度的 MLP。

 使用串聯:

hi=σ(K(H(xi)?⊕?ˉmi)))(7)(7)?

為了進一步抽象此更新步驟,我們可以將其 K? 視為將消息和源節點嵌入在一起的投影函數:

hi=σ(K(H(xi),?ˉmi)))(8)(8)?

???? 在表示法方面,初始節點特征稱為?xi

在前向通過第一個 GNN 層后,我們改為調用節點特征?hi??。假設我們有更多的 GNN 層,我們可以將節點特征表示為?hli??當前 GNN 層索引的位置?l?。此外,很明顯?h0i=xi??(即GNN的輸入)。

 把它們放在一起

現在我們已經完成了消息傳遞、聚合和更新步驟,讓我們把它們放在一起,在單個節點?i?上形成一個 GNN 層:

hi=σ(W1?hi+∑j∈NiW2?hj)(9)(9)?

在這里,我們使用?sum?聚合和簡單的前饋層作為函數?F?和?H.

?? 請確保節點嵌入的?W1?尺寸和?W2與節點嵌入正確交換。如果?hi∈Rd?∈,?W1,W2?Rd′×d?其中?d是嵌入維度。

使用 Edge 功能

在處理邊緣特征時,我們必須找到一種方法來對它們進行 GNN 前向傳遞。假設邊具有特征?aij∈Rd′。為了在特定層?l更新它們,我們可以考慮邊緣兩側節點的嵌入。正式

alij=T(hli,?hlj,?al?1ij)(10)(10)

其中?T是一個簡單的神經網絡(MLP 或 RNN),它接收來自連接節點?i的嵌入以及?j前一層的邊緣嵌入?al?1ij。

使用鄰接矩陣

到目前為止,我們研究了整個GNN前向通過孤立的單個節點?i?及其鄰域的透鏡?Ni。但是,在給定整個鄰接矩陣?A?和所有?N=∥V∥節點特征時?X?RN×d,了解如何實現 GNN 前向傳遞也很重要。

在普通的機器學習中,在MLP前向傳遞中,我們希望對特征向量中的項目進行加權?xi?。這可以看作是節點特征向量?xi∈Rd和參數矩陣的點積,?W?Rd′×d?其中?d?是嵌入維度:

zi=W?xi??∈Rd′(11)(11)

如果我們想對數據集中的所有樣本(矢量化)執行此操作,我們只需對參數矩陣和特征進行矩陣相乘即可獲得轉換后的節點特征(消息):

Z=(WX)T=XW???RN×d′(12)(12)

現在,在 GNN 中,對于每個節點,消息聚合操作涉及獲取相鄰節點?i?的特征向量,轉換它們并將它們相加(在聚合的情況下?sum?)。

鄰接矩陣中的一行?Ai?告訴我們哪些節點?j?連接到?i?。對于每個 indiex?j?where?Aij=1,我們知道節點?i?并?j?連接→?eij∈E?。

例如,如果?A2=[1,0,1,1,0]2=[1,0,1,1,0]?,我們知道節點連接到節點?22?11?、?33?和?44?。因此,當我們乘?A2?以?Z=XW時,我們只考慮列 、?33?,而?44?忽略列?22?11?和?55?。在矩陣乘法方面,我們正在做:

讓我們關注?A的第 2 行。

矩陣乘法只是每?A?一行與每一列的點積?Z=XW!!

…而這正是消息聚合的本質!!

為了根據連接獲得圖中所有?N?節點的聚合消息,我們可以?A?將整個鄰接矩陣與轉換后的節點特征進行矩陣相乘:

Y=AZ=AXW(13)(13)Y=

!? 一個小問題:觀察聚合消息沒有考慮節點?i?自己的特征向量(就像我們上面所做的那樣)。為此,我們添加了自循環?A?(每個節點?i?都連接到自身)。

這意味著在每個位置?Aii?(即對角線)更改為?00?a?11?。

通過一些線性代數,我們可以使用恒等矩陣來做到這一點!

~A=A+IN

添加自循環允許 GNN 將源節點的特征與其鄰居的特征聚合在一起??!

這樣一來,您就可以使用矩陣而不是單個節點進行 GNN 前向傳遞。

? 要執行?mean?聚合,我們可以簡單地將總和除以?11?中的 s 計數?Ai?。對于上面的例子,由于 中有三個?11?,我們可以?∑j∈N2Wxj∑除以?33?…?A2=[1,0,0,1,1]這正是平均值!!

但是,不可能通過GNN的鄰接矩陣公式來實現 max 和 min 聚合。

 堆疊 GNN 層

現在我們已經弄清楚了單個GNN層是如何工作的,我們如何構建這些層的整個“網絡”呢?信息如何在層之間流動,以及GNN如何優化節點(和/或邊緣)的嵌入/表示?

  1. 第一GNN層的輸入是節點特征?X?RN×d。輸出是中間節點嵌入,?H1?RN×d1?其中?d1是第一個嵌入維度。?H1由?h1i?:?1→N∈Rd1??.
  2. H1是第二層的輸入。下一個輸出是?H2?RN×d2第二層的嵌入維度。同樣,?H2由?h2i?:?1→N∈Rd2?.
  3. 幾層之后,在輸出層?L,輸出為?HL?RN×dL。最后,?HL由?hLi?:?1→N∈RdL??.

的選擇?{d1,d2,…,dL}?完全取決于我們,并且是GNN的超參數??梢园堰@些看作是為一堆MLP層選擇單位(“神經元”的數量)。

節點特征/嵌入(“表示”)通過 GNN 傳遞。結構保持不變,但節點表示在各層中不斷變化。或者,邊表示也會更改,但不會更改連接或方向。

現在,我們可以做?HL一些事情:

無論哪種方式,有趣的是,每個?h1→N∈HL?1→都可以堆疊起來,并被認為是一批樣品。人們可以很容易地將其視為一個批次。

?? 對于給定的節點,GNN聚合中的?lth?層具有節點?i?的?i?l?-hop鄰域。最初,節點看到它的近鄰,并深入到網絡中,它與鄰居的鄰居進行交互,等等。

這就是為什么對于非常小的、稀疏的(很少的邊)圖,大量的GNN層通常會導致性能下降。這是因為所有嵌入的節點都收斂到一個單一向量,因為每個節點都看到了許多跳之外的節點。這是一個無用的情況!!

這就解釋了為什么大多數GNN論文經常使用 ≤4≤4 層進行實驗,以防止網絡死亡。


訓練 GNN(上下文:節點分類)

?? 在訓練過程中,可以使用損失函數(例如:交叉熵)將節點、邊或整個圖的預測與數據集中的真值標簽進行比較。

這使得 GNN 能夠使用原版反向道具和梯度下降以端到端的方式進行訓練。

訓練和測試圖形數據

與常規 ML 一樣,圖形數據也可以拆分為訓練和測試。這可以通過以下兩種方式之一完成:

 透導性

訓練和測試數據都存在于同一個圖中。每個集合中的節點相互連接。只不過,在訓練過程中,測試節點的標簽是隱藏的,而訓練節點的標簽是可見的。但是,所有節點的特征對 GNN 都是可見的。

我們可以使用所有節點上的二進制掩碼來做到這一點(如果訓練節點連接到測試節點?i?j?,只需在鄰接矩陣中設置?Aij=0?即可)。

在轉導設置中,訓練和測試節點都是 SAME 圖的一部分。只是訓練節點暴露其特征和標簽,而測試節點僅暴露其特征。測試標簽在模型中是隱藏的。需要二進制掩碼來告訴GNN什么是訓練節點,什么是測試節點。

 歸納

在這里,有單獨的訓練圖和測試圖,它們彼此隱藏。這類似于常規 ML,其中模型在訓練期間僅看到特征和標簽,并且只看到用于測試的特征。訓練和測試在兩個獨立的、孤立的圖形上進行。有時,這些測試圖是分布外的,以檢查訓練期間泛化的質量。

與常規 ML 一樣,訓練和測試數據是分開保存的。GNN 僅使用來自訓練節點的特征和標簽。這里不需要二進制掩碼來隱藏測試節點,因為它們來自不同的集合。

反向支撐和梯度下降

在訓練過程中,一旦我們通過GNN進行前向傳遞,我們就會得到最終的?hLi∈HL?節點表示。要以端到端的方式訓練網絡,我們可以執行以下操作:

  1. 將每個?hLi?數據饋送到 MLP 分類器中以獲得預測?^yi?^?
  2. 使用地面實況?yi和預測?^yi?→?J(^yi,yi)計算損失
  3. 使用 Backpropagatino 計算梯度,??J?Wl?其中?Wl?是層的參數矩陣
  4. 使用一些優化器(如梯度下降)來更新 GNN 中每個層的參數?Wl
  5. (可選)您還可以微調分類器 (MLP) 網絡的權重。

?? 這意味著GNN在消息傳遞和訓練方面都很容易并行化。整個過程可以矢量化(如上所示)并在 GPU 上執行!!


流行的圖神經網絡

在本節中,我將介紹文獻中的一些流行作品,并將其方程式和數學歸類為上述 3 個 GNN 步驟(或者至少我嘗試過)。許多流行的體系結構將消息傳遞和聚合步驟合并到一個一起執行的函數中,而不是一個接一個地顯式執行。我試圖在本節中分解它們,但為了數學上的方便,最好將它們視為一個單一的運算!

我調整了本節中介紹的網絡符號,使其與本文的符號一致。

消息傳遞神經網絡

量子化學的神經信息傳遞

消息傳遞神經網絡(MPNN)將前向傳遞分解為具有消息傳遞功能的消息傳遞階段,以及具有頂點更新功能?MlUl的讀出階段。

MPNN 將消息傳遞和聚合步驟合并到單個消息傳遞階段:

ml+1i=∑j∈NiMl(hli,?hlj,?eij)(15)(15)

讀出階段是更新步驟:

hl+1i=Ul(hli,?ml+1i)(16)(16)?

其中?ml+1v是聚合消息,?hl+1v?是嵌入的更新節點。這與我上面提到的過程非常相似。消息函數是?F?和?G?的混合,函數?Ul?Ml是?K?。這里,?eij指的是也可以省略的可能邊緣特征。

本文以MPNN為一般框架,并將文獻中的其他作品作為MPNN的特殊變體。作者進一步將MPNN用于量子化學應用。

圖卷積網絡

基于圖卷積網絡的半監督分類

圖卷積網絡 (GCN) 論文以鄰接矩陣的形式研究整個圖。首先,將自連接添加到鄰接矩陣中,以確保所有節點都連接到自身以獲得?~A~?.這確保了我們在消息聚合期間考慮了源節點的嵌入。組合的 Message Aggregation 和 Update 步驟如下所示:

Hl+1=σ(~AHlWl)(17)(17)

其中?Wl是可學習的參數矩陣。當然,我改?X?為?H?在任意層?l?概括節點特征,其中?H0=X

?? 由于矩陣乘法 (?A(BC)=(AB)C 的關聯性質,我們在哪個序列中復配矩陣并不重要(要么是?~AHl第一個,下一個乘法后,要么是?HlWl?下一個乘法前乘法?~AWl?)。

然而,作者 Kipf 和 Welling 進一步引入了度矩陣?~D作為重整化的一種形式,以避免數值不穩定和梯度爆炸/消失:

~Dii=∑j~Aij(18)(18)

“重整化”是在增強鄰接矩陣上進行的?^A=~D?12~A~D?12。總而言之,新的組合消息傳遞和更新步驟如下所示:

Hl+1=σ(^AHlWl)(19)(19)

 圖注意力網絡

聚合通常涉及在總和、平均值、最大值和最小值設置中平等對待所有鄰居。然而,在大多數情況下,一些鄰居比其他鄰居更重要。圖注意力網絡(GAT)通過使用Vaswani等人(2017)的自注意力對源節點與其鄰居之間的邊緣進行加權來確保這一點。

邊緣權重?αij?的生成方式如下。

αij=Softmax(LeakyReLU(WaT?[Whli?⊕?Whlj]))(20)(20)

其中?Wa∈R2d′和?W?Rd′×d是學習參數,是嵌入維度,?d′?⊕⊕?是向量串聯操作。

雖然初始消息傳遞步驟與 MPNN/GCN 相同,但組合的消息聚合和更新步驟是所有鄰居和節點本身的加權總和:

hi=∑j∈Ni ∪ {i}αij ? Whlj

邊緣重要性權重有助于了解鄰居對源節點的影響程度。

與 GCN 一樣,添加了自循環,以便源節點可以考慮自己的表示,以便將來的表示。

GraphSAGE 

GraphSAGE 代表 Graph SAmple 和 AggreGatE。這是一個為大型、非常密集的圖形生成節點嵌入的模型(用于 Pinterest 等公司)。

這項工作介紹了節點鄰域上的學習聚合器。與考慮鄰域中所有節點的傳統 GAT 或 GCN 不同,GraphSAGE 統一對鄰域進行采樣,并在其上使用學習到的聚合器。

假設我們在網絡(深度)中有層,每一?L層?l∈{1,…,L}都著眼于源節點的較大?l?躍點鄰域(正如人們所期望的那樣)。然后,在通過 MLP?F和非線性?σ?傳遞之前,通過將嵌入的節點與采樣消息連接起來來更新每個源節點。

對于某一層?l?,

hlN(i)=AGGREGATEl({hl?1j:j∈N(i)})hli=σ(F(hl?1i?⊕?hlN(i)))(22)

其中?⊕⊕?是向量串聯運算,?N(i)?是返回所有鄰居的子集的統一采樣函數。因此,如果一個節點有 5 個鄰居?{1,2,3,4,5}{1,2,3,4,5}?,則可能的?N(i)輸出將是?{1,4,5}{1,4,5}?或?{2,5}{2,5}?。

聚合器?k=1聚合來自 -hop 鄰域的采樣節點(彩色),而聚合器?k=2聚合來自?22?11?-hop 鄰域的采樣節點(彩色)

未來可能的工作可能是試驗非均勻抽樣函數來選擇鄰居。

注意:在本文中,作者使用?K和?k?來表示圖層索引。在本文中,我分別使用?L?和?l?來保持一致。此外,本文還用于?v?表示源節點和?u?表示鄰居?j?。?i

獎勵:GraphSAGE之前的工作包括DeepWalk。一探究竟!

 時態圖網絡

用于動態圖深度學習的時態圖網絡

到目前為止所描述的網絡在靜態圖上工作。大多數現實情況都適用于動態圖,其中節點和邊在一段時間內添加、刪除或更新。時態圖網絡 (TGN) 適用于連續時間動態圖 (CTDG),可以表示為按時間順序排序的事件列表。

本文將事件分為兩種類型:節點級事件和交互事件。節點級事件涉及一個孤立的節點(例如:用戶更新其個人資料的簡歷),而交互事件涉及兩個可能連接或可能不連接的節點(例如:用戶 A 轉發/關注用戶 B)。

TGN 提供模塊化的 CTDG 處理方法,包括以下組件:

  1. 消息傳遞函數 →隔離節點或交互節點之間的消息傳遞(對于任一類型的事件)。
  2. 消息聚合函數 → **通過查看多個時間步長的時間鄰域而不是給定時間步長的局部鄰域來使用 GAT 的聚合。
  3. 內存更新程序→允許節點具有長期依賴關系,并表示節點在潛在(“壓縮”)空間中的歷史記錄。該模塊根據隨時間發生的交互來更新節點的內存。
  4. 時間嵌入→一種表示捕獲時間本質的節點的方法。
  5. 鏈路預測→事件中涉及的節點的時間嵌入通過一些神經網絡來計算邊緣概率(即,邊緣將來會發生嗎?當然,在訓練過程中,我們知道邊緣存在,所以邊緣標簽是 11 。我們需要訓練基于 Sigmoid 的網絡來像往常一樣預測這一點。

每當節點參與活動(節點更新或節點間交互)時,內存都會更新。

(1) 對于每個事件和 22 批處理中,TGN 為涉及該事件 11 的所有節點生成消息。

(2)接下來,for TGN聚合每個節點?mi?所有時間步?t?的消息;這稱為節點?i?的時間鄰域。

(3)接下來,TGN使用聚合的消息?ˉmi(t)來更新每個節點?si(t)?的內存。

(4) 一旦所有節點的內存?si(t)?都是最新的,它就用于計算批處理中特定交互中使用的所有節點的“臨時節點嵌入”。?zi(t)

(5) 然后將這些節點嵌入輸入 MLP 或神經網絡,以獲得每個事件發生的概率(使用 Sigmoid 激活)。

(6) 然后,我們可以像往常一樣使用二元交叉熵 (BCE) 計算損失(未顯示)。


 結論

上面就是我們對圖神經網絡的數學總結,圖深度學習在處理具有類似網絡結構的問題時是一個很好的工具。它們很容易理解,我們可以使用PyTorch Geometric、spectral、Deep Graph Library、Jraph(jax)以及TensorFlow-gnn來實現。GDL已經顯示出前景,并將繼續作為一個領域發展。

本文章轉載微信公眾號@Python人工智能前沿

上一篇:

使用 Node.js + OPEN AI 實現一個自動生成圖片項目

下一篇:

神經網絡算法 - 一文搞懂CNN(卷積神經網絡)
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費