作者 | 哈工大SCIR 徐嘯
編輯 | 唐裡
本文轉載自 公眾號「哈工大SCIR」( 微信ID:HIt_SCIR),該 公眾號為哈爾濱工業大學社會計算與資訊檢索研究中心(劉挺教授為中心 主任)的師生的資訊分享平臺,本文作者為哈工大SCIR 徐嘯。
來源:Transfer Learning in Natural Language Processing Tutorial (NAACL 2019)
作者:Sebastian Ruder, Matthew Peters, Swabha Swayamdipta, Thomas Wolf
相關資源:
-
Slides: tiny.cc/NAACLTransfer
-
Colab: tiny.cc/NAACLTransferCo
-
Code: github.com/huggingface/
-
Ruder 對教程進行了一定擴充套件的博文 The State of Transfer Learning in NLP,AI科技評論 已對此文進行了翻譯
-
Sebastian Ruder: Transfer Learning in Open-Source Natural Language Processing (spaCy IRL 2019)
本文小結:本文為教程的第一篇,包含教程的 0-2 部分。主要是對遷移學習的介紹以及預訓練方面的經典方法。
提綱
-
介紹:本節將介紹本教程的主題:遷移學習當前在自然語言處理中的應用。在不同的遷移學習領域中,我們主要定位於順序遷移學習 sequential transfer learning 。
-
預訓練:我們將討論無監督、監督和遠端監督的預訓練方法。
-
表示捕獲了什麼:在討論如何在下游任務中使用預訓練的表示之前,我們將討論分析表示的方法,以及觀察到它們捕獲了哪些內容。
-
調整:在這個部分,我們將介紹幾種調整這些表示的方法,包括特徵提取和微調。我們將討論諸如學習率安排、架構修改等的實際考慮。
-
下游應用程式:本節,我們將重點介紹預訓練的表示是如何被用在不同的下游任務中的,例如文字分類、自然語言生成、結構化預測等等。
-
開放問題和方向:在最後一節中,我們將提出對未來的展望。我們將突出待解決的問題以及未來的研究方向。
0. 前言
A Survey on Transfer Learning, Pan and Yang (2010) 摘要:在許多機器學習和資料探勘演算法中,一個主要的假設是訓練和未來的資料必須在相同的特徵空間中,並且具有相同的分佈。然而,在許多實際應用程式中,這種假設可能不成立。例如,我們有時在一個感興趣的領域中有一個分類任務,但是我們只在另一個感興趣的領域中有足夠的訓練資料,並且後者可能位於不同的特徵空間或遵循不同的資料分佈。在這種情況下,如果成功地進行知識遷移,就可以避免昂貴的資料標記工作,從而 大大提高學習效能。近年來,遷移學習作為一種新的學習框架應運而生。本研究的重點是分類和回顧目前遷移學習在分類、迴歸和聚類問題上的進展。在本研究中,我們討論了遷移學習與其他相關機器學習技術的關係,如領域適應、多工學習、樣本選擇偏差以及協變數偏移。同時,我們也探討了遷移學習研究中一些潛在的未來問題。
為什麼要在自然語言處理任務中使用遷移學習 ?
-
許多 NLP 任務共享關於語言的常識 (例如語言表示、結構相似性)
-
跨任務共享的、不同層次的,含義和結構的表示
-
任務之間可以互通有無——例如語法和語義
-
帶註釋的資料很少,應當儘可能多地利用其進行監督學習
-
經驗上看,遷移學習促成了許多有監督的 NLP 任務的 SOTA (如分類、資訊提取、問答等)。
為什麼要在自然語言處理任務中使用遷移學習 ?(經驗之談)
自然語言處理任務中的遷移學習種類
Ruder (2019)
遷移學習包括 Transductive 與 Inductive 兩種:
-
Transductive:相同的任務;但只有原領域的標註資料
-
不同的領域:領域適應
-
不同的語言:跨語種學習
-
Inductive:不同的任務;只有目標領域的標註資料
-
同時學習任務:多工學習
-
順序學習任務:順序遷移學習(教程重點)
這篇tutorial與什麼有關?
-
目標:提供NLP中遷移方法的廣泛概述,重點介紹截至目前(2019年年中)最成功的經驗方法。
-
提供實用的動手 建議→在教程結束時,每個人都有能力將最新的進展應用到文字分類任務
-
這不是:全面的(不可能在一個教程中涵蓋所有相關的論文!)
-
(Bender Rule:本教程主要針對用英語完成的工作,對其他語言的可擴充套件性取決於資料和資源的可用性。)
1. 介紹
Sequential transfer learning 指的是在一個任務/資料集上學習後遷移到其他任務/資料集上。
預訓練的任務和資料集
-
Unlabeled data and self-supervision
-
很容易收集非常大的語料庫:維基百科,新聞,網頁抓取,社交媒體等。
-
利用分佈假設進行訓練:“You shall know a word by the company it keeps”(Firth, 1957),通常形式化為訓練某種語言模型的變體
-
關注使用有效的演算法以利用豐富的資料
-
Supervised pretraining
-
在視覺領域很常見,但由於缺乏大型監督資料集,在NLP中較少
-
機器翻譯
-
NLI 用於學習句子表示
-
任務特定——從一個問答資料集遷移到另一個
目標任務和資料集
-
目標任務通常是監督的,並跨越一系列常見的NLP任務:
-
句子或文件分類(例如情感分類)
-
句子對分類(如NLI, paraphrase)
-
單詞級別(如序列標註、抽取問答)
-
結構化預測(例如解析)
-
生成(例如對話、總結)
從單詞到文字中的單詞
語言模型預訓練
-
許多成功的預訓練方法都是基於語言模型的
-
非正式地,語言模型學習
-
不需要人工註釋
-
許多語言都有足夠的文字來學習高容量模型
-
語言模型是“多才多藝”的——可以學習句子和單詞的表示,具有多種目標函式
由淺到深
Bengio et al 2003: A Neural Probabilistic Language Model Devlin et al 2019: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
預訓練任務 vs 目標任務
預訓練任務的選擇和目標任務是耦合的
-
句子/文件表示對單詞級別的預測沒有幫助
-
詞向量可以跨上下文進行池化,但通常會被其他方法超越 (Attention)
-
在語境詞向量中,雙向語境非常重要
通常:相似的預訓練和目標任務 → 最好結果
2. 預訓練
語言模型預訓練
詞向量
為什麼要詞嵌入?
-
詞嵌入是可以學習的引數
-
在不同任務中 共享 表示
-
低維空間更好計算——難以處理稀疏向量
無監督預訓練 : 神經網路之前
詞向量預訓練
word2vec
以 CBOW 為例,輸入層將目標詞語境 c 中的每一個詞向量簡單求和(也可求平均)後得到語境向量,然後直接與目標詞的輸出向量求點積,目標函式也就是要讓這個與目標詞向量的點積取得最大值,對應的與非目標詞的點積儘量取得最小值。
-
word2vec 的出現,極大促進了 NLP 的發展,尤其是促進了深度學習在 NLP 中的應用(不過word2vec 演算法本身其實並不是一個深度模型,它只有兩層全連線),利用預訓練好的詞向量來初始化網路結構的第一層幾乎已經成了標配,尤其是在只有少量監督資料的情況下,如果不拿預訓練的 embe dding 初始化第一層,幾乎可以被認為是在蠻幹。
Word2vec 與 NNLM 都是語言模型,但不同的是 word2vec 的重點是透過訓練語言模型從而得到詞向量,因此以詞向量為重點對 NNLM 進行了改進最佳化,並且使用 CBOW 和 Skip-gram 兩種方式學習詞向量,GloVe 則透過構建共現矩陣,不透過傳統的 SVD 進行計算複雜度較高的矩陣分解,而是使用平方誤差促使點積儘可能得接近共現機率的對數,因為如果使向量點積等於共現機率的對數,向量差異就會成為共現機率的比率即單詞 j 出現在單詞 i 的上下文中的機率,這一比值蘊含了語義資訊。
相比word2vec,GloVe卻更加充分的利用了詞的共現資訊,word2vec中則是直接粗暴的讓兩個向量的點乘相比其他詞的點乘最大,至少在表面上看來似乎是沒有用到詞的共現資訊,不像GloVe這裡明確的就是擬合詞對的共現頻率。
fastText 則是利用帶有監督標記的文字分類資料完成訓練,框架和 CBOW 一致,不過輸入資料不再是 bag-of-words 的資訊,還 加上了 ngram 資訊,這就加入了語序資訊,而且輸出的是當前輸入文字的類別。此外還引入 subword 來處理長詞,處理 OOV 問題。
句子和文件向量
無監督篇章嵌入 (Le & Mikolov, 2014)
PV-DM的全稱是 Distributed Memory Model of Paragraph Vectors,和CBOW類似,也是透過上下文預測下一個詞,不過在輸入層的時候,同時也維護了一個文件ID對映到一個向量的look-up table,模型的目的便是將當前文件的向量以及上下文向量聯合輸入模型,並讓模型預測下一個詞,訓練結束後,對於現有的文件,便可以直接透過查表的方式快速得到該文件的向量,而對於新的一篇文件,那麼則需要將已有的look-up table新增相應的列,然後重新走一遍訓練流程,只不過此時固定好其他的引數,只調整look-up table,收斂後便可以得到新文件對應的向量了。PV-DBOW的全稱則是Distributed Bag of Words version of Paragraph Vector,和Skip-gram類似,透過文件來預測文件內的詞,訓練的時候,隨機取樣一些文字片段,然後再從這個片段中取樣一個詞,讓PV-DBOW模型來預測這個詞,以此分類任務作為訓練方法,說白了,本質上和Skip-gram是一樣的。這個方法有個致命的弱點,就是為了獲取新文件的向量,還得繼續走一遍訓練流程,並且由於模型主要是針對文件向量預測詞向量的過程進行建模,其實很難去表徵詞語之間的更豐富的語義結構,所以這兩種獲取文件向量的方法都未能大規模應用開來。
Skip-Thought
借鑑 Skip-gram 的思想,Skip-thoughts 直接在句子間進行預測,也就是將 Skip-gram 中以詞為基本單位,替換成了以句子為基本單位,具體做法就是選定一個視窗,遍歷其中的句子,然後分別利用當前句子去預測和輸出它的上一句和下一句。
不過和普通框架不一樣的是,Skip-thoughts有兩個Decoder。在今天看來,這個框架還有很多不完善或者可以改進的地方(作者也在論文中分別提到了這些future works),比如輸入的Encoder可以引入attention機制,從而讓Decoder的輸入不再只是依賴Encoder最後一個時刻的輸出;Encoder和Decoder可以利用更深層的結構;Decoder也可以繼續擴大,可以預測上下文中更多的句子;RNN也不是唯一的選擇,諸如CNN以及2017年穀歌提出的Transformer的結構也可以利用進來,後來果不其然,谷歌的BERT便借鑑了這一思路。
Quick-thoughts 在此基礎上進一步改進,將生成任務改為分類任務。具體說來就是把同一個上下文視窗中的句子對標記為正例,把不是出現在同一個上下文視窗中的句子對標記為負例,並將這些句子對輸入模型,讓模型判斷這些句子對是否是同一個上下文視窗中,很明顯,這是一個分類任務。可以說,僅僅幾個月之後的BERT正是利用的這種思路。而這些方法都和Skip-thoughts一脈相承。
自編碼器預訓練
半監督序列學習
論文提出了兩個方法,用無標籤資料進行無監督訓練的引數來初始化有監督學習的模型:一種是用基礎的語言模型,另一種是用seq2seq自編碼模型(sequence autoencoder, SA-LSTM),encoder 輸入為WXYZ,decoder輸出為依然為WXYZ。和普通的seq2seq模型相比不同的是,這裡的encoder和decoder隱層是共享的。有種提前讓迴圈神經網路學會句子的表達,再之後根據標籤去學習分類的能力的思想。
有監督的句子嵌入
-
Paragram-phrase: uses paraphrase database for supervision, best for paraphrase and semantic similarity (Wieting et al.2016)
-
InferSent: bi-LSTM trained on SNLI + MNLI (Conneau et al.2017)
-
GenSen: multitask training(skip-thought, machine translation, NLI, parsing) (Subramanian et al. 2018)
InferSent 是在史丹佛的SNLI(Stanford Natural Language Inference)資料集上訓練的模型,而後將訓練好的模型當做特徵提取器,以此來獲得一個句子的向量表示,再將這個句子的表示應用在新的分類任務上,來評估句子向量的優劣。框架結構如下圖所示
這個框架最底層是一個 Encoder,也就是最終要獲取的句子向量提取器,然後將得到的句子向量透過一些向量操作後得到句子對的混合語義特徵,最後接上全連線層並做 SNLI 上的三分類任務。
上下文相關詞向量
動機:詞向量將所有的上下文都壓縮到一個單一向量中
關鍵想法:不是每個單詞學習一個向量,而是學習依賴於上下文的向量。
context2vec
基於 CBOW 框架,為了捕捉句子語境的本質,使用雙向 LSTM 提取特徵。
TagLM
TagLM workflow
-
與上文無關的單詞嵌入 + RNN model 得到的 hi dden states 作為特徵輸入
-
Char CNN / RNN + Token Embe dding 作為 bi-LSTM 的輸入
-
得到的 hi dden states 與 Pre-trained bi-LM(凍結的) 的 hi dden states 連線起來輸入到第二層的 bi-LSTM 中
Seq2Seq的無監督預訓練
提出一種通用的提高seq2seq模型的無監督訓練方法。seq2seq模型的encoder和decoder的權重用兩個預訓練語言模型初始化然後微調。
seq2seq模型的缺點:監督學習的語料有限,容易過擬合。本文提出了改善seq2seq效果的無監督訓練方法。在微調階段,訓練任務為語言模型任務和seq2seq的聯合任務。(開始fune-tuning可能導致災難性的遺忘:模型在語言模型上的效能急劇下降,可能損害模型的泛化能力。為保證模型不在有監督語料上過擬合,在fine-tuning階段繼續單語言語言模型任務,seq2seq和語言模型任務的損失相加作為最終損失)
此外還用了殘差連線,Encoder 和 Decoder 之間也用了 Attention。
CoVe
CoVe更側重於如何將現有資料上預訓練得到的表徵遷移到新任務場景中,而之前的句子級任務中大多數都只把遷移過程當做一個評估他們表徵效果的手段,因此觀念上有所不同
-
也有使用訓練好的序列模型為其他NLP模型提供上下文的想法
-
想法:機器翻譯是為了儲存意思,所以這也許是個好目標?
-
使用seq2seq + attention NMT system中的Encoder,即 2層 bi-LSTM ,作為上下文提供者
-
所得到的 CoVe 向量在各種任務上都優於 GloVe 向量
-
但是,結果並不像其他更簡單的NLM培訓那麼好,所以似乎被放棄了
-
也許NMT只是比語言建模更難?
-
或許有一天這個想法會回來?
ELMo
使用長上下文而不是上下文視窗學習 word token 向量(這裡,整個句子可能更長)
學習深度Bi-NLM,並在預測中使用它的所有層
訓練一個雙向LM
目標是 performant 但LM不要太大
使用2個biLSTM層
這兩個biLSTM NLM層有不同的用途/含義
低層更適合低階語法,例如
-
詞性標註(part-of-speech tagging)、句法依賴(syntactic dependency)、NER
高層更適合更高階別的語義
-
情緒、Semantic role labeling 語義角色標記 、question answering、SNLI
目標函式為
(僅)使用字元CNN構建初始單詞表示
如下圖所示,在輸入層和輸出層均使用瞭如下CNN結構,減少了引數規模,解決了 OOV 問題,並且每一個詞向量的計算可以預先做好,更能夠減輕inference階段的計算壓力
2048 個 char n-gram filters 和 2 個 highway layers,512 維的 projection
4096 dim hi dden/cell LSTM狀態,使用 512 dim的對下一個輸入的投影
使用殘差連線
繫結 token 的輸入和輸出的引數(softmax),並將這些引數繫結到正向和反向LMs之間
ELMo學習biLM表示的特定任務組合
這是一個創新,TagLM 中僅僅使用堆疊LSTM的頂層,ELMo 認為BiLSTM所有層都是有用的
衡量ELMo對任務的總體有用性,是為特定任務學習的全域性比例因子
是 softmax 歸一化的混合模型權重,是 BiLSTM 的加權平均值的權重,對不同的任務是不同的
對於每一個詞,可以根據下面的式子得到它的向量,其中 γ 是一個scale因子,加入這個因子主要是想要將ELMo的向量與具體任務的向量分佈拉平到同一個分佈水平,這個時候便需要這麼一個縮放因子了。另外, 便是針對每一層的輸出向量,利用一個softmax的引數來學習不同層的權值引數,因為不同的任務需要的詞語意義的粒度也不一致,一般認為淺層的表徵比較傾向於句法,而高層輸出的向量比較傾向於語義資訊,因此透過一個softmax的結構讓任務自動去學習各層之間的權重,自然也是比較合理的做法。
此外,ELMo 還使用了 Exploring the Limits of Language Modeling 中提出的 char-based CNN 結構,應用到輸入層和輸出層上,減少了引數規模,並解決了令人頭痛的 OOV 問題。
-
ELMo 使用 LSTM 而不是 Transformer 作為特徵抽取器,而很多研究已經證明了Transformer提取特徵的能力是要遠強於LSTM的;另外,ELMO 採取雙向拼接這種融合特徵的能力可能比 Bert 一體化的融合特徵方式弱,但是,這只是一種從道理推斷產生的懷疑,目前並沒有具體實驗說明這一點。
-
ELMo 代表著基於特徵融合的預訓練方法,而 GPT 則是基於Fine-tuning的模式的開創者。
ULMFit
-
在大型通用領域的無監督語料庫上使用 biLM 訓練
-
在目標任務資料上調整 LM
-
對特定任務將分類器進行微調
-
使用合理大小的“1 GPU”語言模型,並不是真的很大
-
在LM調優中要注意很多
-
ULMFit的預訓練和finetune過程主要可以分為三個階段,分別是在大規模語料集上(比如Wikitext 103,有103million個詞)先預訓練,然後再將預訓練好的模型在具體任務的資料上重新利用語言模型來finetune一下(這是第一次finetune,叫做LM finetune),爾後再根據具體任務設計的一個模型上,將預訓練好的模型當做這個任務模型的多層,再一次finetune(這是第二次finetune,如果是分類問題的話可以叫做Classifier finetune)
-
AWD-LSTM
其中 T 是一個閾值,而 K 則是總共的迭代次數,這個式子的意思就是把迭代到第T次之後,對該引數在其後的第 T 輪到最後一輪之間的所有值求平均,從而得到最後模型的該引數值,而相應的,普通的SGD則是直接取
作為最後模型的引數值。並且在每個時間步之間都是用一個全連線層,並且使用DropConnect的方法隨機drop掉一些連線減少一些過擬合的風險
微調技巧
有區分的微調
針對不同的層在訓練更新引數的時候,賦予不同的學習率。這裡的出發點是,一般來說,對於NLP的深度學習模型來說,不同層的表徵有不同的物理含義,比如淺層偏句法資訊,高層偏語義資訊,因此對於不同層的學習率不同,自然就是比較合理的了。原文也給出了具體的選擇:先指定最後一層的學習率,然後根據下式得到前面層的學習率,基本思想是讓淺層的學習率要更小一些。
斜三角學習率
在finetune的第一階段,希望能夠先穩定住原來已經在大規模語料集上已經預訓練好的引數,所以選擇一個比較小的finetune學習率;爾後希望能夠逐步加大學習率,使得學習過程能夠儘量快速;最後,當訓練接近尾聲時,逐步減小學習率,這樣讓模型逐漸平穩收斂(這個思想大概借鑑了2017年穀歌提出Transformer時用到的warm up的學習率調節方法,這個方法也是在訓練的時候先將學習率逐步增大,爾後再逐步減小)。因此,這樣一個三段論式的學習過程,用圖表示如下:
逐漸解凍
主要思想是把預訓練的模型在新任務上finetune時,逐層解凍模型,也就是先finetune最後一層,然後再解凍倒數第二層,把倒數第二層和最後一層一起finetune,然後再解凍第三層,以此類推,逐層往淺層推進,最終finetune整個模型或者終止到某個中間層。這樣做的目的也是為了finetune的過程能夠更平穩。
因為ULMFiT中包含了兩次finetune,即在新任務上用語言模型finetune和在新任務上finetune訓練一個最終的task-specifi-model(比如分類器),而論文中主要把discriminative fine-tuning, slanted triangular learning rates這兩個技巧用在了語言模型的finetune階段,把最後一個gradual unfreezing的技巧應用在最終task-specifi-model的finetune階段。
使用大型的預訓練語言模型是一種提高效能的非常有效的方法
GPT
-
GPT也採用兩階段過程,第一個階段是利用語言模型進行預訓練,第二階段透過Fine-tuning的模式解決下游任務。下圖展示了GPT的預訓練過程(按照論文中的說法,GPT中使用的Transformer是隻用了Decoder),其實和ELMO是類似的,主要不同在於兩點:首先,特徵抽取器不是用的RNN,而是用的Transformer,上面提到過它的特徵抽取能力要強於RNN,這個選擇很明顯是很明智的;其次,GPT的預訓練雖然仍然是以語言模型作為目標任務,但是採用的是單向的語言模型,所謂“單向”的含義是指:語言模型訓練的任務目標是根據單詞的上下文去正確預測單詞 ,GPT則只採用這個單詞的上文來進行預測,而拋開了下文。
-
下游任務怎麼使用 GPT 呢?首先,對於不同的下游任務來說,本來你可以任意設計自己的網路結構,現在不行了,你要向GPT的網路結構看齊,把任務的網路結構改造成和GPT的網路結構是一樣的。然後,在做下游任務的時候,利用第一步預訓練好的引數初始化GPT的網路結構,這樣透過預訓練學到的語言學知識就被引入到你手頭的任務裡來了,這是個非常好的事情。再次,你可以用手頭的任務去訓練這個網路,對網路引數進行Fine-tuning,使得這個網路更適合解決手頭的問題。
-
對於NLP各種花樣的不同任務,怎麼改造才能靠近GPT的網路結構呢?
-
GPT論文給了一個改造施工圖如上,其實也很簡單:對於分類問題,不用怎麼動, 加上一個起始和終結符號即可;對於句子關係判斷問題,比如Entailment,兩個句子中間再加個分隔符即可;對文字相似性判斷問題,把兩個句子順序顛倒下做出兩個輸入即可,這是為了告訴模型句子順序不重要;對於多項選擇問題,則多路輸入,每一路把文章和答案選項拼接作為輸入即可。從上圖可看出,這種改造還是很方便的,不同任務只需要在輸入部分施工即可。
BERT
Bert 採用和GPT完全相同的兩階段模型,首先是語言模型預訓練;其次是使用Fine-Tuning模式解決下游任務。和GPT的最主要不同在於在預訓練階段採用了類似ELMO的雙向語言模型,當然另外一點是語言模型的資料規模要比GPT大。
BERT最主要的幾個特徵分別是
-
利用了真雙向的Transformer
-
為了利用雙向資訊,改進了普通語言模型成為完形填空式的Mask-LM(Mask-Language Model)
-
利用Next Sentence Prediction任務學習句子級別資訊
-
進一步完善和擴充套件了GPT中設計的通用任務框架,使得BERT能夠支援包括:句子對分類任務、單句子分類任務、閱讀理解任務和序列標註任務
預訓練階段
因為Encoder中用了Self-attention機制,而這個機制會將每一個詞在整個輸入序列中進行加權求和得到新的表徵,更通俗的說法是每一個詞在經過Self-attention之後,其新的表徵將會是整個輸入序列中所有詞(當然也包括它本身)的加權求和。在ELMo與GPT中,它們並沒有用上這種交融模式,也就是它們本質上還是一個單向的模型,ELMo稍微好一點,將兩個單向模型的資訊concat起來,GPT則只用了單向模型,這是因為它沒有用上Transformer Encoder,只用了Decdoer的天生基因決定的,其實,很多人就把這種left-to-right的Transformer框架叫做Decoder,因為事實上Decoder就是如此(具體做的時候需要提前把未來待生成的詞做好mask,細節上透過上三角矩陣來實現),這也是OpenAI把他們的模型叫做"Generative"的原因所在。
“GPT則只用了單向模型,這是因為它沒有用上Transformer Encoder,只用了Decdoer的天生基因決定的” ,個人認為主要想表述的是 GPT 使用 Transformer 架構時,受限於傳統的語言模型,產生的假雙向的問題,簡單來說就是GPT並沒有像 Transformer 中的 encoder 一樣對整句話進行 self-attention ,而是像 Decoder 一樣,預測每個單詞時只有其上文進行了 self-attention
Masked-LM 雙向Transformer下的語言模型
-
然而在語言模型中,我們透過某個詞的上下文語境預測當前詞的機率,如果直接把這個套用到Transformer的Encoder中,會發現待預測的輸出和序列輸入已經糅合在一塊了。那麼,如何解決Self-attention中帶來了表徵效能卓越的雙向機制,卻又同時帶來了資訊 洩露的這一問題?Bert 受到完形填空任務的啟發:輸入序列依然和普通Transformer保持一致,只不過把挖掉的一個詞用"[MASK]"替換 ,Transformer的Encoder部分按正常進行,輸出層在被挖掉的詞位置,接一個分類層做詞典大小上的分類問題,得到被mask掉的詞機率大小。
-
直接把普通語言模型中的生成問題(正如GPT中把它當做一個生成問題一樣,雖然其本質上也是一個序列生成問題),變為一個簡單的分類問題,並且也直接解決了Encoder中多層Self-attention的雙向機制帶來的洩密問題(單層Self-attention是真雙向,但不會帶來洩密問題,只有多層 累加的Self-attention才會帶來洩密問題),使得語言模型中的真雙向機制變為現實。
-
不過,BERT針對如何做“[MASK]”,做了一些更深入的研究,它做了如下處理
-
選取語料中所有詞的15%進行隨機mask
-
選中的詞在80%的機率下被真實mask
-
選中的詞在10%的機率下不做mask,而被隨機替換成其他一個詞
-
選中的詞在10%的機率下不做mask,仍然保留原來真實的詞
-
這使得Transformer編碼器不知道它將被要求預測哪些單詞或哪些單詞已被隨機單詞替換,因此它被迫保持每個輸入標記的分散式上下文表示。
預測下一句
-
利用和借鑑了Skip-thoughts方法中的句子預測問題,來學習句子級別的語義關係,具體做法則是將兩個句子組合成一個序列,當然組合方式會按照下面將要介紹的方式,然後讓模型預測這兩個句子是否是先後近鄰的兩個句子,也就是會把"Next Sentence Prediction"問題建模成為一個二分類問題。訓練的時候,資料中有50%的情況這兩個句子是先後關係,而另外50%的情況下,這兩個句子是隨機從語料中湊到一起的,也就是不具備先後關係,以此來構造訓練資料。句子級別的預測思路和之前介紹的Skip-thoughts基本一致,當然更本質的思想來源還是來自於word2vec中的skip-gram模型。
-
要求模型除了做上述的Masked語言模型任務外,附帶再做個句子關係預測,判斷第二個句子是不是真的是第一個句子的後續句子。之所以這麼做,是考慮到很多NLP任務是句子關係判斷任務,單詞預測粒度的訓練到不了句子關係這個層級,增加這個任務有助於下游句子關係判斷任務。所以可以看到,它的預訓練是個多工過程。這也是Bert的一個創新。
-
spanBERT 與 RoBERTa 兩篇文章對此提出了質疑,感興趣的讀者可以自行閱讀~
-
在預訓練階段,因為有兩個任務需要訓練:Mask-LM和Next Sentence Prediction,因此BERT的預訓練過程實質上是一個Multi-task Learning,具體說來,BERT的損失函式由兩部分組成,第一部分是來自於Mask-LM的單詞級別的分類任務,另一部分是句子級別的分類任務,透過這兩個任務的聯合學習,可以使得BERT學習到的表徵既有token級別的資訊,同時也包含了句子級別的語義資訊。具體的損失函式如下
Fine-Tuning 階段
輸入層:如果輸入只有一個句子的話,則直接在句子的前後新增句子的起始標記位和句子的結束符號,在BERT中,起始標記都用“[CLS]”來表示,結束標記符用"[SEP]"表示,對於兩個句子的輸入情況,除了起始標記和結束標記之外,兩個句子間透過"[SEP]"來進行區分。除了這些之外,BERT還用了兩個表示當前是句子A還是句子B的向量來進行表示,對於句子A來說,每一詞都會新增一個同樣的表示當前句子為句子A的向量,相應的,如果有句子B的話,句子B中的每一個詞也都會新增一個表示當前句子為句子B的向量。
NLP 的四大任務:
-
序列標註,這是最典型的NLP任務,比如中文分詞,詞性標註,命名實體識別,語義角色標註等都可以歸入這一類問題,它的特點是句子中每個單詞要求模型根據上下文都要給出一個分類類別。
-
分類任務,比如我們常見的文字分類,情感計算等都可以歸入這一類。它的特點是不管文章有多長,總體給出一個分類類別即可。
-
句子關係判斷,比如Entailment,QA,語義改寫,自然語言推理等任務都是這個模式,它的特點是給定兩個句子,模型判斷出兩個句子是否具備某種語義關係。
-
生成式任務,比如機器翻譯,文字摘要,寫詩造句,看圖說話等都屬於這一類。它的特點是輸入文字內容後,需要自主生成另外一段文字。
對於種類如此繁多而且各具特點的下游NLP任務,Bert如何改造輸入輸出部分使得大部分NLP任務都可以使用Bert預訓練好的模型引數呢?上圖給出示例,對於句子關係類任務,很簡單,和GPT類似, 加上一個起始和終結符號,句子之間加個分隔符即可。對於輸出來說,把第一個起始符號對應的Transformer最後一層位置上面串接一個softmax分類層即可。對於分類問題,與GPT一樣,只需要增加起始和終結符號,輸出部分和句子關係判斷任務類似改造;對於序列標註問題,輸入部分和單句分類是一樣的,只需要輸出部分Transformer最後一層每個單詞對應位置都進行分類即可。從這裡可以看出,上面列出的NLP四大任務裡面,除了生成類任務外,Bert其它都覆蓋到了,而且改造起來很簡單直觀。儘管Bert論文沒有提,但是稍微動動腦子就可以想到,其實對於機器翻譯或者文字摘要,聊天機器人這種生成式任務,同樣可以稍作改造即可引入Bert的預訓練成果。只需要附著在S2S結構上,encoder部分是個深度Transformer結構,decoder部分也是個深度Transformer結構。根據任務選擇不同的預訓練資料初始化encoder和decoder即可。這是相當直觀的一種改造方法。當然,也可以更簡單一點,比如直接在單個Transformer結構上加裝隱層產生輸出也是可以的。不論如何,從這裡可以看出,NLP四大類任務都可以比較方便地改造成Bert能夠接受的方式。這其實是Bert的非常大的優點,這意味著它幾乎可以做任何NLP的下游任務,具備普適性,這是很強的。
最後,我們再次總結下BERT的幾個主要特點:
-
Transformer Encoder因為有Self-attention機制,因此BERT自帶雙向功能
-
因為雙向功能以及多層Self-attention機制的影響,使得BERT必須使用Cloze版的語言模型Masked-LM來完成token級別的預訓練
-
為了獲取比詞更高階別的句子級別的語義表徵,BERT加入了Next Sentence Prediction來和Masked-LM一起做聯合訓練
-
為了適配多工下的遷移學習,BERT設計了更通用的輸入層和輸出層 然後,我們再來看看BERT的工作都站在了哪些“巨人肩膀”上:
-
針對第一點,雙向功能是Transformer Encoder自帶的,因此這個“巨人肩膀”是Transformer
-
第二點中Masked-LM的巨人肩膀是語言模型,CBOW以及Cloze問題
-
第三點中Next Sentence Prediction的“巨人肩膀”是Skip-gram,Skip-thoughts和Quick-thoughts等工作
-
第四點中,對輸入層和輸出層的改造,借鑑了T-DMCA以及GPT的做法
為什麼語言模型效果好?
-
語言建模是一項非常困難的任務,即使對人類來說也是如此。
-
預期語言模型將任何可能的上下文壓縮到一個向量中,該向量概括了可能的完成後的句子。
-
“They walked down the street to ???”
-
為了有機會解決這個任務,模型必須學習語法、語義、對世界事實編碼等等。
-
給定足夠的資料、一個巨大的模型和足夠的計算,就可以完成一項合理的工作!
-
從經驗上看,語言模型比翻譯,自編碼更有效:“Language Modeling Teaches You More Syntax than Translation Does” (Zhang et al. 2018)
預訓練的有趣屬性
1. 樣本高效
ELMo 中的實驗對比
預訓練的一個主要好處就是它減少了對有標註資料的需求。在實際使用中,與非預訓練模型相比,遷移學習模型通常只需要十分之一甚至更少的樣本數量就達到類似的表現,如下圖(ULMFIT Howard and Ruder, 2018)所示。
ULMFit中的實驗對比
2. 擴大預訓練規模
-
上圖為 GloVe 中增加語料庫規模對模型準確度的影響。
-
資料集越大越好,並且維基百科資料集比新聞文字資料集要好
-
因為維基百科就是在解釋概念以及他們之間的相互關聯,更多的說明性文字顯示了事物之間的所有聯絡
-
而新聞並不去解釋,而只是去闡述一些事件
不同資料量的 Crawl 資料作為預訓練的平均 GLUE 效果
通常,我們可以透過同時增加模型引數和預訓練資料量的方式來改善預訓練表徵。但隨著預訓練資料量的增長,回報率開始下降。但如上圖所示的當前的效能曲線,並不表示我們已達到了穩定狀態。因此,我們期待可以在更多資料基礎上訓練出更大的模型。
最近的這種趨勢的例子是ERNIE 2.0,XLNet,GPT-2 8B, 和 RoBERTa。特別是後者發現,簡單地對 BERT 進行更長時間和更多資料的訓練就可以得到更好的結果,而對 GPT-2 8B 進行更長時間和更多資料的訓練則可以減少語言建模資料集上的困惑度(儘管只是相對較小的因素)
跨語言預訓練
-
在訓練跨語言詞嵌入方面做了大量工作(Overview: Ruder et al. (2017))
-
想法:分別訓練每種語言,然後對齊
-
Recent work aligning ELMo: Schuster et al., (NAACL 2019)
-
ACL 2019 Tutorial on Unsupervised Cross-lingual Representation Learning
關鍵思想:透過在多種語言上訓練一個模型,實現跨語言的詞彙表和表示。
優點:易於實現,可單獨進行跨語言預培訓
缺點:低資源語言導致其表示學習的不夠好
-
LASER: Use parallel data for sentence representations(Artetxe & Schwenk, 2018)
-
Multilingual BERT: BERT trained jointly on 100 languages
-
Rosita:Polyglot contextual representations(Mulcaire et al., NAACL 2019)
-
XLM: Cross lingual LM (Lample & Conneau, 2019)