从字到词,大词典中文BERT模型的探索之旅
導(dǎo)語: BERT模型自誕生以來統(tǒng)治了各項NLP任務(wù)的榜單,谷歌也針對中文給出了基于字的模型。然而我們知道詞是語言最重要的組成部分,因此,一個自然的想法就是做基于詞的BERT模型。但是受限于顯存,谷歌原生的BERT模型可以使用的詞典比較小,只能覆蓋一小部分的漢語的詞。在本文中,我們提出了對BERT的一些改進,將中文BERT詞模型的詞典大小進行了大幅擴充,并在多個下游任務(wù)上測試了大詞典BERT的表現(xiàn)。此外,我們嘗試了一種針對上下文相關(guān)詞向量的最近鄰檢索方法,基于BERT的詞向量做以詞搜詞任務(wù),相對于上下文無關(guān)詞向量在效果上有著明顯的提升。
1. 做大詞典BERT詞模型的意義
詞是語言最重要的組成部分。谷歌發(fā)布基于字的BERT[1]模型之后,一個很自然的想法就是將詞的信息引入到模型之中。詞在漢語中扮演了非常重要的詞是語言最重要的組成部分。谷歌發(fā)布基于字的BERT[1]模型之后,一個很自然的想法就是將詞的信息引入到模型之中。詞在漢語中扮演了非常重要的角色。很多詞所表達的含義與其包括的字的含義沒有直接聯(lián)系,比如音譯詞“巧克力”、“圣代”。
最近有一些工作嘗試將詞的信息引入到BERT中去。百度的ERNIE通過遮罩策略將詞的信息引入到模型之中,但是其本質(zhì)仍然是基于字的模型[2]。另外一種方式是對語料進行分詞,直接訓(xùn)練基于詞的中文BERT模型。不過由于中文詞典很大,在谷歌BERT上使用大詞典會導(dǎo)致顯存溢出。使用小詞典的話會導(dǎo)致大量的OOV。為了減緩OOV的影響,我們需要擴大詞典。
因此本文引入了一些語言模型訓(xùn)練的技術(shù),提出了訓(xùn)練大詞典BERT模型的方法。大詞典能提升詞語的覆蓋度,減緩未登錄詞(OOV)問題[3]。不過雖然大詞典能夠減緩OOV,但是相比于字模型,仍然存在一定比例的OOV,會受到OOV的影響。此外,訓(xùn)練基于詞的BERT模型能夠得到高質(zhì)量的上下文相關(guān)詞向量。這些向量可以用于各種應(yīng)用和下游任務(wù)之中。
在谷歌原來的BERT模型中,embedding 層和softmax 層的參數(shù)數(shù)量隨著詞典大小呈線性變化。如果在BERT-base模型上使用50萬大小的詞典,那么embedding層和softmax層會包含500000*768+768*500000=7.68億個參數(shù)。要知道BERT-base的編碼器層(12層transformer)也僅僅包含8500萬個參數(shù)。因此,直接在BERT上使用大詞典會造成顯存溢出。實際上,對于BERT-base模型(在P40型號的GPU上,batch size為32),當句子長度為128的時候,最多支持16萬的詞典大小,當句子長度為192的時候,只能支持8萬的詞典大小。
在下面的章節(jié)中,我們針對embedding 層和softmax 層進行優(yōu)化。對softmax層優(yōu)化后詞典可以達到五十萬大小,對softmax層和embedding層同時優(yōu)化可以把詞典擴大到100萬大小。
3. Adaptive Softmax
對softmax層的優(yōu)化一直是自然語言處理領(lǐng)域研究的重點。這個方向的研究很多,常用的技術(shù)包括基于采樣的方法[4],基于樹的方法[5]等等。這里我們使用facebook提出的adaptive softmax[6]進行優(yōu)化。之所以選擇adaptive softmax,一方面是因為其是針對GPU進行的優(yōu)化。我們在多機多GPU上進行預(yù)訓(xùn)練,使用adaptive softmax能幫助我們在效率上得到顯著的提升。另一方面,adaptive softmax可以節(jié)約顯存,這是我們引入大詞典的關(guān)鍵。下面簡要介紹adaptive softmax的原理。
如上圖所示,如果我們將詞典分成三個部分,那么adaptivesoftmax則由三個前向神經(jīng)網(wǎng)絡(luò)構(gòu)成,我們分別稱之為head、tail1、tail2。第一個詞典會鏈到第二和第三個詞典。我們根據(jù)詞頻對詞語進行排序,令head前向神經(jīng)網(wǎng)絡(luò)去預(yù)測高頻詞語;tail1去預(yù)測中間頻率的詞語;tail2去預(yù)測低頻詞語。
因為高頻詞占據(jù)了語料中絕大部分的頻數(shù)(Zipf’s Law),所以在大多數(shù)情況下,我們只需要用head這個規(guī)模較小的前向神經(jīng)網(wǎng)絡(luò)去做預(yù)測,這很大程度上減少了計算量。當遇到低頻詞的時候(比如上圖中的“二氧化碳”),模型先使用head去預(yù)測,發(fā)現(xiàn)“tail2”的概率值最大,這表明需要繼續(xù)使用tail2前向神經(jīng)網(wǎng)絡(luò)去預(yù)測。然后我們得到tail2前向神經(jīng)網(wǎng)絡(luò)對于“二氧化碳”的預(yù)測值之后,讓其與head的“tail2”位置的概率值相乘,就能得到“二氧化碳”這個詞的預(yù)測概率。在具體實現(xiàn)中,tail1和tail2一般是兩層的前向神經(jīng)網(wǎng)絡(luò),中間隱層維度設(shè)為一個較小的值,從而實減少模型的參數(shù)。下圖是PyTorch實現(xiàn)的一個adaptive softmax的示例。詞典大小為50萬。
可以看到,中間頻率的詞語的向量維度是192;低頻詞語的向量維度是48。相對于原來的參數(shù)量,adaptive softmax參數(shù)減少了500000*768-37502*768-62500*192-400000*48-768*768-192*768-48*768 = 323224320個,相當于原來參數(shù)量的84.2%。在使用adaptive softmax之后,詞典的規(guī)模可以從8萬擴展到50萬。50萬詞典已經(jīng)可以覆蓋絕大部分常見詞,能有效的減少OOV的情況。
4. Adaptive Input
Softmax層一定程度上可以看作embedding層的鏡像。因此可以把softmax上的優(yōu)化操作搬到embedding層。在今年的ICLR上facebook提出了adaptive input方法[7]。下面簡要介紹adaptive input的原理。
如上圖所示,adaptive input對高頻詞使用較大的維度,對低頻詞使用較小的維度。更具體的,上圖把50萬詞語按照詞頻排好序,并分成三個部分:第一部分包括37500個高頻詞語,詞向量維度為768;第二部分包括62500個中間頻率的詞語,詞向量維度為192;第三部分包括40萬個低頻詞語,詞向量維度為48。為了使維度可以統(tǒng)一到隱層維度,這里引入了三個不同的前向神經(jīng)網(wǎng)絡(luò),把不同維度的詞向量映射到相同的維度。經(jīng)過計算,我們可以得到adaptive input 減少的參數(shù)量是500000*768-37500*768-62500*192-400000*48-768*768-192*768-48*768= 323225856,相當于原來的參數(shù)量的84.2%。當模型同時引入adaptive softmax和adaptive input的時候,詞典可以進一步擴展到100萬。
5. 動態(tài)詞典
谷歌BERT模型使用固定的詞典,即對不同的語料和下游任務(wù),均只使用一個詞典。這對基于字的模型是合理的。因為中文字的數(shù)量有限,使用谷歌提供的大小為21128的詞典不會有OOV的問題。但是對于基于詞的BERT模型,使用固定詞典則會有嚴重的問題。下表展示了使用中文維基百科作為預(yù)訓(xùn)練語料,在多個下游任務(wù)上的OOV詞語數(shù)量以及OOV詞語數(shù)量占總詞典大小的百分比。其中第一列展示了不同下游任務(wù)數(shù)據(jù)集的名稱以及對應(yīng)的詞典大小,第二、三、四列展示了不同大小的維基百科詞典與下游任務(wù)數(shù)據(jù)詞典相比較時的OOV在下游任務(wù)數(shù)據(jù)集的占比。可以看到,大詞典有效的緩解了OOV的問題。但是即使詞典擴大到100萬,仍然有很多未登錄詞
因此,對于基于詞的BERT模型,無論是用新的語料進行疊加預(yù)訓(xùn)練,還是針對下游任務(wù)進行微調(diào),我們都需要生成新的詞典(動態(tài)詞典),并根據(jù)新的詞典去對預(yù)訓(xùn)練模型的embedding層和softmax層進行調(diào)整。調(diào)整的方式如下圖所示(藍色表示根據(jù)預(yù)訓(xùn)練模型的參數(shù)初始化,紅色表示隨機初始化)。如果使用固定詞表,那么詞語“人工智能”會被映射到UNK,這個詞語無法在下游任務(wù)上進行訓(xùn)練。對于加入adaptive機制的模型,調(diào)整的過程會增加一些步驟。后面實驗中基于詞的BERT模型均默認使用動態(tài)詞典。動態(tài)詞典相對于固定詞典在效果上有著顯著的提升。
6. 基于BERT的以詞搜詞
本文的另一項工作是嘗試了一種上下文相關(guān)詞向量的最近鄰檢索方法。在傳統(tǒng)的詞向量工作中,每個詞對應(yīng)一個固定的向量,我們稱其為上下文無關(guān)詞向量。對這類詞向量進行最近鄰檢索只需要計算詞向量之間的cos值,并根據(jù)cos值進行排序。對于上下文相關(guān)詞向量,詞向量不僅和詞語本身有關(guān),還和詞語周圍的上下文有關(guān)。也就是語料中的每一個token(詞語的一次出現(xiàn)),都有一個獨有的向量。ELMO[8]為每個token計算一個向量,并利用token向量去尋找其它的token向量。ELMO是基于整個語料尋找token向量的最近鄰。這里我們嘗試一種基于詞典的上下文相關(guān)詞向量檢索方法,具體步驟如下:假如我們需要查找在句子“吉利汽車是中國汽車品牌”中詞語“吉利”的最近鄰(如下圖),我們首先把這句話輸入到BERT編碼器中,取最上層的詞語對應(yīng)的隱層向量作為詞向量。然后我們把詞典中的所有詞語依次替換到“吉利”的位置,這樣就得到每個詞語在特定上下文中的向量。我們計算這些向量之間的cos值,即可得到詞語的最近鄰。
我們還嘗試使用基于字的BERT模型進行以詞搜詞作為基于詞的模型的對比。具體步驟和基于詞的模型相似,只是在基于字的模型中,每一個字對應(yīng)一個向量,因此一個詞會對應(yīng)多個向量。我們對BERT編碼器最上層的字的隱層向量取平均,從而得到每個詞語在特定上下文中的向量。
使用上面介紹的方式進行以詞搜詞,相對于傳統(tǒng)的上下文無關(guān)詞向量,在多義詞的檢索效果上有著明顯的提升。下面給出幾個以詞搜詞的示例。給定一句話以及這句話中要檢索的詞語,返回這個詞語的最近鄰詞語以及相似度。
候選詞語:“吉利”
候選句子:2010年 6 月 2 日 福特汽車公司 宣布 出售 旗下 高端 汽車 沃爾沃 予 中國 浙江省 的?吉利?汽車 , 同時將 于 2010 年 第四季 停止 旗下 中階 房車 品牌 所有 業(yè)務(wù) , 并 將 其 資源 全數(shù) 轉(zhuǎn)移 至 高級車 品牌 林肯 , 2011 年 1 月 4 日 , 福特 汽車 正式 裁徹 品牌 。
在這個例子中,“吉利”指一種汽車品牌。可以看到基于詞的模型的檢索效果不錯。其中“沃爾沃”、“金牛座”是汽車的品牌。“永利”、“天安”、“仁和”、“新光”均是公司名稱,并且這些公司均以一個比較吉利的詞語作為公司的名字。基于字的模型效果也不錯,會傾向于返回包含“吉”、“利”這兩個字的詞語。
候選詞語:“吉利”
候選句子:主要演員 有 扎克· 布拉 夫 、 薩拉 · 朝克 、 唐納德 · 費森 、 尼爾 · 弗林 、 肯 · 詹金斯 、 約翰 · 麥 吉利 、 朱迪 · 雷耶斯 、 邁克爾 · 莫斯利 等 。
在這個例子中,“吉利”指一個人名。可以看到基于字和基于詞的模型均通過上下文捕捉到了這里的“吉利”是人名的信息。基于字的模型返回的人名均包含“利”和“吉”。基于詞的模型返回的單詞則更加的多樣。
候選詞語:“吉利”
候選句子:他 出生 時 身上附有 胎膜 , 其母 認為 這是 一個?吉利?的 征兆 。
在這個例子中,“吉利”指這個單詞的本義。可以看到基于字和基于詞的模型均表現(xiàn)不錯。基于字的模型返回的單詞大多包含“吉”、“利”兩字。基于詞的模型除了會返回和“吉利”意思相近的詞,比如“仁德”、“光彩”、“愉快”,還會返回“食用油”、“玉”這樣的名詞。這些名字放在原句中比較合適。
候選詞語:“蘋果”
候選句子:?另外 , 劉德華亦 堅持 每天 喝 一點 混合 果汁 , 比如?蘋果?加 紅蘿卜 一起 榨 的 汁 , 以 保持 自身 的 健康 。
在這個例子中,“蘋果”指水果。兩種模型效果均不錯。基于字的模型傾向返回包含“果”的詞。
候選詞語:“蘋果”
候選句子:蘋果?削減 了 臺式 Mac 產(chǎn)品線 上 的 眾多 產(chǎn)品
在這個例子中,“蘋果”指科技公司。基于詞的模型效果不錯。但是基于字的模型效果一般,雖然也在topn列表中返回了“谷歌”、“微軟”,但是前面幾個單詞均是包含“果”的詞語。
候選詞語:“騰訊”
候選句子:馬化騰于 1984 年 隨 家人 從 海南 移居 深圳 , 14 年后 的 1998 年 11 月 , 他 和 其他 四位 聯(lián)合創(chuàng)始人一起 創(chuàng)立 騰訊 。
在這個例子中,我們可以看到基于詞的模型返回的均是互聯(lián)網(wǎng)公司或者相關(guān)的內(nèi)容。基于字的模型也會返回和互聯(lián)網(wǎng)公司相關(guān)的單詞,比如“微信”、“百度”,但是也會返回一些包含“騰”的詞語。這些詞語和互聯(lián)網(wǎng)公司關(guān)系較弱。
通過上面的定性分析,我們可以看到使用基于字的BERT模型做詞的檢索有一定的局限性。基于字的模型的詞向量會受到字向量的影響,傾向于返回包含相同字的詞語。基于詞的模型效果較好,能對多義詞進行高質(zhì)量的檢索。
上面使用的檢索方法效率較低。假如詞典大小為2萬,那么進行一次檢索,需要通過BERT編碼器2萬次。如果不加以優(yōu)化,檢索一次的時間需要十幾秒以上。目前我們正在進行優(yōu)化。我們發(fā)現(xiàn)合理的減少編碼器的層數(shù)和attention head的個數(shù),可以在大幅度提升效率的同時,對檢索結(jié)果質(zhì)量產(chǎn)生較小的影響。目前,我們對2萬詞語進行檢索,時間可以控制在3秒以內(nèi),并能得到較高質(zhì)量的檢索結(jié)果。在這個方向上還有很多的優(yōu)化點,后續(xù)我們會進一步探索如何提升檢索效率。
7. 實驗
和Google BERT一樣,我們使用中文維基百科作為語料進行預(yù)訓(xùn)練。對于語料中的中文,我們使用jieba默認模式進行分詞;對于語料中的英文等其它語言,我們使用和Google相同的分詞策略。所有的模型均訓(xùn)練50萬步;學(xué)習(xí)率是1e-4(warmuplinear策略,warmup設(shè)為0.01);優(yōu)化器為BERT默認的AdamW;batchsize為256;序列長度為192。我們使用一個百科詞條作為一個文檔。文檔中根據(jù)“。”、“!”、“?”進行分句。目前我們有8萬詞典和50萬詞典的模型,100萬詞典的模型正在訓(xùn)練當中。我們和Google BERT預(yù)訓(xùn)練使用的策略基本一樣。只是受限于資源,我們的seq_length和訓(xùn)練步數(shù)小于Google的預(yù)訓(xùn)練模型。
7.1 詞模型在下游任務(wù)的表現(xiàn)
我們用5個公開的中文下游任務(wù)數(shù)據(jù)集來對基于詞的BERT模型進行評估。LCQMC是哈工大發(fā)布的問題匹配數(shù)據(jù)集[10];Book review是北師大發(fā)布的書評情感分類數(shù)據(jù)集[11]。Chnsenticorp是百度給出的評論情感分析數(shù)據(jù)集[2];Shopping是評論數(shù)據(jù)集;XNLI 是句子關(guān)系推理數(shù)據(jù)集[12]。
下表展示了基于詞的BERT模型在5個公開數(shù)據(jù)集上的表現(xiàn)。評價指標是不同任務(wù)上的分類的準確率(驗證集/測試集)。可以看到,詞模型在Chnsenticorp以及Shopping數(shù)據(jù)集上與字模型表現(xiàn)相當,在其他數(shù)據(jù)集上與字模型相比還有差距。?
另外,我們還對基于8萬詞典和50萬詞典的BERT模型進行了對比。大詞典較大幅度的降低了OOV的情況,50萬詞典的詞模型在四個數(shù)據(jù)集上的表現(xiàn)都顯著優(yōu)于8萬詞典的詞模型。
7.2 詞模型在內(nèi)部情感分類數(shù)據(jù)集上的表現(xiàn)
下表展示的是在內(nèi)部情感分類數(shù)據(jù)集的結(jié)果,與上面測試集不同之處在于,這個測試集以及預(yù)訓(xùn)練的詞模型的數(shù)據(jù)集都是同源的,另外由于大詞表的情感分類詞模型還沒有訓(xùn)練出來,這個詞模型是一個小詞典的詞模型,可以看出,詞模型的表現(xiàn)比字模型的表現(xiàn)略好一些。
7.3 動態(tài)詞表的有效性
下表展示了使用固定詞典和動態(tài)詞典的模型在書評分類數(shù)據(jù)集上的效果。不管是使用隨機初始化還是預(yù)訓(xùn)練模型初始化,動態(tài)詞典的效果都要顯著的好于固定詞典。說明動態(tài)詞表對于詞模型去初始化下游任務(wù)模型確實非常有用。
7.4 對于實驗結(jié)果的分析
詞模型在公開數(shù)據(jù)集的表現(xiàn)遜于字模型,我們是不是可以得到詞模型一定差于字模型的結(jié)論?我們認為答案是否定的。根據(jù)內(nèi)部情感分類詞模型的分類結(jié)果就可以看出來,詞模型還是表現(xiàn)不錯。
在公開數(shù)據(jù)集表現(xiàn)不好,我們認為如下幾方面原因,第一是由于OOV的問題,根據(jù)上面對于OOV的統(tǒng)計結(jié)果,即使詞典擴展至100萬,也在下游的數(shù)據(jù)上存在較多OOV的情況,后面雖然加了動態(tài)詞典,但是這部分新加入的詞語向量沒有經(jīng)過預(yù)訓(xùn)練。如果預(yù)訓(xùn)練語料和下游任務(wù)數(shù)據(jù)集有相似的來源,會一定程度上減緩這個問題。第二是因為詞相對于字更加的稀疏(有些詞的頻率很低),我們使用的預(yù)訓(xùn)練語料(中文維基百科)規(guī)模較小,這導(dǎo)致對一些詞的訓(xùn)練并不充分。在更大規(guī)模,更多樣的語料上進行預(yù)訓(xùn)練有機會帶來更好的效果[9]。
此外,詞模型在一些數(shù)據(jù)集表現(xiàn)比較差還有一些其他原因,比如在書評數(shù)據(jù)集上,測試集包含25988個詞語,其中9525個詞語不在訓(xùn)練集中。我們認為這是導(dǎo)致在書評數(shù)據(jù)集上基于詞的模型不如基于字的模型的重要的因素,更合適的分詞策略(例如細粒度分詞)會一定程度上減緩這個問題。
在本文中我們介紹了如何通過改進BERT的softmax層和embedding層來擴充中文詞模型的詞典規(guī)模,從而減緩未登錄詞的問題。此外,在訓(xùn)練好的基于詞的BERT模型的基礎(chǔ)上,我們給出了一種針對上下文相關(guān)詞向量進行檢索的方法, 展示了使用BERT詞向量進行以詞搜詞的效果。
參考資料:
Devlin J, Chang M W, Lee ? ? K, et al. Bert: Pre-training of deep bidirectional transformers for ? ? language understanding[J]. NAACL 2019.
https://github.com/PaddlePaddle/LARK/tree/develop/ERNIE
Yan Song, Shuming Shi, ? ? Jing Li, and Haisong Zhang. Directional Skip-Gram: Explicitly ? ? Distinguishing Left and Right Context for Word Embeddings. NAACL 2018.
Bengio Y, Ducharme R, ? ? Vincent P, et al. A neural probabilistic language model[J]. JMLR, 2003.
Tomas Mikolov, Ilya ? ? Sutskever, Kai Chen, Gregory S. Corrado, and Jeffrey Dean:Distributed ? ? Representations of Words and Phrases and their Compositionality. NIPS ? ? 2013.
Edouard Grave , Armand ? ? Joulin, Moustapha Cisse, David Grangierd, Herve Jegou et al. Efficient ? ? softmax approximation for GPUs, ICML 2016.
Alexei Baevski , Michael ? ? Auli. Adaptive Input Representations for Neural Language Modeling. ICLR ? ? 2019.
Peters, Matthew E., et ? ? al. Deep contextualized word representations.?NAACL 2018.
https://github.com/dbiir/UER-py
Liu, X., Chen, Q., Deng, ? ? C. , et al. LCQMC: A Large-scale Chinese Question Matching Corpus. COLING ? ? 2018.
Qiu Y, Li H, Li S, et ? ? al. Revisiting Correlations between Intrinsic and Extrinsic Evaluations of ? ? Word Embeddings. CCL & NLP-NABD.
https://github.com/facebookresearch/XNLI
總結(jié)
以上是生活随笔為你收集整理的从字到词,大词典中文BERT模型的探索之旅的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直播预告|中台基石腾讯云TStack的正
- 下一篇: 重磅亮相KubeCon China,腾讯