【GCN】图卷积网络(GCN)入门详解
機器學習算法與自然語言處理出品
@公眾號原創專欄作者?Don.hub
單位 | 京東算法工程師
學校 | 帝國理工大學
?圖卷積網絡(GCN)入門詳解
什么是GCN
GCN 概述
模型定義
數學推導
Graph Laplacian
ref
圖神經網絡領域算是一個比較新的領域,有非常多的探索潛力,所以我也一直想著要入門。其中圖卷積網絡就非常熱門,我找到了一篇教程:圖卷積網絡(GCN)新手村完全指南, 想著借此走出新手村,結果因為個人資質有限,簡直成了勸退文,看完了之后還是沒有非常的明白,所以決定自己寫一篇入門介紹。當然這篇文章介紹得非常好,我也參考了很多,所以我會引用很多其中的公式,加上相關的推導補充。
本文主要分為兩部分,第一部分介紹什么是GCN,第二部分將進行詳細的數學推導。
什么是GCN
GCN 概述
本文講的GCN 來源于論文:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS,這是在GCN領域最經典的論文之一。
我們可以根據這個GCN的圖看到,一個擁有??個input channel的graph作為輸入,經過中間的hidden layers,得到??個 output channel的輸出。
圖卷積網絡主要可以由兩個級別的作用變換組成:
注意本文講的圖都特指無向無權重的圖。
graph level:
例如說通過引入一些形式的pooling 操作 (see, e.g.?Duvenaud et al., NIPS 2015). 然后改變圖的結構。但是本次講過GCN并沒有進行這個級別的操作。所以看到上圖我們的網絡結構的輸出和輸出的graph的結構是一樣的。
node level:
通常說node level的作用是不改變graph的結構的,僅通過對graph的特征/信號(features/signals)??作為輸入:一個??的矩陣(??: 輸入圖的nodes的個數,?輸入的特征維度) ,得到輸出??:一個??的矩陣(??輸出的特征維度)。
a) 一個特征描述(feature description)??: 指的是每個節點??的特征表示
b) 每一個graph 的結構都可以通過鄰接矩陣??表示(或者其他根據它推導的矩陣)
我們可以很容易的根據一個鄰接矩陣重構出一個graph。例如下圖:??其中??代表節點,??代表邊
我們通過構造??的矩陣可以得到鄰接矩陣??, 其中??如果節點??和節點?相連,否則??, 我們根據graph可以得到??, 同理通過??也可以得到graph 的結構。
所以網絡中間的每一個隱藏層可以寫成以下的非線性函數:
其中輸入層??, 輸出層??,??是層數。不同的GCN模型,采用不同??函數。
模型定義
論文中采用的函數如下:
剛開始看的時候,都會被嚇到!這個函數未免也太抽象了。但是我們先了解一下它在起的作用,然后再從頭一步一步引出這個公式,以及為什么它起到了這些作用。
首先物理上它起的作用是,每一個節點下一層的信息是由前一層本身的信息以及相鄰的節點的信息加權加和得到,然后再經過線性變換??以及非線性變換??。
我們一步一步分解,我們要定義一個簡單的??函數,作為基礎的網絡層。
我們可以很容易的采用最簡單的層級傳導( layer-wise propagation )規則
我們直接將??做矩陣相乘,然后再通過一個權重矩陣??做線性變換,之后再經過非線性激活函數??, 比如說 ReLU,最后得到下一層的輸入??。
我們需要特別注意的是??做矩陣相乘,這代表了什么意思呢?
我們先看看,對于下圖。
假設每個節點??, 那么在經過矩陣相乘之后,它會變成什么呢。
輸入層的??, 根據矩陣的運算公式我們可以很容易地得到下一層的該節點的表示??, 也很容易發現??,而??就是節點1的相鄰節點。具體計算結果可以參考下面的代碼。
A = torch.tensor([[0,1,0,0,1,0],[1,0,1,0,1,0],[0,1,0,1,0,0],[0,0,1,0,1,1],[1,1,0,1,0,0],[0,0,0,1,0,0] ])H_0 = torch.tensor([[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4],[5,5,5,5],[6,6,6,6] ])A.matmul(H_0) >>>tensor([[ 7, 7, 7, 7],[ 9, 9, 9, 9],[ 6, 6, 6, 6],[14, 14, 14, 14],[ 7, 7, 7, 7],[ 4, 4, 4, 4]])所以我們直到??就是把通過鄰接矩陣快速的方式,快速將相鄰的節點的信息相加得到自己下一層的輸入。
但是這就完美了嗎?
問題一:我們雖然獲得了周圍節點的信息了,但是自己本身的信息卻沒了(除非自己有一條邊指向自己)。
我們采用的解決方案是,對每個節點手動增加一條self-loop 到每一個節點,即??, 其中??是單位矩陣identity matrix。
問題二:從上面的結果也可以看出,在經過一次的??矩陣變換后,得到的輸出會變大,即特征向量??的scale會改變,在經過多層的變化之后,將和輸入的scale差距越來越大。
所以我們是否可以將鄰接矩陣??做歸一化使得最后的每一行的加和為1,使得??獲得的是weighted sum。
我們可以將??的每一行除以行的和,這就可以得到normalized的??。而其中每一行的和,就是每個節點的度degree。用矩陣表示則為:??, 對于?
我們還是按照上面圖的graph來看。
import torchA = torch.tensor([[0,1,0,0,1,0],[1,0,1,0,1,0],[0,1,0,1,0,0],[0,0,1,0,1,1],[1,1,0,1,0,0],[0,0,0,1,0,0]], dtype=torch.float32)D = torch.tensor([[2,0,0,0,0,0],[0,3,0,0,0,0],[0,0,2,0,0,0],[0,0,0,3,0,0],[0,0,0,0,3,0],[0,0,0,0,0,1],], dtype=torch.float32)hat_A = D.inverse().matmul(A)>>>hat_Atensor([[0.0000, 0.5000, 0.0000, 0.0000, 0.5000, 0.0000],[0.3333, 0.0000, 0.3333, 0.0000, 0.3333, 0.0000],[0.0000, 0.5000, 0.0000, 0.5000, 0.0000, 0.0000],[0.0000, 0.0000, 0.3333, 0.0000, 0.3333, 0.3333],[0.3333, 0.3333, 0.0000, 0.3333, 0.0000, 0.0000],[0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000]])但是在實際運用中我們采用的是對稱的normalization:??對于??
這跟Laplacian Matrix 有關,下一部分會介紹。我們可以發現?
D_minus_sqrt = D.inverse().sqrt()D_minus_sqrt.matmul(A).matmul(D_minus_sqrt)>>>tensor([[0.0000, 0.4082, 0.0000, 0.0000, 0.4082, 0.0000],[0.4082, 0.0000, 0.4082, 0.0000, 0.3333, 0.0000],[0.0000, 0.4082, 0.0000, 0.4082, 0.0000, 0.0000],[0.0000, 0.0000, 0.4082, 0.0000, 0.3333, 0.5774],[0.4082, 0.3333, 0.0000, 0.3333, 0.0000, 0.0000],[0.0000, 0.0000, 0.0000, 0.5774, 0.0000, 0.0000]])把這兩個tricks結合起來,我們可以得到
其中??,??是??的degree matrix。而??是對??做了一個對稱的歸一化。
數學推導
Graph Laplacian
首先我們表示一個graph的方式有很多,我們可以用鄰接矩陣,也可以用Incidence matrix。這個matrix 中,每一行表示一個邊,每一列表示一個節點。每一行中,邊的節點的起點用記為1,邊的終點記為-1。我們將這個metrix 記為??. 具體如下圖。
那么 graph Laplacian 定義為:?
C = torch.tensor([[1,-1,0,0],[1,0,-1,0],[1,0,0,-1],[0,-1,1,0],[0,0,1,-1],[0,-1,0,1], ]) C.T.matmul(C) >>>tensor([[ 3, -1, -1, -1],[-1, 3, -1, -1],[-1, -1, 3, -1],[-1, -1, -1, 3]])我們可以發現,對角線的值??, 其中如果??, 則其積 = 0,如果??或者??, 則其積 = 1。所以我們可以知道對角線代表的是每個節點的度(Degree)
對于非對角線的值??, 我們可以看出來,如果節點??和??沒有相連,那么??否則??, 于是知道非對角線的值就是鄰接矩陣的負值。
所以我們可以推導得到
如下圖(注意這邊W表示的是鄰接矩陣)
總結來說:
具體計算參考下面的代碼
C = torch.tensor([[-1,1,0,0,0,0], # 1-2[-1,0,0,0,1,0], # 1-5[0,-1,1,0,0,0], # 2-3[0,-1,0,0,1,0], # 2-5[0,0,-1,1,0,0], # 3-4[0,0,0,-1,1,0], # 4-5[0,0,0,-1,0,1], # 5-6 ]) C.T.matmul(C) >>> tensor([[ 2, -1, 0, 0, -1, 0],[-1, 3, -1, 0, -1, 0],[ 0, -1, 2, -1, 0, 0],[ 0, 0, -1, 3, -1, -1],[-1, -1, 0, -1, 3, 0],[ 0, 0, 0, -1, 0, 1]])我們需要知道 laplacian??的性質:
?是對稱矩陣
?有實數的,非負的特征值(eigen values)
?有實數的,正交的特征矩陣(eigen vectors), i.e.?
對此,我們假設??的特征值為??特征向量為??:
對于特征值我們有?
對稱歸一化的Laplacian (Symmetric normalized Laplacian)
其元素值,對角線為1,非對角線為?
我們要知道兩個函數的卷積可以由以下公式得到,具體參考
其中??代表傅立葉變換
而Graph Fourier變換對應的就是以下:
其中Graph Fourier 逆變換對應的就是以下:
其中??是laplacian??的特征矩陣 具體的對應關系:
我們知道普通的卷積公式:
那么相應的圖卷積的公式為:
作為圖的特征??的filter,我們希望它的作用域跟CNN一樣,都是在中心節點附近的區域,所以我們定義??是一個laplacian的函數??, 那么作用一次相當于傳播一次周圍鄰居節點的信息。
又因為??, 所以我們可以把??看成是laplacian 特征值的函數??, 參數為??。
所以圖卷積在Fourier域上可以表示為:
我們知道??需要先計算laplacian matrix??的 特征值,這涉及到大量的矩陣運算,所以文章借用了Chebyshev polynomials進行近似計算:
其中??,??代表的是??次Laplacian,即它取決于中心節點的最近的??order 的鄰居節點(鄰居節點和中心節點的距離最大為K)。
?, 其中??以及??。
我們回到最初的圖卷積計算:
其中?
我們知道論文中采用的傳播鄰居層數為1, 所以取??, 并且我們假設??, 可以得到:
實際運用中,為了防止overfitting以及減少操作,我們令??得到:
我們令??, 以及?
得到:
再加上激活函數??, 我們獲得了
其中??對應輸入??,??對應參數?
ref
en.wikipedia.org/wiki/L
T. N. Kipf, M. Welling, Semi-Supervised Classification with Graph Convolutional Networks(ICLR 2017) [Link,?PDF (arXiv),?code,?blog]
math.stackexchange.com/
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)備注:加入本站微信群或者qq群,請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的【GCN】图卷积网络(GCN)入门详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 未来的成功方程式
- 下一篇: 中文分词的古今中外,你想知道的都在这里