[PLM专题] 十分钟了解文本分类通用训练技巧
前言
歡迎大家來到預訓練語言模型的專題系列分享,本篇推送是該專題系列的第三篇。在前兩篇推送[萌芽時代],[風起云涌]中,我們分享了該領域的奠基文章以及聲名鵲起卻生不逢時的ELMo模型,本期我們帶來的文章將會讓大家了解文本分類的一些通用技巧,希望大家看完后煉丹技術都能更上一層樓!
同時感謝清華大學自然語言處理實驗室整理的體系圖,我們將沿此脈絡前行,探索預訓練語言模型的前沿技術,本期的第一篇文章處于圖中綠色框內,另一篇為課外閱讀。紅色框內的論文在前幾期中介紹,大家有興趣的可以前去一看。
Universal Language Model Fine-tuning for Text Classification (2018)
前幾期介紹的大多是模型或結構,而這篇文章由 Jeremy Howard 和 Sebastian Ruder 發表于2018年,介紹的是文本分類中語言模型的通用訓練技巧。其中的一些技巧,吳老師和我在kaggle 的jigsaw 文本分類比賽中也有應用,并在比賽中拿到了金牌。在未來的推送中,可能還會有詳細介紹。
這篇文章認為,目前語言模型在finetune時經常會過擬合到小數據集上,而且容易導致災難性遺忘。相比于CV模型,NLP模型層數較少,所以需要更多的訓練技巧來使其表現更好。而他們在本文中提出了fine-tuning 語言模型的關鍵技術?ULMFiT,可以大大地提高六個文本分類任務的效果,并且用更少的數據訓練就可以達到相當的效果,加強了泛化能力。
首先介紹下ULMFiT的總體框架。之前的很多論文提出的都是預訓練 + finetune 兩個階段的訓練,而本文提出使用三階段訓練。
第一個階段,首先在一個很龐大的通用領域無關語料上,進行語言模型的訓練,以捕捉語言的通用規律
第二個階段,在特定任務的領域相關語料上,進行語言模型的finetune,來學習任務數據的特定語言特征分布
第三個階段,進行目標任務分類器的總體學習,直接學習到任務的分類目標。
文章認為上述第二個階段很有必要。因為無論通用的語料多樣性多么好,都和你目標任務的數據分布有區別。而且在比較小的特定任務數據上finetune語言模型可以很快得到收斂,成本較低。同時,這樣finetune以后,即使對比較小的數據集,語言模型也能變得比較魯棒。
ULMFiT的總體框架(來自論文)
其次,在ELMo,GPT的介紹中我們都提到過,語言模型的不同層其實能夠捕捉不同級別的語義特征,比如ELMo底層LSTM更多捕捉語法和詞層面的特征,而上層LSTM更多捕捉整句話的語言的特征。既然是不同類型的信息,就應該區分地去進行參數的finetune,所以文章提出了discriminative fine-tuning,即對不同的層使用不同的學習率去學習。因為越靠近最下層Embedding層,模型參數就會含有更多通用信息,不應隨任務目標發生很大變化。所以為了降低災難性遺忘的可能,越下層,就會用更小的學習率來學習,而上層為了讓模型能夠更快地學習到目標任務的獨有信息,會用相對大的學習率。一般層之間的學習率會等比地變化,在這篇文章里,這個比值為2.6, 即上一層參數學習率為下一層的2.6倍。
再者,為了讓語言模型能更好地學習到特定任務相關的特征,文章使用了Slanted triangular learning rates (SLTR),讓模型在訓練初期快速收斂到一個合適的參數區域,接著再進行細致地優化。在現在看來這就是一種warmup策略。warmup已經在神經網絡模型中被廣泛應用了,huggingface的transformers也有現成的函數來對warmupscheduler進行控制。
SLTR示意圖(來自論文)
最后,在目標任務的直接優化過程中,文章提出了幾種輔助訓練技巧,其中這些我認為比較簡單通用。
第一個是Concat pooling,一般文本分類的分類器會接在語言模型最后一層LSTM或transformer之后,但是其實很多信息蘊含在之前的層或時間步中。所以將幾個時間步或者幾層進行concat,再接上全連接層一般會獲得更好的結果。這一點在BERT論文和我們之前比賽中也有驗證,根據實驗,將BERT的后四層concat起來再接上全連接層,會得到更好的效果。
第二個是Gradual unfreezing。一下子把模型的全部層一起訓練,通用信息容易丟失,從而增加災難性遺忘的風險。所以文章提出,可以慢慢地從最后一層開始“解凍”,因為最后一層含有最少的 "general knowledge",讓它先去擬合任務目標比較合適。具體做法是第一個epoch,“解凍”最后一層進行訓練(只改變了最后一層參數)。接著“解凍”倒數第二層訓練(改變了最后兩層參數)。直到把所有層“解凍”為止。
文章接下來的篇幅從各方面比較了文中技巧對任務的提升,我們可以大致看一下。其中,full 是指優化整個模型,last指只優化最后一層,discr指discriminative fine-tuning, sltr指slanted triangular learning rates,cos指cosine annealing schedule。可以看到,文中提到的幾個技術都對誤差率的下降有明顯的效果。
不同策略下驗證錯誤率(來自論文)
這篇文章的貢獻是深遠的,它提出了預訓練語言模型比較通用的訓練方法和技術。這篇文章雖然早于GPT和BERT發表,但是它的框架完全可以在后來的強大模型中提供幫助,讓我們NLP的煉丹之旅輕松又愉快!
How to Fine-Tune BERT for Text Classification(2019)
本篇文章是由復旦計算機系的多位作者發表的。討論如何在文本分類任務中對BERT模型進行finetune。雖然這篇文章不在體系圖,但與第一篇文章在內容上比較相關,而且我們在kaggle比賽中也應用到了,所以一起在這里介紹。我們長話短說,直接來總結一下這篇文章的幾個貢獻點和有用的技巧。
第一個貢獻是,框架相比于上篇文章進行了微調。在通過任務相關數據進行語言模型finetune后,多加了一步可選的stage: 把BERT在領域內相關的其他任務上進行多任務的訓練,我認為這是對于ULMFiT的補充。
BERT finetune框架(來自論文)
第二個貢獻是對長文本的處理,我們在之后BERT文章中將會介紹,BERT模型能一次處理的最長文本長度為512,有時我們為了降低模型運行時間和占用空間,有可能將這個長度變得更短,這時候就可能要對文本進行截斷。文章的結論就是最好的截斷方式既不是截頭,也不是截尾,應該頭尾都截一部分保留最重要信息。
長文本不同處理方式的錯誤率(來自論文)
第三個貢獻是在任務上詳細分析了BERT的不同層對文本分類任務的效果。具體做法是,在某一層后直接接分類器進行分類。單層中,以最后一層的效果最好,因為文本分類是更貼近語言層面的任務。而在文章嘗試的其他幾種選擇中,把最后四層concat或者max pooling效果最好。
不同層向量用以分類的錯誤率(來自論文)
第四個貢獻其實是借鑒discriminative fine-tuning,進行層間學習率的下降。越接近底層,含有的通用信息越多,越不應該隨著特定任務進行大規模的參數改變,否則有災難性遺忘風險。在他們的嘗試中,學習率2e-5,層間學習率變化因數0.95對BERT來說比較合適的。
不同學習率設置的分類錯誤率(來自論文)
總之,這篇文章進行了很多完備的實驗,來提出和驗證了在文本分類任務上,BERT的較好的finetune策略及其效果。文章驗證了 : ?1) 對于文本分類,BERT的最高層的效果最好 2) 使用合適的層間學習率下降策略,BERT能夠克服災難性遺忘的問題 3) 任務相關或領域內相關數據的語言模型finetune可以大大提升效果 4) 相關的多任務學習也對特定任務有提升效果 5) BERT只需少量的特定數據就可以預訓練以提升任務。文章對我們訓練BERT模型有很好的指導意義,以后再也不用擔心炸爐啦!
未完待續
本期的論文就給大家分享到這里,感謝大家的閱讀和支持,下期我們會給大家帶來預訓練語言模型其他的論文閱讀分享,敬請大家期待!
歡迎關注晴天1號,這里有很多最新最熱的論文閱讀分享,有問題或建議可以在公眾號下留言。
參考資料
Universal Language Model Fine-tuning for Text Classification (2018)
https://www.aclweb.org/anthology/P18-1031.pdf
How to Fine-Tune BERT for Text Classification(2019)
https://arxiv.org/pdf/1905.05583.pdf
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
https://arxiv.org/pdf/1810.04805.pdf
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的[PLM专题] 十分钟了解文本分类通用训练技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海华·垃圾分类AI挑战赛baseline
- 下一篇: 【TF-IDF】传统方法TF-IDF解决