1. 程式人生 > 其它 >Bert不完全手冊3. Bert訓練策略優化!RoBERTa & SpanBERT

Bert不完全手冊3. Bert訓練策略優化!RoBERTa & SpanBERT

之前看過一條評論說Bert提出了很好的雙向語言模型的預訓練以及下游遷移的框架,但是它提出的各種訓練方式槽點較多,或多或少都有優化的空間。這一章就訓練方案的改良,我們來聊聊RoBERTa和SpanBERT給出的方案,看作者這兩篇paper是一個組的作品,所以彼此之間也有一些共同點~

RoBERTa

RoBERTa與其說是一個新模型,更像是一個篇煉丹手札( ˘•ω•˘ )。作者針對BERT預訓練中的幾個超引數進行了測試,給出了更好的方案。相信你一定也在不少paper裡都看到過“訓練方案參考RoBERTa,此處省略1K字”之類的,RoBERTa主包括以下幾點改良

  • 更大的batch size
  • 更多的訓練資料,訓練更多的epochs
  • 使用一個長文字替代BERT的兩段短文字, 並剔除NSP任務
  • Dynamic MASK

更大的batch size

RoBERTa對batch size進行了引數調優,發現增加batch size可以有效提高MLM任務,以及下游遷移任務的效果。batch size越大,能更高的利用平行計算加速訓練,以及batch之間的gradient波動越小越平滑,更容易擬合,當然也會有更高的記憶體佔用,以及過於平滑的梯度可能會導致模型快速收斂到區域性最優的問題。

對比結果如下,作者控制了相同的訓練資料和epochs,增加batch size並相應的對lr進行調優,最終考慮到訓練效率沒有選擇表現略好的2K而是用8K作為batch size。

看到這裡其實有一些疑惑,因為平時訓練很少用到如此大的batch size,雖然樣本確實很大,但是控制batch size更多是考慮到batch太大會導致梯度過於平滑。個人感覺這裡使用如此大的batch size,部分原因是MLM只對15%掩碼的token計算loss,訓練效率很低,更大的batch size一定程度上抵消了低效的掩碼策略。

更多的TrainSample & Epochs

進一步佩服作者的耐心,這裡作者清洗了160G的訓練樣本vs BERT(13G) vs XLNET(126G)。在BERT已經使用的BookCorpus和Wiki的基礎上,加入了新聞CC-News,網頁文字OpenWebTet,以及故事類文字Stories。

並一步控制變數進行測試,分別先增加樣本量,再增加訓練epochs。結論是在原始epochs上增加樣本會帶來效果提升,訓練更多的epoches會進一步提升效果。其實也就是在BERT當前的引數量級下,我們可以用更多的樣本塞進更多的文字資訊,一定程度上可以說BERT其實是under fit的。NLP確實是一個大力可以出奇跡的領域。。。

NSP任務到底有用沒用?

BERT除了捕捉雙向文字資訊的核心MLM任務之外,還使用了NSP任務。NSP其實比較早在Quick Thought裡面就被提出了(不熟悉的童鞋看過來無所不能的Embedding5 - skip-thought的兄弟們[Trim/CNN-LSTM/quick-thought])。最初skip-thought這類文字表徵模型,一般通過ENcoder-Decoder來進行建模,然後使用Encoder的Embedding作為句子表徵。但這種訓練方式比較低效,因為Decoder在推理中並不需要,以及Decoder的訓練方式會導致文字表徵過於關注表面文字資訊。因此Quick-Thought直接丟掉了Decoder部分,把任務簡化為通過文字表徵判斷兩個文字是否是連續的上下文。

BERT這裡借鑑了這個任務,來幫助學習文字關聯關係,主要用於QA,NLI這類考慮文字間關聯的任務。樣本構建方式是50%正樣本(A,B)是連續上下文,50%負樣本(A,C)是從其他文字中隨機取樣得到。

RoBERTa分別對比了4種方案

  • Segment Pair + NSP:和BERT一致,segment包含多個句子,控制整體長度<512
  • Sentence Pair + NSP: 只使用單個句子,因為長度會短很多,因此適當增加batch size,讓每個batch的token和以上方案相似
  • Full-Sentence:完整一段文字,允許跨document,只是在document之間加入sep,控制整體長度<512,不使用NSP Loss
  • Doc-Sentences: 完整一段文字,不允許跨document,因為長度可能更短,所以動態增加batch size,不使用NSP Loss

對比結果如下

  • 單句的效果顯著比多個句子更差。作者認為這來自於單個句子影響模型學習長依賴的能力,以及我認為這裡多個句子本身在MLM任務中也會學習句子間的關聯性
  • 移除NSP任務,並沒有影響在NLI以及QA任務上的表現
  • 使用一個文件內的文字效果略優於跨文件,不過實現起來略麻煩,因此RoBERTa最終還是選取了Full-Sentence的方案

雖然RoBERTa這裡驗證了移除NSP的效果並不比BERT差,不過我還不想這麼快把NSP任務打入冷宮,感覺還有幾個需要驗證的點。第一NSP任務其實用了negative sampling對比學習的思路來學習文字表徵,但是它構建負樣本的方式是從其他文件中取樣,過於easy因此容易導致模型偷懶通過學習主題資訊來識別正負樣本,感覺負取樣這裡存在優化空間。第二NSP任務作為二分類任務,比MLM本身要簡單很多,所以二者的擬合速度存在比較大的差異,有可能MLM擬合的時候NSP已經過擬或者發生了塌陷。嘿嘿所以我個人還是對NSP無用持一定的懷疑態度~

Dynamic MASK vs Static MASK

BERT本身的MASK策略是放在資料預處理階段的,為了保證樣本MASK在不同epoch的隨機性。BERT是隨機生成了10份不同MASK的樣本,總共訓練40個epoch,所以每份MASK樣本會被用到4次。而RoBERTa把MASK放到了input pipe過程中,因此不需要預先生成多份樣本,考慮以上RoBERTa使用更多的資料,訓練更多的epoch。這個改良更多是面向工程實現上的記憶體優化,在效果上帶來的收益並如下,並不非常顯著~

SpanBERT

SpanBERT主要針對MASK策略進行優化,包括以下三點創新

  • 基於幾何分佈取樣的長度隨機的Span Mask策略
  • 針對Span MASK設計的損失函式Span Boundary Objective
  • 訓練策略優化:去掉NSP任務,用一個長句替代兩個短句

Span Mask

針對Bert MASK是在subword粒度進行隨機掩碼,已經有不少的改良方案,包括Whole word MASK通過全詞掩碼來更好的引入詞粒度資訊,以及ERINE的knowledge masking通過實體&短語掩碼引入知識資訊等等

而SpanBERT給出了更加通用的掩碼方案,基於幾何分佈\(l \sim Geo(p)\),每次隨機生成MASK的長度,再按均勻分佈隨機生成掩碼的位置,位置必須為完整token而非subwords。對於幾何分佈引數的選取作者選擇了\(p=0.2\),並且限制了長度最長為10,這樣平均掩碼長度是3.8。

整體掩碼的比例和策略Bert保持了一致都是15%,並且對其中80%的token使用MASK,10%用原始token替換,10%用隨機token替換。以上策略針對span級別,如果使用MASK則整個span都會用MASK替換。

以下Whole Word Masking和knowledge Masking,其實都是Span Masking的一種特殊形式,只不過前兩者強調MASK必須針對完整的詞或者短語/實體,而Span Mask其實證明了隨機連續掩碼的效果更好。作者還通過更嚴謹的消融進行了驗證,作者在原始Bert的預訓練策略上,只改變MASK方式,對比whole word,entity,名詞的掩碼,整體上還是隨機長度連續掩碼的效果最好~~

感覺這裡的增益部分可能來自最大長度為10的幾何分佈相比詞/短語遮蓋長文字的概率更大,如果在隨機長度掩碼的基礎上,保證掩碼的邊界是完整的詞邊界,是不是效果還會有提升嘞????

Span Boundary Obejctive

針對以上的掩碼策略,作者也提出了新的訓練目標。我帶著自己的預期去看的這部分,結果發現和作者的設計完全不一樣哈哈~本以為是一個Span級別的Cross Entropy來加強對Span內token聯合概率的學習,結果作者設計的loss有比較強的針對性,主要面向span抽取任務

如上圖,針對被MASK的部分\((x_s,...x_e) \in Y\),其中(s,e)是span的左右邊界,作者在Transformer的Encoder Output上增加了一層變換\(f(\cdot)\)來預測Span內token。

\[y_i = f(x_{s-1}, x_{e+1}, p_{i-s+1}) \]

其中\(f(\cdot)\)是兩層啟用函式為Gelu的全連線層,並且加入了LayerNorm。預測的輸入是Span的左右邊界token,以及span內部的相對位置編碼。SBO的核心是在更新全域性資訊的同時,span邊界的token進行額外的更新,幫助他們學習和Span內部的語義互動,感覺會讓每個token有機會學到更加豐富的語義表達,避免在全域性互動時每個token學到的資訊被稀釋。整體損失是MLM和SBO的損失之和,對應上圖football的損失函式為

\[\begin{align} L(football) &= L_{MLM}(football) + L_{SBO}(football) \\ &=-logP(football|x_7) -logP(football|x_4,x_9,p_3) \end{align} \]

在消融實驗中SBO提升比較顯著的是指代消歧任務和QA,其他任務感覺效果效果不大~所以如果你的下游遷移任務是span 抽取/理解類的,SpanBert可以考慮下喲~

訓練策略

SpanBERT順帶著也對訓練策略做了探索,和RoBERTa比較相似。主要是兩點優化

  • 一個長句比兩個segment效果要好
  • 不要NSP任務效果更好
    這部分不算是SpanBERT的核心,這裡就不做過多展開了~