如何提升bert在下游任務中的性能

更好的閱讀體驗,請?zhí)D至如何提升bert在下游任務中的性能

隨著Transformer 在NLP中的表現(xiàn),Bert已經(jīng)成為主流模型,然而大家在下游任務中使用時,是不是也會發(fā)現(xiàn)模型的性能時好時壞,甚至相同參數(shù)切換一下隨機種子結果都不一樣,又或者自己不管如何調,模型總達不到想象中的那么好,那如何才能讓Bert在下游任務中表現(xiàn)更好更穩(wěn)呢?本文以文本分類為例,介紹幾種能幫你提高下游任務性能的方法。

Further Pre-training

最穩(wěn)定也是最常用的提升下游任務性能的手段就是繼續(xù)進行預訓練了。

二階段 vs 三階段 vs 四階段

首先回顧一下,Bert 是如何使用的呢?我們設通用泛化語料為D_g,下游任務相關的數(shù)據(jù)為D_t, Bert 即在通用語料D_g 上訓練一個通用的Language Model, 然后利用這個模型學到的通用知識來做下游任務,也就是在下游任務上做fine-tune,這就是<code>二階段模式</code>。大多數(shù)情況下我們也都是這么使用的:下載一個預訓練模型,然后在自己的數(shù)據(jù)上直接fine-tune。

三階段

在論文Universal Language Model Fine-tuning for Text Classification中,作者提出了一個通用的范式ULMFiT:

  1. 在大量的通用語料上訓練一個LM(Pretrain);
  2. 在任務相關的小數(shù)據(jù)上繼續(xù)訓練LM(Domain transfer);
  3. 在任務相關的小數(shù)據(jù)上做具體任務(Fine-tune)。

那我們在使用Bert 時能不能也按這種范式,進行三階段的fine-tune 從而提高性能呢?答案是:<code>能!</code>
比如邱錫鵬老師的論文How to Fine-Tune BERT for Text Classification?和[Don't Stop Pretraining: Adapt Language Models to Domains and Tasks](arXiv:2004.10964 [cs])中就驗證了,在任務數(shù)據(jù)D_t 繼續(xù)進行pretraining 任務,可以提高模型的性能。
那如果我們除了任務數(shù)據(jù)沒有別的數(shù)據(jù)時,怎么辦呢?簡單,任務數(shù)據(jù)肯定是相同領域的,此時直接將任務數(shù)據(jù)看作相同領域數(shù)據(jù)即可。所以,在進行下游任務之前,不妨先在任務數(shù)據(jù)上繼續(xù)進行pre-training 任務繼續(xù)訓練LM ,之后再此基礎上進行fine-tune。

四階段

我們在實際工作上,任務相關的label data 較難獲得,而unlabeled data 卻非常多,那如何合理利用這部分數(shù)據(jù),是不是也能提高模型在下游的性能呢?答案是:<code>也能! </code>

  1. 在大量通用語料上訓練一個LM(Pretrain);
  2. 在相同領域D_{in_domain}上繼續(xù)訓練LM(Domain transfer);
  3. 在任務相關的小數(shù)據(jù)上繼續(xù)訓練LM(Task transfer);
  4. 在任務相關數(shù)據(jù)上做具體任務(Fine-tune)。

而且上述兩篇論文中也給出了結論:先Domain transfer 再進行Task transfer 最后Fine-tune 性能是最好的。

如何further pre-training

how to mask

首先,在further pre-training時,我們應該如何進行mask 呢?不同的mask 方案是不是能起到更好的效果呢?
在Roberta 中提出,動態(tài)mask 方案比固定mask 方案效果更好,此外,在做Task transfer 時,由于數(shù)據(jù)通常較小,固定的mask 方案通常也容易過擬合,所以further pre-training 時,動態(tài)隨機mask 方案通常比固定mask 效果更好。
而ERNIE 和 SpanBert 中都給出了結論,更有針對性的mask 方案可以提升下游任務的性能,那future pre-training 時是否有什么方案能更有針對性的mask 呢?
劉知遠老師的論文Train No Evil: Selective Masking for Task-Guided Pre-Training就提出了一種更有針對性的mask 方案<code>Selective Mask</code>,進行further pre-training 方案,該方案的整體思路是:

  1. D_t上訓練一個下游任務模型 Model_0;
  2. 利用Model_0判斷token 是否是下游任務中的重要token,具體計算公式為:S(w_i) = P(y_t|s) - P(y_t|s^{'}_{i-1}W_i), 其中s為完整句子(序列),s^{'}為一個初始化為空的buffer,每次將句子中的token 往buffer中添加,如果加入的token 對當前任務的表現(xiàn)與完整句子在當前任務的表現(xiàn)差距小于閾值,則認為該token 為重要token,并從buffer 中剔除;
  3. 利用上一步中得到的token label,訓練一個二分類模型Model_b,來判斷句子中的token 是否為重要token;
  4. 利用Model_b,在domain 數(shù)據(jù)上進行預測,根據(jù)預測結果進行mask ;
  5. 進行Domain transfer pre-training;
  6. 在下游任務進行Fine-tuning。
    上述方案驗證了更有針對性的mask 重要的token,下游任務中能得到不錯的提升。綜合下來,<code>Selective Mask > Dynamic Mask > Static Mask</code>

雖然selective mask 有提升,但是論文給出的思路太過繁瑣了,本質上是判斷token 在下游任務上的影響,所以這里給出一個筆者自己腦洞的一個方案:通過Model_0在unlabeled 的Domain data 上直接預測,然后通過不同token 下結果的熵的波動來確定token 對下游任務的影響。這個方案我沒有做過實驗,有興趣的可以試試。

when to stop

在further pretraining 時,該何時停止呢?是否訓練的越久下游任務就提升的越多呢?答案是否定的。在進行Task transfer 時,應該訓練多少步,論文How to Fine-Tune BERT for Text Classification?進行了實驗,最后得出的結論是<code>100k</code>步左右,下游任務上提升是最高的,這也與我自己的實驗基本吻合,訓練過多就會過擬合,導致下游任務上提升小甚至降低。

step.png

此外,由于下游任務數(shù)據(jù)量的不同,進行多少步結果是最優(yōu)的也許需要實驗測試。這里給出一個更快捷穩(wěn)妥的方案:借鑒PET本質上也是在訓練MLM 任務,我們可以先利用利用PET做fine-tuning,然后將最優(yōu)模型作為預訓練后的模型來進行分類任務fine-tuning,這種方案我實驗后的結論是與直接進行Task transfer性能提升上相差不大。不了解PET的可以查看我之前博文PET-文本分類的又一種妙解.

how to fine-tuning

不同的fine-tuning 方法也是影響下游任務性能的關鍵因素。

optimizer

關于優(yōu)化方案上,Bert 的論文中建議使用與bert 預訓練時一致的方案進行fine-tuning,即使用weighted decay修正后的Adam,并使用warmup策略 搭配線性衰減的學習率。不熟悉的同學可以查看我之前的博文optimizer of bert

learning rate

不合適的learning rate可能會導致<code>災難性遺忘</code>,通常learning rate 在[-e^{-5}, 1e^{-4}]之間,更大的learning rate可能就會發(fā)生災難性遺忘,不利于優(yōu)化。

lrt.png

此外,對transformer 逐層降低學習率也能降低發(fā)生災難性遺忘的同時提升一些性能。

multi-task

Bert在預訓練時,使用了兩個task:NSP 和 MLM,那在下游任務中,增加一個輔助的任務是否能帶來提升呢?答案是否定的。如我之前嘗試過在分類任務的同時,增加一個相似性任務:讓樣本與label desc的得分高于樣本與其他樣本的得分,但是最終性能并沒有得到提升。具體的實驗過程請看博文模型增強之從label下手
此外,論文How to Fine-Tune BERT for Text Classification?也任務multi-task不能帶來下游任務的提升。

which layer

Bert的結構上是一個12層的transformer,在做文本分類時,通常我們是直接使用最后一層的<code>[CLS]</code>來做fine-tuning,這樣是最優(yōu)的嗎?有沒有更好的方案?
論文How to Fine-Tune BERT for Text Classification?中針對這個問題也做了實驗,對比了不同的layer不同的抽取策略,最終結論是所有層拼接效果最好,但是與直接使用最后一層差距不大。

layer.png

而論文Hate Speech Detection and Racial Bias Mitigation in Social Media based on BERT model中,作者通過組合多種粒度的語義信息,即將12層的<code>[CLS]</code>拼接后,送人CNN,在Hate Speech Detection 中能帶來<code>8個點</code>的提升!

cnn.png

所以在fine-tuning時,也可以想一想到底是哪種粒度的語義信息對任務更重要。

Self-Knowledge Distillation

self-knowledge distillation(自蒸餾)也是一種常用的提升下游任務的手段。做法是先在Task data上fine-tuning 一個模型,然后通過模型得到Task data 的soft labels,然后使用soft labels 代替hard label 進行fine-tuning。更多細節(jié)可以查看之前的博文Knowledge Distillation之知識遷移

知識注入

通過注入外部知識到bert中也能提升Bert的性能,常用的方式主要有兩種:

  1. 在bert embedding 層注入:通過將外部Embedding 與Bert token-embedding 拼接(相加)進行融合,然后進行transformer一起作用下游;
  2. 在transformer的最后一層,拼接外部embedding,然后一起作用下游。
    Enriching BERT with Knowledge Graph Embeddings for Document Classification中,通過在
    transformer的最后一層中拼接其他信息,提高模型的性能。
    kg.png

數(shù)據(jù)增強

NLP中數(shù)據(jù)增強主要有兩種方式:一種是保持語義的數(shù)據(jù)增強,一種是可能破壞語義的局部擾動增強。保持語義通常采用回譯法,局部擾動的通常使用EDA,更多細節(jié)可以查看之前博文NLP中的數(shù)據(jù)增強

總結

本文總結了使用bert 時,當前主要的提升Bert 在下游任務上的性能的方法,遇到相關問題時,可以嘗試一下。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容