香儂讀 | 自訓練 + 預訓練 = 更好的天然語言理解模型 - 知乎

論文標題:Self-training Improves Pre-training for Natural Language Understanding數據庫

論文做者:Jingfei Du, Edouard Grave, Beliz Gunel, Vishrav Chaudhary, Onur Celebi, Michael Auli, Ves Stoyanov, Alexis Conneau框架

論文連接https://arxiv.org/abs/2010.02194dom

預訓練(Pre-training)模型自BERT問世以來就一發不可收拾,目前已經在天然語言理解和生成兩個方面取得了突破性成就。可是,做爲它的一個「兄弟」,自訓練(Self-training)卻不多在天然語言處理中露臉。本文探究了預訓練之上的自訓練方法,從大規模語料中先抽取領域內數據,再用一個Teacher模型生成僞監督數據用於訓練Student模型,這樣就能大幅提高單純基於預訓練模型的效果。自訓練的有效性在必定程度上代表了它與預訓練是互補的,兩者結合能帶來全新表現。

自訓練與預訓練

預訓練(Pre-training)從廣義上來說,是指先在較大規模的數據上對模型訓練一波,而後再在具體的下游任務數據中微調。大多數狀況下,預訓練的含義都比較狹窄:在大規模無標註語料上,用自監督的方式訓練模型。這裏的自監督方法通常指的是語言模型。學習

除了預訓練以外,咱們還常常在圖像領域看到它的一個兄弟,自訓練(Self-training)。自訓練是說有一個Teacher模型f_T和一個Student模型f_S,首先在標註數據上訓練f_T,而後用它對大規模無標註數據進行標註,把獲得的結果當作僞標註數據去訓練f_S測試

顯然,預訓練和自訓練都用到了大規模無標註的數據,只是兩者的處理過程不一樣。並且,其中很是重要的一點是,預訓練始終對針對一個模型進行操做,而自訓練卻用到了兩個模型,前者是直接從無標註數據中學習,然後者是間接地從數據中學習。它們的區別能夠用下圖表示:編碼

那麼,一個天然的問題是:這兩個方法能夠結合起來達到更好的效果嗎?本文給出了答案:固然能夠!首先預訓練一個模型,而後把這個模型在標註數據上訓練後當作f_T,再用它去標註另一批無標註數據,把獲得的僞標註數據用來訓練f_S,最後在推理測試的時候使用f_S便可。從這個過程當中能夠發現,預訓練是爲了更好地自訓練,自訓練是爲了更好地訓練f_S,兩者結合,缺一不可。spa

總之,本文有以下的貢獻:翻譯

  • 結合自訓練與預訓練,比單純的預訓練取得了大幅度的效果提高;
  • 爲了使僞標註數據更加契合下游的具體任務,提出了SentAugment,一種特定領域的數據抽取方法,減小通用語料形成的噪聲干擾;
  • 在知識蒸餾和小樣本學習任務上也取得了突出的結果,證實自訓練+預訓練的優越性。

自訓練處理流程

本文所提出的方法能夠用下面的圖表示,大致分爲四步:orm

  1. 將一個預訓練模型(本文使用RoBERTa_Large)在標註數據上訓練,做爲教師模型f_T
  2. 使用f_T從海量通用語料中提取相關領域的數據;
  3. f_T對提取的數據做標註;
  4. 用僞標註語料訓練學生模型f_S

其中的1,3,4步都是肯定的,因此咱們重點關注如何使用f_T從海量通用語料庫D中抽取出領域相關的語料D'blog

句子編碼

通用語料庫D來自Common-Crawl,直接把文檔切分爲句子,而後以句子爲基本單位進行數據提取。本文使用句子編碼方法,用一個編碼向量去表示每個句子。這個句子編碼器在多個複述(Paraphrase)數據集上訓練,而且還使用了BERT的掩碼語言模型在多語言語料上訓練,以後就能夠用於編碼每一個句子,獲得各自對應的特徵向量。在後文中,咱們默認使用Transformer編碼器。

任務編碼

句子編碼只能表示通用語料庫D中每一個句子s的含義,還不能區分哪些句子是符合領域要求的,這就須要用一個特殊的任務編碼,做爲查詢條件去表示咱們想要的句子是怎樣的,也就是說,只須要計算句子編碼和任務編碼的餘弦值,就知道這個句子是否是符合要求。爲此,考慮三種任務編碼:

  • All-Average: 將訓練f_T所用的全部句子編碼平均起來做爲任務編碼;
  • Label-Average: 將訓練f_T所用的每一個類別的全部句子編碼平均起來做爲各個類別的任務編碼;
  • Per-Sentence:將訓練f_T所用的每一個句子都做爲一個單獨的任務編碼。

相關領域數據提取

在獲取任務編碼後,就能夠把它(們)做爲詢問,根據餘弦值大小,從通用語料庫中抽取相關的句子,這能夠減小通用語料對下游特定任務的噪聲干擾。對於每一個類別,只抽取Top-K個句子,而且對提取的句子,還要知足f_T能取得較高的置信度。

提取了相關領域的數據後,用f_T對其中每個句子x預測它的標籤是什麼:y=f_T(x),獲得其軟標籤或者one-hot硬標籤,這取決於訓練f_S的方法是什麼。但不管如何,到此爲止咱們都獲得了一個僞標註數據庫D'=\{(x,y)\}

用僞標註語料訓練f_S

在獲得僞標註語料D'後,就能夠用它去訓練f_S了。爲此,咱們考慮三種訓練方法:

  • 自訓練(Self-Training):將另外一個預訓練的RoBERTa_Large做爲f_S,使用one-hot硬標籤在D'上訓練;
  • 知識蒸餾(Knowledge-Distillation):將一個預訓練的RoBERTa_Small做爲f_S,使用軟標籤在D'上訓練;
  • 少樣本學習(Few-Shot):訓練f_T所使用的標註數據是少樣本,僞標註語料的大小是標註數據的2~3個數量級,f_S是RoBERTa_Large,使用one-hot硬標籤在D'+D上訓練。

實驗

根據上述訓練f_S的不一樣方法,咱們依次來探究在不一樣訓練設置下,自訓練是否能進一步提升預訓練的效果。數據集包括SST-2,SST-3,CR,IMP,TREC,CoNLL2002,除了最後一個是命名實體識別任務以外,其餘都是分類任務。

自訓練

下圖是在自訓練設置下的實驗結果,ICP是In-domain Continued Pretraining,即直接在D'上預訓練而不使用f_T預測獲得的標籤,ST是Self-Training自訓練。能夠看到,儘管都是在相關領域的數據D'上訓練,ICP因爲沒有使用f_T的預測標籤,反而使得效果降低(-1.2),而ST則能進一步提高預訓練模型的效果(+1.2),這說明沒有僞標註數據,單純的預訓練不能很好地實現領域知識遷移,還要藉助標註數據

少樣本學習與知識蒸餾

下圖是少樣本學習的實驗結果。能夠看到,領域內自訓練能夠大幅提高少樣本場景下的效果

下圖是知識蒸餾的實驗結果。GT表示用真值(Ground-Truth)數據,RD是用隨機(Random)數據,SA(SentAugment)是用本文的方法獲得的數據。在和訓練集同樣大的狀況下,GT和SA都顯著超過了RD,但若是再額外增長100K句子,SA甚至能逼近有監督學習RoBERTa_Large的結果,而且參數量是它的十分之一。這說明,對知識蒸餾來講,自訓練帶來的數據增廣也是很重要的

句子編碼的影響

前面咱們提到咱們默認使用的是Transformer去編碼句子,那麼不一樣的編碼器會有怎樣的影響呢?下圖是不一樣編碼器在STS數據集上的實驗結果。總的來講,單純使用BERT獲得的句子編碼效果最差,而使用Trigram甚至能獲得很好的結果,這說明了複述與多語言掩碼語言模型任務對於訓練句子編碼是頗有幫助的

一個例子

最後咱們來看看從D中抽取的句子是怎樣的,以下圖所示。若是是用Per-Sentence,那麼抽取的句子就基本上是詢問的轉述;若是是用Label-Average,抽取的句子就符合該類別。基於句子編碼與任務編碼的抽取方法有能力獲得知足條件的句子

小結

本文研究了預訓練模型上的自訓練帶來的效果增益。使用自訓練學習框架,模型可以從海量通用語料中抽取出相關領域的句子,而後使用教師模型預測標籤獲得僞標註數據,最後再去訓練學生模型。不管是自訓練自己,仍是知識蒸餾、少樣本學習,預訓練+自訓練都能取得顯著的效果提高。

值得注意的是,本文的核心實際上是如何從海量通用語料中提取知足條件的語料,也即提出的SentAugment方法。在過去一年內,開放領域問答(Open-Domain Question Answering)大量使用了這種方法取提取問題的相關段落,並取得了成功。這些工做代表:基於句子編碼的語料提取、標註,是數據增廣的有效手段,能夠進一步用在天然語言生成任務,如機器翻譯、摘要生成等任務上

相關文章
相關標籤/搜索