天然語言處理中的語言模型預訓練方法(ELMo、GPT和BERT)

天然語言處理中的語言模型預訓練方法(ELMo、GPT和BERT)html

最近,在天然語言處理(NLP)領域中,使用語言模型預訓練方法在多項NLP任務上都得到了不錯的提高,普遍受到了各界的關注。就此,我將最近看的一些相關論文進行總結,選取了幾個表明性模型(包括ELMo [1]OpenAI GPT [2]BERT [3])和你們一塊兒學習分享。算法

1. 引言

在介紹論文以前,我將先簡單介紹一些相關背景知識。首先是語言模型(Language Model),語言模型簡單來講就是一串詞序列的機率分佈。具體來講,語言模型的做用是爲一個長度爲m的文本肯定一個機率分佈P,表示這段文本存在的可能性。在實踐中,若是文本的長度較長,P(wi | w1, w2, . . . , wi−1)的估算會很是困難。所以,研究者們提出使用一個簡化模型:n元模型(n-gram model)。在 n 元模型中估算條件機率時,只須要對當前詞的前n個詞進行計算。在n元模型中,傳統的方法通常採用頻率計數的比例來估算n元條件機率。當n較大時,機會存在數據稀疏問題,致使估算結果不許確。所以,通常在百萬詞級別的語料中,通常也就用到三元模型。網絡

爲了緩解n元模型估算機率時遇到的數據稀疏問題,研究者們提出了神經網絡語言模型。表明性工做是Bengio等人在2003年提出的神經網絡語言模型,該語言模型使用了一個三層前饋神經網絡來進行建模。其中有趣的發現了第一層參數,用作詞表示不只低維緊密,並且可以蘊涵語義,也就爲如今你們都用的詞向量(例如word2vec)打下了基礎。其實,語言模型就是根據上下文去預測下一個詞是什麼,這不須要人工標註語料,因此語言模型可以從無限制的大規模單語語料中,學習到豐富的語義知識。app

接下來在簡單介紹一下預訓練的思想。咱們知道目前神經網絡在進行訓練的時候基本都是基於後向傳播(BP)算法,經過對網絡模型參數進行隨機初始化,而後經過BP算法利用例如SGD這樣的優化算法去優化模型參數。那麼預訓練的思想就是,該模型的參數再也不是隨機初始化,而是先有一個任務進行訓練獲得一套模型參數,而後用這套參數對模型進行初始化,再進行訓練。其實早期的使用自編碼器棧式搭建深度神經網絡就是這個思想。還有詞向量也能夠當作是第一層word embedding進行了預訓練,此外在基於神經網絡的遷移學習中也大量用到了這個思想。框架

接下來,咱們就具體看一下這幾篇用語言模型進行預訓練的工做。函數

2. ELMo

2.1 引言

Deep Contextualized Word Representations》這篇論文來自華盛頓大學的工做,最後是發表在今年的NAACL會議上,並得到了最佳論文。其實這個工做的前身來自同一團隊在ACL2017發表的《Semi-supervised sequence tagging with bidirectional language models [4],只是在這篇論文裏,他們把模型更加通用化了。首先咱們來看看他們工做的動機,他們認爲一個預訓練的詞表示應該可以包含豐富的句法和語義信息,而且可以對多義詞進行建模。而傳統的詞向量(例如word2vec)是上下文無關的。例以下面"apple"的例子,這兩個"apple"根據上下文意思是不一樣的,可是在word2vec中,只有apple一個詞向量,沒法對一詞多義進行建模。性能

因此他們利用語言模型來得到一個上下文相關的預訓練表示,稱爲ELMo,並在6NLP任務上得到了提高。學習

2.2 方法

EMLo中,他們使用的是一個雙向的LSTM語言模型,由一個前向和一個後向語言模型構成,目標函數就是取這兩個方向語言模型的最大似然。大數據

在預訓練好這個語言模型以後,ELMo就是根據下面的公式來用做詞表示,其實就是把這個雙向語言模型的每一中間層進行一個求和。最簡單的也可使用最高層的表示來做爲ELMo優化

而後在進行有監督的NLP任務時,能夠將ELMo直接當作特徵拼接到具體任務模型的詞向量輸入或者是模型的最高層表示上。總結一下,不像傳統的詞向量,每個詞只對應一個詞向量,ELMo利用預訓練好的雙向語言模型,而後根據具體輸入從該語言模型中能夠獲得上下文依賴的當前詞表示(對於不一樣上下文的同一個詞的表示是不同的),再當成特徵加入到具體的NLP有監督模型裏。

2.3 實驗

這裏咱們簡單看一下主要的實驗,具體實驗還需閱讀論文。首先是整個模型效果的實驗。他們在6NLP任務上進行了實驗,首先根據目前每一個任務搭建了不一樣的模型做爲baseline,而後加入ELMo,能夠看到加入ELMo6個任務都有所提高,平均大約可以提高2個多百分點,而且最後的結果都超過了以前的先進結果(SOTA)。

在下面的分析實驗中,咱們能夠看到使用全部層的效果要比只使用最後一層做爲ELMo的效果要好。在輸入仍是輸出上面加EMLo效果好的問題上,並無定論,不一樣的任務可能效果不同。

3. Open AI GPT

3.1 引言

咱們來看看第二篇論文《Improving Language Understanding by Generative Pre-Training》,這是OpenAI 團隊前一段時間放出來的預印版論文。他們的目標是學習一個通用的表示,可以在大量任務上進行應用。這篇論文的亮點主要在於,他們利用了Transformer網絡代替了LSTM做爲語言模型來更好的捕獲長距離語言結構。而後在進行具體任務有監督微調時使用了語言模型做爲附屬任務訓練目標。最後再12NLP任務上進行了實驗,9個任務得到了SOTA

3.2 方法

首先咱們來看一下他們無監督預訓練時的語言模型。他們仍然使用的是標準的語言模型目標函數,即經過前k個詞預測當前詞,可是在語言模型網絡上他們使用了google團隊在《Attention is all your need》論文中提出的Transformer解碼器做爲語言模型。Transformer模型主要是利用自注意力(self-attention)機制的模型,這裏我就很少進行介紹,你們能夠看論文或者參考我以前的博客(https://www.cnblogs.com/robert-dlut/p/8638283.html)。

而後再具體NLP任務有監督微調時,與ELMo當成特徵的作法不一樣,OpenAI GPT不須要再從新對任務構建新的模型結構,而是直接在transformer這個語言模型上的最後一層接上softmax做爲任務輸出層,而後再對這整個模型進行微調。他們額外發現,若是使用語言模型做爲輔助任務,可以提高有監督模型的泛化能力,而且可以加速收斂。

因爲不一樣NLP任務的輸入有所不一樣,在transformer模型的輸入上針對不一樣NLP任務也有所不一樣。具體以下圖,對於分類任務直接講文本輸入便可;對於文本蘊涵任務,須要將前提和假設用一個Delim分割向量拼接後進行輸入;對於文本類似度任務,在兩個方向上都使用Delim拼接後,進行輸入;對於像問答多選擇的任務,就是將每一個答案和上下文進行拼接進行輸入。

3.3 實驗

下面我簡單的列舉了一下不一樣NLP任務上的實驗結果。

語言推理任務:

問答和常識推理任務:

語義類似度和分類任務:

能夠看到在多項任務上,OpenAI GPT的效果要比ELMo的效果更好。從下面的消除實驗來看,在去掉預訓練部分後,全部任務都大幅降低,平均降低了14.8%,說明預訓練頗有效;在大數據集上使用語言模型做爲附加任務的效果更好,小數據集否則;利用LSTM代替Transformer後,結果平均降低了5.6%,也體現了Transformer的性能。

4. BERT

4.1引言

上週Google放出了他們的語言模型預訓練方法,瞬時受到了各界普遍關注,很多媒體公衆號也進行了相應報道,那咱們來看看這篇論文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》。這篇論文把預訓練語言表示方法分爲了基於特徵的方法(表明ELMo)和基於微調的方法(表明OpenAI GPT)。而目前這兩種方法在預訓練時都是使用單向的語言模型來學習語言表示。

這篇論文中,做者們證實了使用雙向的預訓練效果更好。其實這篇論文方法的總體框架和GPT相似,是進一步的發展。具體的,他們BERT是使用Transformer的編碼器來做爲語言模型,在語言模型預訓練的時候,提出了兩個新的目標任務(即遮擋語言模型MLM和預測下一個句子的任務),最後在11NLP任務上取得了SOTA

4.2方法

在語言模型上,BERT使用的是Transformer編碼器,而且設計了一個小一點Base結構和一個更大的Large網絡結構。

對比一下三種語言模型結構,BERT使用的是Transformer編碼器,因爲self-attention機制,因此模型上下層直接所有互相鏈接的。而OpenAI GPT使用的是Transformer解碼器,它是一個須要從左到右的受限制的Transformer,而ELMo使用的是雙向LSTM,雖然是雙向的,可是也只是在兩個單向的LSTM的最高層進行簡單的拼接。因此做者們任務只有BERT是真正在模型全部層中是雙向的。

而在模型的輸入方面,BERT作了更多的細節,以下圖。他們使用了WordPiece embedding做爲詞向量,並加入了位置向量和句子切分向量。並在每個文本輸入前加入了一個CLS向量,後面會有這個向量做爲具體的分類向量。

在語言模型預訓練上,他們不在使用標準的從左到右預測下一個詞做爲目標任務,而是提出了兩個新的任務。第一個任務他們稱爲MLM,即在輸入的詞序列中,隨機的擋上15%的詞,而後任務就是去預測擋上的這些詞,能夠看到相比傳統的語言模型預測目標函數,MLM能夠從任何方向去預測這些擋上的詞,而不只僅是單向的。可是這樣作會帶來兩個缺點:1)預訓練用[MASK]提出擋住的詞後,在微調階段是沒有[MASK]這個詞的,因此會出現不匹配;2)預測15%的詞而不是預測整個句子,使得預訓練的收斂更慢。可是對於第二點,做者們以爲雖然是慢了,可是效果提高比較明顯能夠彌補。

對於第一點他們採用了下面的技巧來緩解,即不是老是用[MASK]去替換擋住的詞,在10%的時間用一個隨機詞取替換,10%的時間就用這個詞自己。

而對於傳統語言模型,並無對句子之間的關係進行考慮。爲了讓模型可以學習到句子之間的關係,做者們提出了第二個目標任務就是預測下一個句子。其實就是一個二元分類問題,50%的時間,輸入一個句子和下一個句子的拼接,分類標籤是正例,而另50%是輸入一個句子和非下一個隨機句子的拼接,標籤爲負例。最後整個預訓練的目標函數就是這兩個任務的取和求似然。

在微調階段,不一樣任務的模型以下圖,只是在輸入層和輸出層有所區別,而後整個模型全部參數進行微調。

4.3 實驗

下面咱們列出一下不一樣NLPBERT的效果。

GLUE結果:

QA結果:

實體識別結果:

SWAG結果:

能夠看到在這些全部NLP任務上,BERT都取得了SOTA,並且相比EMLoGPT的效果提高仍是比較大的。

在預訓練實驗分析上,能夠看到本文提出的兩個目標任務的做用仍是頗有效的,特別是在MLM這個目標任務上。

做者也作了模型規模的實驗,大規模的模型效果更好,即便在小數據集上。

此外,做者也作了像ELMo當成特徵加入的實驗,從下圖能夠看到,當成特徵加入最好效果能達到96.1%和微調的96.4%差很少,說明BERT對於基於特徵和基於微調這兩種方法都是有效的。

 

5. 總結

最後進行簡單的總結,和傳統的詞向量相比,使用語言模型預訓練其實能夠當作是一個句子級別的上下文的詞表示,它能夠充分利用大規模的單語語料,而且能夠對一詞多義進行建模。並且從後面兩篇論文能夠看到,經過大規模語料預訓練後,使用統一的模型或者是當成特徵直接加到一些簡單模型上,對各類NLP任務都能取得不錯的效果,說明很大程度上緩解了具體任務對模型結構的依賴。在目前不少評測上也都取得了SOTAELMo也提供了官網供你們使用。可是這些方法在空間和時間複雜度上都比較高,特別是BERT,在論文中他們訓練base版本須要在16TGPU上,large版本須要在64TPU上訓練4天,對於通常條件,一個GPU訓練的話,得用上1年。還有就是能夠看出這些方法裏面都存在不少工程細節,一些細節作得很差的話,效果也會大大折扣。

 

參考文獻

[1] Peters, M. E. et al. Deep contextualized word representations. naacl (2018).

[2] Radford, A. & Salimans, T. Improving Language Understanding by Generative Pre-Training. (2018).

[3] Devlin, J., Chang, M.-W., Lee, K. & Toutanova, K. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. (2018).

[4] Peters, M. E., Ammar, W., Bhagavatula, C. & Power, R. Semi-supervised sequence tagging with bidirectional language models. Acl (2017).

相關文章
相關標籤/搜索