參考 :
首先看兩篇論文,大概了解一下原理性的東西:
GRAPH CONVOLUTIONAL NETWORKS THOMAS KIPF, 30 SEPTEMBER 2016
http://tkipf.github.io/graph-convolutional-networks/
Multi-layer Graph Convolutional Network (GCN) with first-order filters.
Overview綜述
許多重要的現實世界數據集以圖表或網絡的形式出現:社交網絡、知識圖表、蛋白質交互網絡、萬維網等等(僅舉幾例)。然而,直到最近,很少有人關注神經網絡模型泛化到這樣的結構化數據集。在過去的幾年里,許多論文重新探討了將神經網絡推廣到任意結構圖上的問題(Bruna等,ICLR 2014;Henaff等,2015;Duvenaud等,NIPS 2015;Li等人,ICLR 2016;Defferrard等,NIPS 2016;Kipf和Welling, ICLR 2017),他們中的一些人現在在一些以前由基於內核的方法、基於圖的正則化技術等領域取得了非常有前途的結果。
在這篇文章中,我將簡要概述這一領域的最新發展,並指出各種方法的優缺點。這里的討論主要集中在最近的兩篇論文上:
- Kipf & Welling (ICLR 2017), Semi-Supervised Classification with Graph Convolutional Networks
- Defferrard et al. (NIPS 2016), Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering
Ferenc Huszar的評論:圖卷積有多強大?(https://www.inference.vc/how-powerful-are-graph-convolutions-review-of-kipf-welling-2016-2/)討論了這類模型的一些局限性。
在這里(在這篇文章的最后)對Ferenc的評論寫了一個簡短的評論。
Outline
*Short introduction to neural network models on graphs 簡要介紹圖上的神經網絡模型
*Spectral graph convolutions and Graph Convolutional Networks (GCNs) 譜圖卷積和圖卷積網絡
*Demo: Graph embeddings with a simple 1st-order GCN model 演示:圖嵌入與一個簡單的一階GCN模型
*GCNs as differentiable generalization of the Weisfeiler-Lehman algorithm GCNs作為weisfeler - lehman算法的可微推廣
圖卷積網絡有多強大?
最近的文獻概括了像RNNs或CNNs這樣已經建立的神經模型來處理任意結構的圖是一個具有挑戰性的問題。最近的一些論文介紹了特定問題的專用體系結構(如Duvenaud等人,NIPS 2015;Li等人,ICLR 2016;Jain et al., CVPR 2016),其他人則利用光譜圖理論中已知的圖卷積(Bruna et al., ICLR 2014;定義多層神經網絡模型中使用的參數化過濾器,類似於我們所知道和喜愛的“經典”CNNs。最近的工作重點是彌合快速啟發法和較慢但更有原則的光譜方法之間的差距。Defferrard等人(NIPS 2016)使用Chebyshev多項式在光譜域近似平滑濾波器,使用在類神經網絡模型中學習的自由參數。它們在常規域(如MNIST)上取得了令人信服的結果,與簡單的2D CNN模型非常接近。Kipf &威靈電機(ICLR 2017),我們采取類似的方法,從框架通過卷積譜圖,然而介紹簡化(稍后我們將得到這些post),在很多情況下允許顯著更快的訓練時間和更高的預測精度,達到最先進的基准圖的數據集的分類結果。
GCNs第一部分:定義
目前,大多數圖神經網絡模型都有一個通用的體系結構。我將這些模型稱為圖卷積網絡(GCNs);卷積,因為過濾器參數通常在圖中的所有位置共享(或其中的一個子集,如Duvenaud等人,NIPS 2015)。
對於這些模型,目標是學習圖上信號/特征的函數
讓我們來看看我們的簡單GCN模型(見前一節或Kipf & Welling, ICLR 2017)是如何在一個著名的圖形數據集上工作的:Zachary的空手道俱樂部網絡(見上圖)。我們取一個3層的GCN,它的權值是隨機初始化的。現在,甚至在訓練權值之前,我們只需將圖的鄰接矩陣和X=IX=I(即單位矩陣,因為我們沒有任何節點特征)插入到模型中。3層的GCN現在在前向傳遞中執行三個傳播步驟,並有效地對每個節點的3階鄰域進行卷積(所有節點到3“跳”遠)。值得注意的是,該模型生成了這些節點的嵌入,它們與圖中的社區結構非常相似(見下圖)。請記住,我們已經完全隨機地初始化了權值,並且還沒有執行任何訓練更新(到目前為止)!
這似乎有點令人驚訝。最近一篇關於DeepWalk模型的論文(Perozzi et al., KDD 2014)表明,他們可以在復雜的無監督訓練過程中學習非常類似的嵌入。怎么可能得到這樣一個嵌入或多或少“免費”使用我們簡單的未經訓練的GCN模型?通過將GCN模型解釋為眾所周知的圖上的weisfeler - lehman算法的廣義可微版本,我們可以對此提供一些啟發。(1維)weisfeler - lehman算法如下:
實際上,weisfeler - lehman算法為大多數圖分配了一組獨特的特征。這意味着每個節點都被分配了一個唯一描述其在圖中的角色的特性。例外情況是高度規則的圖形,如網格、鏈等。對於大多數不規則圖,這種特征分配可以用來檢查圖的同構性(即兩個圖是否相同,直到節點的排列)。
回到我們的Graph Convolutional layer -wise propagation rule (now in vector form):
GCNs Part IV:半監督學習
由於我們的模型中的所有東西都是可微分和參數化的,我們可以添加一些標簽,訓練模型並觀察嵌入的反應。我們可以使用Kipf & Welling (ICLR 2017)中引入的GCNs半監督學習算法。我們只是為每個類/社區標記一個節點(在下面的視頻中突出顯示的節點),並開始進行一些迭代訓練5:
http://tkipf.github.io/graph-convolutional-networks/images/video.mp4
注意,該模型直接產生了一個二維的潛在空間,我們可以立即可視化。我們觀察到,3層的GCN模型能夠線性地分離社區,每個類只給出一個標記的示例。考慮到模型沒有收到節點的特征描述,這是一個有點值得注意的結果。同時,可以提供初始的節點特征,這正是我們在論文(Kipf & Welling, ICLR 2017)中描述的實驗中所做的,以實現對大量圖數據集的最新分類結果。
關於這一課題的研究才剛剛開始。過去幾個月出現了令人興奮的發展,但迄今為止,我們可能只觸及了這些類型模型的皮毛。如何將圖上的神經網絡進一步應用於特定類型的問題,如在有向圖或關系圖上的學習,以及如何將學習過的圖嵌入用於未來的任務,這些都有待觀察。這個列表絕不是詳盡的,我期望在不久的將來會出現更多有趣的應用程序和擴展。
We have released the code for Graph Convolutional Networks on GitHub: https://github.com/tkipf/gcn.
【GCN+AE代碼逐行學習】參考資料記錄:
https://www.baidu.com/link?url=0VitAaCEOfc60eW_bXCRmiuYV7SV5O7cuElOGJaoGk1D-QZHlckKtwv8YXoLYrfB7TONrsN-y46R6702byd7o9ecz1eW3-3SdNOBgnS44BG&wd=&eqid=9d04d9070008d75a000000065d9eae5a
keras版本:https://codeload.github.com/tkipf/keras-gcn/zip/master
tensorflow版本:https://github.com/tkipf/gcn.
pytorch框架下實現的GCN代碼:https://github.com/tkipf/pygcn
接下來分析tensorflow版本的:
首先下載相關文件:
然后准備數據:
為了使用您自己的數據,您必須提供:
一個N×N的鄰接矩陣(N是節點的數量),
一個N×D的特征矩陣(D是每個節點的特征數量),
一個N×E的二進制標簽矩陣(E是類的數量)。
以utils.py中的load_data()函數為例。
Have a look at the load_data() function in utils.py for an example. In this example, we load citation network data (Cora, Citeseer or Pubmed). The original datasets can be found here: http://linqs.cs.umd.edu/projects/projects/lbc/. In our version (see data folder) we use dataset splits provided by https://github.com/kimiyoung/planetoid (Zhilin Yang, William W. Cohen, Ruslan Salakhutdinov, Revisiting Semi-Supervised Learning with Graph Embeddings, ICML 2016). You can specify a dataset as follows: python train.py --dataset citeseer (or by editing train.py)
模型選擇:
You can choose between the following models: gcn: Graph convolutional network (Thomas N. Kipf, Max Welling, Semi-Supervised Classification with Graph Convolutional Networks, 2016) gcn_cheby: Chebyshev polynomial version of graph convolutional network as described in (Michaël Defferrard, Xavier Bresson, Pierre Vandergheynst, Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering, NIPS 2016) dense: Basic multi-layer perceptron that supports sparse inputs
圖分類Graph classification:
我們的框架還支持使用每個鄰接矩陣對多個圖實例(可能大小不同)進行分批分類。最好是將各自的特征矩陣串聯起來,構建一個(稀疏的)塊對角矩陣,其中每個塊對應一個圖實例的鄰接矩陣。對於池(在圖級輸出而不是節點級輸出的情況下),最好指定一個簡單的池矩陣,從各自的圖實例中收集特性,如下圖所示:
代碼結構:
.── data // 圖數據
├── inits // 初始化的一些公用函數
├── layers // GCN層的定義
├── metrics // 評測指標的計算
├── models // 模型結構定義
├── train // 訓練
└── utils // 工具函數的定義
訓練結果: