69 BERT預(yù)訓(xùn)練【動手學(xué)深度學(xué)習(xí)v2】

BERT 預(yù)訓(xùn)練
NLP 里的遷移學(xué)習(xí)
- 在計算機視覺中比較流行,將 ImageNet 或者更大的數(shù)據(jù)集上預(yù)訓(xùn)練好的模型應(yīng)用到其他任務(wù)中,比如小數(shù)據(jù)的預(yù)測、圖片分類或者是目標檢測
1、使用預(yù)訓(xùn)練好的模型(例如 word2vec 或語言模型)來抽取詞、句子的特征
2、做遷移學(xué)習(xí)的時候,一般不更新預(yù)訓(xùn)練好的模型
3、在更換任務(wù)之后,還是需要構(gòu)建新的網(wǎng)絡(luò)來抓取新任務(wù)需要的信息
- 使用預(yù)訓(xùn)練好的模型來抽取特征的時候,一般得到的是一些比較底層的特征,很多時候只是當成一個 embedding 層來使用,還是需要設(shè)計一個比較復(fù)雜的模型
- word2vec 忽略了時序信息
- 語言模型只看一個方向,而且訓(xùn)練的模型不是很大(RNN 處理不了很長的序列,因為它只能看到很短的一部分)
BERT
1、BERT 是芝麻街中一個人物的名字,芝麻街是美國一個針對小朋友啟蒙的節(jié)目
2、BERT 結(jié)合了 ELMo 對上下文進行雙向編碼以及 GPT 任務(wù)無關(guān)這兩方面的優(yōu)點,對上下文進行雙向編碼,并且對于大多數(shù)的自然語言處理任務(wù)只需要最少的架構(gòu)改變
- 通過將整個序列作為輸入,ELMo 是為輸入序列中的每一個單詞分配一個表示的函數(shù)(ELMo 將來自預(yù)訓(xùn)練的雙向長短期記憶網(wǎng)絡(luò)的所有中間層表示組合為輸出表示,ELMo 的表示將作為附加特征添加到下游任務(wù)的現(xiàn)有監(jiān)督模型中)
- 在加入 ELMo 表示之后,凍結(jié)了預(yù)訓(xùn)練的雙向 LSTM 模型中的所有權(quán)重;現(xiàn)有的監(jiān)督模型是專門為給定的任務(wù)定制的(為每一個自然語言處理任務(wù)設(shè)計一個特定的架構(gòu)實際上并不是一件容易的事情),利用不同任務(wù)的不同最佳模型,添加 ELMo 改進了六種自然語言處理任務(wù)的技術(shù)水平:情感分析、自然語言推斷、語義角色標注、共指消解、命名實體識別和回答
- GPT (Generative Pre Training ,生成式預(yù)訓(xùn)練)模型為上下文的敏感表示設(shè)計了通用的任務(wù)無關(guān)模型,它在 Transformer 解碼器的基礎(chǔ)上,預(yù)訓(xùn)練了一個用于表示文本序列的語言模型,當將 GPT 應(yīng)用于下游任務(wù)時,語言模型的輸出被送到一個附加的線性輸出層,以預(yù)測任務(wù)的標簽
- 與 ELMo 凍結(jié)預(yù)訓(xùn)練模型的參數(shù)不同,GPT 在下游任務(wù)的監(jiān)督學(xué)習(xí)過程中對預(yù)訓(xùn)練 Transformer 解碼器中的所有參數(shù)進行微調(diào),GPT 在自然語言推斷、問答、句子相似性和分類等12項任務(wù)上進行了評估,并在對模型架構(gòu)進行最小更改的情況下改善了其中9項任務(wù)的最新水平
- ELMo 對上下文進行雙向編碼,但使用特定于任務(wù)的架構(gòu);GPT 是任務(wù)無關(guān)的,但是從左到右編碼上下文(由于語言模型的自回歸特性,GPT 只能向前看(從左到右))
- 在下游任務(wù)的監(jiān)督學(xué)習(xí)過程中,BERT 在兩方面與GPT相似:BERT 表示將被輸入到一個添加的輸出層中,根據(jù)任務(wù)的性質(zhì)對模型架構(gòu)進行最小的更改(例如預(yù)測每個詞元與預(yù)測整個序列);BERT 對預(yù)訓(xùn)練 Transformer 編碼器的所有參數(shù)進行微調(diào),而額外的輸出層將從頭開始訓(xùn)練
- BERT 進一步改進了 11 種自然語言處理任務(wù)的技術(shù)水平,這些任務(wù)分為以下幾個大類:單一文本分類(如情感分析)、文本對分類(如自然語言推斷)、問答、文本標記(如命名實體識別)

3、原始的 BERT 有兩個版本,其中基本模型有 1.1 億個參數(shù),大模型有 3.4 億個參數(shù)
4、最初的 BERT 模型是在兩個龐大的圖書館語料庫和英語維基百科的合集上預(yù)訓(xùn)練的
5、現(xiàn)成的預(yù)訓(xùn)練 BERT 模型可能不適合醫(yī)學(xué)等特定領(lǐng)域的應(yīng)用
6、在預(yù)訓(xùn)練 BERT 之后,可以用它來表示單個文本、文本對或其中的任何詞元
7、BERT 表示是上下文敏感的,同一個詞元在不同的上下文中具有不同的 BERT 表示
- 上下文敏感:同一個詞可以根據(jù)上下文被賦予不同的表示(詞的表征取決于它們的上下文)
BERT 的動機
1、基于微調(diào)的 NLP 模型
2、預(yù)訓(xùn)練的模型抽取了足夠多的信息
3、新的任務(wù)只需要增加一個簡單的輸出層

- 做微調(diào)的時候,特征抽取的層是可以復(fù)用的(也可以應(yīng)用到別的任務(wù)上面去),只需要修改分類器就可以了
- 預(yù)訓(xùn)練的模型抽取了足夠多的信息,使得 feature 已經(jīng)足夠好能夠抓住很多的信息,所以在做新的任務(wù)的時候,只需要增加一個輸出層就可以了
BERT 架構(gòu)
1、只有編碼器的 Transformer
2、BERT 在原始的論文中提供了兩個原始的版本(原始 BERT 模型中,輸入序列最大長度是 512):
- Base:#blocks=12,hidden size=768,#heads=12,#parameters=110M
- Large:#blocks=24,hidden size=1024,#heads=16,#parameters=340M
3、在大規(guī)模數(shù)據(jù)上訓(xùn)練 > 3B 詞
對輸入的修改

1、每個樣本是一個句子對
- 從源句子到目標句子
- 翻譯的時候,源句子進的是編碼器,目標句子進的是解碼器,而現(xiàn)在只有一個編碼器。因為 NLP 中很多情況下都是兩個句子,比如說 Q&A 都是兩個句子,一個句子進去,一個句子出來。在 BERT 中,將兩個句子拼接起來,然后放進編碼器,因此每個樣本就是一個句子對
2、加入額外的片段嵌入
上圖中的“this movie is great”和“i like it”兩個句子是如何放進去的
- 首先在句首加了一個特殊的分類標簽<cls>(class),作為句子對的開頭( BERT 輸入序列明確地表示單個文本和文本對)
- 然后在兩個句子至今之間使用了一個特殊的分隔符<sep>(separate),將兩個句子分開(第二個句子末尾也使用了一個分隔符)
- 也可以做得更長,將更多的句子連接起來,但是一般沒有這種情況的使用場景,所以一般使用兩個句子就夠了
因為有兩個句子,而且僅僅使用標簽的話,對于 transformer 來講并不是很好區(qū)分兩個句子的先后順序,所以額外地添加了一個 Segment Embedding 來進行區(qū)分
- 對于第一個句子中的所有詞元添加 Segment Embedding 為 0 (包括句首的分類標簽以及兩個句子之間的分隔符)
- 對于第爾個句子中的所有詞元添加 Segment Embedding 為 1(包括句末的分隔符)
3、位置編碼可學(xué)習(xí)
- 在 Transformer 編碼器中常見的是,位置嵌入被加入到輸入序列的每個位置,而 BERT 中使用的是可學(xué)習(xí)的位置嵌入( BERT 輸入序列的嵌入是詞元嵌入、片段嵌入和位置嵌入的和)
- 不再使用 sin 和 cos 函數(shù)
預(yù)訓(xùn)練任務(wù)
BERT 是做一個通用的任務(wù),因為他是一個預(yù)訓(xùn)練模型,做很常見的通用的任務(wù),使得用這個任務(wù)訓(xùn)練出來的數(shù)據(jù)足夠好,以至于做別的任務(wù)的時候都能做
在文本中,最通用的任務(wù)就是語言模型了,給定一個詞,然后預(yù)測下一個詞
- 但是 BERT 不能直接這么做,因為他里面的編碼器是可以看到后面的東西的
- Transformer 中的編碼器是雙向的,既看前面又看后面,解碼器才是單向的
- BERT 中的 B 是 bi-directional ,是雙向的意思,所以它是看雙向的信息,然后抽取比較好的特征,但是如果用來訓(xùn)練語言模型的話就會有問題
因此在 BERT 中做了一個修改,叫做帶掩碼的語言模型
- 給定一個句子,把中間的一些詞遮起來,然后預(yù)測這些詞,有點類似于完型填空
預(yù)訓(xùn)練任務(wù) 1:掩蔽語言模型(Masked Language Modeling)
1、Transformer 的編碼器是雙向的,標準語言模型要求單向
- 語言模型使用左側(cè)的上下文預(yù)測詞元
- 為了雙向編碼上下文以表示每個詞元,BERT 隨機掩蔽詞元并使用來自雙向上下文的詞元以自監(jiān)督的方式預(yù)測掩蔽詞元
2、帶掩碼的語言模型每次隨機(15%概率)將一些詞元(作為預(yù)測的掩蔽詞元)替換成 <mask>
- 任務(wù)就變成了預(yù)測被遮起來的那些詞,模型就不是預(yù)測未來,而是變成了完型填空,因此看雙向的信息是沒有任何問題的
- 在每個預(yù)測位置,輸入可以由特殊的“掩碼”詞元或隨機詞元替代,或者保持不變
3、雖然 BERT 在訓(xùn)練的時候加了很多的 <mask> ,但是在微調(diào)任務(wù)中不出現(xiàn) <mask> 這種人造特殊詞元,為了避免預(yù)訓(xùn)練和微調(diào)之間的這種不匹配,解決的辦法是模型不要總是對 <mask> 遮掉的部分進行預(yù)測輸出
- 80% 概率下,將選中的詞元變成 <mask>
- 10% 概率下?lián)Q成一個隨機詞元(這種偶然的噪聲鼓勵 BERT 在其雙向上下文編碼中不那么偏向于掩蔽詞元,尤其是當標簽詞元保持不變時)
- 10% 概率下保持原有的詞元
4、帶掩碼的語言雖然能夠編碼雙向上下文來表示單詞,但是它并不能顯式地建模文本對之間的邏輯關(guān)系
預(yù)訓(xùn)練任務(wù) 2:下一句子預(yù)測(Next Sentence Prediction)
1、給定一個句子對,預(yù)測這個句子對中兩個句子在原始的句子中是不是相鄰,從而幫助理解兩個文本序列之間的關(guān)系
2、在構(gòu)造樣本的時候,訓(xùn)練樣本中:
- 50% 概率選擇相鄰句子對(在采樣一個句子的時候,將該句子后面的一個句子也采樣進去):<cls> this movie is great <sep> i like it <sep>
- 50% 概率選擇隨機句子對(在采樣一個句子的時候,在其他地方再隨機挑選一個句子采樣進去):<cls> this movie is great <sep> hello world <sep>
3、將 <cls> 對應(yīng)的輸出放到一個全連接層來預(yù)測,判斷兩個句子是不是相鄰的
總結(jié)
1、BERT 是針對 NLP 的微調(diào)設(shè)計,在大的文本上訓(xùn)練一個比較大的模型,在做別的任務(wù)的時候?qū)⑤敵鰧舆M行修改,最后的效果會比直接訓(xùn)練好一點( BERT 讓微調(diào)在 NLP 中變成了主流)
2、BERT 其實就是一個基于 Transformer 的編碼器,但是做了一點修改
- 模型更大,訓(xùn)練數(shù)據(jù)更多(一般是至少十億個詞,文本不像圖片,文本不需要進行標記,所以文本可以無限大)
- 輸入句子對,片段嵌入,可學(xué)習(xí)的位置編碼
- 訓(xùn)練時使用兩個任務(wù):帶掩碼的語言模型和下一個句子預(yù)測
3、word2vec 和 GloVe 等詞嵌入模型與上下文無關(guān),它們將相同的預(yù)訓(xùn)練向量賦給同一個詞,而不考慮詞的上下文(如果有的話),因此很難處理好自然語言中的一詞多義或復(fù)雜語義
4、對于上下文敏感的詞表示,如 ELMo 和 GPT ,詞的表示依賴于它們的上下文
- ELMo 對上下文進行雙向編碼,但使用特定于任務(wù)的架構(gòu)(為每個自然語言處理任務(wù)設(shè)計一個特定的體系架構(gòu)實際上并不容易)
- GPT 是任務(wù)無關(guān)的,但是從左到右編碼上下文
5、BERT 結(jié)合了這兩個方面的優(yōu)點:對上下文進行雙向編碼,并且需要對大量自然語言處理任務(wù)進行最小的架構(gòu)更改
6、BERT輸入序列的嵌入是詞元嵌入、片段嵌入和位置嵌入的和
7、BERT 預(yù)訓(xùn)練包括兩個任務(wù):掩蔽語言模型和下一句預(yù)測
- 掩蔽語言模型能夠編碼雙向上下文來表示單詞
- 下一句預(yù)測能夠顯式地建模文本對之間的邏輯關(guān)系
Q&A
- 1、老師能否再解釋一下什么是 embedding?
- ?QA P5 - 00:00?
- 2、embedding 層是轉(zhuǎn)換單詞的向量表示嗎,比如一個詞原來的向量表示是 v ,經(jīng)過 embedding 層轉(zhuǎn)換為 u 。如果是這樣,那原來的向量表示 v 是怎么來的呢?
- ?QA P5 - 00:15?
- 3、在做掩碼的時候,10% 的概率保持原來的詞元,那不是什么都沒做嗎,與15% 的概率做 mask 不是矛盾了嗎?
- ?QA P5 - 00:39?
- 4、老師, bert 需要大量訓(xùn)練數(shù)據(jù),是不是很少用在 CV 上或者基本不用在 CV 上呢?
- ?QA P5 - 02:03?
- 5、請問老師可以展示下 100w batch 的訓(xùn)練結(jié)果嗎?
- ?QA P5 - 03:16?
- 6、老師,想用 bert large 作為預(yù)訓(xùn)練模型,但是 bert large 太大了,顯存不足訓(xùn)練不了,想問用沒有好的模型壓縮方式能夠來適應(yīng)訓(xùn)練?
- ?QA P5 - 03:46?
- 7、bert 的預(yù)訓(xùn)練任務(wù)有什么改進嗎?
- ?QA P5 - 05:01?
- 8、請問老師,不同數(shù)量級別的數(shù)據(jù)用 bert 做預(yù)訓(xùn)練訓(xùn)練大概多久?怎么評估?
- ?QA P5 - 05:26?
----end----
其他參考:
1、《動手學(xué)深度學(xué)習(xí)》,課程 PPT ,https://courses.d2l.ai/zh-v2/assets/pdfs/part-4_6.pdf
2、《動手學(xué)深度學(xué)習(xí)》,教程,https://zh-v2.d2l.ai/chapter_natural-language-processing-pretraining/bert.html
3、《動手學(xué)深度學(xué)習(xí)》,教程,https://zh-v2.d2l.ai/chapter_natural-language-processing-pretraining/bert-dataset.html
4、《動手學(xué)深度學(xué)習(xí)》,教程,https://zh-v2.d2l.ai/chapter_natural-language-processing-pretraining/bert-pretraining.html