这些年,NLP常见的预训练模型剖析
“預訓練-微調”(pre-training and fine-tune) 已經成為解決NLP任務的一種新的范式?;陬A訓練語言模型的詞表示由于可以建模上下文信息,進而解決傳統(tǒng)靜態(tài)詞向量不能建?!耙辉~多義”語言現象的問題。傳統(tǒng)的詞向量有one-hot(杜熱編碼)、詞袋模型(TF_IDF)、N-Gram、Word2Vec、Glove等,其中word2vec和Glove是屬于word embedding。?
- one-hot:每個單詞都創(chuàng)建一個長度等于詞匯量的零向量,在相應單詞的位置上置為1。缺點 :效率低下、且向量稀疏。(未聯(lián)系上下文,忽略詞和詞之間的聯(lián)系)
- 詞袋模型(TF-IDF):將每篇文章看成一袋子詞,忽略每個詞出現的順序,將文本以詞為單位分開,并將每篇文章表示成一個長向量,計算每個詞在原文章中的重要性。(未聯(lián)系上下文,忽略詞和詞之間的聯(lián)系)
- N-gram:將連續(xù)出現的n個詞組成的詞組也作為一個單獨特征放到向量表示中去。(增加了詞和詞之間的聯(lián)系,未考慮詞性變化)
- Word2Vec:通過上下文來學習語義信息。常見模型有CBOW和Skip-gram,CBOW是通過上下文出現的詞語去預測中心詞,訓練速度較快。Skip-gram是通過當前詞去預測上下文中的各詞生成概率,對罕見詞的訓練效果比較好。缺點:(1)由于詞和向量是一對一的關系,所以多義詞的問題無法解決(2)Word2vec 是一種靜態(tài)的方式,雖然通用性強,但是無法針對特定任務做動態(tài)優(yōu)化(學習了語義信息,能學習到一些同義詞,但是也存在一些缺點)
- Glove:以矩陣分解方法為基礎,通過對包含整個語料統(tǒng)計信息的矩陣進行分解,得到每個單詞對應的實數向量。
相比較Word2Vec和Glove區(qū)別的可以參考:Word2Vec 與 GloVe 技術淺析與對比
基于傳統(tǒng)詞向量模型的不足(一詞多義問題,在簡單的word embedding里邊一個詞只有一個embedding,但是在生活中,存在一詞多義),在2018年后,出現了新的一批模型(基于上下文的word embedding)。常見的預訓練模型有
1.ELMo
ELMo(Embedding from Language Models)的縮寫,在2018年發(fā)表的論文《Deep Contextualized Word Embeddings》,提出了ELMo的思想。ELMo是采用雙向的Bi-LSTM對輸入進行訓練,單詞特征E可以通過傳統(tǒng)詞向量方式實現,每一個lstm層都將單詞特征與其上文詞向量和下文詞向量進行拼接作為當前的輸入向量,其中第一層lstm獲取句法特征,第二層lstm獲取語義特征。 在進行下游任務時,獲取之前模型訓練的3個embedding(包括單詞向量E,第一層LSTM的輸出,第二層LSTM的輸出),進行加權求和后輸入下游任務中。
ELMO雖然能夠看到上下文信息,但是它只能看到單向的上下文信息,這樣說是因為ELMO中前向lstm和后向lstm的網絡是完全獨立的,也就是說當使用前向lstm訓練時,詞?t?看不到?t+1及之后的所有詞,同理使用后向lstm訓練時,詞?t?看不到?t - 1及之前的所有詞,因此本質上來說它依然只能看到單向信息,所謂的“雙向”只是將兩個方向的信息進行拼接而已。這是ELMO的局限性。
ELMo有三個特點:
1. 學習的是word token的詞向量,根據上面的定義,word token與具體的上下文有關,不再是靜態(tài)的word type的詞向量;
2. 使用很長的上下文進行學習,而不像word2vec一樣使用較小的滑動窗口,所以ELMo能學到長距離詞的依賴關系;
3. 使用雙向的語言模型進行學習,并使用網絡的所有隱藏層作為這個詞的特征表示。
2.GPT(單向語言模型)
GPT(Generative Pre-training Transformer)是OpenAI發(fā)布的,目前發(fā)布了三個版本:GPT-1、GPT-2、GPT-3。
GPT?是使用 Transformer 的 Decoder 模塊構建進行半監(jiān)督訓練(無監(jiān)督的預訓練和有監(jiān)督的微調),與原生Transformer相比,GPT對其中每個解碼器的結構做了簡化:在Transformer中,每個解碼器模塊中包括掩膜多頭自注意力(Masked Multi-Head Attention)、編碼-解碼注意力(Encode-Decode Attention)和全連接前饋網絡(Feed Forward NN)三個模塊。而GPT去掉了其中的編碼-解碼注意力模塊,僅保留掩膜多頭自注意力和全連接前饋網絡兩個模塊。
(1)Masked Multi-Head Attention
- Attention
Attention是將有限的注意力集中在重點信息上,從而節(jié)省資源,快速獲得最有效的信息。在seq2seq中為了解決輸入序列信息丟失的問題引入的。Attention的Query(Q)是decoder的內容、Key(K)和Value(V)是encoder的內容,q和k對齊了解碼端和編碼端的信息相似度。
步驟:
第一步: query 和 key 進行相似度計算,得到權值(sim(q,k))
第二步:將權值進行歸一化,得到直接可用的權重(softmax(sim(q,k)))
第三步:將權重和 value 進行加權求和(sum(softmax(sim(q,k))))
- Self Attention?
當模型處理句子中的每個詞時,Self Attention?機制使得模型不僅能夠關注這個位置的詞,而且能夠關注句子中其他位置的詞,作為輔助線索,進而可以更好地編碼當前位置的詞。例如
The animal didn't cross the street because it was too tired在句子中,我們能夠分析出來it是指代the animal ,但是機器不知道,self Attention就是讓it 和the animal關聯(lián)起來。總體計算公式為:
第 一 步是:對輸入編碼器的每個詞向量,都創(chuàng)建 3 個向量,分別是:Query 向量,Key 向量,Value 向量。這 3 個向量是詞向量分別和 3 個矩陣相乘得到的,而這個矩陣是我們要學習的參數。
例:兩個詞向量為例,輸入向量和權重W(Q,K,V)向量相乘,得到3個向量q,k,v。
第 2 步,是計算 Attention Score(注意力分數)。假設我們現在計算第一個詞?Thinking?的 Attention Score(注意力分數),需要根據?Thinking?這個詞,對句子中的其他每個詞都計算一個分數。這些分數決定了我們在編碼Thinking這個詞時,需要對句子中其他位置的每個詞放置多少的注意力。從圖上看,就是q1*k1+q1*k2
第 3 步就是把每個分數除以?(?是 Key 向量的長度)。你也可以除以其他數,除以一個數是為了在反向傳播時,求取梯度更加穩(wěn)定。(下圖中的8是多頭里邊的8組注意力)
第 4 步,接著把這些分數經過一個 Softmax 層,Softmax可以將分數歸一化,這樣使得分數都是正數并且加起來等于 1。
第 5 步,得到每個位置的分數后,將每個分數分別與每個 Value 向量相乘。這種做法背后的直覺理解就是:對于分數高的位置,相乘后的值就越大,我們把更多的注意力放到了它們身上;對于分數低的位置,相乘后的值就越小,這些位置的詞可能是相關性不大的,這樣我們就忽略了這些位置的詞。
第 6 步是把上一步得到的向量相加,就得到了 Self Attention 層在這個位置(這里的例子是第一個位置)的輸出。
- Multi-Head Attention
一組注意力機制是一個head,多組注意力機制就是多頭(Multi-Head),多頭注意力的好處:
1、它擴展了模型關注不同位置的能力。
2、多頭注意力機制賦予 attention 層多個“子表示空間”(一個頭是一個子表示空間)。
???
由四部分組成:
?用linear并分拆成Multi head(作者就將512維向量拆成8份,每64維得到一個向量);
經過Scaled-Dot-Product Attention生成n(8)個B矩陣;
concat,新增一個權重系數,將b1,...,bn,合并成B傳入下一層;
再增加一層Linear Layer。?
- Masked Self-Attention
Masked Multi-Head Attention只允許關注到輸出序列中早于當前位置之前的單詞。具體做法是:在 Self Attention 分數經過 Softmax 層之前,屏蔽當前位置之后的那些位置。
因為解碼器是要預測未來,因此,當前詞后邊的詞是不存在的,需要將當前詞后邊的詞向量的K置為無窮。
(Self-Attention 和 Masked Self-Attention 的區(qū)別)
假設模型只有2個token作為輸入,且正在進行第二個token的計算,則將最后兩個token屏蔽(masked),將未來的token評分為0。
這個屏蔽(masking)是通過attention mask的矩陣進行的,在q.k之后,softmax之前進行,將需要屏蔽的單元格設置為負無窮大或者一個非常大的負數。然后按照self Attention的計算方式完成后續(xù)計算。
(2)Feed Forword NN
(3)位置編碼
GPT-2和GPT的不同有:
1.?GPT-2去掉了fine-tuning層:不再針對不同任務分別進行微調建模,而是不定義這個模型應該做什么任務,模型會自動識別出來需要做什么任務
2.?增加數據集:GPT-2收集了更加廣泛、數量更多的語料組成數據集。該數據集包含800萬個網頁,大小為40G。
3.?增加網絡參數:GPT-2將Transformer堆疊的層數增加到48層,隱層的維度為1600,參數量更是達到了15億
4.?調整transformer:將layer normalization放到每個sub-block之前,并在最后一個Self-attention后再增加一個layer normalization。
3.BERT(雙向語言模型)
BERT(Bidirectional Encoder Representations from Transformers)是Google發(fā)表的論文,基于Transformers-encoder的雙向編碼表示模型。BERT是Transformers應用的一次巨大的成功。在該模型提出時,其在NLP領域的11個方向上都大幅刷新了SOTA。其模型的主要特點可以歸納如下:
Bert有兩種不一樣規(guī)模的模型:Bert(base)是12個encoder,768個隱藏層單元和12個heads,Bert(large)是24個encoder,1024個隱藏層單元和16個heads,原Transformer有配置是6個encoder,512個隱藏層單元和8個heads。
特殊標識:[cls]在樣本Input的開頭,就是classification的意思,可以理解為用于下游的分類任務。
[sep]用于做句子的分割符,在每個句子的結尾。
(1)Transformer-Encoder
與Transformer的模型的encoder一致。特點是(1)Multi-head Attention(2)feed forward NN(3)殘差網絡? (4)位置編碼?等。
- Multi-Head self attention:多頭機制類似于“多通道”特征抽取,self attention通過attention mask動態(tài)編碼變長序列,解決長距離依賴(無位置偏差)、可并行計算;
- Feed-forward :在位置維度計算非線性層級特征;
- Layer Norm & Residuals:加速訓練,使“深度”網絡更加健壯;
(2)MLM(Mask Language Model)
為了實現深度雙向表示,我們采用了隨機按百分比遮擋(masking)輸入數據(Input token),然后預測被遮擋的數據(masked token)。論文中是隨機屏蔽每個句子15%的token,但是有兩個缺點
- 因為[mask]在fine-tuning不被看見,因此在pre-training和fine-tuning是不匹配的。為了減輕這個,我們會進行以下操作,而不是全部用[mask]替換。例:the dog is hairty
80%:使用[mask] token替換單詞,the dog is hairty->the dog is [mask]
10%:使用其他詞隨機替換單詞,the dog is hairty->the dog is apple
10%:保持單詞不改變,the dog is hairty->the dog is hairty,目的是評估真實值和預測值之間的差據
- 使用MLM之后每個批次只有15%的詞被預測,這意味著模型需要更多的預訓練步驟進行處理,收斂速度要比left-to-right模型(GPT)要慢。
(3)NSP(Next Sentence Prediction)
類似于QA(問答)、NLI(自然語言推斷)的下游任務需要理解兩個文本序列之間的關系,我們提出來NSP任務(可以從任何語料庫里生成)。我們從每個預訓練樣本中選擇兩個句子A和B,在B中,有50%是真實的A的next sentence內容,50%是從語料庫隨機選取的,例如圖,摘自論文:
Bert的不足:
-
生成任務表現不佳:預訓練過程和生成過程的不一致,導致在生成任務上效果不佳;
-
采取獨立性假設:沒有考慮預測[MASK]之間的相關性,是對語言模型聯(lián)合概率的有偏估計(不是密度估計);
-
輸入噪聲[MASK],造成預訓練-精調兩階段之間的差異;
-
無法文檔級別的NLP任務,只適合于句子和段落級別的任務;
-
不適合處理NLG任務;由于BERT本身在預訓練過程和生成過程的不一致,并沒有做生成任務的相應機制,導致在生成任務上效果不佳,不能直接應用于生成任務。如果將BERT或者GPT用于Seq2Seq的自然語言生成任務,可以分別進行預訓練編碼器和解碼器,但是編碼器-注意力-解碼器結構沒有被聯(lián)合訓練,BERT和GPT在條件生成任務中只是次優(yōu)效果。
4.ERINE
ERNIE(Enhanced Representation through kNowledge IntEgration)是百度提出的語義表示模型,同樣基于Transformer Encoder,相較于BERT,其預訓練過程利用了更豐富的語義知識和更多的語義任務,在多個NLP任務上取得了比BERT等模型更好的效果。
ERINE有兩個版本:
ERINE1.0(主要更改MLM模塊):
-
在預訓練階段引入知識(實際是預先識別出的實體),引入3種[MASK]策略預測:
-
Basic-Level Masking:跟BERT一樣,對subword進行mask,無法獲取高層次語義;
-
Phrase-Level Masking:mask連續(xù)短語;
-
Entity-Level Masking:mask實體;
-
-
在預訓練階段引入了論壇對話類數據
-
利用對話語言模式(DLM, Dialogue Language Model)建模Query-Response對話結構,將對話Pair對作為輸入,引入Dialogue Embedding標識對話的角色,利用對話響應丟失(DRS, Dialogue Response Loss)學習對話的隱式關系,進一步提升模型的語義表示能力。
-
BERT在預訓練過程中使用的數據僅是對單個字符進行屏蔽,例如圖3所示,訓練Bert通過“哈”與“濱”的局部共現判斷出“爾”字,但是模型其實并沒有學習到與“哈爾濱”相關的知識,即只是學習到“哈爾濱”這個詞,但是并不知道“哈爾濱”所代表的含義;而ERNIE在預訓練時使用的數據是對整個詞進行屏蔽,從而學習詞與實體的表達,例如屏蔽“哈爾濱”與“冰雪”這樣的詞,使模型能夠建模出“哈爾濱”與“黑龍江”的關系,學到“哈爾濱”是“黑龍江”的省會以及“哈爾濱”是個冰雪城市這樣的含義。
ERINE2.0:
在預訓練階段引入多任務學習,預訓練包括了三大類學習任務,分別是:
- 詞法層任務:學會對句子中的詞匯進行預測。
- 語法層任務:學會將多個句子結構重建,重新排序。
- 語義層任務:學會判斷句子之間的邏輯關系,例如因果關系、轉折關系、并列關系等。
5.XLNET
XLNET是自回歸(AR)語言模型,GPT和GPT-2都是AR語言模型。AR語言模型的優(yōu)點是擅長NLP生成任務。因為在生成上下文時,通常是正向的。AR語言模型在這類NLP任務中很自然地工作得很好。但是AR語言模型有一些缺點,它只能使用前向上下文或后向上下文,這意味著它不能同時使用前向上下文和后向上下文。BERT被歸類為自動編碼器(AE)語言模型。AE語言模型的目的是從損壞的輸入中重建原始數據。XLNet提出了一種新的方法,讓AR語言模型從雙向的上下文中學習,避免了AE語言模型中mask方法帶來的弊端。
改進點:
(1)排列語言模型(Permutation LM)
PLM的本質是LM聯(lián)合概率的多種分解機制的體現,將LM的順序拆解推廣到隨機拆解,但是需要保留每個詞的原始位置信息,遍歷其中的分解方法,并且模型參數共享,就可以學習到預測詞上下文。
(2)two-stream self-Attention
two-stream self-Attention解決了沒有目標位置信息的問題。
(3)Transformer-XL
Word2Vec 與 GloVe 技術淺析與對比
[NLP]ELMO理解
【NLP】圖解GPT-2(完整版)
圖解Transformer(完整版)!
BERT、ERNIE、XLNET等15個預訓練模型對比分析與關鍵點探究
總結
以上是生活随笔為你收集整理的这些年,NLP常见的预训练模型剖析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ros学习-中国大学MOOC---《机器
- 下一篇: sklearn——决策树