BERT fintune 的藝術

BERT 預訓練模型就如宰好待烹的豬,則 finetune 便是烹飪之法,豬頭能用來做成香糯濃醇的燒豬頭肉,豬蹄能用來做成勁道十足的紅燒豬蹄,身上的梅花肉,五花肉,裏脊肉也各有各的做法。於是對於 Bert finetune,也就有各種料理之法。

序言

自去年 BERT 論文發出,正巧半年,不光各大榜單上盡是 BERT 之名,最近公佈 NAACL 最佳長論文也給了 BERT,正所謂實至名歸。

正巧在讀 BERT 相關論文, 順便總結下,給大家介紹 BERT 論文發出半年後的今天,大概都有哪些與 BERT finetune 相關的研究。

先來簡單介紹 BERT,再進入正題。

何謂 BERT,全稱 Bidirectional Encoder Representations from Transformers(Transformer 雙向編碼器特徵),縮寫爲芝麻街的主角之一 BERT。

取名的惡趣味,導致之後微軟,百度的改進模型,都叫 Big-BirdERNIE,儼然走錯片場,進入了芝麻街的世界。

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])

  1. QA-M:在句後加上 " what do you think of the [C] of [ASP] ?"

  2. NLI-M: 在後面加一個 "[ASP]-[C]" 的擬句

  3. QA-B: 在後面加肯定句 “the polarity of the aspect [C] of [ASP] is positive”,轉換成二分類任務

  4. 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] 來判斷是否文字與視頻一致。

關於視頻特徵具體提取過程,先利用 S3D 模型(詳見 Rethinking Spatiotemporal Feature Learning: Speed-Accuracy Trade-offs in Video Classification,推薦閱讀)提取視頻特徵,1024維。

之後利用 hierachy clustering (層次聚類)來將這些特徵進行 tokenize,總共12^4=20736個 token,再將這些 token 作爲新詞加入詞表。最後,像 BERT 預訓練中一樣,隨機掩蓋(mask)掉一些 token,包括文字和視頻token,同時預測被mask掉部分內容和上下句是否對應,進行 finetune。

之後使用時,可以用下面兩個例子說明。

  1. 圖片分類。下句中輸入視頻信息,上句輸入“now let me show you how to [MASK] the [MASK]” ,就可以直接在 [MASK] 位置獲得視頻中的動作與物品(amazing!);

  2. 字幕生成。與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)過程。

長按關注公衆號

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