【NLP】中文BERT上分新技巧,多粒度信息来帮忙
文 | ????????????????
自然語言處理實在是太難啦!中文尤其難!
相比于英文,中文是以詞作為語義的基本單位的,因此傳統的中文 NLP 都需要先進行分詞。分詞這步就勸退了很多人,比如“研究生活很充實”,怎么讓模型分出“研究|生活”,而不是“研究生”呢?
隨著預訓練模型的到來,中文模型通常直接用字作為輸入。甚至 19 年的一篇 ACL[1] 給出結論:基于“字”的模型要好于基于“詞”的模型。但是,中文是以詞作為語義的基本單位的呀,忽略這種粗粒度的信息,真的合理嗎?
今天這篇發表在 NAACL 2021 的文章就讓 BERT 在預訓練中學到了字和詞的信息,在自然語言理解的多個任務上,相對字級別的模型取得了性能提升,輕松摘得 SOTA。以后做中文任務想要刷分,可以直接拿來換掉自己的 BERT。
這篇文章為了讓 BERT 學到字和詞的信息,解決了三個問題:
怎么將字和詞的信息融合,送入 BERT?
字和詞有重疊,位置編碼怎么設計?
在 MLM 任務上,怎么才能同時將字和詞的信息都 mask 掉?
下面就來看看這篇文章的解決辦法吧~
論文題目:
Lattice-BERT: Leveraging Multi-Granularity Representations in Chinese Pre-trained Language Models
論文鏈接:
http://arxiv-download.xixiaoyao.cn/pdf/2104.07204v1.pdf
代碼地址:
https://github.com/alibaba/AliceMind/tree/main/LatticeBERT
方法
詞格輸入
為了解決問題 1,本文是將詞格(word lattice)輸入 BERT。
中文的詞格圖(lattice graph)是一個有向無環圖,包含了句子里字和詞的所有信息。以“研究生活很充實”這句話為例,詞格如下圖所示:
讀到這里可能會有人疑惑了:BERT 只能處理序列呀?這樣的有向無環圖該怎么被 BERT 處理呢?簡單!這篇文章直接將詞格圖中各粒度的信息“拍平”,得到一個線性序列,作為 BERT 的輸入。其中的每一項無論是字還是詞,我們都稱為 token:
詞格注意力機制
“拍平”詞格的輸入,就會造成不可避免的重復和冗余,那么對于位置編碼,該怎么適應呢?另外,在“拍平”之后,原先二維的復雜圖結構信息就會有所損失,怎樣避免圖結構的損失呢?為了解決問題 2,這篇文章又設計了新的詞格注意力機制。
對于字級別的 BERT,計算 attention map 可以表達為兩個字向量的內積:
其中 分別是第 和 個字在第 層的表示。字級別 BERT 中,位置編碼是在輸入時,直接加到字的表示中的:
然而,很多工作 [2] 表明,這種在輸入中混合位置編碼的方式比較粗糙。在計算 attention map 時,將位置編碼與字的表示解耦,專門設計一個位置編碼的函數,會是一個更好的選擇:
這里 就是關于 兩個字的位置編碼的函數。本文也采取了這一類方法。具體地,attention map 可以通過四項相加的方式得到:
第一項是字的表示得到的 attention score,后面三項都是與位置編碼相關的,下面我就來一一介紹~
絕對位置編碼
絕對位置編碼表示了 token 在句子中的位置。式子里的 表示當前輸入 token 的開始位置, 表示結束的位置。這個式子就表示將 token 的起始位置的絕對位置編碼拼接,進行 attention 操作。
這一項可以說是對原始 BERT 中的位置編碼的復刻,并適應了詞格的輸入。因為詞格輸入的每一項長度是不固定的,引入頭尾位置也是自然的想法。
然而,絕對位置編碼是有缺陷的:在理論上,我們對絕對位置編碼的限制只有一點,即不同位置的編碼不同。但這樣就忽略了很多信息,比如,位置 1 和 2 的距離與位置 5 和 6 的距離應該一樣,位置 1 和 3 的距離比位置 4 和 10 的距離要小,等等。在絕對位置編碼的設計里,我們只能讓 BERT 隱式地“學習”。
相對位置編碼
因此,這篇文章也引入了相對位置編碼,來表示 token 之間的相對距離。式子右邊每一項都代表兩個 token 的起始位置之間的相對距離,例如, 表示兩個 token 的起始位置之間的相對距離 的表示。引入了相對位置編碼,模型就可以建模更長的文本。
層疊關系編碼
表示兩個 token 之間的層疊關系。根據這兩個 token 起始相對位置的不同,兩個 token 可以分成下列七種關系:
具體來說,這七種關系為:
自身
在左邊,且無重疊
在左邊,且有重疊
包含關系
被包含關系
在右邊,且有重疊
在右邊,且無重疊
將 token 之間的關系分成以上七種,就可以顯式地表示詞格圖中的復雜的二維關系。之前“拍平”詞格圖時削弱的信息,在這里又找回來了。
預訓練任務:整段預測
最后一個問題:原來的 MLM 任務在詞格輸入的形式上,似乎并不適用。
還是用“研究生活很充實”來舉個例子。這句話的詞格輸入將是這樣:
研 究 生 活 研究 研究生 生活 很 充 實 充實
詞格的輸入帶來了冗余,在 MLM 任務中,我們隨機 mask 掉一些 token,是希望通過其上下文預測這些 token。但是在詞格輸入里,比如我們隨機 mask 掉了“研究”,但是模型會直接通過前面的“研”“究”和后面的“研究生”來預測這個 mask token,這樣走捷徑,最終一定得不到好結果。
于是,這篇文章設計了整段預測任務(masked segment prediction):在詞格圖中,一句話將被切成多個段(segment),每個段之間不會有重疊的 token,同時也要使段的長度最小。“研究生活很充實”這句話就可以切成下圖的三段:
在整段預測任務中,直接 mask 掉一段里的所有 token,并預測這些 token。這樣就可以避免輸入的冗余讓模型“作弊”。
實驗
這篇文章使用句子里所有可能的詞來構建詞格圖,這樣盡管會帶來錯誤的分詞,但是讓模型自己學習降噪,還能提升模型的魯棒性。
這篇文章在 11 個任務上進行了實驗,11 個任務包括:
6 個文本分類任務:長文本分類、短文本分類、關鍵詞提取、指代消解、自然語言推斷和文本匹配;
2 個序列標注任務:分詞和命名實體識別;
3 個問答任務:機器閱讀理解(答案段選取)、選擇題、完形填空。
總體性能如下圖所示:
其中,RoBERTa 是哈工大的 roberta-base-wwm-ext;NEZHA 是最好的字級別中文預訓練模型,來自華為諾亞方舟研究院;AMBERT 是曾經多粒度中文預訓練模型的 SOTA,是字節跳動李航組的工作;BERT-word 是使用詞作為輸入的 BERT;LBERT 是本文的方法;BERT-our 是本文使用相同語料重新預訓練的 BERT。
可以發現,LBERT 優于所有字級別的預訓練模型,并在 7/11 個任務上取得 SOTA。
LBERT 在哪里強于字級別的 BERT 呢?作者對預測結果進行分析,得到如下結論:
在短文本分類任務上,LBERT 在更短的樣本上有更大的性能提升,作者認為,詞格輸入的冗余信息為短文本提供了更豐富的語義信息;
在關鍵詞提取任務上,LBERT 在詞級別的關鍵詞上性能提升更高,作者認為 LBERT 從詞格輸入中,理解了關鍵詞的語義;
在命名實體識別任務上,LBERT 在重疊實體的樣本上減少了 25% 的錯誤,這是詞格輸入帶來的天然優勢;
LBERT 是怎么運用多粒度的信息呢?作者對注意力分數進行了可視化,還用“研究生活很充實”這句話為例:
圖中的三行分別為:
在預訓練結束后,模型會關注句子的各個部分;
在命名實體識別任務上 fine-tune 之后,模型更關注“研究”“生活”“很”“充實”,這與正確的分詞結果是一致的,對命名實體識別任務也是非常關鍵;錯誤分詞的“研究生”就沒有得到注意力;
在文本分類任務上 fine-tune 之后,模型更關注“研究生”“生活”“充實”,盡管這些詞不能在一套分詞中同時存在,但是對分類都是有用的。
總結
這篇文章解決了三個問題:
怎么輸入?使用詞格(lattice)作為 BERT 的輸入;
位置編碼?設計了詞格注意力機制(lattice position attention),使模型真正習得詞格整張圖的信息;
MLM?設計了整段掩碼預測任務(masked segment prediction),避免模型從詞格的多粒度輸入中使用捷徑。
這樣一來,就能在 BERT 中融合字和詞信息,也在多個任務上拿到 SOTA。
另外,這種詞格的輸入看上去也是優點多多:對于短文本的任務,詞格輸入可以作為一種信息的增強;對于和詞相關的任務,輸入的詞能讓模型更好的理解語義;對于抽取的任務,詞格能幫助定位抽取的邊界。
這里還延伸出一個問題:英文是不是也可以利用多粒度的信息呢?中文的預訓練模型可以使用字和詞的信息,相似地,英文就可以使用 subword 和 word 信息,這樣是不是有效呢?
萌屋作者:????????????????
在北大讀研,目前做信息抽取,對低資源、圖網絡都非常感興趣。希望大家在賣萌屋玩得開心 ヾ(=・ω・=)o
作品推薦
老板讓我用少量樣本 finetune 模型,我還有救嗎?急急急,在線等!
谷歌:CNN擊敗Transformer,有望成為預訓練界新霸主!LeCun卻沉默了...
總結
以上是生活随笔為你收集整理的【NLP】中文BERT上分新技巧,多粒度信息来帮忙的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows7系统电脑管理员权限怎么更
- 下一篇: 【面试相关】非计算机专业如何1年内自学拿