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

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

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

2.3 特殊詞元

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

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

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