寫在前面
該系列主要事對指針網絡在NER以及關系抽取系列取得的成果進行展示,並根據大佬們的筆記總結其中的優劣以及理論分析。
GlobalPointer
在之前的工作中,我們NER采用傳統的LSTM+CRF,在各個字段指標也取得不錯的效果,簡單字段類似學歷這種f1值均在95以上,復雜一點的比如行業專業等也在90以上;最終評估完全准確率(對一篇文檔,所有字段均抽取正確算對)85以上。而基於當前模型也沒有什么太好的優化方案,無非就是針對性補數據,后處理等等。基於此着手調研當前NER更好的方式,當然直接用BERT+CRF會取得比當前更好的效果,有不錯的提升,但性能問題卻很難解決,能做的就是對BERT進行蒸餾、剪枝,但其實效果並不能令人滿意。
偶然之間(必然)看到了蘇老師的GlobalPointer,遂進行了深入研究和探索,最終取得不錯的結果,借助蘇老師的模型,完全准去率從85上升到91,在cpu測試單挑耗時不到17ms,不得不說是性能和指標雙重達標。(注意:此處采用的BERT是四層的BERT,接用網上teacher-student訓練的四層模型結果來做的,完整的BERT完全准確率高達96,耗時未測,我偷懶了)
下面簡單介紹一下優雅與性能並存的GlobalPointer是怎么回事!!!
利用全局歸一化思路進行實體識別,兼容了嵌套實體和非嵌套實體,設計理論比CRF更合理,訓練過程中也不需要想CRF一樣遞歸計算分母,預測的時候也不需要動態規划,完全並行,理想情況瞎時間復雜度\(\color{blue}{O(1)}\)。
\(\color{red}{Pointer\ Network 與 GlobalPointer區別}\)
- Pointer Network一般采用兩個模塊分別識別實體的首和尾,而GlobalPointer將首位是為一個整體去進行判斷,如上圖,因此更具有“全局觀”。
基本思路
假設我們要對一個文本長度為n的文本進行實體識別,而理論上我們識別的實體是連續的,並且最大長度可以為n,由此可以得出最大候選實體個數有\(\color{blue}{n(n+1)/2}\)個;問題就轉換為我們從這些候選中挑選出真實的實體,就變成了m個關系從候選中選k的多標簽分類問題。
這里可以發現一個問題就是復雜度為\(\color{blue}{O(n^2)}\),但這其實是空間上的復雜度,在時間上完全可以並行,可以降到\(\color{blue}{O(n)}\)。
數學形式
長度為n的t輸入經過編碼后得到向量序列\(\color{blue}{h_1,h_2,...h_n}\),通過變換\(\color{blue}{q_{i,\alpha}=w_{q,\alpha}h_i+b_{q,\alpha}}\)和\(\color{blue}{k_{i,\alpha}=w_{k,\alpha}h_i+b_{k,\alpha}}\),可以得到序列向量\(\color{blue}{[q_{1,\alpha},q_{2,\alpha},...,p_{n,\alpha}]}\)和\(\color{blue}{[k_{1,\alpha},k_{2,\alpha},...,k_{n,\alpha}]}\),是識別第\(\color{blue}{\alpha}\)種類型實體所用的向量序列。此時可以定義:
上面就是\(\color{blue}{\alpha}\)類型實體\(\color{blue}{t_{[i:j]}}\)從i到j的打分。這里可以看出,其實就是Multi-Head Attention的一個簡化版,少了V的相關運算。
位置編碼
理論上公式(1)已經足夠了,但實際訓練中由於預料不足表現往往差強人意,究其原因是少了一些相對位置信息,在蘇老師的實驗中,加不加相對位置信息,指標差距近30%以上。
沒有位置信息會導致如何呢?我們可以舉個簡單的例子,比如:北京巴拉巴拉上海巴拉拉吧廣東,假設我們識別地名,由於GlobalPointer對句子的長度以及位置信息都不敏感,那么就有可能出現北京巴拉巴拉上海識別為地點。但是有了職位信息就會解決這個問題,從而區分出真正的實體。
關於位置編碼一直想研究一下各種不同的位置編碼的區別以及優劣,但苦苦沒有開始,再次立個flag吧。下篇就寫它,是的,已經立完了。直接說蘇老師在里面用了RoPE旋轉式位置編碼,它其實就是一個變換矩陣\(\color{blue}{R_i}\),滿足\(\color{blue}{R_i^TR_j=R{j-i}}\),這樣應用到公式(1)的q,k中,得到如下:
這樣就顯式的往\(\color{blue}{s_\alpha(i,j)}\)里面注入了相對位置信息。
上述內容,從基本思路到數學形式、位置編碼就基本說完了GlobalPointer的原理及模型表示。下面說說優化。
損失函數
從上面可以看出,最終打分函數相當於\(\color{blue}{\alpha}\)個\(\color{blue}{n(n+1)/2}\)類個二分類問題,相當於對每個類型的實體候選有\(\color{blue}{n(n+1)/2}\)這么多個,每個候選相當於做一個二分類問題,很明顯,最后會存在嚴重的類別不平衡問題。
參考2《將“softmax+交叉熵”推廣到多標簽分類問題》,里面提到的方式就是單目標多分類的交叉熵的推廣,適合總數很大但目標標簽很少的場景。公式如下:
其中\(\color{blue}{P_\alpha}\)是該樣本的所有類型為\(\color{blue}{\alpha}\)的實體的收尾集和,\(\color{blue}{Q_\alpha}\)是該樣本所有非實體或者類型非\(\color{blue}{\alpha}\)的實體的收尾集和,注意我們只需要考慮\(\color{blue}{i\leq j}\)的組合,即:
而在解碼階段,所有滿足\(\color{blue}{s_\alpha(i,j)\gt0}\)的片段\(\color{blue}{t_{[i:j]}}\)都被視為類型\(\color{blue}{\alpha}\)的實體輸出。可以看出,解碼的過程是極其簡單的,並且充分並行下解碼效率就是\(\color{blue}{O(1)}\)!。
實驗結果
展示在CMeEE(嵌套任務)數據上的實驗結果。
| 驗證集F1 | 測試集F1 | 訓練速度 | 預測速度 | |
|---|---|---|---|---|
| CRF | 63.81% | 64.39% | 1x | 1x |
| GP | 64.84% | 65.98% | 1.52x | 1.13x |
與CRF對比[純copy]
假設序列標注標簽數為k,那么逐幀softmax和crf的區別在於:\(\color{red}{前者將序列標注堪稱n個k分類問題,后者將序列標注堪稱1個k^n分類問題}\)。這也說明了逐幀softmax和crf用於NER時的理論上的缺點。 逐幀softmax將序列標注看成是n個k分類問題,那是過於寬松了,因為某個位置上的標注標簽預測對了,不代表實體就能正確抽取出來了,起碼有一個片段的標簽都對了才算對;相反,CRF將序列標注看成是1個\(\color{blue}{k^n}\)分類問題,則又過於嚴格了,因為這意味着它要求所有實體都預測正確才算對,只對部分實體也不給分。雖然實際使用中我們用CRF也能出現部分正確的預測結果,但那只能說明模型本身的泛化能力好,CRF本身的設計確實包含了“全對才給分”的意思。
所以,CRF在理論上確實都存在不大合理的地方,而相比之下,GlobalPointer則更加貼近使用和評測場景:它本身就是以實體為單位的,並且它設計為一個“多標簽分類”問題,這樣它的損失函數和評價指標都是實體顆粒度的,哪怕只對一部分也得到了合理的打分。因此,哪怕在非嵌套NER場景,GlobalPointer能取得比CRF好也是“情理之中”的。

