[NAACL19]一個更好更快更強的序列標註成分句法分析器
原文連結:
Better, Faster, Stronger Sequence Tagging Constituent Parsers godweiyang.com為了看懂論文裡的策略梯度,又去把強化學習看了一遍。。。
論文地址:
Better, Faster, Stronger Sequence Tagging Constituent Parsers arxiv.org介紹
這篇論文主要是在之前的那篇論文
Constituent Parsing as Sequence Labeling godweiyang.com
基礎上解決了如下三個問題:
- 太長的短語預測錯誤率高。
- 輸出空間太大導致label稀疏性。
- 貪心解碼導致的錯誤傳播。
本文提出的解決方法分別是:
- 採用融合了相對編碼和絕對編碼的動態編碼。
- 將預測任務分解為多個子任務。
- 採用輔助任務和策略梯度。
三大問題以及解決方法
過長短語預測的高錯誤率
由下面這張圖可以看出,當 太小時,準確率就會大幅下降。這個問題主要體現在過長短語的閉合上,右括號的預測尤其困難。其實這也跟資料稀疏性有很大關係,訓練集中過長短語畢竟佔少數。

解決方法就是採用動態編碼,如下圖所示:

第一行是相對值編碼,第二行是絕對值編碼,之前文章都已經解釋過了。第三行是結合了上面兩種編碼的動態編碼,具體取值情況是大多數時候都還採用相對值編碼,因為畢竟相對值編碼空間比較小,可以適當緩解資料稀疏性。但是當滿足如下兩種情況的時候,就採用絕對值編碼:
- 絕對值
,也就是說CA的個數不能超過3個,這樣也是為了降低資料的稀疏性。
- 相對值
,也就是說將上圖中準確率比較低的那些負數值全部用絕對值替代了,在句法樹中表現為
所在的子樹比
低兩層以上。
輸出空間太大導致label稀疏性
這個問題主要是由於三元組 太稀疏了導致的。假設
,那麼這個三元組的狀態空間是
,可以通過將三元組分解為三個不同的子任務將複雜度降低為
。最後的損失函式定義為三個子任務的損失之和:
具體實現上,可以將任務 的輸出給任務
和
作為輸入。
貪心解碼導致的錯誤傳播
這個問題在基於貪心的方法中基本都存在,也就是所謂的一步錯步步錯,這裡主要提出了兩種解決方法。
輔助任務 輔助任務主要就是用來幫助主任務學習到一些不太容易學到的資訊。這裡才用了兩個輔助任務,一個是在預測 的同時再預測一個
,這樣就能往後多預測一步,適當的減少了貪心的影響。另一個方法就是將之前部落格寫到的句法距離(syntactic distances)加入到模型中一起預測:

對於不同的輔助任務,最後將他們的損失求和加到最終的損失函式中去:
策略梯度 這個方法可以從全域性的角度來對模型進行優化。假設模型在 時刻的狀態為 ,輸出標籤為
,那麼模型選擇
的概率定義為策略 ,模型最終可以獲得的獎勵為
,定義為句法樹的F1值。
定義句法樹的概率為每一步決策的概率之積:
所以模型最終就是要最大化如下的獎勵:
按照梯度上升的方向更新引數 ,求梯度可得:
將 代入可得:
其中 是根據分佈 取樣出來的
棵句法樹的獎勵。
具體實現的時候有好幾個小Tips。
第一個就是要將獎勵減去一個baseline,這裡定義為模型直接根據貪心求得的句法樹的F1值:
這麼做的目的就是為了讓獎勵有正有負,不然全部都是正數的話,因為取樣不可能全部取樣到,可能會導致高概率的樣本概率越來越高,而沒有采樣到的低概率樣本可能獎勵非常高,卻因此概率越來越低。
第二個Tip就是加入熵作為正則項:
目的就是使概率儘量不要太小,不然的話取樣數不夠的話就有可能造成取樣不到小概率的樣本。
還有就是給策略加入噪聲:
目的同樣是加大概率,防止概率太接近於0,當然這個可加可不加。。。
實驗結果
首先測試了不同設定的影響:

可以看出上面提到的幾種方法對效能都有提升,其中採用動態編碼、多工(也就是減少輸出空間)、輔助任務(主要是預測前一個 )還有策略梯度可以獲得最好的結果。
最終模型在測試集上取得了90.6的F1值,雖然不是很高,但比之前的序列標註模型提升還是不少。

最後再來看一下模型在負數預測上的準確率,可以看出有了非常大的提升:

總結
這篇論文提出了不少的小Tips來提升序列模型的準確率,但是效果卻還是遠遠低於syntactic distances那篇論文(F1值91.8),具體原因我也不得而知,我猜測跟樹到序列對映編碼關係可能不是特別大,可能還是跟序列建模有關,那篇論文的序列採用了兩次LSTM,中間還夾雜了一次CNN卷積操作。所以編碼器的好壞還是直接決定了最後效能的好壞,怪不得Elmo和Bert的效果那麼的突出。