一:'over-smoothing'問題的提出:
如下圖:
按照我們以往學習‘CNN’等其他層時,我們通常會有這么一個概念,就是加入越多層,我們的神經網路的表達能力也就越強,這種觀念在‘GNN’層中是不合理的,為什么這么說呢?
再解釋這問題之前我們要引入一個概念--‘receptive field’(接受域)如下圖:

接受域簡單來講就是假如有1層GNN層,那么我們是不是就是從要嵌入節點(圖中黃色節點)的一階鄰居(圖中紅色的點)那里拿資訊?那對于有K層GNN層來講是不是從要嵌入節點的1-k階鄰居那里拿資訊?對的,接受域就是指你具體要到哪些鄰居那里拿資訊,那些鄰居的總和就是接受域
知道了接受域的概念后我們就可以定義‘over-smoothing’問題了,如下圖:

假如現在你想進行鏈路預測,那你就需要對一對節點進行嵌入,如果GNN層很深的話,這兩個節點所共享的鄰居就會非常多,導致這兩個節點的嵌入非常相似(如圖中的紅點部分為兩個節點的接受域的共享部分)(黃色節點是需要嵌入的兩個節點),這就是‘over-smoothing’問題了
二:'over-smoothing'問題的產生:
所以我們可以這么歸納‘over-smoothing’問題的產生:
我們知道節點嵌入是取決于它的接收域范圍的,如果兩個節點的接收場高度重疊,那么他們的節點嵌入也可能十分相似,所以會有以下邏輯:我們堆疊過多的GNN層—節點具有高度重疊的接收域—節點的嵌入變得十分相似—這就是我們所說的over-smoothing問題
三:'over-smoothing'問題的解決:
lesson1:
在增添GNN層的時候要小心添加(不像是其他如CNN網路那樣,過多的添加GNN層對節點精確嵌入沒有好處):
(1):要分析可行的節點接收域,分析多少層GNN是好的(這可以每一層疊加完之后看訓練的準確率來確定最合適的gnn層數)
(2):當我們要設計l層GNN的時候,不要輕易的讓層數增加,試著使用不同的方法來怎么加精度的問題
lesson2:
我們知道層數小意味著我們神經網路的表達能力會下降,那我們如何能做到讓少層數的GNN還能增強GNN的表達能力呢?
solution1:在一層GNN層中增加表達能力,我們可以通過聚合和轉換,讓一層GNN層本身變成深度
的一個神經網路(比如增加linear層,dropout層,激活層,attention層,Bantch Norm層等)如圖中的幾種層:

solution2:(常用)我們可以添加不傳遞訊息的圖層(比如linear層等),這里意味著,我們不必全是GNN層在神經網路模型的構建中如下圖:你可以把它們看作預處理(preprocess)層和后處理(postprocess)層,來增加神經網路的表達能力,這也意味著我們將經典的神經網路也結合了進來,

lesson3:
如果我需要解決的問題就是需要很多GNN層,那該怎么辦呢?
solution:添加一些跳過鏈接的概念(skip connection)這可以理解為在最后添加早些時候(層數較少時候的嵌入)輸入到下面深層次的嵌入中如下圖左邊部分(我們可以添加紅色的鏈接,這樣做可以跳過1層或多層GNN層,比如從第一層跳到第三層而這里的資料不需要經過第二層),所以會出現這種情況,(下圖中中間部分)相當于把輸入復制成了兩份,一份通過正常的GNN層順序更新,另一份走的是skip connection,最后把這兩種資料結合起來,這樣可以有效的提升最后的表達能力(因為輸出混合了多層的輸入)

那為什么skip connection有用呢?
(拿普通的GCN層為例)就可以簡單理解為走正常GNN層更新的得到的最終節點的嵌入(如下圖黃色部分)會參考之前層更新后的節點嵌入(如下圖藍色部分),使得減輕‘over-smoothing’的問題,

四:參考視頻:
1:屬于視頻的7.3部分內容:
【雙語字幕】斯坦福CS224W《圖機器學習》課程(2021) by Jure Leskovec_嗶哩嗶哩_bilibili
https://www.bilibili.com/video/BV1RZ4y1c7Co?p=28&spm_id_from=pageDriver
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/425031.html
標籤:AI
