如何利用圖卷積網路對圖進行深度學習(下)

  • 2020 年 2 月 23 日
  • 筆記

編輯 | sunllei 發布 | ATYUN訂閱號

前文回顧:如何利用圖卷積網路對圖進行深度學習(上)

把所有的東西放在一起

我們現在結合了自循環和規範化技巧。此外,我們將重新引入我們先前丟棄的權重和激活函數,以簡化討論。

把權重加回來

首先要做的是計算權重。注意,這裡D_hat是A_hat = A + I的次數矩陣,即,具有強制自循環的A的度矩陣。

In [45]: W = np.matrix([               [1, -1],               [-1, 1]           ])           D_hat**-1 * A_hat * X * W  Out[45]: matrix([              [ 1., -1.],              [ 4., -4.],              [ 2., -2.],              [ 5., -5.]          ])

如果我們想降低輸出特徵表示的維數,我們可以減小權重矩陣W的大小:

In [46]: W = np.matrix([               [1],               [-1]           ])           D_hat**-1 * A_hat * X * W  Out[46]: matrix([[1.],          [4.],          [2.],          [5.]]  )

添加激活函數

我們選擇保留特徵表示的維數,並應用ReLU激活函數。

In [51]: W = np.matrix([               [1, -1],               [-1, 1]           ])           relu(D_hat**-1 * A_hat * X * W)  Out[51]: matrix([[1., 0.],          [4., 0.],          [2., 0.],          [5., 0.]])

瞧!一個完整的隱含層與鄰接矩陣,輸入特徵,權值和激活功能!

回到現實

現在,最後,我們可以將圖卷積網路應用於實圖。我將向您展示如何生成我們在文章早期看到的功能表示。

Zachary空手道俱樂部

Zachary空手道俱樂部是一個常用的社交網路,其中的節點代表空手道俱樂部的成員,並邊緣他們的相互關係。在空手道俱樂部學習時,管理者和教練發生了衝突,導致俱樂部一分為二。下圖顯示了網路的圖形表示,節點根據俱樂部的哪個部分進行標記。管理員和講師分別標有「A」和「I」。

Zachary空手道俱樂部

建立GCN

現在讓我們建立圖卷積網路。我們實際上不會訓練網路,只是隨機初始化它,以生成我們在本文開頭看到的特性表示。我們將使用networkx,它有一個容易獲得的俱樂部的圖形表示,並計算A_hat和D_hat矩陣。

from networkx import karate_club_graph, to_numpy_matrix    zkc = karate_club_graph()  order = sorted(list(zkc.nodes()))    A = to_numpy_matrix(zkc, nodelist=order)  I = np.eye(zkc.number_of_nodes())    A_hat = A + I  D_hat = np.array(np.sum(A_hat, axis=0))[0]  D_hat = np.matrix(np.diag(D_hat))

接下來,我們將隨機初始化權值。

W_1 = np.random.normal(      loc=0, scale=1, size=(zkc.number_of_nodes(), 4))  W_2 = np.random.normal(      loc=0, size=(W_1.shape[1], 2))

堆疊GCN層。這裡我們只使用身份矩陣作為特徵表示,即每個節點被表示為一個熱編碼的分類變數。

def gcn_layer(A_hat, D_hat, X, W):      return relu(D_hat**-1 * A_hat * X * W)  H_1 = gcn_layer(A_hat, D_hat, I, W_1)  H_2 = gcn_layer(A_hat, D_hat, H_1, W_2)  output = H_2

我們提取特徵表示。

feature_representations = {      node: np.array(output)[node]      for node in zkc.nodes()}

瞧!將Zachary空手道俱樂部的社區很好地分隔開的特徵表示。我們還沒開始訓練呢!

Zachary空手道俱樂部節點的特徵表示

我應該注意的是,對於這個例子,隨機初始化的權重很可能在X或Y軸上給出0個值作為Relu函數的結果,因此需要幾個隨機初始化來產生上面的圖。

結論

在這篇文章中,我對圖卷積網路做了一個高級的介紹,並說明了GCN中每一層節點的特徵表示是如何基於其鄰域的集合的。我們看到了如何使用numpy來構建這些網路,以及它們是多麼強大:即使是隨機初始化的GCNs也可以在Zachary的空手道俱樂部中社區分離。

參考文獻

[1] Thomas Kipf關於圖形卷積網路的部落格文章。

[2] 論文Thomas-Kipf和Max-Welling將圖卷積網路稱為半監督分類。

原文鏈接:

https://towardsdatascience.com/how-to-do-deep-learning-on-graphs-with-graph-convolutional-networks-7d2250723780