BERT模型的標準調優和花式調優
新智元報道
來源:知乎
作者:Andy Yang
編輯:小芹
【新智元導讀】BERT預訓練模型就如宰好待烹的豬,則finetune便是烹飪之法,豬頭能用來做成香糯濃醇的燒豬頭肉,豬蹄能用來做成勁道十足的紅燒豬蹄,身上的梅花肉,五花肉,裡脊肉也各有各的做法。於是對於 Bert finetune,也就有各種料理之法。
自去年 BERT 論文發出,正巧半年,不光各大榜單上儘是 BERT 之名,最近公布 NAACL 最佳長論文也給了 BERT,正所謂實至名歸。
正巧在讀 BERT 相關論文, 順便總結下,給大家介紹 BERT論文發出半年後的今天,大概都有哪些與 BERT finetune 相關的研究。
先來簡單介紹 BERT,再進入正題。
BERT全稱Bidirectional Encoder Representations from Transformers(Transformer 雙向編碼器特徵),縮寫為芝麻街的主角之一 BERT。
取名的惡趣味,導致之後微軟,百度的改進模型,都叫 Big-Bird 和 ERNIE,儼然走錯片場,進入了芝麻街的世界。
BERT最主要是開創性地提出同時用 Masked Language Model (掩語言模型) 和 Next Sentence Prediction(下句預測)兩個任務,加上大量的數據,來預訓練出一個大型的 Transformer 模型。
而這個模型,也就是今天的主角 BERT。
BERT主要部件
既然要各自 finetune,那便得先了解 BERT 這頭大肥豬的主要部位。
首先是最關鍵的輸入部分,之後大部分 finetune 和這部分聯繫很大。
自上向下一一可知,BERT 輸入最主要組成部分便是,詞(token 這裡姑且理解為詞)向量、段(segment)向量、位置向量。
詞向量很好理解,也是模型中關於詞最主要信息所在;
段向量是因為 BERT 里有下句預測任務,所以會有兩句拼接起來,上句與下句,上句有上句段向量,下句則有下句段向量,也就是圖中 A 與 B。此外,句子末尾都有加 [SEP] 結尾符,兩句拼接開頭有 [CLS] 符;
而位置向量則是因為 Transformer 模型不能記住時序,所以人為加入表示位置的向量。
之後這三個向量拼接起來的輸入會喂入 BERT 模型,輸出各個位置的表示向量。
Finetune 標準四法
關於 Finetune,這裡定義 BERT 論文上提到的四種方法為標準法,而此外各種方法,則定義為花式。而如果只是對標準法輕微改動,也歸入標準。
標準四法第一法,雙句分類任務。
很簡單就像 BERT 的設定一般,兩句拼起來,加上 [CLS] 和 [SEP],直接取 [CLS] 位置輸出向量預測,進行 finetune。
標準四法第二法,單句分類任務。
和雙句不同的是,直接拿單句,前面加入 [CLS] 輸入,之後同樣取 [CLS] 位置輸出來預測,進行 finetune。
標準四法第三法,問答(QA)任務。
將問題和答題所需上下文分別作為上句與下句,加入 [CLS] 和 [SEP] 特殊符,之後通過在上下文部分預測答案所在位置開頭 (Start) 與結尾 (End),進行 finetune。
標準四法第四法,單句標註任務。
之前單句分類,先加入 [CLS],但是最後取其他位置輸出,預測相應標註,進行 finetune。
Finetune 之標準篇
先來介紹論文中用到標準法的。
雙句分類
標準法的雙句分類,在類似文檔檢索任務中,將 query 與文檔作為上下句,拿 [CLS] 的輸出來預測,finetune。
有這兩篇論文:
Simple Applications of BERT for Ad Hoc Document Retrieval
Passage Re-ranking with BERT
如果說這樣的文檔檢索主要有三步:
第一,先用工具或演算法(BM25 等)獲得最初候選;
第二,用方法對 query 與候選匹配重新打分,按照分數重新排序;
第三,最上面多少條作為所需。
這裡最主要是對第二步處理。
Simple Applications of BERT for Ad Hoc Document Retrieval
主要測試了兩個任務,首先是 Microblog 的句級別檢索匹配,用 Anserini IR toolkit 工具先根據 query 召回 1000 條候選,然後候選和 query 拼接喂入 BERT 得到分數,之後取 BERT 分數和 Anserini 分數的線性插值,作為結果分數,重新排序。
然後在 newswire 上長片段檢索,文檔長度拼接 query 會大於 BERT 預訓練模型最大長度 512 個 token。其實大體步驟與句級別相同,不過會先在句級別 finetune,之後,計算文檔分句後各句分數,取 top n 加權,再和 Anserini 的分數插值,重新排序。
Passage Re-ranking with BERT
大體和上篇類似,數據集有些不同,也是先第一步用 BM25 演算法,獲得 1000 篇相關候選,然後把 query 作為上句候選作為下句,BERT 打分,最後對候選重新排序。
和上面做法不同的是,對於 query 超過 64 個 token 部分截斷,以及 query 和候選拼接總長超過 512 部分截掉。訓練時,拿 1000 個中相關的作為正例,不相關作為負例,取 [CLS] 向量二分類 finetune。
單句標註
Google 公開的 BERT 預訓練模型,根據語言,可分為英文,中文,多語言(104 種語言)。這裡介紹的大部分論文都是拿英文模型直接 finetune,而中文沒有,這一篇是唯一一篇用多語言 finetune 的。
75 Languages, 1 Model: Parsing Universal Dependencies Universally
這篇論文用到的是斯坦福的 Universal Dependencies 數據集,裡面包含了多達 75 種語言的語料,任務和標註也涵蓋了從形態學,到 POS,再到依存關係等等多級任務。
最早入門 NLP,本人拿來第一個練手的數據集也是這個,深知這個數據集的困難,諸多語言有些聞所未聞,裡面還有各種設定(無標註,低資源),多任務訓練如何設定...
而這篇文章,直接用 BERT 多語言預訓練模型在所有語言上,所有任務上,進行 finetune。
首先,多語言里一個大問題是如何將詞分開,因為如此多語言,詞表會非常大,這裡作者用 BERT 自帶 WordPiece 直接分詞,然後用分完後第一個子詞位置的輸出向量來預測。
關於多任務,對 UPOS,UFeats 是直接各位置 softmax 輸出,Lemmas 也類似標註任務,不過會有後處理,Deps 則是用了 Manning 組提出的 「graph-based biaffine attention parser」。
最後 finetune 時,直接拿單句加上 [CLS] 輸入,但要注意的是,這裡拿的不是最上一層的輸出,而是用到一個可學習各層權重的 "Layer Attention" 來對不同層加和。
如此操作是因為之前多個研究表面,低層任務(比如 POS)特徵主要在網路底層,而高層任務特徵(比如依存)主要在高層。之後結果也表明這一點,如下圖。
為避免過於依賴某層,還加入 Layer Dropout,訓練中隨機會不用某層輸出。
結果在依存任務上超過之前 SOTA,其他任務達到匹敵程度。還有在低資源 finetune 的結果提升最明顯。
雙句分類 問答
還有些論文可能一個標準法不夠,所有拿兩個同時進行,其實也可理解為一種多任務學習。
A BERT Baseline for the Natural Questions
主要針對谷歌自己的 Natural Questions 數據集,給出相應的 fintune 方法。
Natural Question 數據集,也是個問答任務,簡單介紹就是 query 會是 google 搜索時的 query,而答案可能在給出的相關維基百科頁面。其中問題分好幾種答案,long,short,yes/no,還可能沒答案。
其實它這裡的做法和原論文中的問答比較像,不過增加了問題分類環節。將頁面文檔分成多個片段,和 query 拼接,然後同時對幾個問題,用 [CLS] 進行預測問題種類,而其他 token 的位置預測所在範圍,最後將一個大頁面中的所有片段的分數排序,挑出最高者。
單句分類 標註
這篇來自達摩院。
BERT for Joint Intent Classification and Slot Filling
其實很簡單,就是在最上面一層直接拿兩個任務進行 finetune。Finetune 時用多任務,也就是 joint 訓練。[CLS] 對 Intent Classification 進行預測,而其他的 token 則對 Slot Filling 預測標註。
火力全開
既然可以兩個任務同時進行多任務 finetune,那能不能把四種標準法都用上進行 finetune 呢。當然可以。
Multi-Task Deep Neural Networks for Natural Language Understanding
這篇來自微軟的 MTDNN 就是先 pretrain,然後拿 GLUE 數據集中的任務同時進行 finetune,最後發現多任務對性能的幫組。
關於詳細如何訓練,可參考論文。
Finetune 之花式
這裡會介紹一些用到異於上述標準 finetune 法的論文,因為方法各異,故冠名花式。
Fine-tune BERT for Extractive Summarization
這篇將 BERT 用於抽取式文本摘要,主要是選擇性抽取文本中的句子作為最後的摘要。這個任務最大的問題是如何獲得每個句子向量,然後把向量用於二分類,判斷去留。而 BERT 原模型只能生成單句的句子向量,或者句子對的。
於是,作者們的第一個改進是,簡單粗暴地將文檔中每句話前加 [CLS] 後加 [SEP],然後輸入 BERT,而每個 [CLS] 對應的位置就是每句的句向量。
為了進一步增加句之間的互動,作者們又在 BERT 之上加了一層 Transformer 的 Summarization Layer,只輸入每個 [CLS] 的向量,最後輸出預測當前句是否保留,finetune。
Utilizing BERT for Aspect-Based Sentiment Analysis via Constructing Auxiliary Sentence
該篇中了 NAACL2019.
用於基於方面 (aspect) 的情感分析(ABSA)任務,主要通過構建附加句,將 ABSA 任務轉換成了句子對分類任務。方法和最早看 GPT2 非監督一樣,出奇簡單,卻有效。
雖然之後 finetune 過程和標準法里的雙句分類相似,但因其構建下句的方法特別,所以拿到花式來講。
具體做法是,通過把原句作為 BERT 上句,然後人為構建下句,分四種情況(假設句中方面用 [ASP] 而其對應分類為 [C]):
QA-M:在句後加上 " what do you think of the [C] of [ASP] ?"
NLI-M: 在後面加一個 "[ASP]-[C]" 的擬句
QA-B: 在後面加肯定句 「the polarity of the aspect [C] of [ASP] is positive」,轉換成二分類任務
NLI-B: 同樣在擬句後面直接加標籤 "[ASP]-[C]-positive"
之後用在這幾種方法分別在 BERT 上進行雙句分類 finetune,然後比較結果。結果是在不同評估指標上各有優劣,詳見論文。
Conditional BERT Contextual Augmentation
這篇比較好玩的是,不像之前論文是拿詞向量進行一些修改,而是拿段 (segment) 向量進行修改。
作者的做法是將 BERT 原有的 segment 向量替換成 label 向量,然後用單句分類任務進行 finetune。比如說可以根據情感識別里的標籤,positive 或 negative 來作為 label。
最後通過將 positive 的向量替換成 negative,或者反過來,輸出預測結果,進行數據增強,這樣子它就會只替換情感最強烈部分讓意思反過來,而大體結構不變。該研究與文本的風格遷移也相關。
VideoBERT: A Joint Model for Video and Language Representation Learning
最後拿這篇來自 BERT 東家谷歌我心目中覺得最棒的來壓軸吧。
這篇通過用 BERT 在語言和視頻多模態上進行 finetune,學習了視覺和語言之間的聯繫。
數據利用了 Youtube 的烹飪類視頻(因為語言與動作更吻合),文本信息用 ASR(語音識別)自動生成,而視頻用 Vector Quantization (矢量量化)來表示。特別值得指出的是這都是無監督的。
首先,用 ASR 獲得的文本作為 BERT 輸入的上句;之後,再對視頻特徵向量進行 tokenize,作為下句;最後用最初的 [CLS] 來判斷是否文字與視頻一致。
之後利用 hierachy clustering (層次聚類)來將這些特徵進行 tokenize,總共 12^4=20736 個 token,再將這些 token 作為新詞加入詞表。最後,像 BERT 預訓練中一樣,隨機掩蓋(mask)掉一些 token,包括文字和視頻 token,同時預測被 mask 掉部分內容和上下句是否對應,進行 finetune。
之後使用時,可以用下面兩個例子說明。
圖片分類。下句中輸入視頻信息,上句輸入 「now let me show you how to [MASK] the [MASK]」 ,就可以直接在 [MASK] 位置獲得視頻中的動作與物品(amazing!);
字幕生成。與 1 相同,不過下句用 「now let』s [MASK] the [MASK] to the [MASK], and then [MASK] the [MASK].」 之後拿獲得的 [MASK] 位置向量與視頻信息向量拼接,用於下一步字幕生成。
總而言之真的是很 fancy 的研究。
彩蛋
除以上所提到所有 finetune 方法,我還想提一個 finetune 方法。它沒有專門作為一篇論文,而是出現在大批量訓練 BERT 論文中的一小節中。
論文中的問題,為了更快訓練,有用到這樣一個技巧,將訓練分為兩個階段。
第一個階段,用 256 長度 64k 批量來訓練;
第二個階段,則用 512 長度 32k 批量來訓練。
這裡第二階段其實也可看做是一種 finetune,而且正是對上面論文一直沒用到的位置向量的 finetune。它可以看做是先在只有 256 個的位置向量上進行預訓練,之後再擴展到 512 個位置進行 finetune。因此裡面也用了 finetune 的一些技巧,比如說第二階段會有一個重新預熱(re-warmup)過程。
本文授權轉載自知乎作者Andy Yang。
※官方揭秘OpenAI Five如何打敗人類:遷移學習+海量訓練,10個月訓練4.5萬年
※中國版波士頓動力狗,更輕更持久
TAG:新智元 |