從字到詞,大詞典中文BERT模型的探索之旅

腾讯技术工程發表於2019-06-27

導語: BERT模型自誕生以來統治了各項NLP任務的榜單,谷歌也針對中文給出了基於字的模型。然而我們知道詞是語言最重要的組成部分,因此,一個自然的想法就是做基於詞的BERT模型。但是受限於視訊記憶體,谷歌原生的BERT模型可以使用的詞典比較小,只能覆蓋一小部分的漢語的詞。在本文中,我們提出了對BERT的一些改進,將中文BERT詞模型的詞典大小進行了大幅擴充,並在多個下游任務上測試了大詞典BERT的表現。此外,我們嘗試了一種針對上下文相關詞向量的最近鄰檢索方法,基於BERT的詞向量做以詞搜詞任務,相對於上下文無關詞向量在效果上有著明顯的提升。


1. 做大詞典BERT詞模型的意義

詞是語言最重要的組成部分。谷歌釋出基於字的BERT[1]模型之後,一個很自然的想法就是將詞的資訊引入到模型之中。詞在漢語中扮演了非常重要的詞是語言最重要的組成部分。谷歌釋出基於字的BERT[1]模型之後,一個很自然的想法就是將詞的資訊引入到模型之中。詞在漢語中扮演了非常重要的角色。很多詞所表達的含義與其包括的字的含義沒有直接聯絡,比如音譯詞“巧克力”、“聖代”。

最近有一些工作嘗試將詞的資訊引入到BERT中去。百度的ERNIE通過遮罩策略將詞的資訊引入到模型之中,但是其本質仍然是基於字的模型[2]。另外一種方式是對語料進行分詞,直接訓練基於詞的中文BERT模型。不過由於中文詞典很大,在谷歌BERT上使用大詞典會導致視訊記憶體溢位。使用小詞典的話會導致大量的OOV。為了減緩OOV的影響,我們需要擴大詞典。

因此本文引入了一些語言模型訓練的技術,提出了訓練大詞典BERT模型的方法。大詞典能提升詞語的覆蓋度,減緩未登入詞(OOV)問題[3]。不過雖然大詞典能夠減緩OOV,但是相比於字模型,仍然存在一定比例的OOV,會受到OOV的影響。此外,訓練基於詞的BERT模型能夠得到高質量的上下文相關詞向量。這些向量可以用於各種應用和下游任務之中。

2. 大詞典BERT簡介

在谷歌原來的BERT模型中,embedding 層和softmax 層的引數數量隨著詞典大小呈線性變化。如果在BERT-base模型上使用50萬大小的詞典,那麼embedding層和softmax層會包含500000*768+768*500000=7.68億個引數。要知道BERT-base的編碼器層(12層transformer)也僅僅包含8500萬個引數。因此,直接在BERT上使用大詞典會造成視訊記憶體溢位。實際上,對於BERT-base模型(在P40型號的GPU上,batch size為32),當句子長度為128的時候,最多支援16萬的詞典大小,當句子長度為192的時候,只能支援8萬的詞典大小。

在下面的章節中,我們針對embedding 層和softmax 層進行優化。對softmax層優化後詞典可以達到五十萬大小,對softmax層和embedding層同時優化可以把詞典擴大到100萬大小。

從字到詞,大詞典中文BERT模型的探索之旅


3. Adaptive Softma

對softmax層的優化一直是自然語言處理領域研究的重點。這個方向的研究很多,常用的技術包括基於取樣的方法[4],基於樹的方法[5]等等。這裡我們使用facebook提出的adaptive softmax[6]進行優化。之所以選擇adaptive softmax,一方面是因為其是針對GPU進行的優化。我們在多機多GPU上進行預訓練,使用adaptive softmax能幫助我們在效率上得到顯著的提升。另一方面,adaptive softmax可以節約視訊記憶體,這是我們引入大詞典的關鍵。下面簡要介紹adaptive softmax的原理。

從字到詞,大詞典中文BERT模型的探索之旅如上圖所示,如果我們將詞典分成三個部分,那麼adaptivesoftmax則由三個前向神經網路構成,我們分別稱之為head、tail1、tail2。第一個詞典會鏈到第二和第三個詞典。我們根據詞頻對詞語進行排序,令head前向神經網路去預測高頻詞語;tail1去預測中間頻率的詞語;tail2去預測低頻詞語。

因為高頻詞佔據了語料中絕大部分的頻數(Zipf’s Law),所以在大多數情況下,我們只需要用head這個規模較小的前向神經網路去做預測,這很大程度上減少了計算量。當遇到低頻詞的時候(比如上圖中的“二氧化碳”),模型先使用head去預測,發現“tail2”的概率值最大,這表明需要繼續使用tail2前向神經網路去預測。然後我們得到tail2前向神經網路對於“二氧化碳”的預測值之後,讓其與head的“tail2”位置的概率值相乘,就能得到“二氧化碳”這個詞的預測概率。在具體實現中,tail1和tail2一般是兩層的前向神經網路,中間隱層維度設為一個較小的值,從而實減少模型的引數。下圖是PyTorch實現的一個adaptive softmax的示例。詞典大小為50萬。

從字到詞,大詞典中文BERT模型的探索之旅

可以看到,中間頻率的詞語的向量維度是192;低頻詞語的向量維度是48。相對於原來的引數量,adaptive softmax引數減少了500000*768-37502*768-62500*192-400000*48-768*768-192*768-48*768 = 323224320個,相當於原來引數量的84.2%。在使用adaptive softmax之後,詞典的規模可以從8萬擴充套件到50萬。50萬詞典已經可以覆蓋絕大部分常見詞,能有效的減少OOV的情況。

4. Adaptive Input

Softmax層一定程度上可以看作embedding層的映象。因此可以把softmax上的優化操作搬到embedding層。在今年的ICLR上facebook提出了adaptive input方法[7]。下面簡要介紹adaptive input的原理。

從字到詞,大詞典中文BERT模型的探索之旅如上圖所示,adaptive input對高頻詞使用較大的維度,對低頻詞使用較小的維度。更具體的,上圖把50萬詞語按照詞頻排好序,並分成三個部分:第一部分包括37500個高頻詞語,詞向量維度為768;第二部分包括62500箇中間頻率的詞語,詞向量維度為192;第三部分包括40萬個低頻詞語,詞向量維度為48。為了使維度可以統一到隱層維度,這裡引入了三個不同的前向神經網路,把不同維度的詞向量對映到相同的維度。經過計算,我們可以得到adaptive input 減少的引數量是500000*768-37500*768-62500*192-400000*48-768*768-192*768-48*768= 323225856,相當於原來的引數量的84.2%。當模型同時引入adaptive softmax和adaptive input的時候,詞典可以進一步擴充套件到100萬。

5. 動態詞典

谷歌BERT模型使用固定的詞典,即對不同的語料和下游任務,均只使用一個詞典。這對基於字的模型是合理的。因為中文字的數量有限,使用谷歌提供的大小為21128的詞典不會有OOV的問題。但是對於基於詞的BERT模型,使用固定詞典則會有嚴重的問題。下表展示了使用中文維基百科作為預訓練語料,在多個下游任務上的OOV詞語數量以及OOV詞語數量佔總詞典大小的百分比。其中第一列展示了不同下游任務資料集的名稱以及對應的詞典大小,第二、三、四列展示了不同大小的維基百科詞典與下游任務資料詞典相比較時的OOV在下游任務資料集的佔比。可以看到,大詞典有效的緩解了OOV的問題。但是即使詞典擴大到100萬,仍然有很多未登入詞

從字到詞,大詞典中文BERT模型的探索之旅因此,對於基於詞的BERT模型,無論是用新的語料進行疊加預訓練,還是針對下游任務進行微調,我們都需要生成新的詞典(動態詞典),並根據新的詞典去對預訓練模型的embedding層和softmax層進行調整。調整的方式如下圖所示(藍色表示根據預訓練模型的引數初始化,紅色表示隨機初始化)。如果使用固定詞表,那麼詞語“人工智慧”會被對映到UNK,這個詞語無法在下游任務上進行訓練。對於加入adaptive機制的模型,調整的過程會增加一些步驟。後面實驗中基於詞的BERT模型均預設使用動態詞典。動態詞典相對於固定詞典在效果上有著顯著的提升。

從字到詞,大詞典中文BERT模型的探索之旅6. 基於BERT的以詞搜詞


本文的另一項工作是嘗試了一種上下文相關詞向量的最近鄰檢索方法。在傳統的詞向量工作中,每個詞對應一個固定的向量,我們稱其為上下文無關詞向量。對這類詞向量進行最近鄰檢索只需要計算詞向量之間的cos值,並根據cos值進行排序。對於上下文相關詞向量,詞向量不僅和詞語本身有關,還和詞語周圍的上下文有關。也就是語料中的每一個token(詞語的一次出現),都有一個獨有的向量。ELMO[8]為每個token計算一個向量,並利用token向量去尋找其它的token向量。ELMO是基於整個語料尋找token向量的最近鄰。這裡我們嘗試一種基於詞典的上下文相關詞向量檢索方法,具體步驟如下:假如我們需要查詢在句子“吉利汽車是中國汽車品牌”中詞語“吉利”的最近鄰(如下圖),我們首先把這句話輸入到BERT編碼器中,取最上層的詞語對應的隱層向量作為詞向量。然後我們把詞典中的所有詞語依次替換到“吉利”的位置,這樣就得到每個詞語在特定上下文中的向量。我們計算這些向量之間的cos值,即可得到詞語的最近鄰。

從字到詞,大詞典中文BERT模型的探索之旅我們還嘗試使用基於字的BERT模型進行以詞搜詞作為基於詞的模型的對比。具體步驟和基於詞的模型相似,只是在基於字的模型中,每一個字對應一個向量,因此一個詞會對應多個向量。我們對BERT編碼器最上層的字的隱層向量取平均,從而得到每個詞語在特定上下文中的向量。

使用上面介紹的方式進行以詞搜詞,相對於傳統的上下文無關詞向量,在多義詞的檢索效果上有著明顯的提升。下面給出幾個以詞搜詞的示例。給定一句話以及這句話中要檢索的詞語,返回這個詞語的最近鄰詞語以及相似度。

候選詞語:“吉利”

候選句子:2010年 6 月 2 日 福特汽車公司 宣佈 出售 旗下 高階 汽車 沃爾沃 予 中國 浙江省 的 吉利 汽車 , 同時將 於 2010 年 第四季 停止 旗下 中階 房車 品牌 所有 業務 , 並 將 其 資源 全數 轉移 至 高階車 品牌 林肯 , 2011 年 1 月 4 日 , 福特 汽車 正式 裁徹 品牌 。

從字到詞,大詞典中文BERT模型的探索之旅在這個例子中,“吉利”指一種汽車品牌。可以看到基於詞的模型的檢索效果不錯。其中“沃爾沃”、“金牛座”是汽車的品牌。“永利”、“天安”、“仁和”、“新光”均是公司名稱,並且這些公司均以一個比較吉利的詞語作為公司的名字。基於字的模型效果也不錯,會傾向於返回包含“吉”、“利”這兩個字的詞語。

候選詞語:“吉利”

候選句子:主要演員 有 扎克· 布拉 夫 、 薩拉 · 朝克 、 唐納德 · 費森 、 尼爾 · 弗林 、 肯 · 詹金斯 、 約翰 · 麥 吉利 、 朱迪 · 雷耶斯 、 邁克爾 · 莫斯利 等 。

從字到詞,大詞典中文BERT模型的探索之旅

在這個例子中,“吉利”指一個人名。可以看到基於字和基於詞的模型均通過上下文捕捉到了這裡的“吉利”是人名的資訊。基於字的模型返回的人名均包含“利”和“吉”。基於詞的模型返回的單詞則更加的多樣。

候選詞語:“吉利”

候選句子:他 出生 時 身上附有 胎膜 , 其母 認為 這是 一個 吉利 的 徵兆 。

從字到詞,大詞典中文BERT模型的探索之旅

在這個例子中,“吉利”指這個單詞的本義。可以看到基於字和基於詞的模型均表現不錯。基於字的模型返回的單詞大多包含“吉”、“利”兩字。基於詞的模型除了會返回和“吉利”意思相近的詞,比如“仁德”、“光彩”、“愉快”,還會返回“食用油”、“玉”這樣的名詞。這些名字放在原句中比較合適。

候選詞語:“蘋果”

候選句子: 另外 , 劉德華亦 堅持 每天 喝 一點 混合 果汁 , 比如 蘋果 加 紅蘿蔔 一起 榨 的 汁 , 以 保持 自身 的 健康 。

從字到詞,大詞典中文BERT模型的探索之旅

在這個例子中,“蘋果”指水果。兩種模型效果均不錯。基於字的模型傾向返回包含“果”的詞。

候選詞語:“蘋果”

候選句子:蘋果 削減 了 臺式 Mac 產品線 上 的 眾多 產品

從字到詞,大詞典中文BERT模型的探索之旅


在這個例子中,“蘋果”指科技公司。基於詞的模型效果不錯。但是基於字的模型效果一般,雖然也在topn列表中返回了“谷歌”、“微軟”,但是前面幾個單詞均是包含“果”的詞語。

候選詞語:騰訊

候選句子:馬化騰於 1984 年 隨 家人 從 海南 移居 深圳 , 14 年後 的 1998 年 11 月 , 他 和 其他 四位 聯合創始人一起 創立 騰訊

在這個例子中,我們可以看到基於詞的模型返回的均是網際網路公司或者相關的內容。基於字的模型也會返回和網際網路公司相關的單詞,比如“微信”、“百度”,但是也會返回一些包含“騰”的詞語。這些詞語和網際網路公司關係較弱。

通過上面的定性分析,我們可以看到使用基於字的BERT模型做詞的檢索有一定的侷限性。基於字的模型的詞向量會受到字向量的影響,傾向於返回包含相同字的詞語。基於詞的模型效果較好,能對多義詞進行高質量的檢索。

上面使用的檢索方法效率較低。假如詞典大小為2萬,那麼進行一次檢索,需要通過BERT編碼器2萬次。如果不加以優化,檢索一次的時間需要十幾秒以上。目前我們正在進行優化。我們發現合理的減少編碼器的層數和attention head的個數,可以在大幅度提升效率的同時,對檢索結果質量產生較小的影響。目前,我們對2萬詞語進行檢索,時間可以控制在3秒以內,並能得到較高質量的檢索結果。在這個方向上還有很多的優化點,後續我們會進一步探索如何提升檢索效率。

7. 實驗

和Google BERT一樣,我們使用中文維基百科作為語料進行預訓練。對於語料中的中文,我們使用jieba預設模式進行分詞;對於語料中的英文等其它語言,我們使用和Google相同的分詞策略。所有的模型均訓練50萬步;學習率是1e-4(warmuplinear策略,warmup設為0.01);優化器為BERT預設的AdamW;batchsize為256;序列長度為192。我們使用一個百科詞條作為一個文件。文件中根據“。”、“!”、“?”進行分句。目前我們有8萬詞典和50萬詞典的模型,100萬詞典的模型正在訓練當中。我們和Google BERT預訓練使用的策略基本一樣。只是受限於資源,我們的seq_length和訓練步數小於Google的預訓練模型。

7.1 詞模型在下游任務的表現

我們用5個公開的中文下游任務資料集來對基於詞的BERT模型進行評估。LCQMC是哈工大發布的問題匹配資料集[10];Book review是北師大發布的書評情感分類資料集[11]。Chnsenticorp是百度給出的評論情感分析資料集[2];Shopping是評論資料集;XNLI 是句子關係推理資料集[12]。

下表展示了基於詞的BERT模型在5個公開資料集上的表現。評價指標是不同任務上的分類的準確率驗證集/測試集)。可以看到,詞模型在Chnsenticorp以及Shopping資料集上與字模型表現相當,在其他資料集上與字模型相比還有差距。 

另外,我們還對基於8萬詞典和50萬詞典的BERT模型進行了對比。大詞典較大幅度的降低了OOV的情況,50萬詞典的詞模型在四個資料集上的表現都顯著優於8萬詞典的詞模型。

從字到詞,大詞典中文BERT模型的探索之旅

7.2 詞模型在內部情感分類資料集上的表現

下表展示的是在內部情感分類資料集的結果,與上面測試集不同之處在於,這個測試集以及預訓練的詞模型的資料集都是同源的,另外由於大詞表的情感分類詞模型還沒有訓練出來,這個詞模型是一個小詞典的詞模型,可以看出,詞模型的表現比字模型的表現略好一些。

從字到詞,大詞典中文BERT模型的探索之旅

7.3 動態詞表的有效性

下表展示了使用固定詞典和動態詞典的模型在書評分類資料集上的效果。不管是使用隨機初始化還是預訓練模型初始化,動態詞典的效果都要顯著的好於固定詞典。說明動態詞表對於詞模型去初始化下游任務模型確實非常有用。

從字到詞,大詞典中文BERT模型的探索之旅

7.4 對於實驗結果的分析

詞模型在公開資料集的表現遜於字模型,我們是不是可以得到詞模型一定差於字模型的結論?我們認為答案是否定的。根據內部情感分類詞模型的分類結果就可以看出來,詞模型還是表現不錯。

在公開資料集表現不好,我們認為如下幾方面原因,第一是由於OOV的問題,根據上面對於OOV的統計結果,即使詞典擴充套件至100萬,也在下游的資料上存在較多OOV的情況,後面雖然加了動態詞典,但是這部分新加入的詞語向量沒有經過預訓練。如果預訓練語料和下游任務資料集有相似的來源,會一定程度上減緩這個問題。第二是因為詞相對於字更加的稀疏(有些詞的頻率很低),我們使用的預訓練語料(中文維基百科)規模較小,這導致對一些詞的訓練並不充分。在更大規模,更多樣的語料上進行預訓練有機會帶來更好的效果[9]。

此外,詞模型在一些資料集表現比較差還有一些其他原因,比如在書評資料集上,測試集包含25988個詞語,其中9525個詞語不在訓練集中。我們認為這是導致在書評資料集上基於詞的模型不如基於字的模型的重要的因素,更合適的分詞策略(例如細粒度分詞)會一定程度上減緩這個問題。

總結
在本文中我們介紹瞭如何通過改進BERT的softmax層和embedding層來擴充中文詞模型的詞典規模,從而減緩未登入詞的問題。此外,在訓練好的基於詞的BERT模型的基礎上,我們給出了一種針對上下文相關詞向量進行檢索的方法, 展示了使用BERT詞向量進行以詞搜詞的效果。

參考資料:

  1. Devlin J, Chang M W, Lee     K, et al. Bert: Pre-training of deep bidirectional transformers for     language understanding[J]. NAACL 2019.

  2. https://github.com/PaddlePaddle/LARK/tree/develop/ERNIE

  3. Yan Song, Shuming Shi,     Jing Li, and Haisong Zhang. Directional Skip-Gram: Explicitly     Distinguishing Left and Right Context for Word Embeddings. NAACL 2018.

  4. Bengio Y, Ducharme R,     Vincent P, et al. A neural probabilistic language model[J]. JMLR, 2003.

  5. Tomas Mikolov, Ilya     Sutskever, Kai Chen, Gregory S. Corrado, and Jeffrey Dean:Distributed     Representations of Words and Phrases and their Compositionality. NIPS     2013.

  6. Edouard Grave , Armand     Joulin, Moustapha Cisse, David Grangierd, Herve Jegou et al. Efficient     softmax approximation for GPUs, ICML 2016.

  7. Alexei Baevski , Michael     Auli. Adaptive Input Representations for Neural Language Modeling. ICLR     2019.

  8. Peters, Matthew E., et     al. Deep contextualized word representations. NAACL 2018.

  9. https://github.com/dbiir/UER-py

  10. Liu, X., Chen, Q., Deng,     C. , et al. LCQMC: A Large-scale Chinese Question Matching Corpus. COLING     2018.

  11. Qiu Y, Li H, Li S, et     al. Revisiting Correlations between Intrinsic and Extrinsic Evaluations of     Word Embeddings. CCL & NLP-NABD.

  12. https://github.com/facebookresearch/XNLI

相關文章