nlp模型-bert從入門到精通(一)


在說內容之前先把,bert基本資料準備一下

基礎資料準備

tensorflow版:點擊傳送門
pytorch版(注意這是一個第三方團隊實現的):點擊傳送門
論文:點擊傳送

從0到1瞭解模型的優缺點

從現在的大趨勢來看,使用某種模型預訓練一個語言模型看起來是一種比較靠譜的方法。從之前AI2的 ELMo,到 OpenAI的fine-tune transformer,再到Google的這個BERT,全都是對預訓練的語言模型的應用。

BERT這個模型與其它兩個不同的是:

  • 1、它在訓練雙向語言模型時以減小的概率把少量的詞替成了Mask或者另一個隨機的詞。這個目的在於使模型被迫增加對上下文的記憶。至於概率值那就是平感覺來。
    **解讀:**任務1: Masked LM

從直覺上看,研究團隊有理由相信,深度雙向模型比left-to-right 模型或left-to-right and right-to-left模型的淺層連接更強大。遺憾的是,標準條件語言模型只能從左到右或從右到左進行訓練,因爲雙向條件作用將允許每個單詞在多層上下文中間接地“see itself”。

爲了訓練一個深度雙向表示(deep bidirectional representation),研究團隊採用了一種簡單的方法,即隨機屏蔽(masking)部分輸入token,然後只預測那些被屏蔽的token。論文將這個過程稱爲“masked LM”(MLM),儘管在文獻中它經常被稱爲Cloze任務(Taylor, 1953)。

在這個例子中,與masked token對應的最終隱藏向量被輸入到詞彙表上的輸出softmax中,就像在標準LM中一樣。在團隊所有實驗中,隨機地屏蔽了每個序列中15%的WordPiece token。與去噪的自動編碼器(Vincent et al., 2008)相反,只預測masked words而不是重建整個輸入。

雖然這確實能讓團隊獲得雙向預訓練模型,但這種方法有兩個缺點。首先,預訓練和finetuning之間不匹配,因爲在finetuning期間從未看到[MASK]token。爲了解決這個問題,團隊並不總是用實際的[MASK]token替換被“masked”的詞彙。相反,訓練數據生成器隨機選擇15%的token。例如在這個句子“my dog is hairy”中,它選擇的token是“hairy”。然後,執行以下過程:

數據生成器將執行以下操作,而不是始終用[MASK]替換所選單詞:

80%的時間:用[MASK]標記替換單詞,例如,my dog is hairy → my dog is [MASK]
10%的時間:用一個隨機的單詞替換該單詞,例如,my dog is hairy → my dog is apple
10%的時間:保持單詞不變,例如,my dog is hairy → my dog is hairy. 這樣做的目的是將表示偏向於實際觀察到的單詞。

Transformer encoder不知道它將被要求預測哪些單詞或哪些單詞已被隨機單詞替換,因此它被迫保持每個輸入token的分佈式上下文表示。此外,因爲隨機替換隻發生在所有token的1.5%(即15%的10%),這似乎不會損害模型的語言理解能力。

使用MLM的第二個缺點是每個batch只預測了15%的token,這表明模型可能需要更多的預訓練步驟才能收斂。團隊證明MLM的收斂速度略慢於 left-to-right的模型(預測每個token),但MLM模型在實驗上獲得的提升遠遠超過增加的訓練成本。

  • 2、增加了一個預測下一句的loss。從這一點來看做的比較新穎。
    解讀:
    任務2:下一句預測

許多重要的下游任務,如問答(QA)和自然語言推理(NLI)都是基於理解兩個句子之間的關係,這並沒有通過語言建模直接獲得。

在爲了訓練一個理解句子的模型關係,預先訓練一個二進制化的下一句測任務,這一任務可以從任何單語語料庫中生成。具體地說,當選擇句子A和B作爲預訓練樣本時,B有50%的可能是A的下一個句子,也有50%的可能是來自語料庫的隨機句子。例如:

Input = [CLS] the man went to [MASK] store [SEP]

he bought a gallon [MASK] milk [SEP]

Label = IsNext

Input = [CLS] the man [MASK] to the store [SEP]

penguin [MASK] are flight ##less birds [SEP]

Label = NotNext

團隊完全隨機地選擇了NotNext語句,最終的預訓練模型在此任務上實現了97%-98%的準確率。

BERT模型具有以下兩個特點:

第一,是這個模型非常的深,12層,並不寬(wide),中間層只有1024,而之前的Transformer模型中間層有2048。這似乎又印證了計算機圖像處理的一個觀點——深而窄 比 淺而寬 的模型更好。

第二,MLM(Masked Language Model),同時利用左側和右側的詞語,這個在ELMo上已經出現了,絕對不是原創。其次,對於Mask(遮擋)在語言模型上的應用,已經被Ziang Xie提出了(我很有幸的也參與到了這篇論文中):[1703.02573] Data Noising as Smoothing in Neural Network Language Models。這也是篇巨星雲集的論文:Sida Wang,Jiwei Li(香儂科技的創始人兼CEO兼史上發文最多的NLP學者),Andrew Ng,Dan Jurafsky都是Coauthor。但很可惜的是他們沒有關注到這篇論文。用這篇論文的方法去做Masking,相信BRET的能力說不定還會有提升。

模型的輸入

在這裏插入圖片描述
BERT輸入表示。輸入嵌入是token embeddings, segmentation embeddings 和position embeddings 的總和

具體如下:

(1)使用WordPiece嵌入(Wu et al., 2016)和30,000個token的詞彙表。用##表示分詞。
(2)使用學習的positional embeddings,支持的序列長度最多爲512個token。
每個序列的第一個token始終是特殊分類嵌入([CLS])。對應於該token的最終隱藏狀態(即,Transformer的輸出)被用作分類任務的聚合序列表示。對於非分類任務,將忽略此向量。
(3)句子對被打包成一個序列。以兩種方式區分句子。首先,用特殊標記([SEP])將它們分開。其次,添加一個learned sentence A嵌入到第一個句子的每個token中,一個sentence B嵌入到第二個句子的每個token中。
(4)對於單個句子輸入,只使用 sentence A嵌入。

參考資料:

1.論文解讀方面:
NLP必讀:十分鐘讀懂谷歌BERT模型
https://zhuanlan.zhihu.com/p/51413773
論文解讀:BERT模型及fine-tuning
https://zhuanlan.zhihu.com/p/46833276

2.原理方面解讀
https://zhuanlan.zhihu.com/p/68295881
https://zhuanlan.zhihu.com/p/49271699
http://www.52nlp.cn/tag/tensorflow-bert

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章