1. 程式人生 > 實用技巧 >斯坦福CS224n NLP課程【十四】——樹RNN遞迴和短語句法分析

斯坦福CS224n NLP課程【十四】——樹RNN遞迴和短語句法分析

語言光譜模型

對於語義相似性等這類目標來說,最好的方法還是詞袋

最簡陋最常用的是詞袋模型,或“詞向量袋模型”。最複雜的可能是短語結構樹,額外再標註一些諸如指代、語義等標籤。

這張圖很形象,詞袋中裝不下所有單詞,散落一地。雖然詞袋模型很簡陋,但它依然是一個很難擊敗的基線模型。它簡單高效,通過一些聰明的技巧可以在一些任務中勝過深度神經網路。

語言的語義解釋--並不只是詞向量

詞向量只是詞語級別的向量,對於下列兩句話,加粗部分其實意思是一致的:

就算一個人沒見過snowboarder這個單詞,他也能明白這與下面這個短語是同一個意思。人們可以用更大顆粒度的文字來表達自己的意思,而不僅僅是詞袋中的某個單詞。我們希望有這樣的一個模型來做到這點、

語義合成性

這個問題觸及的第一個層面就是語義的合成性,你可以組合小的單元來表示更復雜的語義。

這不僅關乎語言,還關乎人類的其他認知活動。對於影象而言,也有類似的組成性:

將小部件組成大模組並理解大模組的大體思想 Tree Recursive NN 是最好的模型 而Recursive 遞迴的概念是什麼?

語言能力:

以前有種主流觀點認為,人類生來就具備處理語言的大腦模組,使得人類區別於其他動物,成為萬物靈長。但喬姆斯基最近的工作認為,人類大腦中沒有這種結構,只是因為人類學會了遞迴而已。有了遞迴的思想,人類就能利用有限的器官處理無限長度的語言序列。

語言是遞迴的嗎?

在認知科學上雖然有些爭議,因為一般一個句子是有長度限制的,人們幾乎從不說300個詞以上的句子。但是遞迴是描述語言的最佳方式,比如[The man from [the company that you spoke with about [the project] yesterday]]這裡面一個名詞短語套一個名詞短語,一級級下去。從實用的角度講

1、通過遞迴地描述句子(句法樹),可以有效地消歧:

2、便於指代相消等任務。

3、便於利用語法樹結構(基於短語的機器翻譯)

建立在詞向量空間的模型

不論句子多複雜,我們總是希望能在同一個向量空間中表示詞語和短語的語義。為什麼一定要這麼做?回想這節課開頭snowboarder的例子就明白了,有時候一個單詞與一個短語表達的是同一個意思。

如何將短語對映到詞向量空間中

使用語義合成的原則在數學、語義學和語言哲學中,複合性原理是指,一個複雜表示式的意義是由其各組成部分的意義以及用以結合它們的規則來決定的。https://dict.eudic.net/dicts/en/Principle_of_compositionality.html

通過同時學習句法樹和複合性向量表示,就可以得到短語的向量表示了。

短語結構分析

如果我們能用短語結構樹表示一個句子:

將每個rule視作一個運算元,即可得到每個短語乃至句子的向量表示:

Recursive vs recurrent NN

recurrent更像是受限的tree 結構

  • 兩者都是遞迴神經網路,只不過前者在空間上遞迴,後者在時間上遞迴。中文有時會把後者翻譯為“迴圈神經網路”,但這明顯混淆了等級,令人誤解。
  • 它們各有各的優缺點,Recursive neural net需要分析器來得到句法樹,而Recurrent neural net只能捕捉“字首”“上文”無法捕捉更小的單位。
  • 但人們還是更傾向於用後者,LSTM之類。因為訓練Recursive neural net之前,你需要句法樹;句法樹是一個離散的決策結果,無法連續地影響損失函式,也就無法簡單地利用反向傳播訓練Recursive neural net。另外,複雜的結構也導致Recursive neural net不易在GPU上優化。

RNN與CNN之間的關係

RNN只會為滿足語法的短語計算向量,而CNN為每個可能的短語計算向量。從語言學和認知科學的角度來講,CNN並不合理。甚至recurrent neural network也比tree model和CNN更合理。

兩者的關係可以這樣想象,RNN將CNN捕捉的不是短語的部分刪除了:

得到:這裡的RNN指的是 遞迴Recursive

Recursive NN 用於結構化預測

同時得到結構樹和向量表示的一種任務。輸入兩個候選子節點,輸出兩個結果1.兩個子節點合併後的新節點語義表示向量,2.新節點成立的分數來判斷該組合結構是否合理。

最簡單的Recursive NN

利用單層的神經網路作為組合函式,向量內積作為打分函式,馬上就可以得到一個最簡單的RNN:

使用Recursive NN分析句子

計算任意兩個單詞合併的得分(雖然下圖是相鄰兩個,但我覺得那只是繪圖方便;就算是我第一次寫的玩具級別的依存句法分析器,也是任意兩個單詞之間計算):

然後貪心地選擇得分最大的一對合並:

重複這一過程

直到得到根節點:

最大間隔

使用貪心演算法,每次都選擇總分得分最高的tree

不再僅僅根據整個句子的總分挑選,而是要求每個預測分值離錯誤類別要儘量遠。

然後也不要貪心搜尋,而是柱搜尋。

兩兩組合詞語進行貪心搜尋,獲取最優的解法。導致時間複雜度變得更大,工作量變大不是我們想要的。所以我們可以使用反向傳播演算法對引數進行更新。

由於前向傳播時每個節點的訊號來自所有子節點,所以梯度也來自所有子節點。並且前向傳播時父節點的訊號是利用子節點訊號的拼接計算的,所以梯度需要針對子節點的訊號計算:

這個問題其實在TensorFlow那一課已經講過了,圖計算:前向傳播訊號流入某節點,反向傳播誤差就得從某節點分流到所有源節點。樹只是圖的一個特例:

討論 簡單的Recursive NN的缺點

單層神經網路接受兩個單詞詞向量的拼接,乘上權值矩陣W,非線性啟用。矩陣運算中W可視作兩個矩陣的拼接,c_1和c_2其實沒有發生互動。

另外,模型中只有一個合成函式,使用同一個權值矩陣WW處理NP、VP、PP……這明顯是不合理的。

版本2:Syntactically-UnitedRecursiveNN

利用子節點的句法分類(詞性NN、VV、PP)不同而使用不同的權值矩陣進行合成。

然後句子的結構也是通過PCFG中的CKY演算法動態規劃地得到。這樣速度很快,不需要遍歷每兩個節點的組合,進行矩陣和向量的乘積計算。這種“文法”被稱為Compostional Vector Grammars。

句法分析的相關工作

CVG的產生離不開PCFG的拓展,當時人們提出Lexicalized PCFG,即用短語的head表示短語本身。但這是個離散的表示,丟失了其他詞語的語義,CVG自然而然地想到了用連續的向量表示來代替它。

效果:裸的CKY-PCFG可以拿到72%的F1,但裸的RNN已經可以拿到85%的F1了,在加上Syntactically-United,立馬超越所有人工特徵工程。

句法分析並不是最終目的,最終目的是通過句法分析得到的句法樹合成句子的意思的表示。

直觀效果:將每種短語的合成函式的權值矩陣視覺化,會發現模型成功地捕捉到究竟哪個子節點語義資訊更豐富。

其中主對角線的黃線來自單位矩陣初始化。上圖名詞-連詞短語中,語義主要來自前半部分。而所有格-名詞短語中,語義主要來自後半部分。

還有很多類似的例子:

而得到的句子表示也的確把相似的句子放到了鄰近的向量空間中:

版本2依然沒有解決兩個子節點的混合問題,它們依然乘上的是矩陣的不同部分,互不相干。

版本3 Compositionality Through Recursive Matrix-Vector Spaces

有理論認為語言是由兩種不同的符號組成,一種符號就是普通的符號,另一種符號類似操作符,可以改變普通符號的意思。比如very good和not good中,good是普通符號,被前面的操作符修改了意思。

版本3形式化了這種思想,將操作符抽象為矩陣,將符號抽象為向量。我們不知道哪些詞語是操作符,哪些是符號,所以為每個節點同時賦予向量和矩陣,在合成運算的時候混合兩者的矩陣和向量,期待模型自己去區分並混合語義:

這樣得到的短語p依然是一個向量,但是已經充分混合兩個子節點的語義表示。

而對兩個子節點的矩陣表示,也拼接起來乘上另一個矩陣得到一個新的矩陣,作為短語的操作符的矩陣表示:

事實上,矩陣是個龐大的引數集合,這是該模型的短板。

效果

雖然樸素RNN可以捕捉大多數短語語義,但它容易被最後一個單詞影響。而MV-RNN的確做得更好。下圖是兩種模型預測的短語情感(越大越正面)及其概率分佈:

語義關係分類

可以將MV-RNN用於學習較大的語義上下文所描述的語義關係,比如總體-區域性、訊息-主題之類:

只需得到包含兩個目標單詞的最小短語表示進行分類即可。

效果:

樸素RNN依然挺好,加上MV和一點點額外語言學特徵就超越了使用大量特徵工程的SVM。

其他應用:

解析影象各部分的語義成分(類似句法分析):

影象分割與多分類(類似中文分詞與詞性標註):

甚至用於粒子物理: