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