从文本分类来看图卷积神经网络
? ? “?圖神經網絡火了這么久,是時候掌握它了。”
本文包括以下內容,閱讀時間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)是一類采用圖卷積的神經網絡,發展到現在已經有基于最簡單的圖卷積改進的無數版本,在圖網絡領域的地位正如同卷積操作在圖像處理里的地位。
什么是卷積
離散卷積的本質是一種加權求和。
https://www.zhihu.com/question/22298352
卷積過程示意圖
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 featuressuper(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 architectureX = 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,很好的回答了這些問題。
鏈接?
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
總結
以上是生活随笔為你收集整理的从文本分类来看图卷积神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【白话机器学习】算法理论+实战之K近邻算
- 下一篇: 科普:目标检测Anchor是什么?怎么科