自训练:超越预训练,展现强大互补特性的上分新范式!
文 | 香儂科技
編 | 兔子醬
背景
預訓練(Pre-training)模型自BERT問世以來就一發不可收拾,目前已經在自然語言理解和生成兩個方面取得了突破性成就。但是,作為它的一個“兄弟”,自訓練(Self-training) 卻很少在自然語言處理中露臉。本文探究了預訓練之上的自訓練方法,從大規模語料中先抽取領域內數據,再用一個Teacher模型生成偽監督數據用于訓練Student模型,這樣就能大幅提升單純基于預訓練模型的效果。自訓練的有效性在一定程度上表明了它與預訓練是互補的,二者結合能帶來全新表現。
論文標題:Self-training Improves Pre-training for Natural Language Understanding
下載鏈接:
https://arxiv.org/abs/2010.02194
Arxiv訪問慢的小伙伴也可以在 【夕小瑤的賣萌屋】訂閱號后臺回復關鍵詞 【1029】 下載論文PDF~
自訓練與預訓練
預訓練(Pre-training)從廣義上來講,是指先在較大規模的數據上對模型訓練一波,然后再在具體的下游任務數據中微調。大多數情況下,預訓練的含義都比較狹窄:在大規模無標注語料上,用自監督的方式訓練模型。這里的自監督方法一般指的是語言模型。
除了預訓練之外,我們還經常在圖像領域看到它的一個兄弟,自訓練(Self-training) 。自訓練是說有一個Teacher模型和一個Student模型,首先在標注數據上訓練,然后用它對大規模無標注數據進行標注,把得到的結果當做偽標注數據去訓練。
顯然,預訓練和自訓練都用到了大規模無標注的數據,只是二者的處理過程不同。而且,其中非常重要的一點是,預訓練始終對針對一個模型進行操作,而自訓練卻用到了兩個模型,前者是直接從無標注數據中學習,而后者是間接地從數據中學習。它們的區別可以用下圖表示:
那么,一個自然的問題是:這兩個方法可以結合起來達到更好的效果嗎?本文給出了答案:當然可以!首先預訓練一個模型,然后把這個模型在標注數據上訓練后當做,再用它去標注另外一批無標注數據,把得到的偽標注數據用來訓練,最后在推理測試的時候使用即可。從這個過程中可以發現,預訓練是為了更好地自訓練,自訓練是為了更好地訓練,二者結合,缺一不可。
總之,本文有如下的貢獻:
結合自訓練與預訓練,比單純的預訓練取得了大幅度的效果提升;
為了使偽標注數據更加契合下游的具體任務,提出了 SentAugment,一種特定領域的數據抽取方法 ,減少通用語料造成的噪聲干擾;
在知識蒸餾和小樣本學習任務上也取得了突出的結果,證明自訓練+預訓練的優越性。
自訓練處理流程
本文所提出的方法可以用下面的圖表示,大體分為四步:
將一個預訓練模型(本文使用RoBERTa_Large)在標注數據上訓練,作為教師模型;
使用從海量通用語料中提取相關領域的數據;
用對提取的數據作標注;
用偽標注語料訓練學生模型。
其中的1,3,4步都是確定的,所以我們重點關注如何使用從海量通用語料庫中抽取出領域相關的語料。
句子編碼
通用語料庫來自Common-Crawl,直接把文檔切分為句子,然后以句子為基本單位進行數據提取。本文使用句子編碼方法,用一個編碼向量去表示每一個句子。這個句子編碼器在多個復述(Paraphrase)數據集上訓練,并且還使用了BERT的掩碼語言模型在多語言語料上訓練,之后就可以用于編碼每個句子,得到各自對應的特征向量。在后文中,我們默認使用Transformer編碼器。
任務編碼
句子編碼只能表示通用語料庫中每個句子的含義,還不能區分哪些句子是符合領域要求的,這就需要用一個特殊的任務編碼,作為查詢條件去表示我們想要的句子是怎樣的。也就是說,只需要計算句子編碼和任務編碼的余弦值,就知道這個句子是不是符合要求。為此,考慮三種任務編碼:
All-Average: 將訓練所用的所有句子編碼平均起來作為任務編碼;
Label-Average: 將訓練所用的每個類別的所有句子編碼平均起來作為各個類別的任務編碼;
Per-Sentence:將訓練所用的每個句子都作為一個單獨的任務編碼。
相關領域數據提取
在獲取任務編碼后,就可以把它(們)作為詢問,根據余弦值大小,從通用語料庫中抽取相關的句子,這可以減少通用語料對下游特定任務的噪聲干擾。對于每個類別,只抽取Top-K個句子,并且對提取的句子,還要滿足能取得較高的置信度。
提取了相關領域的數據后,用對其中每一個句子預測它的標簽是什么:,得到其軟標簽或者one-hot硬標簽,這取決于訓練的方法是什么。但無論如何,到此為止我們都得到了一個偽標注數據庫。
用偽標注語料訓練
在得到偽標注語料后,就可以用它去訓練了。為此,我們考慮三種訓練方法:
自訓練(Self-Training):將另一個預訓練的RoBERTa_Large作為,使用one-hot硬標簽在上訓練;
知識蒸餾(Knowledge-Distillation):將一個預訓練的RoBERTa_Small作為,使用軟標簽在上訓練;
少樣本學習(Few-Shot):訓練所使用的標注數據是少樣本,偽標注語料的大小是標注數據的2~3個數量級,是RoBERTa_Large,使用one-hot硬標簽在上訓練。
實驗
根據上述訓練的不同方法,我們依次來探究在不同訓練設置下,自訓練是否能進一步提高預訓練的效果。數據集包括SST-2,SST-3,CR,IMP,TREC,CoNLL2002,除了最后一個是命名實體識別任務之外,其他都是分類任務。
自訓練
下圖是在自訓練設置下的實驗結果,ICP是In-domain Continued Pretraining,即直接在上預訓練而不使用預測得到的標簽,ST是Self-Training自訓練。可以看到,1、沒有偽標注數據,單純的預訓練不能很好地實現領域知識遷移,還要借助標注數據。2、盡管都是在相關領域的數據上訓練,ICP由于沒有使用的預測標簽,反而使得效果下降(-1.2),而ST則能進一步提升預訓練模型的效果(+1.2)。
少樣本學習
下圖是少樣本學習的實驗結果。可以看到,領域內自訓練可以大幅提升少樣本場景下的效果。
知識蒸餾
下圖是知識蒸餾的實驗結果。GT表示用真值(Ground-Truth)數據,RD是用隨機(Random)數據,SA(SentAugment)是用本文的方法得到的數據。在和訓練集一樣大的情況下,GT和SA都顯著超過了RD,但如果再額外增加100K句子,SA甚至能逼近有監督學習RoBERTa_Large的結果,并且參數量是它的十分之一。這說明,對知識蒸餾來說,自訓練帶來的數據增廣也是很重要的。
句子編碼的影響
前面我們提到我們默認使用的是Transformer去編碼句子,那么不同的編碼器會有怎樣的影響呢?下圖是不同編碼器在STS數據集上的實驗結果。總的來說,單純使用BERT得到的句子編碼效果最差,而使用Trigram甚至能得到很好的結果,這說明了復述與多語言掩碼語言模型任務對于訓練句子編碼是很有幫助的。
一個例子
最后我們來看看從中抽取的句子是怎樣的,如下圖所示。如果是用Per-Sentence,那么抽取的句子就基本上是詢問的轉述;如果是用Label-Average,抽取的句子就符合該類別。基于句子編碼與任務編碼的抽取方法有能力得到滿足條件的句子。
小結
本文研究了預訓練模型上的自訓練帶來的效果增益。使用自訓練學習框架,模型能夠從海量通用語料中抽取出相關領域的句子,然后使用教師模型預測標簽得到偽標注數據,最后再去訓練學生模型。無論是自訓練本身,還是知識蒸餾、少樣本學習,預訓練+自訓練都能取得顯著的效果提升。
值得注意的是,本文的核心其實是如何從海量通用語料中提取滿足條件的語料,也即提出的SentAugment方法。在過去一年內,開放領域問答(Open-Domain Question Answering)大量使用了這種方法取提取問題的相關段落,并取得了成功。這些工作表明:基于句子編碼的語料提取、標注,是數據增廣的有效手段,可以進一步用在自然語言生成任務,如機器翻譯、摘要生成等任務上。
后臺回復關鍵詞【入群】
加入賣萌屋NLP/IR/Rec與求職討論群
有頂會審稿人、大廠研究員、知乎大V和妹紙
等你來撩哦~
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的自训练:超越预训练,展现强大互补特性的上分新范式!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 26岁!年入100万,两周把 Githu
- 下一篇: 吐槽贴:用ELECTRA、ALBERT之