一、BERT的設(shè)計(jì)原理與預(yù)訓(xùn)練策略
Bert(Bidirectional Encoder Representations from Transformers))是純編碼器架構(gòu)。
回顧一下傳統(tǒng)的向量生成的方式: 都是靜態(tài)詞向量。
主題模型;SVD矩陣分解。 通過構(gòu)建“詞-文檔”矩陣,進(jìn)行矩陣分解。生成兩個(gè)矩陣,一個(gè)是“詞-主題”,一個(gè)是“文檔-主題”矩陣。其中“詞-主題”矩陣,就是詞向量矩陣。
Word2Vec: 通過用上下文預(yù)測(cè)中心詞(CBOW)或者用當(dāng)前詞預(yù)測(cè)上下文。線性層實(shí)現(xiàn), 是靜態(tài)詞向量。通過無監(jiān)督預(yù)訓(xùn)練生成的查詢表作為詞向量表示。
缺點(diǎn)都是無法理解當(dāng)前語境,無法解決一詞多義問題。
Bert出現(xiàn)之前,像Word2Vec這樣的模型能夠?yàn)樵~語生成一個(gè)固定的向量(靜態(tài)詞向量),但無法解決一詞多義的問題。例如,“破防”在“我除了一件破防裝備”和“NLP算法給我學(xué)破防了”中的含義完全不同,但在Word2Vec中他們的向量是相同的。
BERT設(shè)計(jì)的目標(biāo)是生成動(dòng)態(tài)的、與上下文相關(guān)的詞向量,不僅僅是一個(gè)詞向量生成工具,更是一個(gè)強(qiáng)大的預(yù)訓(xùn)練語言模型。工作范式分為預(yù)訓(xùn)練和微調(diào)兩個(gè)主要階段。
(1)預(yù)訓(xùn)練: 在文本語料庫上,通過特定的無監(jiān)督任務(wù)來訓(xùn)練一個(gè)深度神經(jīng)網(wǎng)絡(luò)模型。目標(biāo)不是為了完成某個(gè)具體的NLP任務(wù),而是讓模型學(xué)習(xí)語言本身的規(guī)律,比如語法結(jié)構(gòu)、詞語間的語義關(guān)系、上下文依賴等。訓(xùn)練完成后,就得到了一個(gè)包含了豐富語言知識(shí)的、參數(shù)已經(jīng)訓(xùn)練好的預(yù)訓(xùn)練模型
(2)微調(diào): 針對(duì)具體的下游任務(wù), 通過預(yù)訓(xùn)練好的Bert模型,加載已經(jīng)學(xué)習(xí)到的所有參數(shù)初始值。在Bert模型之上增加一個(gè)小的、任務(wù)相關(guān)的輸出層,最后在自己的任務(wù)數(shù)據(jù)集上對(duì)整個(gè)模型進(jìn)行訓(xùn)練。
這種“預(yù)訓(xùn)練+微調(diào)”的訓(xùn)練范式,屬于遷移學(xué)習(xí)的一種實(shí)現(xiàn),也是BERT的訓(xùn)練框架。能夠從海量數(shù)據(jù)中學(xué)到的通用語言知識(shí),遷移到數(shù)據(jù)量有限的特定任務(wù)中。
與RNN/LSTM的區(qū)別
BERT是基于自注意力機(jī)制的,實(shí)現(xiàn)真正的深度雙向,bi-RNN/LSTM是淺層連接,一個(gè)正向和一個(gè)反向拼接而成,視野有限。
二、BERT架構(gòu)詳解
2.1 BERT的模型規(guī)模
Bert提供了不同規(guī)模的預(yù)訓(xùn)練模型,以適應(yīng)不同的計(jì)算資源和性能需求。

2.2 BERT的輸入表示
Bert的輸入表示由三部分的嵌入向量逐元素相加而成。

(1)詞元嵌入: WordPieces的分詞方法,拆分成更小的子詞單元,有效處理未登錄詞的問題。對(duì)于bert-base-chiness模型,詞表以單字為主,也包含少量常用詞,處理中文時(shí)效果接近于按字分詞,但是準(zhǔn)確描述是子詞切分。
(2)片段嵌入:為了處理句子對(duì)任務(wù)(判斷兩個(gè)句子是否是連續(xù)的),用于區(qū)分輸入中的不同句子。
(3)位置嵌入: 使用的可學(xué)習(xí)的位置嵌入。創(chuàng)建[max_position_embeddings, hidden_size]的嵌入表,讓模型在預(yù)訓(xùn)練過程中自己學(xué)習(xí)每個(gè)位置的最佳向量表示。

2.3 特殊詞元

三、BERT的預(yù)訓(xùn)練任務(wù)
3.1 任務(wù)一: 掩碼語言模型(MLM)

思路是在輸入文本中隨機(jī)遮蓋掉一部分詞元,然后訓(xùn)練模型去根據(jù)上下文預(yù)測(cè)這些被遮蓋的詞元。這就想做完形填空,迫使模型學(xué)習(xí)詞元之間深層次的語義關(guān)系和句法結(jié)構(gòu)。
MLM執(zhí)行策略:
(1)隨機(jī)選擇: 在每一個(gè)訓(xùn)練序列中,隨機(jī)挑選15%的詞元作為預(yù)測(cè)目標(biāo)
(2)特殊替換策略: 為了緩解預(yù)訓(xùn)練(有[MASK]標(biāo)記)與微調(diào)(沒有[MASK]標(biāo)記)階段的數(shù)據(jù)差異,對(duì)于這15%被選中的詞元,采用如下“80/10/10”的替換方法。假設(shè)如圖5-3中My son is a good stu的son 詞元被替換:
- 80%的情況: 將選中的詞替換為[MASK]
- 10%的情況: 將選中的詞替換成一個(gè)隨機(jī)的其他詞元。 相當(dāng)于引入噪聲,一方面要求模型能理解上下文,同時(shí)能糾正錯(cuò)誤詞元,增強(qiáng)模型的魯棒性,另一方面促使模型學(xué)習(xí)每一個(gè)輸入詞元的分布式特征關(guān)系,而不是僅僅依賴[MASK]去出發(fā)預(yù)測(cè)
- 10%的情況: 保持詞元不變。為了上模型看到真實(shí)詞元,也去預(yù)測(cè)他自己。讓模型更好的學(xué)習(xí)每一個(gè)真實(shí)詞元的上下文表示,減輕預(yù)訓(xùn)練和微調(diào)階段數(shù)據(jù)不匹配問題。
MLM的局限
因?yàn)槭请S機(jī)Mask單個(gè)字或子詞,可能會(huì)割裂一個(gè)完整詞語的內(nèi)部語義聯(lián)系。后續(xù)提出了WWW 全詞掩碼,如果一個(gè)的一部分被選中進(jìn)行mask,那么這個(gè)詞的所有部分都會(huì)被一起mask。
3.2 任務(wù)二: 下一句預(yù)測(cè)

NSP任務(wù)目標(biāo)是讓模型理解句子與句子之間的邏輯關(guān)系。
訓(xùn)練時(shí),模型會(huì)接收一對(duì)句子A和B,并判斷句子B是否是句子A在原文中的下一句。
做法: 準(zhǔn)備句子對(duì)【[CLS] A [SEP] B】這樣的句子對(duì),50%的情況B是A的下一句,50%B是語料庫中隨機(jī)的句子。通過預(yù)測(cè)B是不是A得下一句,從[CLS]位置的隱狀態(tài)送入一個(gè)二分類器,判斷IsNext還是NotNext, 通過懸鏈[CLS]向量學(xué)習(xí)句子級(jí)別的聚合特征。
NSP的有效性:后續(xù)研究如RoBERTa,ALBERT等,在更大規(guī)模預(yù)訓(xùn)練下,移除它或other任務(wù)替代(如句子順序預(yù)測(cè))會(huì)帶來更好的結(jié)果。
但是BERT原始論文中,消融實(shí)驗(yàn)證明,當(dāng)時(shí)的訓(xùn)練設(shè)置下,移除NSP會(huì)導(dǎo)致在問答和自然語言推斷等任務(wù)下性能明顯下家,說明NSP任務(wù)能幫助原始BERT學(xué)習(xí)到句子級(jí)別的關(guān)系,特定場(chǎng)景下依然有價(jià)值。
四、BERT的應(yīng)用與實(shí)踐
4.1 微調(diào)下游任務(wù)
(1)文本分類任務(wù): 對(duì)于文本分類任務(wù)(如情感分析、意圖識(shí)別),輸入語句格式化(添加[CLS]和[SEP]),利用[CLS]詞元的聚合表示能力,提取[CLS]詞元對(duì)應(yīng)最終輸出向量,在這之上添加分類器,在任務(wù)數(shù)據(jù)上進(jìn)行訓(xùn)練,同時(shí)以最小的學(xué)習(xí)率微調(diào)BERT模型的參數(shù)。
(2)詞元分類任務(wù):如命名實(shí)體識(shí)別、分詞、詞性標(biāo)注,需要對(duì)輸入序列中每一個(gè)詞元進(jìn)行分類,與文本分類類似。所有詞元的最終向量后添加全連接層,作為詞的分類器。
(3)其他任務(wù): 幾乎可以適配所有NLP任務(wù)。例如問答任務(wù)中,可以將問題和段落作為句子輸入BERT,然后懸鏈模型去預(yù)測(cè)答案在段落中的起始和結(jié)束位置。
4.2 實(shí)踐技巧和生態(tài)
進(jìn)行BERT微調(diào)時(shí),需要注意鏈各個(gè)細(xì)節(jié):
- 最大長(zhǎng)度限制,標(biāo)準(zhǔn)BERT模型,最大輸入長(zhǎng)度為512個(gè)token。因?yàn)橛芯渥幼x限制,實(shí)際上最大只能是510個(gè)。
- 特殊token的添加,輸入開頭必須添加[CLS],結(jié)尾必須添加[SEP]。 統(tǒng)稱Tokenizer會(huì)自動(dòng)添加這些特殊token,但在手動(dòng)構(gòu)建輸入是需要自己加上。
Bert不同層級(jí)學(xué)習(xí)到的特征有所側(cè)重,其中底層更偏向于捕捉詞法、語法等表層信息,高層更偏向于捕捉語義、語境等深層信息,所以一些任務(wù)通常用最后幾層的向量進(jìn)行拼接或相加,有時(shí)效果比單獨(dú)使用最后一層更好。
Hugging Face提供開源的transformers庫,無需自己從頭實(shí)現(xiàn)BERT模型。