[NAACL16]RNN文法
來自專欄自然語言處理與深度學習3 人贊了文章
原文鏈接:
Recurrent Neural Network Grammars
論文地址:Recurrent Neural Network Grammars
代碼地址:github
今天要介紹的這篇論文是來自NAACL16的Recurrent Neural Network Grammars,主要貢獻點就是提出了一種新的文法RNNG,不同於傳統的PCFG之類的文法,RNNG使用RNN來對句子和它的句法樹的聯合概率進行建模,因此它是一個生成模型。但是稍稍修改就可以改為判別模型,也就是大家熟悉的基於轉移的成分句法分析系統,並且轉移系統是採用top-down方法的,也就是利用了句法樹的前序遍歷。
RNNG在語言模型任務上取得了當時的state-of-the-art結果,成分句法分析任務上,生成模型取得了媲美最好結果的F1值,而判別模型就差了點。本文最大的貢獻點就是提出了生成式模型RNNG,說明了在數據量不是很大的時候,利用生成式模型可以提高成分句法分析的準確率。
摘要
RNN在語言模型和其他許多NLP任務上面都已經取得了非常不錯的效果,但是RNN只能捕捉到句子的序列特徵,例如句子的句法結構等遞歸嵌套的結構信息無法用RNN捕捉到。
因此本文提出了一種利用RNN建模出來的全新文法RNNG,建立在句子的句法結構之上,消除了PCFG的上下文無關假設。並提出了兩種變體,一種是生成模型,可以用來句法分析和訓練語言模型,另一種是判別模型,可以用來句法分析。
RNNG建立在top-down轉移系統之上,top-down轉移系統相比於bottom-up轉移系統有一個好處,就是不需要二叉化,因為如果bottom-up轉移系統不二叉化的話,REDUCE的狀態就會有很多種可能,不知道到底歸約棧里的幾個結點。而top-down轉移系統就不存在這個問題,直接歸約到第一個父結點為止就行了。本文應該也是第一個提出用RNN來實現top-down轉移系統的,之前的方法都是用top-down的文法,或者是bottom-up的,例如Sochar2013的CVG,也是用二叉化後的RNN學習結點的語義表示。
RNN文法
RNNG定義為三元組 ,其中 是非終結符集合, 是終結符集合,並且 , 就是神經網路的參數集合。RNNG和傳統的PCFG的一個明顯區別就是它沒有顯式地指出語法規則是什麼,而是蘊含在了神經網路中,在句法轉移的時候動態的生成。
Top-down句法分析和生成
這部分主要介紹RNNG的兩個變體,一個是top-down的句法分析系統,還有一個是稍稍修改後的生成系統。
判別式系統
這個判別式模型之前也已經介紹過很多次了,和普通的基於轉移的句法分析系統一樣,輸入是一個句子 ,輸出是它的句法分析樹 。主要組成部分有句法樹棧、句子單詞buffer、動作集合,每一步的動作有三種:
- NT(X): 將一個父結點X移進棧里。
- SHIFT: 從buffer中移一個單詞到棧里。
- REDUCE: 將棧頂的若干個結點歸約為它們的父結點,並且出棧。
圖1就是每個動作的狀態變化過程,圖2是判別式模型進行句法分析的示例:
當然得給動作添加一些限制,首先記當前狀態為三元組 ,分別表示buffer、棧、當前棧里未歸約的父結點數量,這個之前的博客沒有提及過:
- NT(X)動作只有當buffer不為空並且 的時候才能進行。因為buffer空了的話就沒有單詞了,此時不可能移進新的非終結符了,並且要限制 防止一元產生式無限生成下去。
- SHIFT動作只有當buffer不為空並且 時才能進行。前者不用解釋了,後者的話因為是top-down的,所以棧里至少要有一個父結點才能移進新的單詞。
- REDUCE只有當棧頂不是沒有歸約的父結點才能進行。
- REDUCE只有當 或者buffer為空時才能進行。這裡要解釋一下為什麼 ,因為如果buffer不為空同時 ,那麼這時候如果REDUCE的話,棧里就只剩一個非終結符了,只可能是根節點S,而buffer里還有單詞,所以這是不可能的。
記當前狀態的可能動作集合為 。
生成式系統
將上面的top-down轉移系統稍稍修改即可得到生成式系統。區別有兩點:
- 首先沒有了輸入的buffer,取而代之的是輸出的buffer 。
- 其次因為沒有輸入單詞了,所以在需要輸入單詞的時候採用GEN(x)動作來產生一個新的單詞 ,然後移進棧里,取代SHIFT動作。
圖3就是每個動作的狀態變化過程,圖4是生成式模型進行句法分析的示例:
同樣也要對其採取一些限制:
- GEN(x)動作只有當 時才能進行,上面SHIFT限制已經解釋過了。
- REDUCE只有當 或者buffer為空時才能進行。這裡再次解釋一下,上面判別式模型限制條件是 ,為什麼這裡就變成了 ?因為生成模型沒有輸入buffer,所以即使 時REDUCE了,以後不要再GEN(x)即可,直接結束分析
記當前狀態的可能動作集合為 。
轉移序列
因為一棵句法樹的前序遍歷是唯一的,所以不管用判別式模型還是生成式模型,得到的動作序列也都是唯一的。對於句子 和句法樹 ,記生成式模型動作序列為 ,判別式模型動作序列為 。
生成式模型
本文最重要的就是上面提到的生成式模型,因為GEN(x)動作的存在,所以模型同時對句子 和句法樹 的聯合分布進行了建模。記當前狀態的向量表示為 ,那麼聯合分布可以表示為:
其中 表示動作 的向量表示, 表示偏移向量,都包含在了RNNG參數集合 裡面,通過訓練得到。
而當前狀態的向量表示 由三部分得到,輸出buffer的LSTM輸出 、棧的LSTM輸出 、歷史動作序列的LSTM輸出 ,然後經過一個前饋神經網路得到:
和 同樣也包含在了RNNG參數集合 裡面,下圖是三個LSTM的示例圖:
句法成分組合
在REDUCE操作時,需要將若干個子結點歸約為一個父結點,為了得到父結點的向量表示,再次利用一個LSTM對子結點序列進行編碼,同時在首尾加上父結點,結構圖如下所示:
單詞生成
單詞生成採用softmax尋找概率最大的單詞,但是單詞數量可能十分巨大,所以採用分層softmax的思想,首先預測當前動作是不是GEN,如果是GEN,記單詞總數為 ,再將單詞平均分成 個類別,用softmax預測屬於哪個類別,然後在那個類別里再用softmax預測輸出哪個單詞。這樣時間複雜度就從 降到了 。
參數訓練和判別式模型
模型最終訓練目的就是使得聯合概率最大。
而只需要將輸出buffer改為輸入buffer,GEN動作改為SHIFT動作,然後重新訓練,就可以將模型變為判別式模型了,輸出給定輸入句子下概率最大的句法樹。
通過重要性採樣進行推理
本文的生成式模型另一大作用是訓練語言模型 ,根據邊際分布公式
可以直接得到 ,但是一句話的句法樹可能性是指數級別的,不可能一一枚舉,這時候就要用到重要性採樣演算法。
首先定義一個比較容易得到的條件分布 ,它滿足如下性質:
- 可以推出 。
- 服從分布的樣本很容易得到。
- 可以直接計算得到。
可以發現,上面的判別式模型得到的條件分布符合上面的性質,所以這裡直接用判別式模型來進行採樣。
這樣 就變為了:
其中重要性權重 。
最後如果根據分布 採樣得到了 個句法樹樣本,那麼用蒙特卡羅方法就可以估計出 了:
實驗
實驗部分主要說一下PTB上的句法分析和語言模型吧,下面兩張圖分別是句法分析和語言模型的結果:
句法分析方面可以看出,生成模型效果要遠遠好於判別模型,生成模型效果也接近了當時的最好結果。一個合理的解釋是在小數據集上面,生成模型效果要更好,而在大數據集上,判別模型效果可以趕上生成模型。
這裡要提到的一點是,判別式模型就是每一個狀態直接貪心argmax找到概率最大的動作,然後生成句法樹。而生成式模型是利用判別式模型採樣出100個概率比較高的句法樹,然後用生成式模型計算它們的聯合概率,重排序選擇概率最高的句法樹。
語言模型方面,結果要比最好結果高了一點。
總結
RNNG這個文法是個生成式模型,建模了句子和句法樹的聯合分布,稍稍修改即可應用到句法分析和語言模型中,效果也非常的好。
最後,我再簡要梳理一遍RNNG的主要訓練過程,因為這篇論文也看了整整兩天,還是看的頭大,一些細節可能還是沒完全搞清。
首先利用生成式模型對每句話進行訓練,在每個狀態計算正確的動作的概率,然後訓練使得概率之積最大。
然後應用到句法分析中,只需要修改為判別式模型即可。
最後應用到語言模型中,由於需要用到重要性採樣,所以直接利用判別式模型生成若干樣本,然後根據算得的條件概率計算語言模型句子的概率。
推薦閱讀:
※【第六期】AI Talk:基於深度學習的語音合成技術進展
※《Learning Text Similarity with Siamese Recurrent Networks》
※【群話題精華】五月集錦——機器學習和深度學習中一些值得思考的問題
※命名實體識別的兩種方法
※文本分類綜述,機器學習/深度學習方法總結
TAG:自然語言處理 | 深度學習DeepLearning | 語法分析 |