从文本分类来看图卷积神经网络
? ? “?圖神經(jīng)網(wǎng)絡(luò)火了這么久,是時(shí)候掌握它了。”
本文包括以下內(nèi)容,閱讀時(shí)間10min
圖神經(jīng)網(wǎng)絡(luò)是什么意思
文本如何構(gòu)建圖
圖卷積神經(jīng)網(wǎng)絡(luò)
源代碼實(shí)現(xiàn)
圖卷積神經(jīng)網(wǎng)絡(luò)最新進(jìn)展
本文閱讀基礎(chǔ)
神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
本文不包含拉普拉斯矩陣的數(shù)學(xué)推導(dǎo)
01
—
“圖神經(jīng)網(wǎng)絡(luò)”是什么
過去幾年,神經(jīng)網(wǎng)絡(luò)在機(jī)器學(xué)習(xí)領(lǐng)域大行其道。比如說卷積神經(jīng)網(wǎng)絡(luò)(CNN)在圖像識(shí)別領(lǐng)域的成功以及循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM)在文本識(shí)別領(lǐng)域的成功。對(duì)于圖像來說,計(jì)算機(jī)將其量化為多維矩陣;對(duì)于文本來說,通過詞嵌入(word embedding)的方法也可以將文檔句子量化為規(guī)則的矩陣表示。以神經(jīng)網(wǎng)絡(luò)為代表的深度學(xué)習(xí)技術(shù)在這些規(guī)范化的數(shù)據(jù)上應(yīng)用的比較成功。但是現(xiàn)實(shí)生活中還存在很多不規(guī)則的以圖的形式存在的數(shù)據(jù)。比如說社交關(guān)系圖譜中人與人之間的連接關(guān)系,又比如說電子商務(wù)系統(tǒng)中的人與貨物的關(guān)系等等,這些數(shù)據(jù)結(jié)構(gòu)像下面這樣:
演員-電影 關(guān)系位于neo4j的圖數(shù)據(jù)
圖神經(jīng)網(wǎng)絡(luò)(Graph Neural Network, GNN)是指神經(jīng)網(wǎng)絡(luò)在圖上應(yīng)用的模型的統(tǒng)稱,圖神經(jīng)網(wǎng)絡(luò)有五大類別:分別是:圖卷積網(wǎng)絡(luò)(Graph Convolution Networks,GCN)、 圖注意力網(wǎng)絡(luò)(Graph Attention Networks)、圖自編碼器( Graph Autoencoders)、圖生成網(wǎng)絡(luò)( Graph Generative Networks) 和圖時(shí)空網(wǎng)絡(luò)(Graph Spatial-temporal Networks)。本文只重點(diǎn)介紹最經(jīng)典和最有意義的基礎(chǔ)模型GCN。
清華大學(xué)孫茂松教授組在 arXiv 發(fā)布了論文Graph Neural Networks: A Review of Methods and Applications,作者對(duì)現(xiàn)有的 GNN 模型做了詳盡且全面的綜述。
02
—
文本如何構(gòu)建圖
我們要構(gòu)建一個(gè)具有定義好n個(gè)節(jié)點(diǎn),m條邊的圖。
以經(jīng)典的分類任務(wù)為例。我抽屜里有5本不同的機(jī)器學(xué)習(xí)書,里面一共有a個(gè)章節(jié),同時(shí)所有書里面一共有b種不同的單詞(不是單詞個(gè)數(shù),是所有的單詞種類)。然后我們就可以給a個(gè)章節(jié)和b個(gè)單詞標(biāo)記唯一的id,一共n=a+b個(gè)節(jié)點(diǎn),這是我們圖的節(jié)點(diǎn)。
邊的創(chuàng)建
我們有兩種節(jié)點(diǎn),章節(jié)和單詞。然后邊的構(gòu)建則來源于章節(jié)-單詞 關(guān)系和 單詞-單詞 關(guān)系。對(duì)于邊章節(jié)-單詞?來說,邊的權(quán)重用的是單詞在這個(gè)章節(jié)的TF-IDF算法,可以較好地表示這個(gè)單詞和這個(gè)章節(jié)的關(guān)系。這個(gè)算法比直接用單詞頻率效果要好[1]。單詞-單詞 關(guān)系的邊的權(quán)重則依賴于單詞的共現(xiàn)關(guān)系。我們可以用固定寬度的滑窗對(duì)5本書的內(nèi)容進(jìn)行平滑,類似于word2vector的訓(xùn)練取樣本過程,以此計(jì)算兩個(gè)單詞的關(guān)系。具體的算法則有PMI算法實(shí)現(xiàn)。
point-wise mutual information(PMI)是一個(gè)很流行的計(jì)算兩個(gè)單詞關(guān)系的算法。我們可以用它來計(jì)算兩個(gè)單詞節(jié)點(diǎn)的權(quán)重。節(jié)點(diǎn) i 和節(jié)點(diǎn) j 的權(quán)重計(jì)算公式如下:
PMI(i, j)的計(jì)算方式如下:
#W(i)?表示所有的滑窗中包含單詞節(jié)點(diǎn) i 的個(gè)數(shù)。
#W(i; j) 表示所有的滑窗中同時(shí)包含單詞節(jié)點(diǎn) i 和單詞節(jié)點(diǎn) j 的個(gè)數(shù)。
#W?是總的滑窗次數(shù)
PMI值為正則說明兩個(gè)單詞語義高度相關(guān),為負(fù)則說明相關(guān)性不高。因此最后的圖構(gòu)造過程中只保留了具有正值的單詞節(jié)點(diǎn)對(duì)組成的邊。
圖的節(jié)點(diǎn)和邊確定了,接下來介紹如何應(yīng)用圖卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行一些學(xué)習(xí)應(yīng)用。
2019年AAAI有一篇論文使用了此方法進(jìn)行章節(jié)分類。題目“Graph Convolutional Networks for Text Classification”
03
—
圖卷積神經(jīng)網(wǎng)絡(luò)
圖卷積神經(jīng)網(wǎng)絡(luò)(Graph Convolutional Network, GCN)是一類采用圖卷積的神經(jīng)網(wǎng)絡(luò),發(fā)展到現(xiàn)在已經(jīng)有基于最簡單的圖卷積改進(jìn)的無數(shù)版本,在圖網(wǎng)絡(luò)領(lǐng)域的地位正如同卷積操作在圖像處理里的地位。
什么是卷積
離散卷積的本質(zhì)是一種加權(quán)求和。
https://www.zhihu.com/question/22298352
卷積過程示意圖
CNN中卷積的本質(zhì)就是利用共享參數(shù)的過濾器 kernel,通過計(jì)算中心像素點(diǎn)及相鄰像素點(diǎn)的加權(quán)和來構(gòu)成feature map實(shí)現(xiàn)空間特征的提取,加權(quán)系數(shù)就是卷積核的權(quán)重系數(shù)。卷積核的權(quán)重系數(shù)通過BP算法得到迭代優(yōu)化。卷積核的參數(shù)正是通過優(yōu)化才能實(shí)現(xiàn)特征提取的作用,GCN的理論很重要一點(diǎn)就是引入可以優(yōu)化的卷積參數(shù)來實(shí)現(xiàn)對(duì)圖結(jié)構(gòu)數(shù)據(jù)特征的獲取。
社交網(wǎng)絡(luò)中圖結(jié)構(gòu)
圖卷積的目的類似,寄希望學(xué)習(xí)到一種節(jié)點(diǎn)表示,該節(jié)點(diǎn)表示依賴于每個(gè)節(jié)點(diǎn)及其周邊相鄰的節(jié)點(diǎn)。然后該節(jié)點(diǎn)表示就可以輸出用作分類任務(wù)了,就是我們常說的節(jié)點(diǎn)分類。
圖的定義
對(duì)于圖??,??為節(jié)點(diǎn)的集合,??為邊的集合,對(duì)于每個(gè)節(jié)點(diǎn)??, 均有其特征??,可以用矩陣??表示。其中??表示節(jié)點(diǎn)數(shù),??表示每個(gè)節(jié)點(diǎn)的特征數(shù),也可以說是特征向量的維度。
那么有什么東西來度量節(jié)點(diǎn)的鄰居節(jié)點(diǎn)這個(gè)關(guān)系呢?拉普拉斯矩陣。舉個(gè)簡單的例子,對(duì)于下圖中的左圖而言,它的度矩陣??,鄰接矩陣??和拉普拉斯矩陣??分別如下圖所示,度矩陣(degree matrix)??只有對(duì)角線上有值,為對(duì)應(yīng)節(jié)點(diǎn)的度,其余為0;鄰接矩陣只有在有邊連接的兩個(gè)節(jié)點(diǎn)之間為1,其余地方為0;拉普拉斯矩陣??為??。這是比較簡單的拉普拉斯矩陣。
圖結(jié)構(gòu)數(shù)據(jù)的各種表示
以下是重點(diǎn)
圖卷積網(wǎng)絡(luò)(GCN)第一層的傳播公式如下:
ρ是激活函數(shù),比如ReLU。
我們暫時(shí)理解等同于鄰接矩陣A,代表圖的拓?fù)浣Y(jié)構(gòu),維度N*N,N表示節(jié)點(diǎn)個(gè)數(shù);?
X是第一層輸入的特征矩陣,維度N*M,M表示每個(gè)節(jié)點(diǎn)的特征向量維度;?
Wo是權(quán)重參數(shù)矩陣,維度M*K,K代表轉(zhuǎn)給下一層的向量維度。
因此第一層輸出L1的向量維度就是 N*K。
在上面介紹的文本分類任務(wù)中,
X是原始輸入,我們用對(duì)角線為1的單位矩陣來表示,維度N*N;可以理解為是對(duì)節(jié)點(diǎn)的one-hot表示。Wo采用的參數(shù)是N*K隨機(jī)初始化(K=200),。
XWo 的維度就是N*200,相當(dāng)于對(duì)每個(gè)輸入節(jié)點(diǎn)做了embedding,維度為200。
A * XWo 這個(gè)矩陣乘法怎么理解?這才是理解圖卷積的關(guān)鍵。復(fù)習(xí)一下矩陣乘法公式,發(fā)現(xiàn)新生成的L1這個(gè)N*K矩陣的每一個(gè)節(jié)點(diǎn)的K個(gè)維度,都是對(duì)應(yīng)該節(jié)點(diǎn)的相鄰節(jié)點(diǎn)鄰接權(quán)重乘以相鄰節(jié)點(diǎn)在這個(gè)維度上的值的累加和。從而實(shí)現(xiàn)了通過一次卷積,GCN可以讓每個(gè)節(jié)點(diǎn)都擁有其鄰居節(jié)點(diǎn)的信息。
(不準(zhǔn)確的講,圖的鄰接矩陣乘以圖節(jié)點(diǎn)embedding,就相當(dāng)于是做一次卷積)
下面我畫了一個(gè)示意圖
結(jié)論:新生成的0號(hào)節(jié)點(diǎn)的向量全部由相鄰的1號(hào)節(jié)點(diǎn)和3號(hào)節(jié)點(diǎn)的向量等加權(quán)求和得到。從而實(shí)現(xiàn)了周邊節(jié)點(diǎn)卷積(加權(quán)求和)得到新的自身的目的。
(鄰接矩陣A第一行0 1 0 1表示0號(hào)節(jié)點(diǎn)和1,3號(hào)節(jié)點(diǎn)相連,和2號(hào)不連接)
如果要讓節(jié)點(diǎn)擁有周邊更廣泛的節(jié)點(diǎn)信息,可以多次進(jìn)行卷積。
上面的如果用鄰接矩陣替代的話有兩個(gè)缺點(diǎn)。
沒有考慮節(jié)點(diǎn)自身對(duì)自己的影響,因?yàn)猷徑泳仃噷?duì)角線為0;
鄰接矩陣沒有被規(guī)范化,這在提取圖特征時(shí)可能存在問題,比如鄰居節(jié)點(diǎn)多的節(jié)點(diǎn)傾向于有更大的影響力。
因此更常用的公式是:
又稱為規(guī)范化對(duì)稱鄰接矩陣(normalized symmetric adjacency matrix)。關(guān)于這個(gè)公式理解,可以參考[1]
04
—
pytorch代碼實(shí)現(xiàn)
有的人看代碼更能理解。下面介紹了兩層圖卷積網(wǎng)絡(luò)的模型定義:
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) # 第一層權(quán)重維度?args.hidden_size_1取200, # 第二層權(quán)重維度args.hidden_size_2取20; # args.num_classes=5最開始介紹的5本書的章節(jié)和單詞構(gòu)成的圖,一共有100個(gè)章節(jié)節(jié)點(diǎn)和5000個(gè)單詞節(jié)點(diǎn)。每個(gè)章節(jié)節(jié)點(diǎn)的標(biāo)簽是屬于哪本書。一共五類。希望通過對(duì)其中50個(gè)章節(jié)的標(biāo)簽進(jìn)行標(biāo)記和訓(xùn)練,讓網(wǎng)絡(luò)學(xué)會(huì)剩下50個(gè)章節(jié)屬于哪本書。屬于半監(jiān)督學(xué)習(xí)。
05
—
圖卷積神經(jīng)網(wǎng)絡(luò)最新進(jìn)展
本文的寫作基礎(chǔ)是來源于AAAI2019的一篇論文Graph Convolutional Networks for Text Classification,用GCN做文本分類。在AAAI2020上,清華大學(xué)科大訊飛的學(xué)者提出張量卷積神經(jīng)網(wǎng)絡(luò)在文本分類的應(yīng)用Tensor Graph Convolutional Networks for Text Classification,通過利用文本構(gòu)成多種圖結(jié)構(gòu),進(jìn)一步提高文本分類的性能。
在嶄新的的2020年,圖神經(jīng)網(wǎng)絡(luò)GNN又有哪些嶄新的發(fā)展可能呢?分享一個(gè)AAAI2020詳細(xì)講解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]?一個(gè)圖卷積分類的項(xiàng)目代碼?
https://github.com/plkmo/Bible_Text_GCN
總結(jié)
以上是生活随笔為你收集整理的从文本分类来看图卷积神经网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【白话机器学习】算法理论+实战之K近邻算
- 下一篇: 聚焦和增强卷积神经网络