導讀: 本次分享的內容為圖深度學習在自然語言處理領域的方法與應用,主要內容和素材都來自于我們Graph4NLP團隊的一篇調研文章:Graph Neural Networks for Natural Language Processing:A Survery,以及我們團隊所開發的Graph4NLP的python開源庫和教程,主要包括以下幾大方面內容:
- DLG4NLP背景與發展
- DLG4NLP方法和模型
- DLG4NLP典型的應用
- DLG4NLP Python開源庫
--
01 DLG4NLP背景與發展
我將首先闡述一下為什么需要圖結構來處理NLP任務,然后介紹一下傳統的圖方法在NLP里面的應用,最后引出圖神經網路并且簡單介紹圖深度學習的基礎理論,
1. 為什么需要圖來處理NLP任務
我們知道圖結構資料是由節點和邊組成的資料型別,在生活的方方面面都可以看到,尤其在大資料時代,比如互聯網、社交網路、金融的交易網,還有可以表示成圖結構的蛋白質等化學物質,我們也可以用圖結構來表示邏輯關系的程式腳本,從影像領域來看,有表示影像里物體間相互互動關系的圖結構,
同樣在NLP的領域里,我們也會發現很多很多可以表示為圖結構的資料,比如針對一個句子,如果我們想表示這個句子里的句法資訊的話,可以建立一個dependency graph或者constituency graph;如果我們想捕捉句子的語意資訊的話,可以建立一個AMR graph或者IE graph;如果我們把程式語言也看作一種自然語言的話,我們可以構建出捕捉程式邏輯關系的SQL graph,
2. 傳統圖方法在NLP任務的應用
傳統NLP領域的表征方法一般分為3種:
第一種采用詞袋來表征文本,該方法依靠統計每個詞在句子或檔案里的頻率,但是這種方式無法捕捉詞語之間順序或者無法捕捉詞語之間的語意資訊,
第二種把文本表示成序列,相對于詞袋會捕捉更多的序列資訊,并且會包含詞對之間的前后關系,典型方法有Word2vec和Glove,
第三種把文本表示成圖,比較常見的有dependency graph和constituency graph等,當我們把一個文本表示成圖后,就不再局限于前后位置的序列關系,我們可以捕捉到任意兩個位置之間的關系,除了位置關系、語法關系,我們還可以捕捉語意關系,所以當我們對句子的文本表示越徹底越全面時,對表征學習任務幫助越大,
現在把自然語言表示成圖結構已經不是一件新鮮事情,早在深度學習之前就有演算法去這么做,例如采用Random Walk演算法和Graph Matching演算法計算文本之間的相似性,雖然傳統方法表征成了圖結構,但是對語言的處理具有比較大的局限性,
其一是沒有后續特征的提取環節,其二解決的任務比較有限,比如句子生成,詞與句子分類,尤其對于預處理模型同時求多個任務時,需要應用圖深度學習來解決圖特征提取環節,
3. 圖深度學習基礎理論
圖神經網路的核心思想是依靠鄰居節點的表征向量對目標節點的影響,不斷地更新和學習每個節點的隱式表征,不同的圖神經網路之間的差異在于所定義的鄰居節點對目標節點的影響方式和資訊傳遞的方式不同,圖神經網路既可以計算節點的表征向量node embedding,也可以計算整個圖的表征向量graph-level embedding,通過圖卷積方式計算節點的表征向量的不同,圖卷積有四個比較典型的代表:Spectral-based,Spatial-based,Attention-based,Recurrent-based,該四個型別并不相互排斥,一種圖卷積方法既可以是Spatial-based也可以是Attention-based,
我們介紹下基本的圖卷積操作,
第一個公式為圖卷積運算,它的輸入為A鄰接矩陣和H node embedding(節點表征);對于節點分類和鄰接預測的任務,得到節點的表征向量即可,對于圖分類和圖的生成任務,需要采用pooling(池化操作)對整個圖做表征向量,常見的方法有Flat Graph Pooling(求平均、最大、最小值pooling方式);另外一種是Hierarchical Graph Pooling(Diff pool方式),根據圖結構把整個node embedding聚合到一起組成一個graph embedding network,
根據不同的圖卷積方式和pooling(池化)層,我們可以得到不同的圖神經網路模型,比如GCN,GAT等,
--
02 DLG4NLP方法和模型
下面我們進入第二部分,即如何用圖神經網路去解決自然語言處理的任務,這一環節我會從三個方面進行介紹,首先是如何去構造自然語言任務里的圖結構,其次是如何在圖結構基礎上進行表征學習,最后講兩個比較典型的圖神經網路構架,
1. 如何構造NLP的圖結構
自然語言里對文本的圖構造可以分為兩類:
- 靜態圖構造
- 動態圖構造
靜態圖構造的輸入可以為原始的句子、段落或者檔案,輸出是我們針對輸入所構造出的圖結構,靜態圖可以在預處理階段完成,但是它需要有一些對句子或檔案文本的領域資訊,比如一些語法資訊、語意資訊、邏輯資訊和主題資訊,根據領域資訊對句子或者文本構造一個圖,
根據不同的資訊或者文本,靜態圖可以進一步細分,
首先是Dependence Graph,該圖結構依賴于dependence parsing,可以用來捕捉句子的句法資訊,它更注重兩個詞之間的句法關系,所以該圖結構是一個比較簡潔的構圖表示,如果我們想用圖表示整個檔案的話,我們可以結合連續邊的資訊來表示檔案中句子之間的前后關系,
相對Dependence Graph,Constituency Graph展現的是句子的句法資訊,更注重整個句子的結構,而不是局限于句子中兩個詞之間的句法關系,所以它更全面地展示了整個句子的結構性,
其次介紹AMR Graph和IE Graph,它們都是用來捕捉句子的語意資訊,更注重兩個詞之間語意關系,比如IE Graph例子里面Paul是個人名,然后Seattle是個地名,所以我們首先需要表示它們倆屬于物體,同時也需要知道兩個物體之間的關系是一種grew up in的語意關系,根據物體關系,可以構造出IE Graph作為最終的構圖,
除了之前幾種構造圖外,還有Co-occurrence Graph,它是通過統計兩個詞同時出現的次數,得到Co-occurrence矩陣,然后將矩陣作為構圖的鄰接矩陣,
總結以上例子,靜態圖構建是需要額外的領域資訊來增強句子本身的資訊組成的圖結構,常用的資訊有句法資訊、語意資訊、主題邏輯資訊、co-occurrence資訊,甚至基于應用的資訊,所以根據不同的領域資訊,可以構造出不同的靜態圖結構,
下面介紹另外一種構圖方式即動態構圖,動態圖構造不需要有額外的領域知識去指導如何構圖,該方法直接把文本丟給機器,讓機器自己去學習圖結構,
例如有若干個表示為word或者句子的未知關系節點,首先通過圖相似矩陣學習的方式去構造一個全連接圖,然后對其做稀疏化操作得到稀疏圖,然后進行圖表征學習,
動態圖構建中最重要的一個步驟是相似矩陣學習,其核心是計算任意兩個節點特征向量相似度,首先需要設定一個相似的kernel去定義這兩個embedding的相似度,兩種典型的做法:一個是Node Embedding Based方法,第二個是Structure-aware方法,下面分別介紹這兩種方法,
Node Embedding Based方法依靠兩個節點的表征向量(embedding),先計算兩個節點embedding的相似度,然后把相似度作為加權的鄰接矩陣里面的值,特征向量計算相似度的方式也分兩種,一個是attention based,一個是cosine based,
Attention-based的方式在計算相似度時,會有可學習的引數來幫助計算每對節點對之間的attention,它其實有兩種方式來計算attention:
第一種是假設對所有的節點都共享可學習的引數,可學習引數是一個向量,
第二種方式是每一對節點都有自己的可學習的引數,這里可學習的引數是一個矩陣了,矩陣里面N代表節點的數量,
Cosine-based方法是先把節點的表征向量都乘以一個可學習的引數矩陣,相當于將其投影到另一個新的空間,再計算新空間下兩個表征向量之間的cosine值,如果想讓函式更加具有張力,可以借鑒多頭機制(multi-head)設定多個投影空間,即學多個引數,對于每一個頭引數都會有一個cosine值,然后把所有的cosine求平均,即為最終的cosine值,
在計算相似度時有時不僅要考慮node embedding,還要考慮圖本身的結構,可以用structure-aware相似矩陣來學習本身的初始結構,但該結構不確定對下游任務的影響,但是可以先用起來,然后去算structure-aware相似度,
structure-aware相似矩陣計算其相似度也有兩種方式,計算相似度時都將邊界的embedding算進去,
下面對動態圖和靜態圖的構造做一個總結:
a) 靜態圖的優點可以依靠認為構造去捕捉一些先驗目標知識,其缺點是人為構造會產生噪聲,同時無法確定構建的圖結構對下游任務是否有所幫助,當我們確定所掌握的領域知識是跟下游任務是匹配時,可以應用靜態圖結構,
b) 動態圖的優點是比較簡便,不需要額外的領域知識直接讓機器去學最優的圖結構,其圖結構和圖表征的學習程序可以相互促進,缺點是圖結構的可解釋性幾乎為零,不太能解釋兩個節點之間的關系和代表的含義,第二個缺點是由于是全連接的圖導致穩定性很差,當缺少一些領域知識或者不確定用什么圖去解決下游任務時,可以選擇動態圖構建來幫我們去學最優的圖結構,下面介紹如何做表征學習,
2. 如何做NLP的圖表征學習
圖表征學習分為三種,為Homogeneous Graph、Multi-relational Graph和Heterogenous graph,Homogeneous Graph只有一種節點型別以及一種邊型別,Multi-relational Graph是一種節點型別以及多種邊型別,Heterogenousgraph則是多種節點型別和多種邊型別,
下面分別介紹這三種不同的圖表征學習,
Homogeneous Graph的神經網路比較簡單,構建來源有兩種,一種是本身圖結構就是homogeneous,第二種是通過轉換操作,把non-homogeneous graph轉化成一個homogeneous graph,
接下來舉例子介紹,如何把不適合的non-homogeneous graph轉化成homogeneous graph,左邊圖結構是一個AMR graph,有多種不同的關系,把每個關系的ARG值當成一個節點,這樣就可以把它轉化成了只有一種ARG值的graph,如果將節點看作同等對,其就是一個homogeneous graph,
還有一個比較關鍵的問題,在構圖中會經常遇到連接的邊具有方向性,邊的方向性在表示兩個節點關系上是非常重要的,比如說在處理序列時,BiLSTM結構之所以效果很好,其實也是考慮到這種方向性,所以在圖結構上也要考慮這個方向性,目前處理方向有三個選擇:
第一個是在資訊傳遞時,只讓資訊沿著方向傳播,例如a中的紅色節點跟四個節點連接,但是因為讓資訊只沿著節點的箭頭方向傳播,所以它只受三個鄰居節點的影響,
第二個是把edge的兩個方向當成兩個edge種類,產生一個多關系的graph,
第三個是設計Bidirectional GNNs,直接用這種特殊的圖神經網路去解決問題,
下面詳細介紹特殊的Bidirectional GNNs,該圖神經網路分兩個型別:
第一種型別是對每一個方向都會搭建兩個獨立的卷積網路,分別學習embedding,到最后一層時,再把兩個方向得到的節點表征連接到一起得到最終的表征,
另外一種型別不同之處在于,雖然有兩個不同方向的卷積網路,但在每一層卷積之后都會把學到的節點表征合到一起,把新的節點表征去分別送到下一層兩個方向的卷積,
接下來介紹Multi-relation GNNs,其方法分為三類:
第一種是引入不同的與type相關的可訓練卷積引數,
第二種直接引入edge embeddings,來表示不同的關系,
第三種利用專門的Multi-Relation Graph Transformer,
下面是處理Multi-relation的方法,
第一種方法是對每一個關系學一個卷積核,相比于傳統的GNN,R-GGN有一個引數θ,對每個type都會學一個θ,每一個關系都會得到節點表征,然后把得到的節點表征做一個加和,
第二種直接引入邊的表征向量,其核心是在做message傳播時,把邊的表征向量加進來可以捕捉不同邊的種類,引入邊表征向量有兩種方式,一種是邊表征向量從頭到尾是固定不變的,另外一種是邊的表征向量像節點一樣,在傳播中不斷地更新迭代,
eterogeneousGraph在NLP領域里面更多用的是基于meta-path的GNNs,詳細介紹可以看ACL2020的文章,
3. NLP任務重的圖編碼解碼模型
在經典的NLP任務里面,seq2seq的架構相對比較流行,比如自然語言翻譯這種實際問題,但是這種結構只能處理序列轉換,無法解決圖結構,所以為了把圖結構引入整個NLP任務,需要采用Graph2Seq的結構,
目前有兩個比較主流的結構,第一個是由encoder-decoder組成,其encoder是基于GNN神經網路組成,將圖作為輸入圖的embedding,然后decoder選擇為NLP里針對不同下游任務所使用的語言生成器,
第二種結構是graph-to-Tree Model,輸出不只是需要sequence,我們還需要更詳細的圖結構文本,比如程式語言的生成,需要把它表示成為tree的結構模型來解決任務,
--
03 DLG4NLP典型的應用
接下來介紹Graph NLP里面主要模型和方法的兩個典型應用,
一種廣泛的應用是文本問題生成,即根據輸入的答案,生成對應的問題,該應用可以看成一個生成問題,目的是希望decoder學到一個基于條件的分布,
在ICLR220的這篇文章中,它是利用Graph2Seq的結構去解決生成問題,把輸入表示成一個圖結構,用BiGGNN去學習節點表征,再配上RNN decoder做最后的問題生成,
另外一篇文章是總結概要的應用,它的目的就是把整個比較大的文章輸入進去,得到一個短摘要,該文章收錄在ICLR2021的summary session中,
--
04 DLG4NLP Python開源庫
最后介紹一下我們團隊開發的開源python庫Graph4NLP,
首先我們開源庫基于pytorch、DGL和CoreNLP開發,并且提供了Huggingface介面,進而可以使用bert之類的模型,
下面是對開源庫功能函式的概覽,其核心的module包含了Graph Construction即靜態圖構建和動態圖構建,還有其下游的任務,比如分類任務和生成任務,另外還包括一些比較典型的圖神經網路GCN和GraphSAGE等,我們還用python庫去實作了一些比較經典文章里的一些模型,并且取得了不錯的效果,
接下來展示下python庫如何做完成NLP任務,
流程為首先做一個圖構建,將圖結構輸進去,用python庫的Graph Data產生Data資料型別,然后用GNN圖學習模塊優化該圖,或者進行圖的表征學習,最后可以根據具體的任務去選擇下游的模塊,或者做分類、生成任務等,
這個表格展示了python庫在不同NLP任務上取得的不錯結果,如果大家想探索圖深度學習在NLP應用的話,請關注和嘗試該library,歡迎大家多提寶貴的意見,因為我們還在不斷的去更新我們的開源庫,今天就是我分享的全部內容,謝謝大家的關注,
--
05 精彩問答
Q1:現在像知識圖譜的圖表示學習的演算法多嗎?
A:目前邊的網路更多的是生成homogeneous graph, Heterogeneous graph也有一兩篇文章,
Q2:Bert加圖學習訓練不起來怎么辦?
A:有可能是構建圖結構有問題,或者調參沒調好,可以試下上面講的開源python庫,先去做一個嘗試,然后對照排查問題,
Q3:最近transformer相對比較火,在用于NLP文本建模時用全連接的圖來進行建模,如果找一些比較稀疏的有語意的圖,也可以取得非常好的結果,您覺得有沒有可能把這兩種方法結合起來,同時利用全連接的圖和語意的圖?
A:我覺得transformer本身就是一種GNN形式,只不過它學的是個全連接圖,它有點類似于我剛才講的動態圖構建,因為動態圖的構建本身也是學一個全連接圖,如果你本身有原始的圖,可以借用原始的圖把它放到動態圖,然后兩兩去結合促進后面的圖學習,
Q4:將圖神經網路用于NLP,重點是在于圖的構建還是在于新的模型?
A:目前圖學習的效果已經不錯了,但基于不同應用,我覺得圖的構建是比較關鍵的一件事情,尤其是如果你做靜態圖構建的時候,你的資訊選取不對或者添加的圖資訊不對的話,你有可能會引入一些bias或一些noise,然后導致學不到你想要的一個資訊,或者得到了更多noise,
今天的分享就到這里,謝謝大家,
本文首發于微信公眾號“DataFunTalk”
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469514.html
標籤:其他