圖計算任務成功的關鍵是為節(jié)點生成節(jié)點表征,本節(jié)主要任務如下:
1.首先學習圖神經(jīng)網(wǎng)絡生成節(jié)點表征的規(guī)范-消息傳遞范式(Message Passing)
2.接著初步分析PyG為我們提供的實現(xiàn)圖神經(jīng)網(wǎng)絡的MessagePassing基類矫钓。
3.然后以繼承MessagePassing基類的GCNConv類為例闯团,學習如何通過繼承MessagePassing基類實現(xiàn)一個簡單的圖神經(jīng)網(wǎng)絡。
4.再接著對MessagePassing基類進行剖析
5.最后我們將學習再繼承MessagePassing基類的子類中覆寫message(),aggreate(),message_and_aggreate()和update()方法的規(guī)范孝常。
參考:1.https://blog.csdn.net/qq_41987033/article/details/103377561(這篇超贊的!M匆小)
2.Datawhale提供的課程鏈接:https://github.com/datawhalechina/team-learning-nlp/blob/master/GNN
一殿较、消息傳遞范式介紹
神經(jīng)網(wǎng)絡的生成節(jié)點表征的操作稱為節(jié)點嵌入(Node Embedding)耸峭,節(jié)點表征也可以稱為節(jié)點嵌入。為了統(tǒng)一表述淋纲,在本篇內容中我們規(guī)定節(jié)點嵌入只代指神經(jīng)網(wǎng)絡生成節(jié)點表征的操作劳闹。
下圖展示了基于消息傳遞范式的生成節(jié)點表征的過程:
如圖2所示,節(jié)點A是我們的目標節(jié)點洽瞬,節(jié)點A的Embedding本涕,是它的鄰接節(jié)點B、C伙窃、D的Embedding傳播的結果菩颖,而節(jié)點B、C为障、D的Embedding晦闰,又是由它們各自的鄰接節(jié)點Embedding傳播的結果。具體步驟如下:
1.B節(jié)點的鄰接節(jié)點(A鳍怨、C)的信息經(jīng)過變換后聚合到B節(jié)點呻右,接著B節(jié)點信息與鄰居節(jié)點聚合信息一起經(jīng)過變換得到B節(jié)點的新的節(jié)點信息。C鞋喇、D節(jié)點的信息也遵循同樣的過程被更新声滥。實際上,同樣的過程在所有節(jié)點都進行了一遍侦香,所有節(jié)點的信息都更新了一遍落塑。
2.這樣的鄰居節(jié)點信息傳遞到中心節(jié)點的過程會進行多次。如圖2所示鄙皇,A節(jié)點的鄰接節(jié)點(B芜赌,C仰挣,D)的已經(jīng)更新過一次的節(jié)點信息經(jīng)過變換伴逸、聚合、再變換得到了A節(jié)點第二次更新的節(jié)點信息膘壶。多次更新后的節(jié)點信息就作為節(jié)點表征错蝴。
二洲愤、GCNConv源碼解析
PyG提供了MessagePassing基類,它封裝了“消息傳遞”的運行流程顷锰。通過繼承MessagePassing基類柬赐,可以方便地構造消息傳遞圖神經(jīng)網(wǎng)絡,構造一個最簡單的消息傳遞圖神經(jīng)網(wǎng)絡類官紫,我們只需定義message()方法肛宋、update()方法,以及使用的消息聚合方案(aggr="add"束世、aggr="mean"或aggr="max")酝陈。
如圖3向量形式的GCNConv公式,其中毁涉,相鄰節(jié)點的特征首先通過權重矩陣進行轉換沉帮,然后按端點的度進行歸一化處理,最后進行求和贫堰。這個公式可以分為以下幾個步驟:
a.向鄰接矩陣添加自環(huán)邊
b.線性轉換節(jié)點特征矩陣
c.計算歸一化系數(shù)
d.歸一化j中的節(jié)點特征
e.將相鄰節(jié)點特征相加("求和"聚合)
GCNConv公式實現(xiàn)中步驟a-c是在消息傳遞發(fā)生之前計算的穆壕,步驟d-e可以使用MessagePassing基類處理。該層的實現(xiàn)如下: