您的位置 首页 kreess

一文讓你看懂圖卷積神經網絡(GCN)!!!

圖卷積網絡(GCN)入門詳解什麼是GCN用一個例子引出GCN我們使用的是Cora數據集,該數據集由2708篇論文,及它們之間的引用關系構成的5429條邊組成。這些論文被根據

圖卷積網絡(GCN)入門詳解

什麼是GCN

用一個例子引出GCN

我們使用的是Cora數據集,該數據集由2708篇論文,及它們之間的引用關系構成的5429條邊組成。這些論文被根據主題劃分為7類,分別是神經網絡、強化學習、規則學習、概率方法、遺傳算法、理論研究、案例相關。每篇論文的特征是通過詞袋模型得到的,維度為1433,每一維表示一個詞,1表示該詞在這篇文章中出現過,0表示未出現。首先我們定義類CoraData來對數據進行預處理,主要包括下載數據、規范化數據並進行緩存以備重復使用。最終得到的數據形式包括如下幾個部分:

  • x:節點特征,維度為2808×1433;
  • y:節點對應的標簽,包括7個類別;

如何做識別? 使用普通的神經網絡比如RNN其實都可以做,隻要做一個監督學習,把x和y輸進去訓練,然後再拿去做預測就行瞭。但是呢,我們現在就偏偏不用這種方法,看到“它們之間的引用關系構成的5429條邊組成”,我們就可以聯想到圖論有關的知識,那麼,我們是否可以通過其他的預測模型來實現預測呢?

所以,利用節點之間的連接關系這種性質進行預測的圖神經網絡出來瞭!

GCN 概述

我們可以根據這個GCN的圖看到,一個擁有C 個input channel的graph作為輸入,經過中間的hidden layers,得到 F 個 output channel的輸出。

圖卷積網絡主要可以由兩個級別的作用變換組成:

註意本文講的圖都特指無向無權重的圖。

  • graph level:

例如說通過引入一些形式的pooling 操作 (see, e.g. Duvenaud et al., NIPS 2015). 然後改變圖的結構。但是本次講過GCN並沒有進行這個級別的操作。所以看到上圖我們的網絡結構的輸出和輸出的graph的結構是一樣的。

  • node level:

通常說node level的作用是不改變graph的結構的,僅通過對graph的特征/信號(特征信號 X 作為輸入:一個 N*D 矩陣( N : 輸入圖的nodes的個數, D 輸入的特征維度) ,得到輸出 Z :一個 N*F 的矩陣( F 輸出的特征維度)。

a) 一個特征描述(feature description) x_i : 指的是每個節點 i 的特征表示

b) 每一個graph 的結構都可以通過鄰接矩陣 A 表示(或者關聯矩陣)

我們可以很容易的根據一個鄰接矩陣重構出一個graph。 例如下圖: G=(V,E) 其中 V 代表節點, E 代表邊。

我們通過構造 |V|×|V| 的矩陣可以得到鄰接矩陣 A , 其中 A_{ij}=1 如果節點 i 和節點 j 相連,否則 A_{ij}=0 , 我們根據graph可以得到 A , 同理通過 A 也可以得到graph 的結構。

因為A 可以確定唯一的一張圖,這麼重要的一個屬性我們肯定是要把他放到神經網絡傳遞函數裡面去的,所以網絡中間的每一個隱藏層可以寫成以下的非線性函數:

large H ^ { ( l + 1 ) } = f left( H ^ { ( l ) } , A right)\

其中輸入層 H(0)=X , 輸出層 H(L)=Z , L 是層數。 不同的GCN模型,采用不同 f(· ,·) 函數。

GCN 的傳遞函數

論文中采用的函數如下: large f left( H ^ { ( l ) } , A right) = sigma left( hat { D } ^ { – frac { 1 } { 2 } } hat { A } hat { D } ^ { – frac { 1 } { 2 } } H ^ { ( l ) } W ^ { ( l ) } right)\

剛開始看的時候,都會被嚇到!這個函數未免也太抽象瞭。但是我們先瞭解一下它在起的作用,然後再從頭一步一步引出這個公式,以及為什麼它起到瞭這些作用。

首先物理上它起的作用是,每一個節點下一層的信息是由前一層本身的信息以及相鄰的節點的信息加權加和得到,然後再經過線性變換 W 以及非線性變換 delta()

我們一步一步分解,我們要定義一個簡單的 f left( H ^ { ( l ) } , A right) 函數,作為基礎的網絡層。

我們可以很容易的采用最簡單的層級傳導( layer-wise propagation )規則 large f left( H ^ { ( l ) } , A right) = sigma left( A H ^ { ( l ) } W ^ { ( l ) } right)\

我們直接將 AH 做矩陣相乘,然後再通過一個權重矩陣 W ^ { ( l ) } 做線性變換,之後再經過非線性激活函數 delta(·) , 比如說 ReLU,最後得到下一層的輸入 H^{l+1}

我們需要特別註意的是 AH 做矩陣相乘,這代表瞭什麼意思呢?

我們先看看下圖:

假設每個節點 x_i=[i] , 那麼在經過矩陣相乘之後,它會變成什麼呢。

輸入層的 x_1=[1] , 根據矩陣的運算公式我們可以很容易地得到下一層的該節點的表示 x'_1=[7] , 也很容易發現 x'_1(1)=x_2+x_5 ,而 x_2,x_5 就是節點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],
[2],
[3],
[4],
[5],
[6]])

A.matmul(H_0)
>>>tensor([[ 7],
[ 9],
[ 6],
[14],
[ 7],
[ 4]])

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部