1.前言
本文是筆者對GCN的一個知識整理與彙總,會盡可能從通俗易懂的角度來爲0基礎的同學解釋GCN的推導過程,GCN的推導總體來說較爲複雜,筆者的理解可能會有偏差,如有解釋錯誤的地方,歡迎指正交流。
圖卷積神經網絡公式很簡單,如下所示,即鄰接矩陣和度矩陣再上節點信號(特徵)的非線性變換。
公式雖簡單,但背後包含很多複雜數學原理。GCN有兩種推導方式,第一種是基於傅里葉變換的形式,該方法涉及到很多預備知識,大量的數學推導;第二種是基於message passing的方式,該方式便於理解。本文會盡可能從通俗易懂的角度來把兩種方式解釋清楚。
2.基於傅里葉變換的圖卷積
如果你不想去深入瞭解嚴格的數學推導過程,建議直接跳過本節,直接看第三節基於message passing的GCN原理說明,包括目前兩個比較常用的包pytorch_geometric與dgl都是採用的message passing原理。
在開始講解前,我們先介紹一些預備知識
2.1 卷積
在數學上,卷積分爲離散卷積和連續卷積,我們稱爲的卷積
-
離散卷積
-
連續卷積
只看公式很難理解其含義,我們看兩個具體的例子。
2.1.1 離散卷積的例子
假如我們拋了兩個骰子,我們想知道兩個骰子相加的點數爲4的概率。我們設表示第一個骰子拋出的概率,設表示第二個骰子拋出的概率,那麼拋出點數和爲4個情況有,,,加起來的概率爲
轉換成標準化的形式爲
2.1.2 連續卷積的例子
某饅頭鋪生意很好,供不應求,於是使用了一臺機器來做饅頭,假設生產饅頭的速度是,那麼一天生產的饅頭就是
饅頭生產好如果不及時銷售的話就會慢慢腐壞,設腐壞的函數爲
第一個小時生產出來的饅頭,一天後會經歷24小時的腐壞,第二個小時生產出來的饅頭,一天後會經歷23小時的腐壞,一天後,饅頭總共腐壞了
2.1.3 CNN中的卷積
在CNN中的卷積實際上屬於離散卷積,從上文我們也可以發現,離散卷積實際上就是一個加權求和的過程,CNN中的卷積本質上就是利用一個共享參數的卷積核,通過計算中心像素點以及相鄰像素點的加權和來構成feature map實現空間特徵的提取,當然加權係數就是卷積核的權重係數。
2.2 傅里葉變換
這裏又引入了一個新的概念,傅里葉變換,這一節我不會把傅里葉變換講的太詳細,理解GCN我個人覺得對傅里葉有一個大致的理解就ok了,我們先看個小例子。
假如你想調製一杯正宗的mojito,但是你並不知道其中薄荷、檸檬汁、蘇打水、朗姆酒的比例成分,現在你有一杯酒吧中買到的mojito,如果你能從這杯調製好的mojito中分離出其各成分,你就可以知道其比例,從此你就是mojito調製大師。 這裏的成分分析就需要用到一個過濾器,不同的過濾器過濾不同的成分,過濾的過程實際上就是所謂的傅里葉變換。知道了mojito的配方後,你就可以自己購買這些基礎配料來調配自己的mojito,這個調配的過程就是傅里葉逆變換。
有了這個概念後,我們來看傅里葉變換真實的應用場景。傅里葉變換主要是用於把信號從時域變換到頻域,而變換的過程,需要把不同頻率的信號先過濾出來,如下圖所示。所以如果你想把一段錄音中的雜音給去處,就可以考慮使用傅里葉變換,先把雜音與人聲過濾出來,再把雜音去除,最後進行傅里葉逆變換。
傅里葉變換的公式如下
傅里葉變換的目的是把信號轉到不同的子信號對應的空間中(頻域), 那怎麼把一個信號映射到另一個空間呢,很簡單,和一組基向量相乘,公式中表示的是信號,表示的是另一個空間的一組基,所以傅里葉變換的公式表示的就是把信號映射到新的空間然後計算其積分。
傅里葉逆變換公式如下
2.3 傅里葉變換的簡單推導
接下來我們對傅里葉變換公式做一個簡單的推導,詳細推導請點擊這裏,當然,這一部分不影響你對整個GCN原理的理解,可以選擇跳過直接閱讀2.4節的內容。
拉格朗日等數學家發現某些週期函數可以由三角函數的和來表示,比如下圖中,黑色的斜線就是週期爲的函數,而紅色的曲線是三角函數之和,可以看出兩者確實近似:
另一位數學家傅里葉則推導出任意週期函數都可以寫成三角函數之和,例如某函數其週期是,那麼可以用三角函數近似表示爲
這個就是我們常聽到的傅里葉級數,所以我們只需要計算出、、這三個參數就能得到最後的近似解,最終的結果如下
利用歐拉公式,可以把與表示爲
然後我們把傅里葉級數中的與替換爲表示,則有
其中
改成連續性的
用表示頻率,表示則有
這個公式就是傅里葉逆變換(因爲這裏是在找組成原始信號的子信號),根據上面的公式和的表達式,我們可以得到,這個就是傅里葉變換,注意這裏的公式和上文提到的有一個的區別,這個和頻率有關係
2.4 圖上如何實現卷積
卷積操作通常是在歐幾里得空間內進行計算,然而graph是一個拓撲結構,並不滿足歐幾里得結構。也就是說要麼我們找到一種方法能讓卷積操作在拓撲結構中進行計算,要麼把拓撲結構的數據轉變到歐幾里得空間中再進行卷積,GCN的思想就是後者,先採用傅里葉變換把信號映射到頻域進行卷積,之後再映射回時域空間。
這一部分的內容是GCN的核心推導部分,各位拉好穩好以免翻車,首先我們定義幾個符號
- 圖
- 鄰接矩陣
- 度矩陣
- 節點的信號 其中表示的是節點的信號,這裏也可以理解爲對應節點的特徵
- 拉普拉斯矩陣 , 是一個半正定矩陣(半正定矩陣的特徵值均大於等於0),我們這裏考慮的是一個無向圖,所以是一個對稱陣,拉普拉斯矩陣特徵分解後爲,是一個對角陣,是對應的特徵向量組成的矩陣,這些特徵向量都是正交的。
2.4.1 圖上的傅里葉變換
有了上面的概念,我們需要考慮一個問題,如果想在圖上使用傅里葉變換,那麼我們就需要找到這樣的一組基,然後把我們的節點信號(特徵)映射到頻域。在graph中,如果要找到一組這樣的基,自然會考慮到拉普拉斯矩陣,對其做特徵分解,得到其對應的特徵值與特徵向量,維空間中個線性無關的向量可以構成空間的一組基,拉普拉斯矩陣是一個對稱的半正定矩陣,其特徵向量剛好是正交基,因此我們可以得到這樣的一個傅里葉變換公式
其中是拉普拉斯矩陣的特徵向量組成的矩陣的轉置,是節點信號。
降維解釋下這個公式,是一個包含了多個基的矩陣,每一行的向量表示一個基,每個基可以理解爲一個過濾器,我們的目的就是要用這個過濾器把過濾到自己的那個維度上。其實這裏甚至可以理解爲attention,不同的基對取了一個加權平均數。
有了傅里葉變換我們還需要傅里葉逆變換來把結果從頻域變回時域,其計算公式如下,其中是拉普拉斯矩陣的特徵向量組成的矩陣
爲什麼直接和特徵向量相乘就可以了呢?我們看個具體的例子,假如我們在時域的原函數的圖如下,其中紅線表示時刻,我們這隻考慮時刻
該函數是由三個餘弦函數構成
因此傅里葉級數可以表示爲
傅里葉變換是過濾出對應的並計算出,傅里葉逆變換就是把與乘回去,說白了就是重新構造出上面的傅里葉級數的公式。其中就是我們傅里葉變換後的結果,就是對應的特徵向量在時刻的值。所以傅里葉逆變換就是用,表示成圖的形式如下
2.4.2 圖上的卷積
有了以上的知識鋪墊,我們就可以開始進行卷積操作了,在GCN中,我們的卷積核是特徵值的一個函數,其公式如下
這裏特徵值是一個對角陣,和相乘只有對應位置的值會保留下來。接下來我們把展開,然後把卷積後的結果進行傅里葉逆變換
最終就是我們卷積之後的結果,其公式爲
也就是說我們的結果就是拉普拉斯矩陣一個變換後與節點信號相乘後的值,我們要學習的參數就是特徵值對應的參數即的參數。到這一步其實已經距離我們開篇介紹的GCN公式很接近了,其中,整理一下是這個樣子的
2.4.3 GCN的優化
到目前爲止實際上GCN已經可以用了,但是有兩個很大的問題
- GCN時間複雜度和節點數是呈正比的,需要做特徵分解,並且還有複雜的矩陣乘法,時間複雜度達到了,也就是說節點越多,計算量越大
- 非局部卷積,在CNN中卷積都是關注的局部特徵,但是我們目前的GCN並不是局部特徵
看個例子,我們有如下這樣一個圖
因爲可以是任意的函數,假設,對其做泰勒展開
因爲可以是任意的函數,如果就是,則卷積之後的結果爲
因爲圖中0節點和3節點沒有直連相連,所以與相乘,沒有相連的節點的計算結果是0,這沒啥問題,但是如果取
卷積後的結果沒有相連的點的計算結果非0,這就導致了卷積之後的結果不是局部的,也就是說,的指數和局部性呈反比,如果的指數,那麼卷積的結果就會看到全局的一個值。爲了解決這個問題,需要採用一個多項式來替代,而這個多項式的次數最高爲,表示的就是局部的大小。
解決了局部問題,我們還需要解決時間問題,爲了降低時間複雜度,這裏引入了切比雪夫多項目,切比雪夫多項式的計算方法是遞歸的形式, 如下圖所示。
注意,切比雪夫多項式的必須屬於[-1,1],所以我們要對拉普拉斯的特徵值做一個變換
變換後可以得到這樣的切比雪夫多項式
最後我們需要學習的參數就變爲了切比雪夫多項式每一項的
那爲什麼切比雪夫多項式計算就快呢,我們先看一個數學題
假如我們要求上圖中的,實際上計算起來會很麻煩,如果我們能先求出對應的,那計算量就少了很多,切比雪夫多項式其實和這個題目是一個道理。我們本來要求,但是我們對做了一個多項式的轉換,只需要求其前面的參數即可。這裏我們把切比雪夫多項式展開看一下。
根據切比雪夫多項式的定義,我們有
把對應的項和相乘
進一步簡化式子,我們設,則有
把帶入到卷積的式子中
可以看到,結果就是與的點積,我們需要學習的參數是,只需要採用遞歸的形式進行計算即可,時間複雜度爲
GCN最終是把設置爲了1
把展開
回顧下上文,GCN的通常都會先做一個歸一化(不歸一化可能會出現梯度消失的問題),即,歸一化後的最大特徵值會小於2,這裏我們近似取
爲了抑制參數數量防止過擬合,這裏做進一步的簡化,把和置爲同一個值,只是取了個反,則有
最後這裏的和單位陣相加可以簡單的理解爲加上一個自環,最終就很能得到本文開篇的GCN公式
3.基於message passing的圖卷積
接下來我們從消息傳遞的角度解釋下GCN,假如我們有這樣一個圖(該圖是無向圖),假如每個節點會互相給相鄰節點傳遞消息,直到相鄰節點的消息達到一個平衡狀態,例如圖中的節點,其有三個鄰居節點,我們想計算出節點接收到的消息
注意我們這裏的圖需要遵循馬爾科夫假設,根據上面的圖我們可以得到節點的信息爲
其中表示的是鄰節點傳遞給目標節點的一個傳遞係數,表示節點的消息量,表示的是鄰接矩陣,因爲是無向圖鄰接矩陣是對稱陣,對角線上的值都是0,與其相鄰的位置有非0的值,不相鄰的位置值爲0,所以上面的公式也說明只有相鄰的節點纔會有消息的傳遞,我們對上述公式簡單的展開
如果用向量的形式來表示就是
細心的讀者其實已經發現了,到這一步已經很接近GCN的計算公式了,唯一的區別就在於少了一個非線性的變化。
消息傳遞的核心思想就是把目標節點的鄰居節點的消息就行一個聚合的操作,我們上面這裏的公式可以把非線性變換看成是簡單的求和(雖然這不是非線性的),當然你可以採用更多的聚合方式,例如平均,sigmoid,lstm,甚至使用attention機制計算加權平均。
4.GCN的效果與缺點
對比之前介紹過的DeepWalk模型,GCN整體的效果有較大的提升,並且保證了局部性、計算效率高等優勢,但GCN也還存在一些缺點。
- 擴展性差:由於訓練時需要需要知道關於訓練節點、測試節點在內的所有節點的鄰接矩陣,因此在擴展性問題上侷限很大,每當圖更新了就需要重新訓練整個模型。
- 無法獲取深層次特徵:GCN論文中表明,目前GCN只侷限於淺層,實驗中使用2層GCN效果最好,加深模型層數需要使用殘缺結構等trick,但是實際的效果提升並不明顯。
- 不能處理有向圖:拉普拉斯矩陣的特徵分解需要滿足拉普拉斯矩陣是對稱矩陣的條件。
最後再上一張GCN和其他圖模型的對比,可以看到,GCN的確還有很多進步空間,甚至在圖像識別中效果甚至不如多層感知機,這也是因爲其無法獲取更深層次特徵的原因。
看到着,有些讀者可能會認爲GCN效果這麼差,爲什麼還要學習這個模型呢?其實其它的GNN模型中,其基本思想都和GCN中的message passing思想是類似的,所以我們需要對GCN先有一個大概的認識,這樣對後續模型也能瞭解的更深入、透徹。
5.總結
本文對GCN的推導過程做了一個全面的介紹,相信閱讀到這裏的讀者對GCN有了一個全面的認知,在閱讀GNN方面的paper時肯定也會有更多的見解。本文部分細節內容沒有深入講解,讀者如果想對例如傅里葉級數,傅里葉變換等內容有更深入的瞭解可以閱讀reference中提到的博文。
6.References
1、圖卷積網絡 GCN Graph Convolutional Network(譜域GCN)的理解和詳細推導
2、如何理解 Graph Convolutional Network(GCN)
3、Graph Neural Network (2/2) (助教姜成翰同學講授)
4、傅立葉及拉普拉斯
5、SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS