bert 多义词_自然语言处理:Bert及其他
以下內(nèi)容主要參考了文末列出的參考文獻(xiàn),在此表示感謝!
2018年被認(rèn)為是NLP技術(shù)的new era的開始。在這一年,提出了多種有創(chuàng)新性的技術(shù),而且最后的集大成者Bert在NLP的多項(xiàng)任務(wù)中屠榜,造成的震撼不比當(dāng)初神經(jīng)網(wǎng)絡(luò)初次在ImageNet登場時小。
我們首先來看一下BERT的光輝戰(zhàn)績。
NLP一般可分為四大類任務(wù):
- 序列標(biāo)注:分詞/POS Tag/NER/語義標(biāo)注
- 分類任務(wù):文本分類/情感計(jì)算
- 句子關(guān)系判斷:Entailment/QA/自然語言推理
- 生成式任務(wù):機(jī)器翻譯/文本摘要....
絕大部分NLP問題可以歸入上圖所示的四類任務(wù)中:一類是序列標(biāo)注,這是最典型的NLP任務(wù),比如中文分詞,詞性標(biāo)注,命名實(shí)體識別,語義角色標(biāo)注等都可以歸入這一類問題,它的特點(diǎn)是句子中每個單詞要求模型根據(jù)上下文都要給出一個分類類別。第二類是分類任務(wù),比如我們常見的文本分類,情感計(jì)算等都可以歸入這一類。它的特點(diǎn)是不管文章有多長,總體給出一個分類類別即可。第三類任務(wù)是句子關(guān)系判斷,比如Entailment,QA,語義改寫,自然語言推理等任務(wù)都是這個模式,它的特點(diǎn)是給定兩個句子,模型判斷出兩個句子是否具備某種語義關(guān)系;第四類是生成式任務(wù),比如機(jī)器翻譯,文本摘要,寫詩造句,看圖說話等都屬于這一類。它的特點(diǎn)是輸入文本內(nèi)容后,需要自主生成另外一段文字。
在2018年Google的論文中推出了兩種BERT,一個是BERT Base,一種是BERT LARGE。兩者結(jié)構(gòu)相似,主要是層數(shù)不同。BERT基本具有與OpenAI GPT完全相同的參數(shù):L = 12,H = 768,A = 12其中L是堆疊的編碼器的數(shù)量,H是隱藏大小,A是MultiHead attention中的頭數(shù)。 BERT large基本上更大且計(jì)算密集度更高:L = 24,H = 1024,A = 16。從論文的結(jié)果中可以看出:BERT Base 超過 OpenAI GPT,并且BERT Large超過BERT base。
接下來看一下BERT在各項(xiàng)任務(wù)上的成績:
GLUE
一般語言理解評估(GLUE)基準(zhǔn)(Wang et al,2018)是各種自然語言理解任務(wù)的集合。有8個GLUE分類任務(wù)用于評估績效。BERT Base不僅所有任務(wù)上超過了OpenAI GPT 達(dá)到了SOTA,而且平均將SOTA提高了5%。 對于所有任務(wù),BERT Large 超過 BERT Base。
SQUAD
Standford問題回答數(shù)據(jù)集(SQuAD)是100k問答對的集合(Rajpurkar等,2016)。 給定一個問題和維基百科中包含答案的段落,任務(wù)是預(yù)測段落中的答案文本范圍。在SQUAD中,BERT大大提升了性能。 獲得最高分的模型是BERT LARGE模型集成,使用TriviaQA擴(kuò)充數(shù)據(jù)集。
命名實(shí)體識別
為了評估Tag標(biāo)記任務(wù)的性能,在CoNLL 2003命名實(shí)體識別(NER)數(shù)據(jù)集上微調(diào)BERT。 該數(shù)據(jù)集由200k個訓(xùn)練單詞組成,這些單詞已注釋為人員、組織、位置、雜項(xiàng)或其他(非命名實(shí)體)。在NER中,BERT Large在一定程度上實(shí)現(xiàn)了SOTA,但沒有大幅提高。
SWAG
具有對抗性生成的情境(SWAG)數(shù)據(jù)集包含113k個句子對完成示例,其評估基于常識的推斷(Zellers等,2018)。在這項(xiàng)任務(wù)中,BERT以驚人的27.1%大幅改進(jìn)SOTA,這是超人的表現(xiàn)!
消融研究(Ablation Study)
作者還進(jìn)行了許多有用的消融研究。 最重要的一點(diǎn)是:
- BERT和OpenAI GPT之間的大多數(shù)性能差異可以通過雙向性來解釋。
在BERT中,最主要的創(chuàng)新包括Bi-directional,雙向性以及next sentence prediction,但是從消融研究來看,起到最重要作用的是雙向性。
接下來我們來討論一下2018年的重要工作,ELMo,GPT以及BERT。
前面介紹了BERT的效果,另一方面是Bert具備廣泛的通用性,就是說絕大部分NLP任務(wù)都可以采用BERT的兩階段模式直接去提升效果。我們先看一下BERT的兩階段模式。
預(yù)訓(xùn)練過程就是做圖像或者視頻領(lǐng)域的一種比較常規(guī)的做法,而且這種做法很有效,能明顯促進(jìn)應(yīng)用的效果。
那么圖像領(lǐng)域怎么做預(yù)訓(xùn)練呢,上圖展示了這個過程,我們設(shè)計(jì)好網(wǎng)絡(luò)結(jié)構(gòu)以后,對于圖像來說一般是CNN的多層疊加網(wǎng)絡(luò)結(jié)構(gòu),可以先用某個訓(xùn)練集合比如訓(xùn)練集合A或者訓(xùn)練集合B對這個網(wǎng)絡(luò)進(jìn)行預(yù)先訓(xùn)練,在A任務(wù)上或者B任務(wù)上學(xué)會網(wǎng)絡(luò)參數(shù),然后存起來以備后用。假設(shè)我們面臨第三個任務(wù)C,網(wǎng)絡(luò)結(jié)構(gòu)采取相同的網(wǎng)絡(luò)結(jié)構(gòu),在比較淺的幾層CNN結(jié)構(gòu),網(wǎng)絡(luò)參數(shù)初始化的時候可以加載A任務(wù)或者B任務(wù)學(xué)習(xí)好的參數(shù),其它CNN高層參數(shù)仍然隨機(jī)初始化。之后我們用C任務(wù)的訓(xùn)練數(shù)據(jù)來訓(xùn)練網(wǎng)絡(luò),此時有兩種做法,一種是淺層加載的參數(shù)在訓(xùn)練C任務(wù)過程中不動,這種方法被稱為“Frozen”;另外一種是底層網(wǎng)絡(luò)參數(shù)盡管被初始化了,在C任務(wù)訓(xùn)練過程中仍然隨著訓(xùn)練的進(jìn)程不斷改變,這種一般叫“Fine-Tuning”,顧名思義,就是更好地把參數(shù)進(jìn)行調(diào)整使得更適應(yīng)當(dāng)前的C任務(wù)。一般圖像或者視頻領(lǐng)域要做預(yù)訓(xùn)練一般都這么做。
這么做有幾個好處,首先,如果手頭任務(wù)C的訓(xùn)練集合數(shù)據(jù)量較少的話,現(xiàn)階段的好用的CNN比如Resnet/Densenet/Inception等網(wǎng)絡(luò)結(jié)構(gòu)層數(shù)很深,幾百萬上千萬參數(shù)量算起步價(jià),上億參數(shù)的也很常見,訓(xùn)練數(shù)據(jù)少很難很好地訓(xùn)練這么復(fù)雜的網(wǎng)絡(luò),但是如果其中大量參數(shù)通過大的訓(xùn)練集合比如ImageNet預(yù)先訓(xùn)練好直接拿來初始化大部分網(wǎng)絡(luò)結(jié)構(gòu)參數(shù),然后再用C任務(wù)手頭比較可憐的數(shù)據(jù)量上Fine-tuning過程去調(diào)整參數(shù)讓它們更適合解決C任務(wù),那事情就好辦多了。這樣原先訓(xùn)練不了的任務(wù)就能解決了,即使手頭任務(wù)訓(xùn)練數(shù)據(jù)也不少,加個預(yù)訓(xùn)練過程也能極大加快任務(wù)訓(xùn)練的收斂速度,所以這種預(yù)訓(xùn)練方式是老少皆宜的解決方案,另外療效又好,所以在做圖像處理領(lǐng)域很快就流行開來。
為什么這種預(yù)訓(xùn)練模式是可行的呢?
目前我們已經(jīng)知道,對于層級的CNN結(jié)構(gòu)來說,不同層級的神經(jīng)元學(xué)習(xí)到了不同類型的圖像特征,由底向上特征形成層級結(jié)構(gòu),如上圖所示,如果我們手頭是個人臉識別任務(wù),訓(xùn)練好網(wǎng)絡(luò)后,把每層神經(jīng)元學(xué)習(xí)到的特征可視化肉眼看一看每層學(xué)到了啥特征,你會看到最底層的神經(jīng)元學(xué)到的是線段等特征,圖示的第二個隱層學(xué)到的是人臉五官的輪廓,第三層學(xué)到的是人臉的輪廓,通過三步形成了特征的層級結(jié)構(gòu),越是底層的特征越是所有不論什么領(lǐng)域的圖像都會具備的比如邊角線弧線等底層基礎(chǔ)特征,越往上抽取出的特征越與手頭任務(wù)相關(guān)。正因?yàn)榇?#xff0c;所以預(yù)訓(xùn)練好的網(wǎng)絡(luò)參數(shù),尤其是底層的網(wǎng)絡(luò)參數(shù)抽取出特征跟具體任務(wù)越無關(guān),越具備任務(wù)的通用性,所以這是為何一般用底層預(yù)訓(xùn)練好的參數(shù)初始化新任務(wù)網(wǎng)絡(luò)參數(shù)的原因。而高層特征跟任務(wù)關(guān)聯(lián)較大,實(shí)際可以不用使用,或者采用Fine-tuning用新數(shù)據(jù)集合清洗掉高層無關(guān)的特征抽取器。
一般用ImageNet來做網(wǎng)絡(luò)的預(yù)訓(xùn)練,主要有兩點(diǎn),一方面ImageNet是圖像領(lǐng)域里有超多事先標(biāo)注好訓(xùn)練數(shù)據(jù)的數(shù)據(jù)集合,分量足是個很大的優(yōu)勢,量越大訓(xùn)練出的參數(shù)越靠譜;另外一方面因?yàn)镮mageNet有1000類,類別多,算是通用的圖像數(shù)據(jù),跟領(lǐng)域沒太大關(guān)系。
那我們思考一下,在NLP領(lǐng)域的預(yù)訓(xùn)練模型是啥?
NLP領(lǐng)域也有類似的預(yù)訓(xùn)練模型,就是詞向量機(jī)制。
譬如這樣經(jīng)過查表:
然后一句話可以表示為
結(jié)合下圖:
如上圖所示,有個NLP的下游任務(wù),QA,就是問答問題。所謂問答問題,指的是給定一個問題X,給定另外一個句子Y,要判斷句子Y是否是問題X的正確答案。使用問答問題假設(shè)設(shè)計(jì)的網(wǎng)絡(luò)結(jié)構(gòu)如上圖所示,來演示如何使用訓(xùn)練好的Word Embedding。句子中每個單詞以O(shè)nehot形式作為輸入,然后乘以學(xué)好的Word Embedding矩陣Q,就直接取出單詞對應(yīng)的Word Embedding了。那個Word Embedding矩陣Q其實(shí)就是網(wǎng)絡(luò)Onehot層到embedding層映射的網(wǎng)絡(luò)參數(shù)矩陣。所以你看到了,使用Word Embedding等價(jià)于什么?等價(jià)于把Onehot層到embedding層的網(wǎng)絡(luò)用預(yù)訓(xùn)練好的參數(shù)矩陣Q初始化了。這跟前面講的圖像領(lǐng)域的低層預(yù)訓(xùn)練過程其實(shí)是一樣的,區(qū)別無非Word Embedding只能初始化第一層網(wǎng)絡(luò)參數(shù),再高層的參數(shù)就無能為力了。下游NLP任務(wù)在使用Word Embedding的時候也類似圖像有兩種做法,一種是Frozen,就是Word Embedding那層網(wǎng)絡(luò)參數(shù)固定不動;另外一種是Fine-Tuning,就是Word Embedding這層參數(shù)使用新的訓(xùn)練集合訓(xùn)練也需要跟著訓(xùn)練過程更新掉。
我們上星期討論word2vec的時候,把它夸成了一朵花兒。word2vec的好處是它可以捕捉語義信息,而且在CBOW中,它同時使用了上下文信息。使用word2vec對很多NLP任務(wù)都有幫助。但是word2vec也有自己的問題。最主要的問題是什么呢?
多義詞是自然語言中經(jīng)常出現(xiàn)的現(xiàn)象,也是語言靈活性和高效性的一種體現(xiàn)。多義詞對Word Embedding來說有什么負(fù)面影響?如上圖所示,比如多義詞Bank,有兩個常用含義,但是Word Embedding在對bank這個單詞進(jìn)行編碼的時候,是區(qū)分不開這兩個含義的,因?yàn)樗鼈儽M管上下文環(huán)境中出現(xiàn)的單詞不同,但是在用語言模型訓(xùn)練的時候,不論什么上下文的句子經(jīng)過word2vec,都是預(yù)測相同的單詞bank,而同一個單詞占的是同一行的參數(shù)空間,這導(dǎo)致兩種不同的上下文信息都會編碼到相同的word embedding空間里去。所以word embedding無法區(qū)分多義詞的不同語義,這就是它的一個比較嚴(yán)重的問題。
ELMO
ELmo模型是AllenNLP在2018年8月發(fā)布的一個上下文無關(guān)模型,在BERT沒出來時,也小有名氣。ELMO是“Embedding from Language Models”的簡稱,其實(shí)這個名字并沒有反應(yīng)它的本質(zhì)思想,提出ELMO的論文題目:“Deep contextualized word representation”更能體現(xiàn)其精髓,而精髓在哪里?在deep contextualized這個短語,一個是deep,一個是context,其中context更關(guān)鍵。在此之前的Word Embedding本質(zhì)上是個靜態(tài)的方式,所謂靜態(tài)指的是訓(xùn)練好之后每個單詞的表達(dá)就固定住了,以后使用的時候,不論新句子上下文單詞是什么,這個單詞的Word Embedding不會跟著上下文場景的變化而改變,所以對于比如Bank這個詞,它事先學(xué)好的Word Embedding中混合了幾種語義 ,在應(yīng)用中來了個新句子,即使從上下文中(比如句子包含money等詞)明顯可以看出它代表的是“銀行”的含義,但是對應(yīng)的Word Embedding內(nèi)容也不會變,它還是混合了多種語義。這是為何說它是靜態(tài)的,這也是問題所在。ELMO的本質(zhì)思想是:我事先用語言模型學(xué)好一個單詞的Word Embedding,此時多義詞無法區(qū)分,不過這沒關(guān)系。在我實(shí)際使用Word Embedding的時候,單詞已經(jīng)具備了特定的上下文了,這個時候我可以根據(jù)上下文單詞的語義去調(diào)整單詞的Word Embedding表示,這樣經(jīng)過調(diào)整后的Word Embedding更能表達(dá)在這個上下文中的具體含義,自然也就解決了多義詞的問題了。所以ELMO本身是個根據(jù)當(dāng)前上下文對Word Embedding動態(tài)調(diào)整的思路。
上圖展示的是ELMO的預(yù)訓(xùn)練過程,它的網(wǎng)絡(luò)結(jié)構(gòu)采用了雙層雙向LSTM,目前語言模型訓(xùn)練的任務(wù)目標(biāo)是根據(jù)單詞
的上下文去正確預(yù)測單詞,之前的單詞序列Context-before稱為上文,之后的單詞序列Context-after稱為下文。圖中左端的前向雙層LSTM代表正方向編碼器,輸入的是從左到右順序的除了預(yù)測單詞外的上文Context-before;右端的逆向雙層LSTM代表反方向編碼器,輸入的是從右到左的逆序的句子下文Context-after;每個編碼器的深度都是兩層LSTM疊加。這個網(wǎng)絡(luò)結(jié)構(gòu)其實(shí)在NLP中是很常用的。使用這個網(wǎng)絡(luò)結(jié)構(gòu)利用大量語料做語言模型任務(wù)就能預(yù)先訓(xùn)練好這個網(wǎng)絡(luò),如果訓(xùn)練好這個網(wǎng)絡(luò)后,輸入一個新句子,句子中每個單詞都能得到對應(yīng)的三個Embedding:最底層是單詞的Word Embedding,往上走是第一層雙向LSTM中對應(yīng)單詞位置的Embedding,這層編碼單詞的句法信息更多一些;再往上走是第二層LSTM中對應(yīng)單詞位置的Embedding,這層編碼單詞的語義信息更多一些。也就是說,ELMO的預(yù)訓(xùn)練過程不僅僅學(xué)會單詞的Word Embedding,還學(xué)會了一個雙層雙向的LSTM網(wǎng)絡(luò)結(jié)構(gòu),而這兩者后面都有用。通過把正向和反向的隱藏層狀態(tài)連接起來:
ELMO采用了典型的兩階段過程,第一個階段是利用語言模型進(jìn)行預(yù)訓(xùn)練;第二個階段是在做下游任務(wù)時,從預(yù)訓(xùn)練網(wǎng)絡(luò)中提取對應(yīng)單詞的網(wǎng)絡(luò)各層的Word Embedding作為新特征補(bǔ)充到下游任務(wù)中。
上面介紹的是ELMO的第一階段:預(yù)訓(xùn)練階段。那么預(yù)訓(xùn)練好網(wǎng)絡(luò)結(jié)構(gòu)后,如何給下游任務(wù)使用呢?上圖展示了下游任務(wù)的使用過程,比如我們的下游任務(wù)仍然是QA問題,此時對于問句X,我們可以先將句子X作為預(yù)訓(xùn)練好的ELMO網(wǎng)絡(luò)的輸入,這樣句子X中每個單詞在ELMO網(wǎng)絡(luò)中都能獲得對應(yīng)的三個Embedding。這種三層的結(jié)構(gòu)也類似于圖像處理中的從底層到高層語義逐漸復(fù)雜。之后給予這三個Embedding中的每一個Embedding一個權(quán)重a,這個權(quán)重可以學(xué)習(xí)得來,根據(jù)各自權(quán)重累加求和,將三個Embedding整合成一個。然后將整合后的這個Embedding作為X句在自己任務(wù)的那個網(wǎng)絡(luò)結(jié)構(gòu)中對應(yīng)單詞的輸入,以此作為補(bǔ)充的新特征給下游任務(wù)使用。對于上圖所示下游任務(wù)QA中的回答句子Y來說也是如此處理。因?yàn)镋LMO給下游提供的是每個單詞的特征形式,所以這一類預(yù)訓(xùn)練的方法被稱為“Feature-based Pre-Training”。
使用雙向LSTM,一開始的訓(xùn)練目標(biāo)可以表示為:
具體來說是通過雙方向預(yù)測單詞,前向過程中,用1~k-1的詞去預(yù)測第k個詞,后向過程中,用k+1~N的詞去預(yù)測第k個詞。在計(jì)算損失函數(shù)的時候,也同時考慮了雙向的損失,這樣,使得詞的特征提取具有了雙向性。
ELMO的前輩,TagLM:
ELMo使用雙層BiLSTM來訓(xùn)練語言模型,創(chuàng)新是線性組合不同層的word vectors, 作為最終的word representation。核心公式:
其中,
是各層表示的權(quán)重, 是該次任務(wù)的權(quán)重。這里可以看到,這兩個參數(shù)都是和具體的任務(wù)相關(guān)的,因此,即使是相同的詞,在不同的上下文中也有不同的詞向量表示。- 第一層是普通的word embedding 可以用wrod2vec或者glove來得到,或者使用character level得到token embedding》 這部分是general embedding,上下文無關(guān)。文中使用的character level的CNN+Highway.
- 后面連接兩個biLSTM 去encode 輸入(同時也有殘差連接), 每一層LSTM得到的輸出(隱狀態(tài)) 作為每個詞的上下文相關(guān)的word vectors.
- 這樣每個詞就會有(L+1)個詞向量,L為biLSTM的層數(shù).
- 詞向量的線性組合,針對不同的任務(wù),不同層的向量做不同的權(quán)重加和。 其中權(quán)重s是一個維度為L的vector,參與訓(xùn)練。
因此ELMo的基本輸入單元為句子,每個詞沒有固定的詞向量,是根據(jù)詞的上下文環(huán)境來動態(tài)產(chǎn)生當(dāng)前詞的詞向量,常見的場景可以較好解決一詞多義的問題,這一點(diǎn)跟word2vec與glove等通用詞向量模型是不同的。
另外比較有趣的一點(diǎn)是,ELMO和BERT是動畫片《芝麻街》中的兩個人物。
ELMO可以較好地解決多義詞的問題。
在各項(xiàng)任務(wù)中也有不錯的表現(xiàn):
那么ELMO的缺點(diǎn)是什么呢?
首先,“不完全雙向”。是指模型的前向和后向LSTM兩個模型是分別訓(xùn)練的,從圖中也可以看出,對于一個序列,前向遍歷一遍獲得左邊的LSTM,后向遍歷一遍獲得右邊的LSTM,最后得到的隱層向量直接拼接得到結(jié)果向量(前向的hidden state1 + 后向的hidden state2 = 總的hidden state,+是concat),并且在最后的Loss function中也是前向和后向的loss function直接相加,并非完全同時的雙向計(jì)算。
另外,“自己看見自己”。是指要預(yù)測的下一個詞在給定的序列中已經(jīng)出現(xiàn)的情況。傳統(tǒng)語言模型的數(shù)學(xué)原理決定了它的單向性。從公式
可以看出,傳統(tǒng)語言模型的目標(biāo)是獲得在給定序列從頭到尾條件概率相乘后概率最大的下一詞,而雙向模型會導(dǎo)致預(yù)測的下一詞已經(jīng)在給定序列中出現(xiàn)了的問題,這就是“自己看見自己”。如下圖所示(圖片從下往上看),最下行是訓(xùn)練數(shù)據(jù)A B C D,經(jīng)過兩個bi-lstm操作,需要預(yù)測某個詞位置的內(nèi)容。比如第二行第二列A|CD這個結(jié)果是第一層bi-lstm在B位置輸出內(nèi)容,包括正向A和反向CD,直接拼接成A|CD。比如第三行第二例ABCD這個結(jié)果是前向BCD和反向AB|D拼接結(jié)果,而當(dāng)前位置需要預(yù)測的是B,已經(jīng)在ABCD中出現(xiàn)了,這就會有問題。因而對于Bi-LSTM,只要層數(shù)增加,就是會存在“自己看見自己”的問題。
另一方面,在ELMO提出的時候,TRANSFORMER已經(jīng)提出了,而TF是比LSTM更適合用于提取遠(yuǎn)距離詞間關(guān)系特征的架構(gòu)。
GPT
GPT是2018年OpenAI的論文《Improving Language Understandingby Generative Pre-Training》中提出的模型,是“Generative Pre-Training”的簡稱,從名字看其含義是指的生成式的預(yù)訓(xùn)練。GPT也采用兩階段過程,第一個階段是利用語言模型進(jìn)行預(yù)訓(xùn)練,第二階段通過Fine-tuning的模式解決下游任務(wù)。下圖展示了GPT的預(yù)訓(xùn)練過程,其實(shí)和ELMO是類似的,主要不同在于兩點(diǎn):首先,特征抽取器不是用的RNN,而是用的Transformer,上面提到過它的特征抽取能力要強(qiáng)于RNN,這個選擇很明顯是很明智的。
大家可以快速回顧一下什么是Transformer?multi-head, self-attention。補(bǔ)上位置編碼的公式:
所以,結(jié)合一個例子來看:
其次,GPT的預(yù)訓(xùn)練雖然仍然是以語言模型作為目標(biāo)任務(wù),但是采用的是單向的語言模型,所謂“單向”的含義是指:語言模型訓(xùn)練的任務(wù)目標(biāo)是根據(jù)
單詞的上下文去正確預(yù)測單詞,之前的單詞序列Context-before稱為上文,之后的單詞序列Context-after稱為下文。ELMO在做語言模型預(yù)訓(xùn)練的時候,預(yù)測單詞同時使用了上文和下文,而GPT則只采用Context-before這個單詞的上文來進(jìn)行預(yù)測,而拋開了下文。這個選擇現(xiàn)在看不是個太好的選擇,原因很簡單,它沒有把單詞的下文融合進(jìn)來,這限制了其在更多應(yīng)用場景的效果,比如閱讀理解這種任務(wù),在做任務(wù)的時候是可以允許同時看到上文和下文一起做決策的。如果預(yù)訓(xùn)練時候不把單詞的下文嵌入到Word Embedding中,是很吃虧的,白白丟掉了很多信息。GPT中也提出了fine-tuning的方法,這里就非常類似圖像處理中的預(yù)處理了。但是使用預(yù)訓(xùn)練好的參數(shù),需要對任務(wù)的模型進(jìn)行了改造。把任務(wù)的網(wǎng)絡(luò)結(jié)構(gòu)改造成和GPT的網(wǎng)絡(luò)結(jié)構(gòu)是一樣的。然后,在做下游任務(wù)的時候,利用第一步預(yù)訓(xùn)練好的參數(shù)初始化GPT的網(wǎng)絡(luò)結(jié)構(gòu),這樣通過預(yù)訓(xùn)練學(xué)到的語言學(xué)知識就被引入到你手頭的任務(wù)里來了,這是個非常好的事情。再次,你可以用手頭的任務(wù)去訓(xùn)練這個網(wǎng)絡(luò),對網(wǎng)絡(luò)參數(shù)進(jìn)行Fine-tuning,使得這個網(wǎng)絡(luò)更適合解決手頭的問題。
GPT論文給了一個改造施工圖如上,其實(shí)也很簡單:對于分類問題,不用怎么動,加上一個起始和終結(jié)符號即可;對于句子關(guān)系判斷問題,比如Entailment,兩個句子中間再加個分隔符即可;對文本相似性判斷問題,把兩個句子順序顛倒下做出兩個輸入即可,這是為了告訴模型句子順序不重要;對于多項(xiàng)選擇問題,則多路輸入,每一路把文章和答案選項(xiàng)拼接作為輸入即可。從上圖可看出,這種改造還是很方便的,不同任務(wù)只需要在輸入部分施工即可。
GPT的效果也是很好的(在BERT出來之前):
以上只是部分截圖,GPT在12個任務(wù)中有9個達(dá)到最好。
GPT的有效因子分析:
那么GPT有什么缺點(diǎn)呢?
事后看起來,主要就是沒有采用雙向模型。
BERT
BERT是谷歌在2018年的論文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》中提出來的模型。Bert采用和GPT完全相同的兩階段模型,首先是語言模型預(yù)訓(xùn)練;其次是使用Fine-Tuning模式解決下游任務(wù)。和GPT的最主要不同在于在預(yù)訓(xùn)練階段采用了類似ELMO的雙向語言模型,當(dāng)然另外一點(diǎn)是語言模型的數(shù)據(jù)規(guī)模要比GPT大。
將三個模型并在一起看很有意思:
從上圖可見,Bert其實(shí)和ELMO及GPT存在千絲萬縷的關(guān)系,比如如果我們把GPT預(yù)訓(xùn)練階段換成雙向語言模型,那么就得到了Bert;而如果我們把ELMO的特征抽取器換成Transformer,那么我們也會得到Bert。所以你可以看出:Bert最關(guān)鍵兩點(diǎn),一點(diǎn)是特征抽取器采用Transformer;第二點(diǎn)是預(yù)訓(xùn)練的時候采用雙向語言模型。
以下是BERT論文的思路:
假如給一個句子 “能實(shí)現(xiàn)語言表征[mask]的模型”,遮蓋住其中“目標(biāo)”一詞。從前往后預(yù)測[mask],也就是用“能/實(shí)現(xiàn)/語言/表征”,來預(yù)測[mask];或者,從后往前預(yù)測[mask],也就是用“模型/的”,來預(yù)測[mask],稱之為單向預(yù)測 unidirectional。單向預(yù)測,不能完整地理解整個語句的語義。于是研究者們嘗試雙向預(yù)測。把從前往后,與從后往前的兩個預(yù)測,拼接在一起 [mask1/mask2],這就是雙向預(yù)測 bi-directional。BERT 的作者認(rèn)為,bi-directional 仍然不能完整地理解整個語句的語義,更好的辦法是用上下文全向來預(yù)測[mask],也就是用 “能/實(shí)現(xiàn)/語言/表征/../的/模型”,來預(yù)測[mask]。BERT 作者把上下文全向的預(yù)測方法,稱之為 deep bi-directional。如何來實(shí)現(xiàn)上下文全向預(yù)測呢?BERT 的作者建議使用 Transformer 模型。
這個模型的核心是聚焦機(jī)制,對于一個語句,可以同時啟用多個聚焦點(diǎn),而不必局限于從前往后的,或者從后往前的,序列串行處理。不僅要正確地選擇模型的結(jié)構(gòu),而且還要正確地訓(xùn)練模型的參數(shù),這樣才能保障模型能夠準(zhǔn)確地理解語句的語義。BERT 用了兩個步驟,試圖去正確地訓(xùn)練模型的參數(shù)。第一個步驟是把一篇文章中,15% 的詞匯遮蓋,讓模型根據(jù)上下文全向地預(yù)測被遮蓋的詞。假如有 1 萬篇文章,每篇文章平均有 100 個詞匯,隨機(jī)遮蓋 15% 的詞匯,模型的任務(wù)是正確地預(yù)測這 15 萬個被遮蓋的詞匯。通過全向預(yù)測被遮蓋住的詞匯,來初步訓(xùn)練 Transformer 模型的參數(shù)。
然后,用第二個步驟繼續(xù)訓(xùn)練模型的參數(shù)。譬如從上述 1 萬篇文章中,挑選 20 萬對語句,總共 40 萬條語句。挑選語句對的時候,其中 210 萬對語句,是連續(xù)的兩條上下文語句,另外 210 萬對語句,不是連續(xù)的語句。然后讓 Transformer 模型來識別這 20 萬對語句,哪些是連續(xù)的,哪些不連續(xù)。
BERT的關(guān)鍵創(chuàng)新如下:
1: Masked LM
從直覺上看,研究團(tuán)隊(duì)有理由相信,深度雙向模型比left-to-right 模型或left-to-right and right-to-left模型的淺層連接更強(qiáng)大。遺憾的是,標(biāo)準(zhǔn)條件語言模型只能從左到右或從右到左進(jìn)行訓(xùn)練,因?yàn)殡p向條件作用將允許每個單詞在多層上下文中間接地“see itself”。
為了訓(xùn)練一個深度雙向表示(deep bidirectional representation),研究團(tuán)隊(duì)采用了一種簡單的方法,即隨機(jī)屏蔽(masking)部分輸入token,然后只預(yù)測那些被屏蔽的token。論文將這個過程稱為“masked LM”(MLM),盡管在文獻(xiàn)中它經(jīng)常被稱為Cloze任務(wù)(Taylor, 1953)。
在這個例子中,與masked token對應(yīng)的最終隱藏向量被輸入到詞匯表上的輸出softmax中,就像在標(biāo)準(zhǔn)LM中一樣。在團(tuán)隊(duì)所有實(shí)驗(yàn)中,隨機(jī)地屏蔽了每個序列中15%的WordPiece token。
雖然這確實(shí)能讓團(tuán)隊(duì)獲得雙向預(yù)訓(xùn)練模型,但這種方法有兩個缺點(diǎn)。首先,預(yù)訓(xùn)練和fine-tuning之間不匹配,因?yàn)樵趂ine-tuning期間從未看到[MASK]token。為了解決這個問題,團(tuán)隊(duì)并不總是用實(shí)際的[MASK]token替換被“masked”的詞匯。相反,訓(xùn)練數(shù)據(jù)生成器隨機(jī)選擇15%的token。例如在這個句子“my dog is hairy”中,它選擇的token是“hairy”。然后,執(zhí)行以下過程:
數(shù)據(jù)生成器將執(zhí)行以下操作,而不是始終用[MASK]替換所選單詞:
80%的時間:用[MASK]標(biāo)記替換單詞,例如,my dog is hairy → my dog is [MASK]
10%的時間:用一個隨機(jī)的單詞替換該單詞,例如,my dog is hairy → my dog is apple
10%的時間:保持單詞不變,例如,my dog is hairy → my dog is hairy. 這樣做的目的是將表示偏向于實(shí)際觀察到的單詞。
Transformer encoder不知道它將被要求預(yù)測哪些單詞或哪些單詞已被隨機(jī)單詞替換,因此它被迫保持每個輸入token的分布式上下文表示。此外,因?yàn)殡S機(jī)替換只發(fā)生在所有token的1.5%(即15%的10%),這似乎不會損害模型的語言理解能力。
使用MLM的第二個缺點(diǎn)是每個batch只預(yù)測了15%的token,這表明模型可能需要更多的預(yù)訓(xùn)練步驟才能收斂。團(tuán)隊(duì)證明MLM的收斂速度略慢于 left-to-right的模型(預(yù)測每個token),但MLM模型在實(shí)驗(yàn)上獲得的提升遠(yuǎn)遠(yuǎn)超過增加的訓(xùn)練成本。
(FFNN feedforward neural network)
2:下一句預(yù)測
許多重要的下游任務(wù),如問答(QA)和自然語言推理(NLI)都是基于理解兩個句子之間的關(guān)系,這并沒有通過語言建模直接獲得。
在為了訓(xùn)練一個理解句子的模型關(guān)系,預(yù)先訓(xùn)練一個二進(jìn)制化的下一句測任務(wù),這一任務(wù)可以從任何單語語料庫中生成。具體地說,當(dāng)選擇句子A和B作為預(yù)訓(xùn)練樣本時,B有50%的可能是A的下一個句子,也有50%的可能是來自語料庫的隨機(jī)句子。例如:
Input = [CLS] the man went to [MASK] store [SEP]
he bought a gallon [MASK] milk [SEP]
Label = IsNext
Input = [CLS] the man [MASK] to the store [SEP]
penguin [MASK] are flight ##less birds [SEP]
Label = NotNext
團(tuán)隊(duì)完全隨機(jī)地選擇了NotNext語句,最終的預(yù)訓(xùn)練模型在此任務(wù)上實(shí)現(xiàn)了97%-98%的準(zhǔn)確率。對BERT模型的觀點(diǎn)
XLNet概述
XLNet是一個語言模型。和ELMO,GPT,BERT一脈相承,同時借鑒了Transformer-XL,故稱XLNet(XL含義源于衣服尺碼,意思是模型橫向更寬);并提出一些新方法改善了Bert存在的問題,目前取得了全面超越Bert的成果。和Bert一樣,XLNet也分為Pre-train和Fine-turn兩階段;并且參數(shù)規(guī)模比Bert更大。
參考:
總結(jié)
以上是生活随笔為你收集整理的bert 多义词_自然语言处理:Bert及其他的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十年轩逸悬挂如何维护
- 下一篇: 剪映电脑版_七款手机剪辑app,效果堪比