一、寫(xiě)在前面的話(huà)
BERT模型其實(shí)一直想寫(xiě)筆記,但一直沒(méi)寫(xiě),主要原因就是在研究完Transformer之后,BERT幾乎一讀就懂,沒(méi)有在額外加入太多的東西,但另一方法,BERT在實(shí)踐上可以說(shuō)是結(jié)合很多深度學(xué)習(xí)領(lǐng)域有效的方法的一個(gè)大禮包,仔細(xì)研究BERT模型可以發(fā)現(xiàn)很多目前最前沿有效的方法。故這次蹭著論文學(xué)習(xí)小組需要寫(xiě)筆記,記錄了一下自己關(guān)于BERT的理解,后續(xù)會(huì)在這個(gè)的基礎(chǔ)上加入代碼分解。
二、BERT的整體結(jié)構(gòu)

BERT 的模型結(jié)構(gòu)是一個(gè)多層雙向Transformer 編碼器,整體的模型結(jié)構(gòu)其實(shí)就是Transformer,但BERT的創(chuàng)新點(diǎn)在于:
- 引入了掩碼使得Transformer編碼器能夠使用雙向信息
- 加入兩個(gè)預(yù)訓(xùn)練任務(wù),實(shí)現(xiàn)NLP領(lǐng)域的遷移學(xué)習(xí)
三、輸入表示

BERT在預(yù)訓(xùn)練階段輸入基本和Transformer結(jié)構(gòu)是相同的,主要的區(qū)別是加入了CLS和SEP兩個(gè)特殊字符,每個(gè)序列的第一個(gè)標(biāo)記始終是特殊分類(lèi)嵌入CLS,該特殊標(biāo)記對(duì)應(yīng)的最終隱藏狀態(tài)(即Transformer 的輸出)被用作分類(lèi)任務(wù)中該序列的總表示。對(duì)于非分類(lèi)任務(wù),這個(gè)最終隱藏狀態(tài)將被忽略,SEP則是用來(lái)區(qū)別被打包到一起的句子對(duì)輸入。
1. WordPiece
BERT在處理輸入時(shí),會(huì)采用WordPiece方法對(duì)輸入進(jìn)行分割。WordPiece字面理解是把word拆成piece一片一片,其主要使用雙字節(jié)編碼(BPE,Byte-Pair Encoding)的方式來(lái)實(shí)現(xiàn)的。BPE的過(guò)程可以理解為把一個(gè)單詞再拆分,使得我們的此表會(huì)變得精簡(jiǎn),并且寓意更加清晰。比如"loved","loving","loves"這三個(gè)單詞。其實(shí)本身的語(yǔ)義都是“愛(ài)”的意思,但是如果我們以單詞為單位,那它們就算不一樣的詞,在英語(yǔ)中不同后綴的詞非常的多,就會(huì)使得詞表變的很大,訓(xùn)練速度變慢,訓(xùn)練的效果也不是太好。BPE算法通過(guò)訓(xùn)練,能夠把上面的3個(gè)單詞拆分成"lov","ed","ing","es"幾部分,這樣可以把詞的本身的意思和時(shí)態(tài)分開(kāi),有效的減少了詞表的數(shù)量。
2. Segment Embeddings
為了對(duì)被打包在一起輸入的句子對(duì),除了使用上面的SEP標(biāo)示之外,BERT會(huì)給第一個(gè)句子的每個(gè)標(biāo)記添加一個(gè)可訓(xùn)練的句子 A嵌入,給第二個(gè)句子的每個(gè)標(biāo)記添加一個(gè)可訓(xùn)練的句子 B 嵌入,例如A嵌入都是0,B嵌入都是1。
3. Position Embeddings
位置嵌入其實(shí)就是對(duì)輸入的每個(gè)位置訓(xùn)練一個(gè)向量,在原論文中使用如下公式得到位置嵌入:

但現(xiàn)在的BERT代碼中似乎換成和隨機(jī)生成詞向量一樣,通過(guò)訓(xùn)練得到位置嵌入,這也是一般獲得位置嵌入的方法。
四、Transformer編碼器
基本上就是從原論文照搬結(jié)構(gòu),參考之前的筆記:《Attention is All You Need》論文筆記
五、預(yù)訓(xùn)練任務(wù)

1. 遮蔽語(yǔ)言模型
BERT為了訓(xùn)練擁有雙向句子信息的模型采用了一種隨機(jī)遮蔽一定比例的輸入標(biāo)記,然后預(yù)測(cè)那些被遮蔽的標(biāo)記的預(yù)訓(xùn)練任務(wù)。BERT在每個(gè)序列中隨機(jī)遮蔽 15% 的標(biāo)記,然后通過(guò)最后使用softmax去預(yù)測(cè)被遮蔽的字,但直接使用這樣的預(yù)訓(xùn)練任務(wù)會(huì)有兩個(gè)問(wèn)題:
- 預(yù)訓(xùn)練和微調(diào)之間造成了不匹配,因?yàn)?[MASK] 標(biāo)記在微調(diào)期間從未出現(xiàn)過(guò)
- 使用 Transformer 的每批次數(shù)據(jù)中只有 15% 的標(biāo)記被預(yù)測(cè),這意味著模型可能需要更多的預(yù)訓(xùn)練步驟來(lái)收斂
為了解決問(wèn)題一(問(wèn)題二還有待優(yōu)化),BERT采用了以下的操作:
- 80% 的情況下:用 [MASK] 替換被選擇的單詞,例如,my dog is hairy → my dog is [MASK]
- 10% 的情況下:用一個(gè)隨機(jī)單詞替換被選擇的單詞,例如,my dog is hairy → my dog is apple
- 10% 的情況下:保持被選擇的單詞不變,例如,my dog is hairy → my dog is hairy
2. 句子預(yù)測(cè)
BERT為了訓(xùn)練一個(gè)理解句子關(guān)系的模型,預(yù)訓(xùn)練了一個(gè)下一句預(yù)測(cè)的二元分類(lèi)任務(wù):例如對(duì)每一個(gè)輸入的句子對(duì)(句子A和句子B),50% 的情況下 B 是真的在 A 后面的下一個(gè)句子,50% 的情況下是來(lái)自語(yǔ)料庫(kù)的隨機(jī)句子。
六、微調(diào)

可以看到,BERT的微調(diào)非常簡(jiǎn)單,通過(guò)對(duì)最后一層的簡(jiǎn)單改造即可遷移到自己的NLP任務(wù)中。