進一步改進GPT和BERT:使用Transformer的語言模型

機器之心發表於2019-05-01

BERT 和 GPT-2 是當前 NLP 領域兩大最先進的模型,它們都採用了基於 Transformer 的架構。Amazon Web Services 近期一篇論文提出了一些對 Transformer 的新改進,包括架構上的改進、利用先驗知識以及一種新的架構搜尋方法,能得到更加高效的語言模型

進一步改進GPT和BERT:使用Transformer的語言模型

Transformer 在計算效率方面優於基於 RNN 的模型。近期的 GPT 和 BERT已經表明,使用在大規模語料庫上預訓練的語言模型時,Transformer 能高效地處理多種 NLP 任務。讓人驚訝的是,這些 Transformer 架構對於語言模型本身而言是次優的。在 Transformer 中,不管是自注意(self-attention)還是位置編碼(positional encoding),都無法整合對語言建模而言至關重要的詞級序列上下文(sequential context)。

本論文探索了用於語言模型的高效 Transformer 架構,包括新增額外的 LSTM 層以在保持計算高效的同時獲取序列上下文。我們提出了協調式架構搜尋(CAS:Coordinate Architecture Search),可通過模型的迭代式優化來尋找高效的架構。在 PTB、WikiText-2 和 WikiText-103 上的實驗結果表明 CAS 能在所有問題上實現在 20.42 與 34.11 之間的困惑度,即相比於之前最佳的 LSTM 方法,困惑度平均能提升 12.0。

引言

建模語言中的序列上下文是很多 NLP 任務成功的關鍵。迴圈神經網路(RNN)可以將序列上下文記憶在精心設計的單元中。但是,這些模型的序列性使得其計算成本高昂,由此難以擴充套件用於大型語料庫

Transformer 架構使用了自注意和逐點全連線層替代 RNN 單元;這種層是高度可並行化的,因此計算成本更低。搭配上位置編碼,Transformer 能通過模糊的相對 token 位置求取長程依賴性。這會得到句子級的粗粒度序列表徵。GPT(或 GPT2)和 BERT 等近期研究成果表明在大規模語言建模資料集上學習到的表徵既可以有效用於優化句子級任務(比如 GLUE 基準),也能用於優化不依靠上下文中詞序依賴性的 token 級任務(比如問答和命名實體識別)。

儘管事實上 GPT 和 BERT 都使用了語言模型來預訓練,但它們在語言建模方面都沒有實現當前最佳。語言模型的目標是根據之前的上文預測下一個詞,這需要細粒度的上下文詞序資訊。已有的 Transformer 架構中的自注意和位置編碼都不能有效地建模這種資訊。

第二個挑戰(和機會)源自這一事實:我們往往有機會獲取在相關但不完全相同的任務上預訓練的模型。舉個例子,GPT 或 BERT 都沒有針對 WikiText 進行調整,也沒有直接以最小化困惑度為目標。事實上,這些架構甚至可能沒有直接的用處:BERT 提供的是 p(w_i |context) 而非 p(w_i |history) 的估計。這表明,對於可以從這些任務匯出(和適應得到)的網路空間,我們需要設計能系統性地探索它們的演算法。這能泛化為相關任務使用預訓練詞嵌入的問題,只是我們這裡不是處理向量,而是整個網路

最後,架構搜尋問題本身已經受到了很大的關注。但是,為 GPT 或 BERT 訓練單個模型所需大小的資料集的成本可能超過 1 萬美元,如果要通過完全重新訓練來執行完備的模型探索,成本將高得不切實際。相對而言,我們提出以遠遠更加受限(和經濟)的方式來調研如何優化一個經過訓練的架構,進而實現架構搜尋。這樣的成本要低得多。我們務實的方法能提升語言建模問題的當前最佳表現。我們有如下貢獻:

  1. 我們提出了一種用於語言模型的 Transformer 架構。在所有 Transformer 模組之後新增 LSTM 層是有效的(這是搜尋演算法的一個結果)。這能獲得細粒度的詞級序列上下文。

  2. 我們描述了一種高效的搜尋流程:協調式架構搜尋(CAS)。這種演算法能基於已找到的當前最佳架構隨機地生成 Transformer 架構的變體。由於這種貪婪性質,CAS 比之前的架構搜尋演算法更簡單且速度更快。

  3. 我們以 GPT 或 BERT 的形式展示瞭如何將其用於整合大量先驗知識。而使用暴力式架構搜尋獲取這些資訊的成本會非常高。

其中貢獻 2 和 3 是通用的,可用於 NLP 領域外的其它很多情況。貢獻 1 應該更特定於語言方面。我們在 PTB、WikiText-2 和 WikiText-103 這三個常用語言模型資料集上評估了 CAS。相比於當前最佳的基於 LSTM 的語言模型 AWD-LSTM-MoS,基於 BERT 的 CAS 在困惑度方面實現了平均 12.0 的增益。

用於語言模型的 Transformer

我們的 Transformer 架構基於 GPT 和 BERT。我們將複用在 GPT 和 BERT 中預訓練的權重來優化語言模型。我們會修改和再訓練 GPT 和 BERT 使用的權重和網路以適應語言模型任務。

GPT 和 BERT 

GPT 使用了 Transformer 架構的一種變體,即它使用了基於多層 Transformer 解碼器的語言模型。其原論文提供了一種預訓練的架構,其模組僅有 12 層的 Transformer 解碼器。每個模組都有 768 的隱藏大小和 12 個自注意頭。權重是在 BooksCorpus 上訓練的。這使其可生成 p(wi |history),一次一個詞。

BERT 是一種多層雙向 Transformer 編碼器。其原論文提供了兩種 BERT 結構:BERT-Base 和 BERT-Large。其中 BERT-Base 由 12 層雙向 Transformer 編碼器模組構成,有 768 的隱藏大小和 12 個自注意頭。BERT-Large 包含 24 層雙向 Transformer 編碼器模組,隱藏大小為 1024,有 16 個自注意頭。其權重是在 BooksCorpus 和英語維基百科上訓練的。除非另有說明,我們提到的 BERT 都是指 BERT-Base。

GPT 與 BERT 的關係是怎樣的?兩個模型使用了幾乎一樣的架構。事實上,GPT 和 BERT-Base 甚至使用了一樣的層數和維數。唯一的差別是 BERT 是雙向的,因為它試圖根據上下文填入單個詞,而 GPT 則使用了掩碼式自注意頭。

調整 GPT 和 BERT 以用於子詞語言模型

GPT 僅需少量修改,除非我們想要探索不同的架構。畢竟其已經作為語言模型經過了訓練。最低程度而言,在微調期間,我們可以新增一個線性層,其隱藏大小等於詞彙庫大小。這些權重經過調整並被送入 softmax,進而生成目標詞在詞彙庫上的概率分佈。掩碼式自注意能確保僅出現因果資訊流。

回想一下 BERT 的目標:掩碼式語言模型和下一句子預測。掩碼式語言模型使用的是雙向上下文資訊,並會在訓練過程中隨機地掩蓋某些 token。其試圖基於這一點推斷被掩蓋的詞的「身份」。不幸的是,估計進一步改進GPT和BERT:使用Transformer的語言模型並不利於構建高效的文字生成器。我們需要設計 Gibbs 取樣器來取樣進一步改進GPT和BERT:使用Transformer的語言模型,即給定上下文進一步改進GPT和BERT:使用Transformer的語言模型,在所有 i 上迭代和重複地取樣 w_i,以直接使用這方面的變體。

下一句子預測的目標是獲取兩個句子之間的二值化關係。重申一下,這不能直接用於語言模型。因此,我們移除了這一目標,並在微調過程中將其替換成了一個對數似然度量。類似於 GPT,我們新增一個輸出線性層,並用掩碼式自注意替代自注意頭以防止資訊向左流動。

注意 GPT 和 BERT 預訓練權重會在語言模型微調過程中複用,以節省整個再訓練的成本。因此,我們是在子詞級上執行語言模型,因為 GPT 和 BERT 中都使用了子詞 token 化。

微調 Transformer 權重

GPT 和 BERT 會針對前面提到的任務調整各自模型的權重。舉個例子,BERT 預設並不使用開窗(windowing)。因為在針對語言建模進行微調時,調整權重是合理的。但是,更新所有權重可能導致過擬合,因為 WikiText 或 Penn Tree Bank 之類的資料集比用於訓練 GPT 和 BERT 的資料小一個數量級以上。

為了解決這一難題,我們提出在微調過程中僅更新一部分層的權重。因為 GPT 和 BERT 都有 12 個 Transformer 模組,每一個模組都包含一個自注意和一個逐點全連線層,所以難以簡單直接地選出引數應該固定的那部分層。於是我們轉而自動搜尋對語言模型任務而言最有效的那一部分層。搜尋演算法將在後面介紹。

新增一個 LSTM

通過 Transformer 中的傅立葉基實現的位置編碼僅能提供模糊的相對位置資訊,這會迫使層在每層為特定的詞訪問重新建立三角法(trigonometry)。這會出現問題,因為語言模型需要強大的詞級上下文資訊來預測下一個詞。RNN 可顯式地建模這種序列資訊。因此我們提出向 Transformer 架構新增 LSTM 層。

理論上而言,我們可以在任意位置新增 LSTM 層,甚至可以將它們與 Transformer 交織起來。但是,LSTM 會顯著影響計算效率,因為它們不支援平行計算。我們的推理過程類似於 SRU(簡單迴圈單元 (Lei et al., 2018))的設計思路。因此,我們提出要麼在所有基礎 Transformer 模組之前新增一層 LSTM,要麼就加在它們後面。對於前者,我們在嵌入層之後直接新增 LSTM 層,並移除位置嵌入和分段嵌入,因為我們相信 LSTM 層能夠編碼足夠的序列資訊。對於後者,我們在最後一個 Transformer 模組與輸出線性層之間插入 LSTM 層。我們通過自動搜尋認定這就是 LSTM 的最佳位置。

協調式架構搜尋

現在我們已有了基本的元件,這裡回顧一下為了獲得表現優良的架構而提出的網路變換和相關的搜尋過程。

網路變換

我們前面提出了多種可改變網路的變換方式,我們將它們分別稱為:AddLinear、AddLSTM、FixSubset。其中 AddLinear 是新增線性輸出層,AddLSTM 是新增 LSTM 層,FixSubset 是固定一部分 Transformer 模組的權重

搜尋候選項取樣

進一步改進GPT和BERT:使用Transformer的語言模型

圖 1:搜尋候選項取樣。圖中 net 是指基礎架構,candidate 是下一步驟返回的架構。Transformers、Embeddings、LSTM 和 Linear 是各種變換。其中顏色較淺的模組是可變的,深色模組是固定的。參見演算法 1。

進一步改進GPT和BERT:使用Transformer的語言模型

演算法 1:搜尋候選項取樣

協調式架構搜尋

進一步改進GPT和BERT:使用Transformer的語言模型

圖 2:協調式架構搜尋。net_best 是指搜尋的第 i 步驟的最佳架構。我們取樣搜尋候選項,並保留表現最好的那個。我們的衡量指標是微調後在目標資料集上的困惑度(Val PPL)。參見演算法 2。

進一步改進GPT和BERT:使用Transformer的語言模型

演算法 2:協調式架構搜尋

實驗

為了體現使用協調式搜尋找到的 Transformer 架構的有效性,我們在 WikiText 和 Penn TreeBank 資料集上進行了實驗。我們也給出了與其它已有神經搜尋策略的比較。結果見表 1 和圖 3。

進一步改進GPT和BERT:使用Transformer的語言模型

表 1:協調式架構搜尋(CAS)的表現。Val 和 Test 分別指驗證和測試困惑度。

進一步改進GPT和BERT:使用Transformer的語言模型

圖 3:CAS 與其它模型的測試困惑度比較(左圖是使用 BERT 預訓練模型的結果;右圖是使用 GPT 預訓練模型的結果)。「Subset」是指沒有使用 LSTM 的變體,「LSTM」則對應不更新 Transformer 模組的模型。

此外,我們也執行了消融實驗,結果也證實了我們的直觀認識,即我們需要首先使用固定子集權重保留粗粒度的表徵,然後再使用 LSTM 來建模詞序依賴性。

最後,我們還比較了新提出的模型與當前最佳的語言模型 GPT-2,比較指標分為三個維度:結果、引數規模、訓練資料規模。結果見表 6 和表 7。可以看到,在引數方面我們的 BERT-Large-CAS 在 PTB 和 WT-103 上比 GPT-2 更高效,而在 WT-2 上的表現比 GPT-2 差,我們推測原因可能是 WT-2 的規模非常小。而在訓練資料方面,BERT-Large-CAS 能用顯著更少的資料達到相近的結果。

進一步改進GPT和BERT:使用Transformer的語言模型

表 6:模型引數規模與模型結果的比較。GPT-2 模型大小和結果來自 Radford et al., 2019

進一步改進GPT和BERT:使用Transformer的語言模型

表 7:與 GPT-2 的訓練資料集大小比較

相關文章