引言
之前的文章和大家詳細(xì)的介紹了靜態(tài)的詞向量表示word2vec理論加實戰(zhàn),但是word2vec存在一個很大的問題,由于是靜態(tài)詞向量所以無法表示一詞多義,對于每個詞只能有一個固定的向量表示,今天我們來介紹一個給NLP領(lǐng)域帶來革新的預(yù)訓(xùn)練語言大模型Bert,對比word2vec和Glove詞向量模型,Bert是一個動態(tài)的詞向量語言模型,接下來將帶領(lǐng)大家一起來聊聊Bert的前世今生,感受一下Bert在自然語言處理領(lǐng)域的魅力吧。
1 預(yù)訓(xùn)練的演化史
NLP里面的Word Embedding預(yù)訓(xùn)練技術(shù)的演化史,從最初的靜態(tài)詞向量word2vec,到動態(tài)預(yù)訓(xùn)練詞向量ELMO和GPT,再到今天的主角Bert預(yù)訓(xùn)練模型,這個演變過程也是整個NLP技術(shù)的發(fā)展歷程,Bert的橫空問世直接刷新了NLP領(lǐng)域11項基本任務(wù)的最佳成績,成為最受NLP算法工程師青睞的算法模型。
文章參考論文地址:https://arxiv.org/pdf/1810.04805.pdf
1.1 onehot編碼
one-hot編碼顧名思義,又稱為獨熱編碼表示,之前的文章中有對onehot詞向量做詳細(xì)的介紹:
【NLP修煉系列之詞向量(一)】詳解one-hot編碼&實戰(zhàn)
1.2 word2vec詞向量
word2vec是一種靜態(tài)的詞向量表示,word2vec存在最大的問題就是由于它是靜態(tài)詞向量表示導(dǎo)致不能表示一詞多義的情況,之前的文章有對word2vec原理和實戰(zhàn)做詳解,想了解的小伙伴可以回顧一下:
1.3 ELMO預(yù)訓(xùn)練模型
對比word2vec靜態(tài)詞向量的缺點,為了解決這種靜態(tài)詞向量一詞多義問題,2018年NAACL上發(fā)表了paper《Deep contextualized word representations》提出了ELMO預(yù)訓(xùn)練語言模型。
ELMO模型結(jié)構(gòu):
ELMO的核心思想:使用兩層BiLSTM模型來學(xué)習(xí)文本深度學(xué)習(xí)層次表示,最后針對每個單詞輸出三個向量,針對于下游任務(wù)可以使用加權(quán)的方式來表征文本,一定程度上解決了一詞多義的問題。
1.4 GPT預(yù)訓(xùn)練模型
GPT的全稱是"Generative Pre-Traingng Transformer"的簡稱,是一個生成式預(yù)訓(xùn)練模型,由論文《Deep contextualized word representations》提出。
參考論文地址:https://arxiv.org/pdf/1802.05365.pdf
GPT模型結(jié)構(gòu)圖:
GPT的核心思想:通過二段式的訓(xùn)練,第一個階段是利用語言模型進(jìn)行預(yù)訓(xùn)練(無監(jiān)督形式),第二階段通過 Fine-tuning 的模式解決下游任務(wù)(監(jiān)督模式下)。
圖(左)文章中使用的 Transformer 架構(gòu)和訓(xùn)練目標(biāo)。 (右)用于微調(diào)不同任務(wù)的輸入轉(zhuǎn)換,將所有結(jié)構(gòu)化輸入轉(zhuǎn)換為令牌序列,由預(yù)訓(xùn)練模型處理,然后是線性+softmax 層。
GPT和ELMO模型一樣都是兩階段的預(yù)訓(xùn)練模型,但是不同的是,GPT特征抽取器不是用的RNN,而是用的transformer,它的特征抽取能力要強(qiáng)于RNN,其次GPT的預(yù)訓(xùn)練雖然仍然是以語言模型作為目標(biāo)任務(wù),但是采用的是自回歸模型,單向的transformer結(jié)構(gòu),只會根據(jù)上文信息來表示W(wǎng)ord Embedding,是一個生成式模型。
1.4 Bert預(yù)訓(xùn)練模型
BERT和ELMO、GPT有密切關(guān)系,三者直接有著共同點和不同點,先給出模型結(jié)構(gòu),后面我們詳細(xì)的介紹一下今天的主角Bert預(yù)訓(xùn)練語言模型。
總結(jié)一下預(yù)訓(xùn)練的幾個演變模型的關(guān)系:
one-hot編碼是離散的向量表示,離散編碼存在諸多的問題,例如無法衡量相似數(shù)據(jù)之間的相似關(guān)系等。
word2vec是靜態(tài)的的詞向量表示,靜態(tài)詞向量之前也說明了存在著很多的問題,其中最大的缺點就是不能解決一詞多義的問題。
相比較word2vec而言ELMO,Bert,GPT都是動態(tài)的詞向量表示,其中ELMO不僅使用了詞向量表示詞,還加入了句法特征向量和語義特征向量三層embedding組合來表示詞,ELMO主要特點是使用了LSTM的特征提取器,自左到右和自右到左雙向的使用上下文來語義表示,如果ELMO將LSTM改成Transformer特征提取器就變成了Bert結(jié)構(gòu)了。
GPT使用的特征提取器是Transformer,但是是自左到右單向僅僅使用上文語義的自回歸生成模型,如果GPT也是使用自左到右和自右到左的雙向提取上下文語義就變成了Bert結(jié)構(gòu)了。
那么這么看來Bert的結(jié)構(gòu)就比較清晰了,Bert綜合了以上左右模型的“優(yōu)點”吧,動態(tài)的詞向量語義表示,使用了強(qiáng)大的Transformer特征提取器,同時是自左到右和自右到左雙向的使用上下文來語義表示,可以說Bert是集大成者。
2 Bert概述
Bert全稱是“Bidirectional Encoder Representations from Transformers”,Bert是一種預(yù)訓(xùn)練語言模型(pre-trained language model, PLM)。Google團(tuán)隊在2018年發(fā)表文章《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》提出了Bert預(yù)訓(xùn)練語言模型,可以說Bert的出現(xiàn)轟動了整個NLP領(lǐng)域,自然語言處理領(lǐng)域開始進(jìn)入一個新的階段。
Bert和ELMO,GPT都一樣是兩階段的任務(wù)(預(yù)訓(xùn)練+微調(diào)):
預(yù)訓(xùn)練階段(pre-training):模型將使用大量的無標(biāo)簽數(shù)據(jù)訓(xùn)練。
微調(diào)階段(fine-tuning):BERT模型將用預(yù)訓(xùn)練模型初始化所有參數(shù),這些參數(shù)將針對于下游任務(wù),比如文本分類,序列標(biāo)注任務(wù)等,微調(diào)階段需要使用有標(biāo)簽的數(shù)據(jù)進(jìn)行模型訓(xùn)練,不同的下游任務(wù)可以訓(xùn)練出不同的模型,但是每次都會使用同一個預(yù)訓(xùn)練模型進(jìn)行初始化。
2.1 BERT的結(jié)構(gòu)
Bert是基于Transformer實現(xiàn)的,主要是Transformer的Encoder部分,完整架構(gòu)如下:
論文中提到的Bert主要有兩種大小,bert-base和bert-large兩個size,base版一共有110M參數(shù),large版有340M的參數(shù),總之Bert有上億的參數(shù)量。
BERT_BASE: L = 12, H = 768, A = 12, Total Parameters = 110M.
BERT_LARGE: L = 24, H = 1024, A = 16, Total Parameters = 340M.
其中 L:Transformer blocks 層數(shù);H:hidden size;A:the number of self-attention heads
2.2 Bert的輸入輸出形式
Bert的Embedding層由3個子層求和得到,分別是詞向量層Token Embedings,句子層Segment Embeddings以及位置編碼層Position Embeddings。
Embedding的組成:
Token Embeddings字向量: 用來表征不同的詞,以及特殊的tokens,第一個單詞是CLS標(biāo)志,主要用于之后的分類任務(wù)。
Segment Embeddings文本向量: 用來區(qū)別兩個句子,來表征這個詞是屬于哪一個句子,作用于兩個句子為輸入的分類任務(wù)。
Position Embeddings位置向量: 由于出現(xiàn)在文本不同位置的字/詞所攜帶的語義信息存在差異,對不同位置的字/詞分別附加一個不同的向量以作區(qū)分,是隨機(jī)初始化訓(xùn)練出來的結(jié)果。
Bert輸出:
主要輸出各字對應(yīng)的融合全文語義信息后的向量表示。
3 Bert的預(yù)訓(xùn)練方式
預(yù)訓(xùn)練:預(yù)訓(xùn)練是通過大量無標(biāo)注的語言文本進(jìn)行語言模型的訓(xùn)練,得到一套模型參數(shù),利用這套參數(shù)對模型進(jìn)行初始化,再根據(jù)具體任務(wù)在現(xiàn)有語言模型的基礎(chǔ)上進(jìn)行精調(diào)。
預(yù)訓(xùn)練主要分為兩大分支,一支是自編碼語言模型(Autoencoder Language Model),自回歸語言模型(Autoregressive Language Model)。
自回歸語言模型: 是根據(jù)上文內(nèi)容預(yù)測下一個可能的單詞,就是常說的自左向右的語言模型任務(wù),或者反過來也行,就是根據(jù)下文預(yù)測前面的單詞。GPT 就是典型的自回歸語言模型。
自編碼語言模型: 是對輸入的句子隨機(jī)Mask其中的單詞,然后預(yù)訓(xùn)練過程的主要任務(wù)之一是根據(jù)上下文單詞來預(yù)測這些被Mask掉的單詞,那些被Mask掉的單詞就是在輸入側(cè)加入的噪音。BERT就是典型的自編碼類語言模型。
3.1 MLM掩碼語言模型(Mask Language Model)
因為Bert就是采用自編碼的預(yù)訓(xùn)練模型,MLM就是我們理解的完形填空的問題,隨機(jī)掩蓋掉每一個句子中15%的詞,用其上下文來去預(yù)測掩蓋的詞,但是在下游任務(wù)做微調(diào)的過程中不會出現(xiàn)mask情況,為了解決這一問題論文中提到了一些替換策略:
80%的時間是采用[mask],my dog is hairy → my dog is [MASK]
10%的時間是隨機(jī)取一個詞來代替mask的詞,my dog is hairy -> my dog is apple
10%的時間保持不變,my dog is hairy -> my dog is hairy
3.2 NSP預(yù)訓(xùn)練任務(wù) (Next Sentence Prediction)
NSP任務(wù)主要是判斷兩個句子的關(guān)系,判斷兩個句子是否是前后句關(guān)系,然后用一些特殊的tokens做區(qū)分(在句子開頭加一個 [CLS],在兩句話之間和句末加 [SEP])。輸入形式是,開頭是一個特殊符號[CLS],然后兩個句子之間用[SEP]隔斷。
正樣例:50%的句子B是真是的A后面的句子。
負(fù)樣例:50%的句子B是從語料中隨機(jī)選取的句子。
4 Bert的微調(diào)
Bert的4個經(jīng)典任務(wù):句子(文本)對匹配、句子(文本)分類、問答系統(tǒng)、序列標(biāo)注。
(1)句對分類(Sentence Pair Classification tasks)
預(yù)測下一句、語義相似度等任務(wù),輸入是兩個句子A和B,中間用[SEP]分隔,最終得到的class label就表示是否下一句或者是否是語義相似的。
(2)單句分類(Single Sentence Classification tasks)
文本分類、情感分析等。輸入就是一個單獨的句子,最終的class label就是表示句子屬于哪一類。
(3)文本問答(Question Answering tasks)
問答任務(wù),輸入是一個問題和問題對應(yīng)的段落,用[SEP]分隔,這里輸出的結(jié)果就不是某個class label而是答案在給定段落的開始和終止位置,主要用于閱讀理解任務(wù)。
(4)序列標(biāo)注任務(wù)(Single Sentence Tagging Tasks)
常見的命名實體識別任務(wù),輸入就是一個單獨的句子,輸出是句子中每個token對應(yīng)的類別標(biāo)注。
5 總結(jié)
Bert模型取得這么驚人的效果的前提是用到了強(qiáng)大的Transformer特征提取器,其次是用到了雙向的上下文語義表示,BERT之后衍生了各類改進(jìn)版BERT,其中改善訓(xùn)練方式、優(yōu)化模型結(jié)構(gòu)、模型小型化等方法去優(yōu)化Bert,比較典型的有Roberta,AlBert,distilBert等更好,更快,更小的模型。
評論
查看更多