今年,位元組AI-Lab與複旦大學合作提出了一種中文文本糾錯模型:Soft-Masked BERT[1].這項工作發表在了ACL 2020上,由于論文并沒有開源代碼,是以我将對這篇論文進行解讀與複現。
問題提出:
中文文本糾錯是一項挑戰性的任務,因為模型要想獲得令人滿意的解決方案,就必須具備人類水準的語言了解能力。比如:
- eg1 Wrong:埃及有金 子 塔。Correct: 埃及有金 字 塔。
- eg2 Wrong: 他的 求勝 欲很強,為了越獄在挖洞。 Correct: 他的求生欲很強,為了越獄在挖洞。
- eg3 Wrong: 他主動拉了姑娘的手, 心裡很 高心 。 Correct: 他主動拉了姑娘的手, 心裡很 高興 。
在Soft-Masked BERT被提出之前,最好的方法是先通過在句子的每個位置建立基于BERT的語言表示模型,再從候選字元清單中選擇一個字元進行修正。然而,BERT使用了mask的方式進行預訓練,沒有足夠的能力來檢測每個位置是否存在誤差(隻有15%的錯誤被找出),是以這種方法的精度不夠好。
Soft-Masked BERT解決方案:
使用兩個網絡模型,一個用于錯誤檢測;另一個基于BERT進行糾錯。
Soft-Masked BERT結構
- Detection Network
Detection Network通過雙向的GRU來實作:
輸入
(input embeddings)是包含每個字元的字嵌入(word embedding)、位置嵌入(position embedding)、段嵌入(segment embedding)三部分的相加的embedding.
輸出
是對應每個字元的0到1之間的機率标簽,該值越小表示對應字元錯誤的可能性越大.
那麼文本序列中的每一個字元的錯誤機率計算公式為:
其中
就是由Detection Network計算出的錯誤機率,
是sigmoid函數,W為全連接配接的權重矩陣,
為偏置項,
就是Bi-GRU最後一層的hidden state,具體為:
建構Detection_Network中的網絡層與執行個體化代碼:
#建構Detection_Network網絡層
- Soft Masking Connection
input embeddings
與使用Detection Network計算出的
權重求和後的結果在論文中叫做soft-masked embedding,
是以誤差率為權重的mask embeddings .下式中的
即代表第
個字元通過計算得到的soft-masked embedding.
不難看出,上個步驟中得到的
越小,則soft-masked embedding計算出的
越接近input embeddings 中的
,此字元錯誤的可能性也越小.
建構Soft Masking Connection層代碼
# 中文預訓練的Bert模型詞表,特殊符[MASK]在詞表中的索引都為103
- Correction Network
該層主要的結構就是Bert模型,其中有12個Encoder層,以整個序列作為輸入。每個block包含一個多頭部的self-attention操作,然後接一個前饋網絡:
取Bert模型中最後一層Encoder的所有隐藏狀态與input embeddings對應相加進行殘差連接配接(Residual Connection)得到殘差連接配接值
:
接着将殘差連接配接值
輸入到一個全連接配接層中,該全連接配接層會使用bert的hidden state将殘差連接配接值映成為與候選詞表維數相同的向量. 後面再跟一個softmax函數輸出字元
可以被糾正為候選字元
的機率:
# bert嵌入、encoder、池化、權重.
- 訓練
訓練資料是原始序列對和修正序列對組成的元組
建立訓練資料的是使用混淆表反複生成包含錯誤序列
的序列.
損失函數是由Detection Network的損失與Correction Network的損失函數線性相加構成:
系數
一般要取一個大于0.5的值,因為
是 Correction Network的損失函數前的線性組合系數,Correction Network的損失函數為多分類損失函數,分類任務明顯更難;而Detection Network的損失函數是二分類損失函數,任務明顯更簡單,這樣也會令整個Soft-Masked BERT模型的效果更好。
其中Detection Network與Correction Network的損失均為交叉熵損失,即:
實驗結果
論文中使用的資料集有3個:
- Chinese Spelling Check Task(CSC)資料集:選擇了其中《對外漢語測試》的作文部分(SIGHAN);
- News Title資料集:來自于今日頭條app中的文章的标題部分;
- 5 million news titles資料集:從一些中文新聞app中爬取,該資料集隻用來fine-tuning
其中公開資料集為Chinese Spelling Check Task資料集[2],包含1100個文本和461種錯誤(字元級别).
不同方法在CSC資料集上的表現對比
可以看出,在CSC資料集的測試中,Soft-Masked BERT模型的效果基本上都是比其他Baseline模型的效果要好。
而在Detection部分,HanSpeller++模型的精準率要高于Soft-Masked BERT模型的精準率,且Correction部分HanSpeller++模型的精準率也高于Soft-Masked BERT模型的精準率.
這是因為HanSpeller++模型中有許多人工添加的規則與特征,這些人工添加的規則與特征能在Detection部分過濾錯誤的識别,雖然這種人工規則與特征效果很好,但這種方式需要很多人工成本,而且泛化性也不好.
綜上,在SIGHAN資料集的測試集上,Soft-Masked BERT模型的效果是最優的。
此外作者還用實驗證明了:
- fine-tuning的資料集(在5 million news titles資料集上)的規模越大,fine-tuning之後的模型在CSC任務中的效果也會越好;
- 消融對比研究,證明該提出的模型每一部分都是不可或缺的.
關于以上内容:
完整代碼以及更詳細的注釋(一行代碼三行注釋)已上傳到github:wanglke/Soft-Masked-BERT
其中代碼中用到的bert中文訓練模型與config檔案可以通過以下連結下載下傳:
config檔案下載下傳:https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-config.json
bert中文預訓練模型:https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-pytorch_model.bin
遺憾的是該論文的作者并沒有對該論文中的算法進行開源,有對中文文本糾錯感興趣的小夥伴可以使用這個開源的中文糾錯工具PYcorrector[3]:
pycorrectorgithub.com
它不僅安裝簡單,同時支援加載自定義混淆集、英文拼寫糾錯,也支援加載kenlm、rnn_crf、seq2seq、BERT等各種模型。可以結合具體領域的fineturn,是一款可應用在工業級的中文糾錯軟體,可以滿足大部分場景中的文本糾錯需求.
問題探讨
那麼中文糾錯對下遊NLP任務有沒有影響?,在這裡我就使用PYcorrector做了一個小實驗,在一個文本分類任務中,我使用的資料集來自電商評論,其中有部分的錯誤
但在使用PYcorrector的時候,我發現PYcorrector确實能找出部分文本中的錯誤:
原句
但更多的是False Positive,比如以下:
原句
有這種結果是因為:
- 我使用預設的kenlm統計語言模型,要比深度學習模型要差;
- 更重要的是我使用的是單品類商品的評價文本,而且沒有使用自己的資料做fine-tune,之後再使用通用型的 糾錯模型糾錯就會使模型"水土不服".
我把該部分資料在糾錯前和糾錯後以及分别放在相同的模型中(ALBERT+TextCNN[4])進行實驗,得到如下的對比結果:
效果意料之中的變差了,雖然是次失敗的嘗試,但起碼證明了效果差的糾錯會對NLP下遊任務造成負面影響。
後續我将會繼續探讨糾錯任務對下遊NLP任務的影響,主要考慮使用深度學習模型在專門的語料上訓練針對性模型
參考
- ^[1] https://arxiv.org/pdf/2005.07421.pdf
- ^http://ir.itc.ntnu.edu.tw/lre/sighan7csc.html
- ^https://github.com/shibing624/pycorrector
- ^https://zhuanlan.zhihu.com/p/164873441