【論文解讀】文本分類上分利器:Bert微調trick大全

論文標題:How to Fine-Tune BERT for Text Classification?
中文標題:如何微調 BERT 進行文本分類?
論文作者:復旦大學邱錫鵬老師課題組
實驗代碼:https://github.com/xuyige/BERT4doc-Classification

前言

大家現在打比賽對預訓練模型非常喜愛,基本上作爲NLP比賽基線首選(圖像分類也有預訓練模型)。預訓練模型雖然很強,可能通過簡單的微調就能給我們帶來很大提升,但是大家會發現比賽做到後期,bert等預訓練模型煉丹一定程度的時候很難有所提升,分數達到了瓶頸,這個時候需要針對具體的任務如何進行微調使用,就涉及到了考經驗積累的tricks,這篇論文做了非常大的充足實驗,爲我們提供了寶貴的BERT微調經驗及方法論,當需要應用BERT到具體的現實任務上時,可以參照這篇論文提供的調參路線進行優化,我在NLP比賽中也屢試不爽,總有一個trick是你的菜,推薦大家讀一讀這篇論文!

論文摘要

這篇論文的主要目的在於在文本分類任務上探索不同的BERT微調方法並提供一種通用的BERT微調解決方法。這篇論文從三種路線進行了探索:(1) BERT自身的微調策略,包括長文本處理、學習率、不同層的選擇等方法;(2) 目標任務內、領域內及跨領域的進一步預訓練BERT;(3) 多任務學習。微調後的BERT在七個英文數據集及搜狗中文數據集上取得了當前最優的結果。有興趣的朋友可以點擊上面的實驗代碼,跑一跑玩一玩~

論文背景與研究動機

文本分了是NLP中非常經典的任務,就是判斷給定的一個文本所屬的具體類別,比如判斷文本情感是正向還是負向。儘管已經有相關的系研究工作表明基於大語料預訓練模型可以對文本分類以及其他NLP任務有非常不錯的效果收益和提升,這樣做的一個非常大的好處我們不需要從頭開始訓練一個新的模型,節省了很大資源和時間。一種常見的預訓練模型就是我們常見的詞嵌入,比如Word2Vec,Glove向量,或者一詞多義詞向量模型Cove和ELMo,這些詞向量經常用來當做NLP任務的附加特徵。另一種預訓練模型是句子級別上的向量化表示,如ULMFiT。其他的還有OpenAI GPT及BERT。

雖然BERT在許多自然語言理解任務上取得了驚人的成績,但是它的潛力還尚未被完全探索出來。很少有研究來進一步改進BERT在目標任務上的性能。這篇論文的主要目的就是通過探索多種方式最大化地利用BERT來增強其在文本分類任務上的性能。
本篇論文的主要貢獻如下:

(1)提出了一個通用的解決方案來微調預訓練的 BERT 模型,它包括三個步驟:(1)進一步預訓練 BERT
任務內訓練數據或領域內數據; (2) 如果有多個相關任務可用,可選用多任務學習微調 BERT; (3) 爲目標任務微調BERT。

(2)本文研究了 BERT 在目標任務上的微調方法,包括長文本預處理、逐層選擇、逐層學習率、災難性遺忘

(3)我們在七個廣泛研究的英文文本分類數據集和一箇中文新聞分類數據集上取得了SOTA成果

論文核心

  • Fine-Tuning Strategies:當我們爲目標任務微調 BERT 時,有很多方法可以
    使用 BERT。 例如,BERT 的不同層捕獲不同級別的語義和句法信息,哪一層更適合目標任務? 我們如何選擇更好的優化算法和學習率?

  • Further Pre-training:BERT 在通用域中訓練,其數據分佈與目標域不同。 一個自然的想法是使用目標域數據進一步預訓練 BERT。這個真的非常有效,在微調達到一定瓶頸之後,可以嘗試下在比賽語料上ITPT,也就是繼續預訓練。在海華閱讀理解比賽以及基於文本挖掘的企業隱患排查質量分析模型都得到了成功驗證~

  • Multi-Task Fine-Tuning:在沒有預先訓練的 LM 模型的情況下,多任務學習已顯示出其利用多個任務之間共享知識優勢的有效性。 當目標域中有多個可用任務時,一個有趣的問題是,在所有任務上同時微調 BERT 是否仍然帶來好處。

微調策略

1. 處理長文本
我們知道BERT 的最大序列長度爲 512,BERT 應用於文本分類的第一個問題是如何處理長度大於 512 的文本。本文嘗試了以下方式處理長文章。

Truncation methods 截斷法
文章的關鍵信息位於開頭和結尾。 我們可以使用三種不同的截斷文本方法來執行 BERT 微調。

  1. head-only: keep the first 510 tokens 頭部510個字符,加上兩個特殊字符剛好是512 ;
  2. tail-only: keep the last 510 tokens;尾部510個字符,同理加上兩個特殊字符剛好是512 ;
  3. head+tail: empirically select the first 128and the last 382 tokens.:尾部結合

Hierarchical methods 層級法
輸入的文本首先被分成k = L/510個片段,喂入 BERT 以獲得 k 個文本片段的表示向量。 每個分數的表示是最後一層的 [CLS] 標記的隱藏狀態,然後我們使用均值池化、最大池化和自注意力來組合所有分數的表示。


上表的結果顯示,head+tail的截斷法在IMDb和Sogou數據集上表現最好。後續的實驗也是採用這種方式進行處理。

2. 不同層的特徵
BERT 的每一層都捕獲輸入文本的不同特徵。 文本研究了來自不同層的特徵的有效性, 然後我們微調模型並記錄測試錯誤率的性能。


我們可以看到:最後一層表徵效果最好;最後4層進行max-pooling效果最好
3. 災難性遺忘
Catastrophic forgetting (災難性遺忘)通常是遷移學習中的常見詬病,這意味着在學習新知識的過程中預先訓練的知識會被遺忘。
因此,本文還研究了 BERT 是否存在災難性遺忘問題。 我們用不同的學習率對 BERT 進行了微調,發現需要較低的學習率,例如 2e-5,才能使 BERT 克服災難性遺忘問題。 在 4e-4 的較大學習率下,訓練集無法收斂。

這個也深有體會,當預訓練模型失效不能夠收斂的時候多檢查下超參數是否設置有問題。
4. Layer-wise Decreasing Layer Rate 逐層降低學習率
下表 顯示了不同基礎學習率和衰減因子在 IMDb 數據集上的性能。 我們發現爲下層分配較低的學習率對微調 BERT 是有效的,比較合適的設置是 ξ=0.95 和 lr=2.0e-5

爲不同的BERT設置不同的學習率及衰減因子,BERT的表現如何?把參數θ \thetaθ劃分成{ θ 1 , … , θ L } {\theta1,\dots,\thetaL}{θ
1
,…,θ
L
},其中θ l \theta^lθ
l

ITPT:繼續預訓練

Bert是在通用的語料上進行預訓練的,如果要在特定領域應用文本分類,數據分佈一定是有一些差距的。這時候可以考慮進行深度預訓練。

Within-task pre-training:Bert在訓練語料上進行預訓練
In-domain pre-training:在同一領域上的語料進行預訓練
Cross-domain pre-training:在不同領域上的語料進行預訓練

  1. Within-task pretraining



    BERT-ITPT-FiT 的意思是“BERT + with In-Task Pre-Training + Fine-Tuning”,上圖表示IMDb 數據集上進行不同步數的繼續預訓練是有收益的。
    2 In-Domain 和 Cross-Domain Further Pre-Training



    我們發現幾乎所有進一步的預訓練模型在所有七個數據集上的表現都比原始 BERT 基礎模型。 一般來說,域內預訓練可以帶來比任務內預訓練更好的性能。 在小句子級 TREC 數據集上,任務內預訓練會損害性能,而在使用 Yah 的領域預訓練中。Yah. A.語料庫可以在TREC上取得更好的結果。

這篇論文與其他模型進行了比較,結果如下表所示:



我們可以看到ITPT和IDPT以及CDPT的錯誤率相比其他模型在不同數據集有不同程度下降。

多任務微調

所有任務都會共享BERT層及Embedding層,唯一不共享的層就是最終的分類層,每個任務都有各自的分類層。


上表表明對於基於BERT多任務微調,效果有所提升,但是對於CDPT的多任務微調是有所下降的,所以說多任務學習對於改進對相關文本分類子任務的泛化可能不是必要的。

小樣本學習 Few-Shot Learning


實驗表明:BERT能夠爲小規模數據帶來顯著的性能提升。

BERT Large模型上進一步預訓練


實驗結果表明:在特定任務上微調BERT Large模型能夠獲得當前最優的結果。

接下來給大家帶來乾貨部分:不同學習率策略的使用

不同學習率策略

完整代碼回覆“學習率”獲取

  1. Constant Schedule


  2. Constant Schedule with Warmup


  3. Cosine with Warmup


  4. Cosine With Hard Restarts


  5. Linear Schedule with Warmup


  6. Polynomial Decay with Warmup


參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章