1. 程式人生 > >NLP中語言模型預訓練方法

NLP中語言模型預訓練方法

最近,在自然語言處理(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)打下了基礎。其實,語言模型就是根據上下文去預測下一個詞是什麼,這不需要人工標註語料,所以語言模型能夠從無限制的大規模單語語料中,學習到豐富的語義知識。

接下來在簡單介紹一下預訓練的思想。我們知道目前神經網路在進行訓練的時候基本都是基於後向傳播(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,並在6個NLP任務上獲得了提升。

2.2 方法

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

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

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

2.3 實驗

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

在下面的分析實驗中,我們可以看到使用所有層的效果要比只使用最後一層作為ELMo的效果要好。在輸入還是輸出上面加EMLo效果好的問題上,並沒有定論,不同的任務可能效果不一樣。

3. Open AI GPT

3.1 引言

我們來看看第二篇論文《Improving Language Understanding by Generative Pre-Training》,這是OpenAI 團隊前一段時間放出來的預印版論文。他們的目標是學習一個通用的表示,能夠在大量任務上進行應用。這篇論文的亮點主要在於,他們利用了Transformer網路代替了LSTM作為語言模型來更好的捕獲長距離語言結構。然後在進行具體任務有監督微調時使用了語言模型作為附屬任務訓練目標。最後再12個NLP任務上進行了實驗,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和預測下一個句子的任務),最後在11個NLP任務上取得了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 實驗

下面我們列出一下不同NLP上BERT的效果。

GLUE結果:

QA結果:

實體識別結果:

SWAG結果:

可以看到在這些所有NLP任務上,BERT都取得了SOTA,而且相比EMLo和GPT的效果提升還是比較大的。

在預訓練實驗分析上,可以看到本文提出的兩個目標任務的作用還是很有效的,特別是在MLM這個目標任務上。

作者也做了模型規模的實驗,大規模的模型效果更好,即使在小資料集上。

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

5. 總結

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