https://zhuanlan.zhihu.com/p/112477513git
「 圖神經網絡火了這麼久,是時候掌握它了。」github
本文包括如下內容,閱讀時間10min算法
- 圖神經網絡是什麼意思
- 文本如何構建圖
- 圖卷積神經網絡
- 源代碼實現
- 圖卷積神經網絡最新進展
本文閱讀基礎網絡
- 神經網絡基礎
- 本文不包含拉普拉斯矩陣的數學推導
01「圖神經網絡」是什麼
過去幾年,神經網絡在機器學習領域大行其道。好比說卷積神經網絡(CNN)在圖像識別領域的成功以及循環神經網絡(LSTM)在文本識別領域的成功。對於圖像來講,計算機將其量化爲多維矩陣;對於文本來講,經過詞嵌入(word embedding)的方法也能夠將文檔句子量化爲規則的矩陣表示。以神經網絡爲表明的深度學習技術在這些規範化的數據上應用的比較成功。可是現實生活中還存在不少不規則的以圖的形式存在的數據。好比說社交關係圖譜中人與人之間的鏈接關係,又好比說電子商務系統中的人與貨物的關係等等,這些數據結構像下面這樣:數據結構
演員-電影 關係位於neo4j的圖數據圖神經網絡(Graph Neural Network, GNN)是指神經網絡在圖上應用的模型的統稱,圖神經網絡有五大類別:分別是:圖卷積網絡(Graph Convolution Networks,GCN)、 圖注意力網絡(Graph Attention Networks)、圖自編碼器( Graph Autoencoders)、圖生成網絡( Graph Generative Networks) 和圖時空網絡(Graph Spatial-temporal Networks)。本文只重點介紹最經典和最有意義的基礎模型GCN。機器學習
【清華大學孫茂松教授組在 arXiv 發佈了論文Graph Neural Networks: A Review of Methods and Applications,做者對現有的 GNN 模型作了詳盡且全面的綜述】。函數
02 文本如何構建圖
咱們要構建一個具備定義好n個節點,m條邊的圖。性能
以經典的分類任務爲例。我抽屜裏有5本不一樣的機器學習書,裏面一共有a個章節,同時全部書裏面一共有b種不一樣的單詞(不是單詞個數,是全部的單詞種類)。而後咱們就能夠給a個章節和b個單詞標記惟一的id,一共n=a+b個節點,這是咱們圖的節點。學習
-邊的建立-優化
咱們有兩種節點,章節和單詞。而後邊的構建則來源於章節-單詞 關係和 單詞-單詞 關係。對於邊章節-單詞 來講,邊的權重用的是單詞在這個章節的TF-IDF算法,能夠較好地表示這個單詞和這個章節的關係。這個算法比直接用單詞頻率效果要好[1]。單詞-單詞 關係的邊的權重則依賴於單詞的共現關係。咱們能夠用固定寬度的滑窗對5本書的內容進行平滑,相似於word2vector的訓練取樣本過程,以此計算兩個單詞的關係。具體的算法則有PMI算法實現。
point-wise mutual information(PMI)是一個很流行的計算兩個單詞關係的算法。咱們能夠用它來計算兩個單詞節點的權重。節點 i 和節點 j 的權重計算公式以下:
PMI(i, j)的計算方式以下:
#W(i) 表示全部的滑窗中包含單詞節點 i 的個數。
#W(i; j) 表示全部的滑窗中同時包含單詞節點 i 和單詞節點 j 的個數。
#W 是總的滑窗次數
PMI值爲正則說明兩個單詞語義高度相關,爲負則說明相關性不高。所以最後的圖構造過程當中只保留了具備正值的單詞節點對組成的邊。
圖的節點和邊肯定了,接下來介紹如何應用圖卷積神經網絡進行一些學習應用。
【2019年AAAI有一篇論文使用了此方法進行章節分類。題目「Graph Convolutional Networks for Text Classification」】
03 圖卷積神經網絡
圖卷積神經網絡(Graph Convolutional Network, GCN)是一類採用圖卷積的神經網絡,發展到如今已經有基於最簡單的圖卷積改進的無數版本,在圖網絡領域的地位正如同卷積操做在圖像處理裏的地位。
什麼是卷積
離散卷積的本質是一種加權求和。[1]
卷積過程示意圖CNN中卷積的本質就是利用共享參數的過濾器 kernel,經過計算中心像素點及相鄰像素點的加權和來構成feature map實現空間特徵的提取,加權係數就是卷積核的權重係數。卷積核的權重係數經過BP算法獲得迭代優化。卷積核的參數正是經過優化才能實現特徵提取的做用,GCN的理論很重要一點就是引入能夠優化的卷積參數來實現對圖結構數據特徵的獲取。
社交網絡中圖結構圖卷積的目的相似,寄但願學習到一種節點表示,該節點表示依賴於每一個節點及其周邊相鄰的節點。而後該節點表示就能夠輸出用做分類任務了,就是咱們常說的節點分類。
那麼有什麼東西來度量節點的鄰居節點這個關係呢?拉普拉斯矩陣。舉個簡單的例子,對於下圖中的左圖而言,它的度矩陣 ,鄰接矩陣 和拉普拉斯矩陣 分別以下圖所示,度矩陣(degree matrix) 只有對角線上有值,爲對應節點的度,其他爲0;鄰接矩陣只有在有邊鏈接的兩個節點之間爲1,其他地方爲0;拉普拉斯矩陣 爲 。這是比較簡單的拉普拉斯矩陣。
圖結構數據的各類表示如下是重點
圖卷積網絡(GCN)第一層的傳播公式以下:
ρ是激活函數,好比ReLU。
上式的 咱們暫時理解等同於鄰接矩陣A,表明圖的拓撲結構,維度N*N,N表示節點個數;
X是第一層輸入的特徵矩陣,維度N*M,M表示每一個節點的特徵向量維度;
Wo是權重參數矩陣,維度M*K,K表明轉給下一層的向量維度。
所以第一層輸出L1的向量維度就是 N*K。
在上面介紹的文本分類任務中,
X是原始輸入,咱們用對角線爲1的單位矩陣來表示,維度N*N;能夠理解爲是對節點的one-hot表示。Wo採用的參數是N*K隨機初始化(K=200),。
XWo 的維度就是N*200,至關於對每一個輸入節點作了embedding,維度爲200。
A * XWo 這個矩陣乘法怎麼理解?這纔是理解圖卷積的關鍵。複習一下矩陣乘法公式,發現新生成的L1這個N*K矩陣的每個節點的K個維度,都是對應該節點的相鄰節點鄰接權重乘以相鄰節點在這個維度上的值的累加和。從而實現了經過一次卷積,GCN可讓每一個節點都擁有其鄰居節點的信息。
(不許確的講,圖的鄰接矩陣乘以圖節點embedding,就至關因而作一次卷積)
下面我畫了一個示意圖
圖卷積的實現過程結論:新生成的0號節點的向量所有由相鄰的1號節點和3號節點的向量等加權求和獲得。從而實現了周邊節點卷積(加權求和)獲得新的自身的目的。
(鄰接矩陣A第一行0 1 0 1表示0號節點和1,3號節點相連,和2號不鏈接)
若是要讓節點擁有周邊更普遍的節點信息,能夠屢次進行卷積。
上面的 若是用鄰接矩陣替代的話有兩個缺點。
- 沒有考慮節點自身對本身的影響,由於鄰接矩陣對角線爲0;
- 鄰接矩陣沒有被規範化,這在提取圖特徵時可能存在問題,好比鄰居節點多的節點傾向於有更大的影響力。
所以更經常使用的公式是:
又稱爲規範化對稱鄰接矩陣(normalized symmetric adjacency matrix)。關於這個公式理解,能夠參考[1]
04 pytorch代碼實現
有的人看代碼更能理解。下面介紹了兩層圖卷積網絡的模型定義:
class gcn(nn.Module):
def __init__(self, X_size, A_hat, args, bias=True): # X_size = num features
super(gcn, self).__init__()
self.A_hat = torch.tensor(A_hat, requires_grad=False).float()
self.weight = nn.parameter.Parameter(torch.FloatTensor(X_size, args.hidden_size_1))
var = 2./(self.weight.size(1)+self.weight.size(0))
self.weight.data.normal_(0,var)
self.weight2 = nn.parameter.Parameter(torch.FloatTensor(args.hidden_size_1, args.hidden_size_2))
var2 = 2./(self.weight2.size(1)+self.weight2.size(0))
self.weight2.data.normal_(0,var2)
if bias:
self.bias = nn.parameter.Parameter(torch.FloatTensor(args.hidden_size_1))
self.bias.data.normal_(0,var)
self.bias2 = nn.parameter.Parameter(torch.FloatTensor(args.hidden_size_2))
self.bias2.data.normal_(0,var2)
else:
self.register_parameter("bias", None)
self.fc1 = nn.Linear(args.hidden_size_2, args.num_classes)
def forward(self, X): ### 2-layer GCN architecture
X = torch.mm(X, self.weight)
if self.bias is not None:
X = (X + self.bias)
X = F.relu(torch.mm(self.A_hat, X))
X = torch.mm(X, self.weight2)
if self.bias2 is not None:
X = (X + self.bias2)
X = F.relu(torch.mm(self.A_hat, X))
return self.fc1(X)
# 第一層權重維度 args.hidden_size_1取200,
# 第二層權重維度args.hidden_size_2取20;
# args.num_classes=5
最開始介紹的5本書的章節和單詞構成的圖,一共有100個章節節點和5000個單詞節點。每一個章節節點的標籤是屬於哪本書。一共五類。但願經過對其中50個章節的標籤進行標記和訓練,讓網絡學會剩下50個章節屬於哪本書。屬於半監督學習。
05 圖卷積神經網絡最新進展
本文的寫做基礎是來源於AAAI2019的一篇論文Graph Convolutional Networks for Text Classification,用GCN作文本分類。在AAAI2020上,清華大學科大訊飛的學者提出張量卷積神經網絡在文本分類的應用Tensor Graph Convolutional Networks for Text Classification,經過利用文本構成多種圖結構,進一步提升文本分類的性能。
在嶄新的的2020年,圖神經網絡GNN又有哪些嶄新的發展可能呢?分享一個AAAI2020詳細講解GNN的ppt,很好的回答了這些問題。
ppt首頁連接 http://cse.msu.edu/~mayao4/tutorials/aaai2020/
參考閱讀:
[1] 另類解讀 https://zhuanlan.zhihu.com/p/89503068
[2] 另類解讀 https://www.zhihu.com/question/54504471/answer/332657604
[3] 挖坑好文
Yao, Liang, Chengsheng Mao, and Yuan Luo. "Graph convolutional networks for text classification." Proceedings of the AAAI Conference on Artificial Intelligence. Vol. 33. 2019.
[4] 一個圖卷積分類的項目代碼 https://github.com/plkmo/Bible_Text_GCN
推薦閱讀
- 能跟你聊DOTA的神經對話模型:Meena&DialoGPT
- LaserTagger: 文本生成任務的序列標註解決方案
- [CLS]預訓練語言模型的前世此生[SEP]萌芽時代[SEP]
- 打造專屬對話機器人,百度UNIT平臺任務型對話體驗
- REALM: Retrieval-Augmented Language Model Pre Training
- REALM後續:最近鄰搜索,MIPS,LSH和ALSH
http://weixin.qq.com/r/SkistK3Eu-DErenX9x1Y (二維碼自動識別)
參考
- ^離散卷積的本質是一種加權求和 https://www.zhihu.com/question/22298352