SpanBert:對 Bert 預訓練的一次深度探索

  • 2019 年 11 月 27 日
  • 筆記

剛看論文題目 SpanBERT: Improving Pre-training by Representing and Predicting Spans,以為是篇水文章,Bert 遮蓋(mask)掉一小段(span)的 idea 並不新了,早有人做過,如百度 ERNIE,還有 Google 放出的 WWM (Whole Word Masking) BERT 模型,都是類似做法,當然細節上會有些不同。

所以細節決定成敗,當仔細讀完這篇論文,才發現,真香。裏面對 Bert 預訓練細節的探索非常有趣,很有啟發。

這篇論文的主要貢獻有三:

  1. 提出了更好的 Span Mask 方案,也再次展示了隨機遮蓋連續一段字要比隨機遮蓋掉分散字好;
  2. 通過加入 Span Boundary Objective (SBO) 訓練目標,增強了 BERT 的性能,特別在一些與 Span 相關的任務,如抽取式問答;
  3. 用實驗獲得了和 XLNet 類似的結果,發現不加入 Next Sentence Prediction (NSP) 任務,直接用連續一長句訓練效果更好

整體模型結構如下。

接下來我會詳細介紹上面三個 idea,包括相關消融實驗,同時給出一些自己看法。

Span Masking :縮寫起來也可以叫 SM ?

首先什麼是 Span Masking,和一般 BERT 訓練有何不同。

對於原始的 BERT,訓練時,會隨機選取整句中的最小輸入單元 token 來進行遮蓋。因為用到 Byte Pair Encoding (BPE)技術,所以也可以把這些最小單元當作是子詞(subword),比如說superman,分成 super+man 兩個子詞。

但這樣會讓本來應該有強相關的一些連在一起的字詞,在訓練時是割裂開來的。

因此我們就會想到,那能不能遮蓋掉這樣連在一起的片段訓練呢?當然可以。

首先想到的做法,既然現在遮蓋子詞,那能不能直接遮蓋整個詞,比如說對於 super + man,只要遮蓋就兩個同時遮蓋掉,這便是 Google 放出的 BERT WWM 模型所做的。

於是能不能進一步,因為有些實體是幾個詞組成的,直接將這個實體都遮蓋掉。因此百度在 ERNIE 模型中,就引入命名實體(Named Entity)外部知識,遮蓋掉實體單元,進行訓練。

以上兩種做法比原始做法都有些提升。但這兩種做法會讓人認為,或許必須得引入類似詞邊界信息才能幫助訓練。但前不久的 MASS 模型,卻表明可能並不需要,隨機遮蓋可能效果也很好,於是就有本篇的 idea:

根據幾何分佈,先隨機選擇一段(span)的長度,之後再根據均勻分佈隨機選擇這一段的起始位置,最後按照長度遮蓋。文中使用幾何分佈取 p=0.2,最大長度只能是 10,利用此方案獲得平均採樣長度分佈。

通過採樣,平均被遮蓋長度是 3.8 個詞的長度。其實這裡我有手動算了下幾何分佈的期望,發現長度 10 以上全部修剪後,平均長度應該是 4.463,這裡 3.8 如何計算獲得,就不清楚了,可能是因為 4.463 指的是 token,而 3.8 指的是詞長度,作者們有統計平均每個詞等於多少 token,所以 4.463 個token等於 3.8 個詞長。

同樣奇怪的還有上面的圖,幾何分佈我們都知道,長度 1 的位置應當是 0.2,但圖上明顯大於 0.2,同樣也可能是經過詞長度後處理統一。關於這個如果有其他的思路,歡迎討論。

長度計算過程:

這便是文中用到的 Span Masking,消融實驗中,作者們用此方法和其他遮蓋方法進行了對比,比如原始 BERT 的子詞遮蓋,或 WWM 的對整詞遮蓋,亦或 ERNIE 的實體遮蓋,還有對名詞短語遮蓋。

結果發現除了 Coreference Resolution (指代消解) 任務,論文中用到的 Random Span 方法普遍更優。但作者們之後發現,只要給 Random Span 再加上 SBO 訓練目標,就能大大提高這個方法的表現。

SBO:我有個很黃很暴力的表兄 HBO

Span Boundary Objective 是該論文加入的新訓練目標,希望被遮蓋 Span 邊界的詞向量,能學習到 Span 的內容。或許作者想通過這個目標,讓模型在一些需要 Span 的下游任務取得更好表現,結果表明也正如此。

具體做法是,在訓練時取 Span 前後邊界的兩個詞,值得指出,這兩個詞不在 Span 內,然後用這兩個詞向量加上 Span 中被遮蓋掉詞的位置向量,來預測原詞

詳細做法是將詞向量和位置向量拼接起來,過兩層全連接層,很簡單:

最後預測 Span 中原詞時獲得一個新損失,就是 SBO 目標的損失,之後將這個損失和 BERT 的 Mased Language Model (MLM)的損失加起來,一起用於訓練模型。

加上 SBO 後效果普遍提高,特別是之前的指代消解任務,提升很大。

NSP:其實好像沒啥用

SpanBERT 還有一個和原始 BERT 訓練很不同的地方,它沒用 Next Sentence Prediction (NSP) 任務,而是直接用 Single-Sequence Training,也就是根本不加入 NSP 任務來判斷是否兩句是上下句,直接用一句來訓練

其實這並不是首次發現 NSP 好像沒啥用了,在之前的 XLNet 中就已發現類似結果。關於 XLNet 細節,可參考我的文章《飛躍芝麻街:XLNet 詳解》。

而且在 XLNet 團隊最近放出的對比博客里復現的幾個 BERT 模型中,沒有 NSP 的模型在有些任務反而是最優。

對於為什麼 NSP 沒有用,這裡,SpanBERT 作者們給出了下面兩個解釋:

  1. 相比起兩句拼接,一句長句,模型可以獲得更長上下文(類似 XLNet 的一部分效果);
  2. 在 NSP 的負例情況下,基於另一個文檔的句子來預測詞,會給 MLM 任務帶來很大噪音

於是 SpanBERT 就沒採用 NSP 任務,直接一句長句,然後 MLM 加上 SBO 任務來進行預訓練

實驗,結論,猜想

還值得一提的是具體實現部分,看實驗表格,會發現 BERT 對比時,除了 Google BERT 還有個神奇的 Our BERT,其實就是對原 BERT 的一些訓練過程進行了優化,然後訓出的 BERT,也是打破 XLNet 記錄的 RoBERTa 的訓練方式。實際上 SpanBERT 和 RoBERTa 應該就是一個組做的,關於 RoBERTa 之後可細講。

其中主要訓練細節是:

  1. 訓練時用了 Dynamic Masking 而不是像 BERT 在預處理時做 Mask;
  2. 取消 BERT 中隨機採樣短句的策略
  3. 還有對 Adam 優化器中一些參數改變。

論文中主要對抽取式問答,指代消解,關係抽取,還有大名鼎鼎的 GLUE 做了實驗。主要結論如下:

  • SpanBERT 普遍強於 BERT
  • SpanBERT 尤其在抽取式問答上表現好,這應該與它的預訓練目標關係較大;
  • 捨棄掉 NSP 的一段長句訓練普遍要比原始 BERT 兩段拼接的方式要好

總體來說,是篇看標題感覺好像不怎麼樣,但看內容驚喜連連,對 BERT 很多訓練細節都進行了分析,讓人漲姿勢的論文。順便吐槽一下,FaceBook 的論文,好幾次都這樣,極度不標題黨,看了標題沒有讀的慾望,但結果一看才發現驚喜多多。

關於猜想部分,為什麼遮蓋 Span 會提高性能,我覺得可能和 XLNet 里提到的學習遮蓋詞之間的關係有關。在 XLNet 中,是通過 PLM 加上自回歸方式來顯式地學習遮蓋詞之間關係,而在 SpanBERT,或上面提的 WWM 和 ERNIE 中,這種關係的學習是通過被遮蓋掉部分本身的強相關性,隱式地學習到的。

本文轉載自公眾號:安迪的寫作間,作者:Andy