【图卷积网络】Graph Convolutional Network
1. 圖卷積網絡
1.1. 為什么會出現圖卷積網絡
普通卷積神經網絡研究的對象是具備Euclidean domains的數據,Euclidean domains data數據最顯著的特征是他們具有規則的空間結構,如圖片是規則的正方形,語音是規則的一維序列等,這些特征都可以用一維或二維的矩陣來表示,卷積神經網絡處理起來比較高效。
然而,現實生活中很多數據不具備規則的空間結構,稱為Non Euclidean data,如,推薦系統、電子交易、分子結構等抽象出來的圖譜。這些圖譜中的每個節點連接不盡相同,有的節點有三個連接,有的節點只有一個連接,是不規則的結構。對于這些不規則的數據對象,普通卷積網絡的效果不盡人意。CNN卷積操作配合pooling等在結構規則的圖像等數據上效果顯著,但是如果作者考慮非歐氏空間比如圖(即graph,流形也是典型的非歐結構,這里作者只考慮圖),就難以選取固定的卷積核來適應整個圖的不規則性,如鄰居節點數量的不確定和節點順序的不確定。4^44
這里的理解就是,數據的組織形式不同,催生出了圖卷積神經網路。如果現實生活中都是規則的數據,普通的卷積神經網絡就足夠勝任。
總結一下,圖數據中的空間特征具有以下特點:
1) 節點特征:每個節點有自己的特征;(體現在點上)
2) 結構特征:圖數據中的每個節點具有結構特征,即節點與節點存在一定的聯系。(體現在邊上)
總地來說,圖數據既要考慮節點信息,也要考慮結構信息,圖卷積神經網絡就可以自動化地既學習節點特征,又能學習節點與節點之間的關聯信息。
綜上所述,GCN是要為除CV、NLP之外的任務提供一種處理、研究的模型。
圖卷積的核心思想是利用『邊的信息』對『節點信息』進行『聚合』從而生成新的『節點表示』。
1.2. 圖卷積網絡的兩個方向
- vertex domain(spatial domain):頂點域(空間域)
- spectral domain:頻域方法(譜方法)
2. 圖卷積網絡的推導
已有很多優秀的博客對圖卷積神經網絡的理論進行了嚴密的推導,在這里我就作為一個學習記錄,記錄自己的疑問的地方,想要讀詳細推導的,請移步參考文獻。
以下是對一階ChebNet(1stChebNet)-GCN的記錄:
H(l+1)=f(H(l),A)=σ(D~?12A~D~?12H(l)W(l))(1)\mathbf{H}^{(l+1)} = f(\mathbf{H}^{(l)},\mathbf{A}) = \sigma(\mathbf{\widetilde{D}}^{-\frac{1}{2}}\mathbf{\widetilde{A}}\mathbf{\widetilde{D}}^{-\frac{1}{2}}\mathbf{H}^{(l)}\mathbf{W}^{(l)}) \tag{1}H(l+1)=f(H(l),A)=σ(D?21?AD?21?H(l)W(l))(1)
- H(l),H(l+1)\mathbf{H}^{(l)}, \mathbf{H}^{(l+1)}H(l),H(l+1) 分別表示第lll層網絡的輸入和輸出。
- fff 相當于lll層擬合的函數,函數的輸入參數是H(l),A\mathbf{H}^{(l)},\mathbf{A}H(l),A,其中A\mathbf{A}A表示圖的鄰接矩陣。
- σ\sigmaσ指任意一種激活函數,一般來說表示的是sigmod\text{sigmod}sigmod。
- A~=A+λIN\mathbf{\widetilde{A}} = \mathbf{{A}} + \lambda\mathbf{I}_{N}A=A+λIN?, 相當于加上了自環,λ\lambdaλ表示一個權重分配,一般情況下默認λ=1\lambda = 1λ=1。
- D~ij=∑jA~ij\mathbf{\widetilde{D}}_{ij} = \sum_j\mathbf{\widetilde{A}}_{ij}Dij?=∑j?Aij?,相當于對新的鄰接矩陣A~\mathbf{\widetilde{A}}A重新計算度矩陣(degree matrix)。
- D~?12A~D~?12\mathbf{\widetilde{D}}^{-\frac{1}{2}}\mathbf{\widetilde{A}}\mathbf{\widetilde{D}}^{-\frac{1}{2}}D?21?AD?21? 這整個部分其實就是對行以及列的平均。
- W(l)\mathbf{W}^{(l)}W(l) 表示的是lll層的網絡參數,訓練網絡本質上就是反向傳播更新網絡參數。
3. 圖卷積網絡代碼實現
代碼Github地址
本次閱讀的代碼使用的是pytorch。
代碼入口是pygcn/train.py
3.1. argparse
import argparse parser = argparse.ArgumentParser() parser.add_argument('--no-cuda', action='store_true', default=False,help='Disables CUDA training.') parser.add_argument('--fastmode', action='store_true', default=False,help='Validate during training pass.') parser.add_argument('--seed', type=int, default=42, help='Random seed.') parser.add_argument('--epochs', type=int, default=200,help='Number of epochs to train.') parser.add_argument('--lr', type=float, default=0.01,help='Initial learning rate.') parser.add_argument('--weight_decay', type=float, default=5e-4,help='Weight decay (L2 loss on parameters).') parser.add_argument('--hidden', type=int, default=16,help='Number of hidden units.') parser.add_argument('--dropout', type=float, default=0.5,help='Dropout rate (1 - keep probability).')args = parser.parse_args()argparse參考
這整段代碼表示的是可以從命令行窗口獲取超參數,可以注意的是都是可選參數,而且有默認值,所以是可以直接運行的。
3.1. Cora數據集
- cora.content
每行代表一個樣本,一行由三部分組成,論文編號,論文單詞向量(1433個獨特的單詞,0代表否,1代表是),論文類別(7類)。[2708,1435],表示有2708個樣本,每個樣本有1435個特征。 - cora.cites
cora.cites 共有 5429 行,每一行有兩個論文編號,表示第一個論文先寫,第二個論文引用第一個論文。如果將論文看做圖中的點,那么這5429行便是點之間的5429條邊。
3.2. numpy
# 返回指定長度的標識數組 # >>> np.identity(3) # array([[1., 0., 0.], # [0., 1., 0.], # [0., 0., 1.]]) np.identity(num) # 構造對稱的鄰接矩陣 adj = adj + adj.T.multiply(adj.T > adj) - adj.multiply(adj.T > adj)不得不說大佬的代碼寫的是真滴優雅。對稱矩陣的逆矩陣與自身相等,上述代碼就是利用這個原理實現構建堆成矩陣。
疑問:引文網絡按理來說應該是個有向圖,即兩篇文章不一定會相互應用,這里強行表示為無向圖是否有問題。
參考文獻:
總結
以上是生活随笔為你收集整理的【图卷积网络】Graph Convolutional Network的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web项目jsp中无法引入js问题
- 下一篇: 光纤测试时怎么选择对应项目的测试标准及测