在自然語言處理(NLP)領(lǐng)域中,使用語言模型預(yù)訓(xùn)練方法在多項NLP任務(wù)上都獲得了很好的提升,也十分吸引大家的眼球。就此,我將最近看的一些相關(guān)論文和博文進(jìn)行總結(jié),選取了幾個代表性模型(包括ELMo ,OpenAI GPT 和BERT)和大家一起學(xué)習(xí)分享。
一個對文本有效的抽象方法可以減輕NLP對監(jiān)督學(xué)習(xí)的依賴。大多數(shù)深度學(xué)習(xí)方法需要大量的人工標(biāo)注信息,這限制了在很多領(lǐng)域的應(yīng)用。在這些情況下,利用來未標(biāo)記數(shù)據(jù)的語言信息的模型來產(chǎn)生更多的注釋,這可能既耗時又昂貴。此外,即使在可獲得相當(dāng)大的監(jiān)督的情況下,以無人監(jiān)督的方式學(xué)習(xí)良好的表示也可以提供顯著的性能提升。到目前為止,最引人注目的證據(jù)是廣泛使用預(yù)訓(xùn)練詞嵌入來提高一系列NLP任務(wù)的性能。
1.1 ELMo的優(yōu)勢
(1)ELMo能夠?qū)W習(xí)到詞匯用法的復(fù)雜性,比如語法、語義。
(2)ELMo能夠?qū)W習(xí)不同上下文情況下的詞匯多義性。
相比word2vec:
ELMo的假設(shè)前提一個詞的詞向量不應(yīng)該是固定的,所以在一詞多意方面ELMo的效果一定比word2vec要好。
word2vec的學(xué)習(xí)詞向量的過程是通過中心詞的上下窗口去學(xué)習(xí),學(xué)習(xí)的范圍太小了,而ELMo在學(xué)習(xí)語言模型的時候是從整個語料庫去學(xué)習(xí)的,而后再通過語言模型生成的詞向量就相當(dāng)于基于整個語料庫學(xué)習(xí)的詞向量,更加準(zhǔn)確代表一個詞的意思。
ELMo還有一個優(yōu)勢,就是它建立語言模型的時候,可以運用非任務(wù)的超大語料庫去學(xué)習(xí),一旦學(xué)習(xí)好了,可以平行的運用到相似問題。
1.2 ELMo的模型簡介
2018年3月份出現(xiàn)了ELMo。在之前2013年的word2vec及2014年的GloVe的工作中,每個詞對應(yīng)一個vector,對于多義詞無能為力。ELMo的工作對于此,提出了一個較好的解決方案。不同于以往的一個詞對應(yīng)一個向量,是固定的。在ELMo世界里,預(yù)訓(xùn)練好的模型不再只是向量對應(yīng)關(guān)系,而是一個訓(xùn)練好的模型。使用時,將一句話或一段話輸入模型,模型會根據(jù)上下文來推斷每個詞對應(yīng)的詞向量。這樣做之后明顯的好處之一就是對于多義詞,可以結(jié)合前后語境對多義詞進(jìn)行理解。比如apple,可以根據(jù)前后文語境理解為公司或水果。
說到詞向量,我們一定會聯(lián)想到word2vec,因為在它提出的詞向量概念給NLP的發(fā)展帶來了巨大的提升。而ELMo的主要做法是先訓(xùn)練一個完整的語言模型,再用這個語言模型去處理需要訓(xùn)練的文本,生成相應(yīng)的詞向量,所以在文中一直強調(diào)ELMo的模型對同一個字在不同句子中能生成不同的詞向量。
原理:
他們使用的是一個雙向的LSTM語言模型,由一個前向和一個后向語言模型構(gòu)成,目標(biāo)函數(shù)就是取這兩個方向語言模型的最大似然。
上圖中的結(jié)構(gòu)使用字符級卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network, CNN)來將文本中的詞轉(zhuǎn)換成原始詞向量(raw word vector)
①將這些原始詞向量輸入雙向語言模型中第一層
②前向迭代中包含了該詞以及該詞之前的一些詞匯或語境的信息
③后向迭代中包含了該詞之后的信息
④這兩種迭代的信息組成了中間詞向量(intermediate word vector),這些中間詞向量被輸入到模型的下一層
⑤最終表示(ELMo)就是原始詞向量和兩個中間詞向量的加權(quán)和
因為雙向語言模型的輸入度量是字符而不是詞匯,該模型能捕捉詞的內(nèi)部結(jié)構(gòu)信息。比如beauty和beautiful,即使不了解這兩個詞的上下文,雙向語言模型也能夠識別出它們的一定程度上的相關(guān)性。
所謂ELMo不過是一些網(wǎng)絡(luò)層的組合。都有哪些網(wǎng)絡(luò)層呢?對于每個單詞(token)tk,對于L層的雙向lstm語言模型,一共有2L+1個表征(representations),如下所示:
ELMo 的方法不局限于sequence labeling, 而是作為一個一般性的詞向量表示方法; 其次, ELMo 不僅僅使用了neural language model 的最后一層的輸出, 而是對所有層的輸出做了加權(quán)平均來構(gòu)造最后的向量 (如下所示).
其中s 是由softmax 算出來的,可以看成是對特定任務(wù)學(xué)習(xí)到的三個詞向量的權(quán)重進(jìn)行的softmax歸一化, 每一個特定任務(wù)的歸一化因子是相同的。gamma 是一個需要學(xué)習(xí)的變量,縮放因子,在具體的任務(wù)模型中學(xué)習(xí)到,調(diào)整的是elmo學(xué)習(xí)到的詞向量占特定任務(wù)中詞向量的權(quán)重。 加不加這個變量對performance 的影響是比較大的。
以上兩個參數(shù)在elmo模型訓(xùn)練好之后還需要在下游模型進(jìn)行訓(xùn)練,相當(dāng)于在下游模型中增加了兩個參數(shù)。
在實驗中還發(fā)現(xiàn)不同層的biLM輸出的token表示對于不同任務(wù)效果不同。
ELMo采用典型的兩階段過程,第一個階段是利用語言模型進(jìn)行預(yù)訓(xùn)練,第二個階段是在做下游任務(wù)時,從預(yù)訓(xùn)練網(wǎng)絡(luò)中提取對應(yīng)單詞的網(wǎng)絡(luò)各層的Word Embedding作為新特征補充到下游任務(wù)中。
將emlo用于下游的任務(wù),論文中提到了三種方式:
(1)中間層和輸入詞向量x進(jìn)行concat
(2)中間層和最后一層的隱藏狀態(tài)concat
(3)同時使用(1)和(2)
缺點:不適合特定任務(wù)
2.1 GPT基本原理
GPT提出一種半監(jiān)督的方式來處理語言理解的任務(wù)。使用非監(jiān)督的預(yù)訓(xùn)練和監(jiān)督方式的微調(diào)。我們的目標(biāo)是學(xué)習(xí)一個通用的語言模型,可以經(jīng)過很小的調(diào)整就應(yīng)用在各種任務(wù)中。
GPT模型圖:
這個模型的設(shè)置不需要目標(biāo)任務(wù)和非標(biāo)注的數(shù)據(jù)集在同一個領(lǐng)域。模型的構(gòu)建可以看成以下兩個過程。
1.對大量非標(biāo)記數(shù)據(jù)集使用語言模型學(xué)習(xí)一個深度模型(非監(jiān)督預(yù)訓(xùn)練)
2.隨后,使用相應(yīng)的監(jiān)督目標(biāo)將這些參數(shù)調(diào)整到目標(biāo)任務(wù)(監(jiān)督微調(diào)fine-tuning)
第一步,輸入:輸入詞向量和每個詞的位置編碼。
第二步,Masked Attention:
在這里我們先介紹一下:self-attention
首先,每個詞都要通過三個矩陣Wq, Wk, Wv進(jìn)行一次線性變化,一分為三,生成每個詞自己的query, key, vector三個向量。以一個詞為中心進(jìn)行Self Attention時,都是用這個詞的key向量與每個詞的query向量做點積,再通過Softmax歸一化出權(quán)重。然后通過這些權(quán)重算出所有詞的vector的加權(quán)和,作為這個詞的輸出。歸一化之前需要通過除以向量的維度dk來進(jìn)行標(biāo)準(zhǔn)化,所以最終Self Attention用矩陣變換的方式可以表示為
最終每個Self Attention接受n個詞向量的輸入,輸出n個加權(quán)向量。
Masked Attention
從上圖中,我們發(fā)現(xiàn)先經(jīng)過一個Masked Attention層。那么Masked的與普通版本的Attention有什么區(qū)別呢?
在transformer中,Encoder因為要編碼整個句子,所以每個詞都需要考慮上下文的關(guān)系。所以每個詞在計算的過程中都是可以看到句子中所有的詞的。但是Decoder與Seq2Seq中的解碼器類似,每個詞都只能看到前面詞的狀態(tài),所以是一個單向的Self-Attention結(jié)構(gòu)。
Masked Attention的實現(xiàn)也非常簡單,只要在普通的Self Attention的Softmax步驟之前,與按位乘上一個下三角矩陣M就好了
第三步:殘差網(wǎng)絡(luò):殘差網(wǎng)絡(luò),將一層的輸入與其標(biāo)準(zhǔn)化后的輸出進(jìn)行相加即可。Transformer中每一個()Attention層與FFN層后面都會連一個Add & Norm層。下圖展示的是encoder模塊中的殘差網(wǎng)絡(luò),在我們GPT中的殘差網(wǎng)絡(luò)原理是一樣的。
第四步:神經(jīng)網(wǎng)絡(luò)
第五步:殘差網(wǎng)絡(luò)
第六步:預(yù)測與下游任務(wù)
2.1.1非監(jiān)督預(yù)訓(xùn)練
文章中使用的是多層Transformer的decoder塊的語言模型。這個多層的結(jié)構(gòu)應(yīng)用multi-headed self-attention在處理輸入的文本加上位置信息的前饋網(wǎng)絡(luò),輸出是詞的概率分布。訓(xùn)練的過程其實非常的簡單,就是將句子n個詞的詞向量(第一個為<SOS>)加上Positional Encoding后輸入到前面提到的模型中,n個輸出分別預(yù)測該位置的下一個詞(<SOS>預(yù)測句子中的第一個詞,最后一個詞的預(yù)測結(jié)果不用于語言模型的訓(xùn)練,因為是一個結(jié)束符)。
2.1.2監(jiān)督微調(diào)fine-tuning
我們增加了語言模型去輔助微調(diào),提高了監(jiān)督模型的結(jié)果。為避免Fine-Tuning使得模型陷入過擬合,文中還提到了輔助訓(xùn)練目標(biāo)的方法,類似于一個多任務(wù)模型或者半監(jiān)督學(xué)習(xí)。具體方法就是在使用最后一個詞的預(yù)測結(jié)果進(jìn)行監(jiān)督學(xué)習(xí)的同時,前面的詞繼續(xù)上一步的無監(jiān)督訓(xùn)練,使得最終的損失函數(shù)成為:
模型結(jié)構(gòu)如下:
1) Classification:對于分類問題,不需要做什么修改
2) Entailment:對于推理問題,可以將先驗與假設(shè)使用一個分隔符分開
3) Similarity:對于相似度問題,由于模型是單向的,但相似度與順序無關(guān)。所以需要將兩個句子順序顛倒后兩次輸入的結(jié)果相加來做最后的推測
4)Multiple Choice:對于問答問題,則是將上下文、問題放在一起與答案分隔開,然后進(jìn)行預(yù)測。
適用場景:分類、推理、問答、相似度等應(yīng)用的場景。
3.1.bert簡介
Bert是谷歌于2018年發(fā)布的NLP領(lǐng)域的預(yù)訓(xùn)練模型,BERT等經(jīng)過預(yù)處理的語言模型在問答、命名實體識別、自然語言推理、文本分類等自然語言處理任務(wù)中發(fā)揮著重要作用。bert模型是使用雙向Transformer模型的EncoderLayer進(jìn)行特征提?。╞ert中沒有Decoder模塊)。前面一章我們介紹了Transformer的工作原理,這里就不加贅述啦。
在bert中的Encoder block的結(jié)構(gòu)如下圖:
BERT模型如下圖中左邊第一個所示,它與OpenAI GPT的區(qū)別就在于采用了Transformer Encoder,也就是每個時刻的Attention計算都能夠得到全部時刻的輸入,而OpenAI GPT采用了Transformer Decoder,每個時刻的Attention計算只能依賴于該時刻前的所有時刻的輸入,因為OpenAI GPT是采用了單向語言模型。
從圖中可以看出BERT、GPT和ELMO三個模型的區(qū)別:
BERT VS GPT :BERT 模型使用多層雙向Transformer作為特征提取器,同時提取上下文信息,GPT模型使用多層單向Transformer作為特征提取器,用于提取上文信息 。相較于GPT,BERT 多使用了下文信息 ;
BERT VS ELMO:BERT 模型使用多層雙向Transformer作為特征提取器,同時提取 上下文信息,ELMO模型使用兩對雙層雙向LSTM分別提取上文信息和下文信息 ,然后將提取的信息進(jìn)行拼接后使用。相較于ELMO,BERT使用了更強大的Transformer作為特征提取器,且BERT是同時提取上下文信息,相較于ELMO分別提取上文信息和下文信息,更加的“渾然天成”。
3.2 Bert模型的構(gòu)建
其實bert也是由兩個階段構(gòu)成:
1. pre-train:用大量的無監(jiān)督文本通過自監(jiān)督訓(xùn)練的方式進(jìn)行訓(xùn)練,bert是一個多任務(wù)模型,它的任務(wù)就是由兩個自監(jiān)督任務(wù)組成,即MLM和NSP。
2. fine-tune階段:使用預(yù)訓(xùn)練的模型,在特定的任務(wù)中進(jìn)行微調(diào),得到用于解決該任務(wù)的定制模型。
第一部分:輸入表示
如上圖所示,BERT模型有兩個特殊的token:CLS(用于分類任務(wù))、 SEP(用于斷句),以及三個embedding:
(1)token embedding:輸入的文本經(jīng)過tokenization之后,將 CLS插入tokenization結(jié)果的開頭, SEP 插入到tokenization結(jié)果的結(jié)尾。然后進(jìn)行 token embedding look up 。shape為:[seq_length, embedding_dims]’。流程如下圖所示:
(2)segment embedding:在NSP任務(wù)中,用于區(qū)分第一句和第二句。segment embedding中只有0和1兩個值,第一句所有的token(包括 cls 和緊隨第一句的sep)的segment embedding的值為0,第二句所有的token(包括緊隨第二句的sep)的segment embdding的值為1。shape為:[seq_length, embedding_dims]。流程如下圖所示:
(3)position embedding:因Transformer-encoderlayer無法捕獲文本的位置信息,而文本的位置信息又非常重要(“你欠我500萬”和“我欠你500萬”的感覺肯定不一樣),因此需要額外把位置信息輸入到模型中。 BERT的位置信息是通過 sin函數(shù)和cos函數(shù)算出來的,shape為:[seq_length, embedding_dims]。該部分參數(shù)在訓(xùn)練時不參與更新。
備注:BERT的輸入為:token_embedding + segment_embedding + position_embedding。
3.2.1預(yù)訓(xùn)練
下面我們開始講講預(yù)訓(xùn)練部分
預(yù)訓(xùn)練任務(wù)1:
遮掩語言模型(Masked Language Modeling)。標(biāo)準(zhǔn)的語言模型(LM)是從左到右或者從右到左進(jìn)行訓(xùn)練,因為雙向的訓(xùn)練會讓每個詞都可以通過多層的上下文看到他自己。故BERT模型為了多層雙向進(jìn)行訓(xùn)練,就簡單的使用了隨機遮蓋住一定比例的輸入標(biāo)記,然后僅僅預(yù)測這些遮住的輸入標(biāo)記。我們把這種方式稱為"masked LM"(MLM)。在這種情況下,被遮蓋的標(biāo)記對應(yīng)的最終的隱藏向量與其他標(biāo)準(zhǔn)語言模型所得的最終隱藏向量一樣被進(jìn)行softmax到詞匯表上。在我們所有的實驗中,我們在每一個序列中隨機的遮蓋了15%的WordPiece標(biāo)記,并且我們只預(yù)測被遮蓋的詞語,而不是重構(gòu)整個輸入。
雖然這允許我們做雙向的與訓(xùn)練模型,但是這種方法仍然有兩個弊端。第一個是這種方法會讓預(yù)訓(xùn)練和微調(diào)不能相互匹配,因為[MASK]標(biāo)記在微調(diào)中是不存在的。為了減輕這種弊端,我們并不總是把15%隨機產(chǎn)生的tokens都用[MASK]表示,而是,比如,在句子"my dog is hairy"中選擇"hairy",然后通過以下的方式產(chǎn)生標(biāo)記:
* 并不總是用[MASK]替換選擇的詞,數(shù)據(jù)通過如下方式產(chǎn)生:
* 80%的情況下:把選擇的詞替換成[MASK],比如:"my dog is hairy" → "my dog is [MASK]"
* 10%的情況下替換選中的詞為隨機詞,比如:"my dog is hairy" → "my dog is apple"
* 10% 的情況下保持原詞不變,比如:"my dog is hairy" → "my dog is hairy"。
這么做的原因是如果句子中的某個token100%都會被mask掉,那么在fine-tuning的時候模型就會有一些沒有見過的單詞。加入隨機token的原因是因為Transformer要保持對每個輸入token的分布式表征,否則模型就會記住這個[mask]是token ‘hairy’。至于單詞帶來的負(fù)面影響,因為一個單詞被隨機替換掉的概率只有15%*10% =1.5%,這個負(fù)面影響其實是可以忽略不計的。
第二個弊端是使用一個MLM意味著每個batch中只有15%的標(biāo)記會被預(yù)測,所以在預(yù)訓(xùn)練的時候收斂需要更多步。在5.3中我們會闡述MLM的收斂速度比從左至右的模型(預(yù)測每一個標(biāo)記)慢,但是和MLM帶來的巨大提升相比,這么做是值得的。
預(yù)訓(xùn)練任務(wù)二:
Next Sentence Prediction(NSP)的任務(wù)是判斷句子B是否是句子A的下文。如果是的話輸出‘IsNext’,否則輸出‘NotNext’。訓(xùn)練數(shù)據(jù)的生成方式是從平行語料中隨機抽取的連續(xù)兩句話,其中50%保留抽取的兩句話,它們符合IsNext關(guān)系,另外50%的第二句話是隨機從預(yù)料中提取的,它們的關(guān)系是NotNext的。這個關(guān)系保存在[CLS]符號中。
我們要求模型除了做上述的Masked語言模型任務(wù)外,附帶再做個句子關(guān)系預(yù)測,判斷第二個句子是不是真的是第一個句子的后續(xù)句子。之所以這么做,是考慮到很多NLP任務(wù)是句子關(guān)系判斷任務(wù)時,單詞預(yù)測粒度的訓(xùn)練到不了句子關(guān)系這個層級,故增加這個任務(wù)有助于下游句子關(guān)系判斷任務(wù)。所以可以看到,bert的預(yù)訓(xùn)練是個多任務(wù)過程。這也是Bert的一個創(chuàng)新。其實這個下一句的預(yù)測就變成了二分類問題了,如下:
Input: the man went to the store [SEP] he bought a gallon of milk
Label: IsNext
Input: the man went to the store [SEP] penguins are flightless birds
Label: NotNext
Bert預(yù)訓(xùn)練所使用的語料是:BooksCorpus(800M words)和EnglishWikipedia(2500M words)加在一起使用。對于維基的數(shù)據(jù)我們僅僅提取了文章部分,忽略了列表,表格和頭部信息。
3.2.2 fine-tuning
微調(diào)的主要任務(wù)可以分為下面幾個部分:
(a)基于句子對的分類任務(wù):
MNLI:給定一個前提 (Premise) ,根據(jù)這個前提去推斷假設(shè) (Hypothesis) 與前提的關(guān)系。該任務(wù)的關(guān)系分為三種,蘊含關(guān)系 (Entailment)、矛盾關(guān)系 (Contradiction) 以及中立關(guān)系 (Neutral)。所以這個問題本質(zhì)上是一個分類問題,我們需要做的是去發(fā)掘前提和假設(shè)這兩個句子對之間的交互信息。
QQP:基于Quora,判斷 Quora 上的兩個問題句是否表示的是一樣的意思。
QNLI:用于判斷文本是否包含問題的答案,類似于我們做閱讀理解定位問題所在的段落。
STS-B:預(yù)測兩個句子的相似性,包括5個級別。
MRPC:也是判斷兩個句子是否是等價的。
RTE:類似于MNLI,但是只是對蘊含關(guān)系的二分類判斷,而且數(shù)據(jù)集更小。
SWAG:從四個句子中選擇最可能為前句下文的那個。
(b)基于單個句子的分類任務(wù)
SST-2:電影評價的情感分析。
CoLA:句子語義判斷,是否是可接受的(Acceptable)。
對于GLUE數(shù)據(jù)集的分類任務(wù)(MNLI,QQP,QNLI,SST-B,MRPC,RTE,SST-2,CoLA),BERT的微調(diào)方法是根據(jù)[CLS]標(biāo)志生成一組特征向量,并通過一層全連接進(jìn)行微調(diào)。損失函數(shù)根據(jù)任務(wù)類型自行設(shè)計,例如多分類的softmax或者二分類的sigmoid。
SWAG的微調(diào)方法與GLUE數(shù)據(jù)集類似,只不過其輸出是四個可能選項的softmax:
(c)問答任務(wù)
SQuAD v1.1:給定一個句子(通常是一個問題)和一段描述文本,輸出這個問題的答案,類似于做閱讀理解的簡答題。如圖(c)表示的,SQuAD的輸入是問題和描述文本的句子對。輸出是特征向量,通過在描述文本上接一層激活函數(shù)為softmax的全連接來獲得輸出文本的條件概率,全連接的輸出節(jié)點個數(shù)是語料中Token的個數(shù)。
(d)命名實體識別
CoNLL-2003 NER:判斷一個句子中的單詞是不是Person,Organization,Location,Miscellaneous或者other(無命名實體)。微調(diào)CoNLL-2003 NER時將整個句子作為輸入,在每個時間片輸出一個概率,并通過softmax得到這個Token的實體類別。
BERT的缺點:
BERT的預(yù)訓(xùn)練任務(wù)MLM使得能夠借助上下文對序列進(jìn)行編碼,但同時也使得其預(yù)訓(xùn)練過程與中的數(shù)據(jù)與微調(diào)的數(shù)據(jù)不匹配,難以適應(yīng)生成式任務(wù)
另外,BERT沒有考慮預(yù)測[MASK]之間的相關(guān)性,是對語言模型聯(lián)合概率的有偏估計
由于最大輸入長度的限制,適合句子和段落級別的任務(wù),不適用于文檔級別的任務(wù)(如長文本分類);
適合處理自然語義理解類任務(wù)(NLU),而不適合自然語言生成類任務(wù)(NLG)
參考文獻(xiàn)
[1] https://blog.csdn.net/cpluss/article/details/81451264
[2] https://blog.csdn.net/s1434088958/article/details/93360013
[3] https://blog.csdn.net/triplemeng/article/details/82380202
[4] https://blog.csdn.net/nht1996/article/details/93777237
[5] https://blog.csdn.net/zyq11223/article/details/93595905
[6] https://zhuanlan.zhihu.com/p/69290203
[7] http://www.sohu.com/a/332894905_680233
[8] https://zhuanlan.zhihu.com/p/46833276
[9] https://zhuanlan.zhihu.com/p/48612853
[10] https://www.jianshu.com/p/2045dbe7ff9d
[11] https://www.tuicool.com/articles/iaANfqV
(部分文字、圖片來自網(wǎng)絡(luò),如涉及侵權(quán),請及時與我們聯(lián)系,我們會在第一時間刪除或處理侵權(quán)內(nèi)容。電話:4006770986 負(fù)責(zé)人:張明)