作者:哈工大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 部分。主要是對遷移學習的介紹以及預訓練方面的經(jīng)典方法。
介紹:本節(jié)將介紹本教程的主題:遷移學習當前在自然語言處理中的應用。在不同的遷移學習領域中,我們主要定位于順序遷移學習 sequential transfer learning 。
預訓練:我們將討論無監(jiān)督、監(jiān)督和遠程監(jiān)督的預訓練方法。
表示捕獲了什么:在討論如何在下游任務中使用預訓練的表示之前,我們將討論分析表示的方法,以及觀察到它們捕獲了哪些內(nèi)容。
調(diào)整:在這個部分,我們將介紹幾種調(diào)整這些表示的方法,包括特征提取和微調(diào)。我們將討論諸如學習率安排、架構修改等的實際考慮。
下游應用程序:本節(jié),我們將重點介紹預訓練的表示是如何被用在不同的下游任務中的,例如文本分類、自然語言生成、結構化預測等等。
開放問題和方向:在最后一節(jié)中,我們將提出對未來的展望。我們將突出待解決的問題以及未來的研究方向。
A Survey on Transfer Learning, Pan and Yang (2010) 摘要:在許多機器學習和數(shù)據(jù)挖掘算法中,一個主要的假設是訓練和未來的數(shù)據(jù)必須在相同的特征空間中,并且具有相同的分布。然而,在許多實際應用程序中,這種假設可能不成立。例如,我們有時在一個感興趣的領域中有一個分類任務,但是我們只在另一個感興趣的領域中有足夠的訓練數(shù)據(jù),并且后者可能位于不同的特征空間或遵循不同的數(shù)據(jù)分布。在這種情況下,如果成功地進行知識遷移,就可以避免昂貴的數(shù)據(jù)標記工作,從而大大提高學習性能。近年來,遷移學習作為一種新的學習框架應運而生。本研究的重點是分類和回顧目前遷移學習在分類、回歸和聚類問題上的進展。在本研究中,我們討論了遷移學習與其他相關機器學習技術的關系,如領域適應、多任務學習、樣本選擇偏差以及協(xié)變量偏移。同時,我們也探討了遷移學習研究中一些潛在的未來問題。
為什么要在自然語言處理任務中使用遷移學習 ?
許多 NLP 任務共享關于語言的常識 (例如語言表示、結構相似性)
跨任務共享的、不同層次的,含義和結構的表示
任務之間可以互通有無——例如語法和語義
帶注釋的數(shù)據(jù)很少,應當盡可能多地利用其進行監(jiān)督學習
經(jīng)驗上看,遷移學習促成了許多有監(jiān)督的 NLP 任務的 SOTA (如分類、信息提取、問答等)。
為什么要在自然語言處理任務中使用遷移學習 ?(經(jīng)驗之談)
自然語言處理任務中的遷移學習種類
Ruder (2019)
遷移學習包括 Transductive 與 Inductive 兩種:
Transductive:相同的任務;但只有原領域的標注數(shù)據(jù)
不同的領域:領域適應
不同的語言:跨語種學習
Inductive:不同的任務;只有目標領域的標注數(shù)據(jù)
同時學習任務:多任務學習
順序學習任務:順序遷移學習(教程重點)
這篇tutorial與什么有關?
目標:提供NLP中遷移方法的廣泛概述,重點介紹截至目前(2019年年中)最成功的經(jīng)驗方法。
提供實用的動手建議→在教程結束時,每個人都有能力將最新的進展應用到文本分類任務
這不是:全面的(不可能在一個教程中涵蓋所有相關的論文!)
(Bender Rule:本教程主要針對用英語完成的工作,對其他語言的可擴展性取決于數(shù)據(jù)和資源的可用性。)
1. 介紹
Sequential transfer learning 指的是在一個任務/數(shù)據(jù)集上學習后遷移到其他任務/數(shù)據(jù)集上。
預訓練的任務和數(shù)據(jù)集
Unlabeled data and self-supervision
很容易收集非常大的語料庫:維基百科,新聞,網(wǎng)頁抓取,社交媒體等。
利用分布假設進行訓練:“You shall know a word by the company it keeps”(Firth, 1957),通常形式化為訓練某種語言模型的變體
關注使用有效的算法以利用豐富的數(shù)據(jù)
Supervised pretraining
在視覺領域很常見,但由于缺乏大型監(jiān)督數(shù)據(jù)集,在NLP中較少
機器翻譯
NLI 用于學習句子表示
任務特定——從一個問答數(shù)據(jù)集遷移到另一個
目標任務和數(shù)據(jù)集
目標任務通常是監(jiān)督的,并跨越一系列常見的NLP任務:
句子或文檔分類(例如情感分類)
句子對分類(如NLI, paraphrase)
單詞級別(如序列標注、抽取問答)
結構化預測(例如解析)
生成(例如對話、總結)
從單詞到文本中的單詞
語言模型預訓練
許多成功的預訓練方法都是基于語言模型的
非正式地,語言模型學習
不需要人工注釋
許多語言都有足夠的文本來學習高容量模型
語言模型是“多才多藝”的——可以學習句子和單詞的表示,具有多種目標函數(shù)
由淺到深
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)
在語境詞向量中,雙向語境非常重要
通常:相似的預訓練和目標任務 → 最好結果
語言模型預訓練
詞向量
為什么要詞嵌入?
詞嵌入是可以學習的參數(shù)
在不同任務中共享表示
低維空間更好計算——難以處理稀疏向量
無監(jiān)督預訓練 : 神經(jīng)網(wǎng)絡之前
詞向量預訓練
word2vec
以 CBOW 為例,輸入層將目標詞語境 c 中的每一個詞向量簡單求和(也可求平均)后得到語境向量,然后直接與目標詞的輸出向量求點積,目標函數(shù)也就是要讓這個與目標詞向量的點積取得最大值,對應的與非目標詞的點積盡量取得最小值。
word2vec 的出現(xiàn),極大促進了 NLP 的發(fā)展,尤其是促進了深度學習在 NLP 中的應用(不過word2vec 算法本身其實并不是一個深度模型,它只有兩層全連接),利用預訓練好的詞向量來初始化網(wǎng)絡結構的第一層幾乎已經(jīng)成了標配,尤其是在只有少量監(jiān)督數(shù)據(jù)的情況下,如果不拿預訓練的 embedding 初始化第一層,幾乎可以被認為是在蠻干。
Word2vec 與 NNLM 都是語言模型,但不同的是 word2vec 的重點是通過訓練語言模型從而得到詞向量,因此以詞向量為重點對 NNLM 進行了改進優(yōu)化,并且使用 CBOW 和 Skip-gram 兩種方式學習詞向量,GloVe 則通過構建共現(xiàn)矩陣,不通過傳統(tǒng)的 SVD 進行計算復雜度較高的矩陣分解,而是使用平方誤差促使點積盡可能得接近共現(xiàn)概率的對數(shù),因為如果使向量點積等于共現(xiàn)概率的對數(shù),向量差異就會成為共現(xiàn)概率的比率即單詞 j 出現(xiàn)在單詞 i 的上下文中的概率,這一比值蘊含了語義信息。
相比word2vec,GloVe卻更加充分的利用了詞的共現(xiàn)信息,word2vec中則是直接粗暴的讓兩個向量的點乘相比其他詞的點乘最大,至少在表面上看來似乎是沒有用到詞的共現(xiàn)信息,不像GloVe這里明確的就是擬合詞對的共現(xiàn)頻率。
fastText 則是利用帶有監(jiān)督標記的文本分類數(shù)據(jù)完成訓練,框架和 CBOW 一致,不過輸入數(shù)據(jù)不再是 bag-of-words 的信息,還加上了 ngram 信息,這就加入了語序信息,而且輸出的是當前輸入文本的類別。此外還引入 subword 來處理長詞,處理 OOV 問題。
句子和文檔向量
無監(jiān)督篇章嵌入 (Le & Mikolov, 2014)PV-DM的全稱是 Distributed Memory Model of Paragraph Vectors,和CBOW類似,也是通過上下文預測下一個詞,不過在輸入層的時候,同時也維護了一個文檔ID映射到一個向量的look-up table,模型的目的便是將當前文檔的向量以及上下文向量聯(lián)合輸入模型,并讓模型預測下一個詞,訓練結束后,對于現(xiàn)有的文檔,便可以直接通過查表的方式快速得到該文檔的向量,而對于新的一篇文檔,那么則需要將已有的look-up table添加相應的列,然后重新走一遍訓練流程,只不過此時固定好其他的參數(shù),只調(diào)整look-up table,收斂后便可以得到新文檔對應的向量了。PV-DBOW的全稱則是Distributed Bag of Words version of Paragraph Vector,和Skip-gram類似,通過文檔來預測文檔內(nèi)的詞,訓練的時候,隨機采樣一些文本片段,然后再從這個片段中采樣一個詞,讓PV-DBOW模型來預測這個詞,以此分類任務作為訓練方法,說白了,本質(zhì)上和Skip-gram是一樣的。這個方法有個致命的弱點,就是為了獲取新文檔的向量,還得繼續(xù)走一遍訓練流程,并且由于模型主要是針對文檔向量預測詞向量的過程進行建模,其實很難去表征詞語之間的更豐富的語義結構,所以這兩種獲取文檔向量的方法都未能大規(guī)模應用開來。
Skip-Thought
借鑒 Skip-gram 的思想,Skip-thoughts 直接在句子間進行預測,也就是將 Skip-gram 中以詞為基本單位,替換成了以句子為基本單位,具體做法就是選定一個窗口,遍歷其中的句子,然后分別利用當前句子去預測和輸出它的上一句和下一句。不過和普通框架不一樣的是,Skip-thoughts有兩個Decoder。在今天看來,這個框架還有很多不完善或者可以改進的地方(作者也在論文中分別提到了這些future works),比如輸入的Encoder可以引入attention機制,從而讓Decoder的輸入不再只是依賴Encoder最后一個時刻的輸出;Encoder和Decoder可以利用更深層的結構;Decoder也可以繼續(xù)擴大,可以預測上下文中更多的句子;RNN也不是唯一的選擇,諸如CNN以及2017年谷歌提出的Transformer的結構也可以利用進來,后來果不其然,谷歌的BERT便借鑒了這一思路。
Quick-thoughts 在此基礎上進一步改進,將生成任務改為分類任務。具體說來就是把同一個上下文窗口中的句子對標記為正例,把不是出現(xiàn)在同一個上下文窗口中的句子對標記為負例,并將這些句子對輸入模型,讓模型判斷這些句子對是否是同一個上下文窗口中,很明顯,這是一個分類任務。可以說,僅僅幾個月之后的BERT正是利用的這種思路。而這些方法都和Skip-thoughts一脈相承。
自編碼器預訓練
半監(jiān)督序列學習
論文提出了兩個方法,用無標簽數(shù)據(jù)進行無監(jiān)督訓練的參數(shù)來初始化有監(jiān)督學習的模型:一種是用基礎的語言模型,另一種是用seq2seq自編碼模型(sequence autoencoder, SA-LSTM),encoder 輸入為WXYZ,decoder輸出為依然為WXYZ。和普通的seq2seq模型相比不同的是,這里的encoder和decoder隱層是共享的。有種提前讓循環(huán)神經(jīng)網(wǎng)絡學會句子的表達,再之后根據(jù)標簽去學習分類的能力的思想。
有監(jiān)督的句子嵌入
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)數(shù)據(jù)集上訓練的模型,而后將訓練好的模型當做特征提取器,以此來獲得一個句子的向量表示,再將這個句子的表示應用在新的分類任務上,來評估句子向量的優(yōu)劣??蚣芙Y構如下圖所示
這個框架最底層是一個 Encoder,也就是最終要獲取的句子向量提取器,然后將得到的句子向量通過一些向量操作后得到句子對的混合語義特征,最后接上全連接層并做 SNLI 上的三分類任務。
上下文相關詞向量
動機:詞向量將所有的上下文都壓縮到一個單一向量中
關鍵想法:不是每個單詞學習一個向量,而是學習依賴于上下文的向量。
context2vec
基于 CBOW 框架,為了捕捉句子語境的本質(zhì),使用雙向 LSTM 提取特征。
TagLM
TagLM workflow
與上文無關的單詞嵌入 + RNN model 得到的 hidden states 作為特征輸入
Char CNN / RNN + Token Embedding 作為 bi-LSTM 的輸入
得到的 hidden states 與 Pre-trained bi-LM(凍結的) 的 hidden states 連接起來輸入到第二層的 bi-LSTM 中
Seq2Seq的無監(jiān)督預訓練
提出一種通用的提高seq2seq模型的無監(jiān)督訓練方法。seq2seq模型的encoder和decoder的權重用兩個預訓練語言模型初始化然后微調(diào)。
seq2seq模型的缺點:監(jiān)督學習的語料有限,容易過擬合。本文提出了改善seq2seq效果的無監(jiān)督訓練方法。在微調(diào)階段,訓練任務為語言模型任務和seq2seq的聯(lián)合任務。(開始fune-tuning可能導致災難性的遺忘:模型在語言模型上的性能急劇下降,可能損害模型的泛化能力。為保證模型不在有監(jiān)督語料上過擬合,在fine-tuning階段繼續(xù)單語言語言模型任務,seq2seq和語言模型任務的損失相加作為最終損失)
此外還用了殘差連接,Encoder 和 Decoder 之間也用了 Attention。
CoVe
CoVe更側重于如何將現(xiàn)有數(shù)據(jù)上預訓練得到的表征遷移到新任務場景中,而之前的句子級任務中大多數(shù)都只把遷移過程當做一個評估他們表征效果的手段,因此觀念上有所不同
也有使用訓練好的序列模型為其他NLP模型提供上下文的想法
想法:機器翻譯是為了保存意思,所以這也許是個好目標?
使用seq2seq + attention NMT system中的Encoder,即 2層 bi-LSTM ,作為上下文提供者
所得到的 CoVe 向量在各種任務上都優(yōu)于 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
目標函數(shù)為
(僅)使用字符CNN構建初始單詞表示
如下圖所示,在輸入層和輸出層均使用了如下CNN結構,減少了參數(shù)規(guī)模,解決了 OOV 問題,并且每一個詞向量的計算可以預先做好,更能夠減輕inference階段的計算壓力
2048 個 char n-gram filters 和 2 個 highway layers,512 維的 projection
4096 dim hidden/cell LSTM狀態(tài),使用 512 dim的對下一個輸入的投影
使用殘差連接
綁定 token 的輸入和輸出的參數(shù)(softmax),并將這些參數(shù)綁定到正向和反向LMs之間
ELMo學習biLM表示的特定任務組合
這是一個創(chuàng)新,TagLM 中僅僅使用堆疊LSTM的頂層,ELMo 認為BiLSTM所有層都是有用的
衡量ELMo對任務的總體有用性,是為特定任務學習的全局比例因子
是 softmax 歸一化的混合模型權重,是 BiLSTM 的加權平均值的權重,對不同的任務是不同的
對于每一個詞,可以根據(jù)下面的式子得到它的向量,其中 γ 是一個scale因子,加入這個因子主要是想要將ELMo的向量與具體任務的向量分布拉平到同一個分布水平,這個時候便需要這么一個縮放因子了。另外, 便是針對每一層的輸出向量,利用一個softmax的參數(shù)來學習不同層的權值參數(shù),因為不同的任務需要的詞語意義的粒度也不一致,一般認為淺層的表征比較傾向于句法,而高層輸出的向量比較傾向于語義信息,因此通過一個softmax的結構讓任務自動去學習各層之間的權重,自然也是比較合理的做法。
此外,ELMo 還使用了 Exploring the Limits of Language Modeling 中提出的 char-based CNN 結構,應用到輸入層和輸出層上,減少了參數(shù)規(guī)模,并解決了令人頭痛的 OOV 問題。
ELMo 使用 LSTM 而不是 Transformer 作為特征抽取器,而很多研究已經(jīng)證明了Transformer提取特征的能力是要遠強于LSTM的;另外,ELMO 采取雙向拼接這種融合特征的能力可能比 Bert 一體化的融合特征方式弱,但是,這只是一種從道理推斷產(chǎn)生的懷疑,目前并沒有具體實驗說明這一點。
ELMo 代表著基于特征融合的預訓練方法,而 GPT 則是基于Fine-tuning的模式的開創(chuàng)者。
ULMFit
在大型通用領域的無監(jiān)督語料庫上使用 biLM 訓練
在目標任務數(shù)據(jù)上調(diào)整 LM
對特定任務將分類器進行微調(diào)
使用合理大小的“1 GPU”語言模型,并不是真的很大
在LM調(diào)優(yōu)中要注意很多
ULMFit的預訓練和finetune過程主要可以分為三個階段,分別是在大規(guī)模語料集上(比如Wikitext 103,有103million個詞)先預訓練,然后再將預訓練好的模型在具體任務的數(shù)據(jù)上重新利用語言模型來finetune一下(這是第一次finetune,叫做LM finetune),爾后再根據(jù)具體任務設計的一個模型上,將預訓練好的模型當做這個任務模型的多層,再一次finetune(這是第二次finetune,如果是分類問題的話可以叫做Classifier finetune)
其中 T 是一個閾值,而 K 則是總共的迭代次數(shù),這個式子的意思就是把迭代到第T次之后,對該參數(shù)在其后的第 T 輪到最后一輪之間的所有值求平均,從而得到最后模型的該參數(shù)值,而相應的,普通的SGD則是直接取
作為最后模型的參數(shù)值。并且在每個時間步之間都是用一個全連接層,并且使用DropConnect的方法隨機drop掉一些連接減少一些過擬合的風險
微調(diào)技巧
有區(qū)分的微調(diào)
針對不同的層在訓練更新參數(shù)的時候,賦予不同的學習率。這里的出發(fā)點是,一般來說,對于NLP的深度學習模型來說,不同層的表征有不同的物理含義,比如淺層偏句法信息,高層偏語義信息,因此對于不同層的學習率不同,自然就是比較合理的了。原文也給出了具體的選擇:先指定最后一層的學習率,然后根據(jù)下式得到前面層的學習率,基本思想是讓淺層的學習率要更小一些。
斜三角學習率
在finetune的第一階段,希望能夠先穩(wěn)定住原來已經(jīng)在大規(guī)模語料集上已經(jīng)預訓練好的參數(shù),所以選擇一個比較小的finetune學習率;爾后希望能夠逐步加大學習率,使得學習過程能夠盡量快速;最后,當訓練接近尾聲時,逐步減小學習率,這樣讓模型逐漸平穩(wěn)收斂(這個思想大概借鑒了2017年谷歌提出Transformer時用到的warm up的學習率調(diào)節(jié)方法,這個方法也是在訓練的時候先將學習率逐步增大,爾后再逐步減?。?。因此,這樣一個三段論式的學習過程,用圖表示如下:
逐漸解凍
主要思想是把預訓練的模型在新任務上finetune時,逐層解凍模型,也就是先finetune最后一層,然后再解凍倒數(shù)第二層,把倒數(shù)第二層和最后一層一起finetune,然后再解凍第三層,以此類推,逐層往淺層推進,最終finetune整個模型或者終止到某個中間層。這樣做的目的也是為了finetune的過程能夠更平穩(wěn)。
因為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的預訓練雖然仍然是以語言模型作為目標任務,但是采用的是單向的語言模型,所謂“單向”的含義是指:語言模型訓練的任務目標是根據(jù)單詞的上下文去正確預測單詞 ,GPT則只采用這個單詞的上文來進行預測,而拋開了下文。
下游任務怎么使用 GPT 呢?首先,對于不同的下游任務來說,本來你可以任意設計自己的網(wǎng)絡結構,現(xiàn)在不行了,你要向GPT的網(wǎng)絡結構看齊,把任務的網(wǎng)絡結構改造成和GPT的網(wǎng)絡結構是一樣的。然后,在做下游任務的時候,利用第一步預訓練好的參數(shù)初始化GPT的網(wǎng)絡結構,這樣通過預訓練學到的語言學知識就被引入到你手頭的任務里來了,這是個非常好的事情。再次,你可以用手頭的任務去訓練這個網(wǎng)絡,對網(wǎng)絡參數(shù)進行Fine-tuning,使得這個網(wǎng)絡更適合解決手頭的問題。
對于NLP各種花樣的不同任務,怎么改造才能靠近GPT的網(wǎng)絡結構呢?
GPT論文給了一個改造施工圖如上,其實也很簡單:對于分類問題,不用怎么動,加上一個起始和終結符號即可;對于句子關系判斷問題,比如Entailment,兩個句子中間再加個分隔符即可;對文本相似性判斷問題,把兩個句子順序顛倒下做出兩個輸入即可,這是為了告訴模型句子順序不重要;對于多項選擇問題,則多路輸入,每一路把文章和答案選項拼接作為輸入即可。從上圖可看出,這種改造還是很方便的,不同任務只需要在輸入部分施工即可。
BERT
Bert 采用和GPT完全相同的兩階段模型,首先是語言模型預訓練;其次是使用Fine-Tuning模式解決下游任務。和GPT的最主要不同在于在預訓練階段采用了類似ELMO的雙向語言模型,當然另外一點是語言模型的數(shù)據(jù)規(guī)模要比GPT大。
BERT最主要的幾個特征分別是
利用了真雙向的Transformer
為了利用雙向信息,改進了普通語言模型成為完形填空式的Mask-LM(Mask-Language Model)
利用Next Sentence Prediction任務學習句子級別信息
進一步完善和擴展了GPT中設計的通用任務框架,使得BERT能夠支持包括:句子對分類任務、單句子分類任務、閱讀理解任務和序列標注任務
預訓練階段
因為Encoder中用了Self-attention機制,而這個機制會將每一個詞在整個輸入序列中進行加權求和得到新的表征,更通俗的說法是每一個詞在經(jīng)過Self-attention之后,其新的表征將會是整個輸入序列中所有詞(當然也包括它本身)的加權求和。在ELMo與GPT中,它們并沒有用上這種交融模式,也就是它們本質(zhì)上還是一個單向的模型,ELMo稍微好一點,將兩個單向模型的信息concat起來,GPT則只用了單向模型,這是因為它沒有用上Transformer Encoder,只用了Decdoer的天生基因決定的,其實,很多人就把這種left-to-right的Transformer框架叫做Decoder,因為事實上Decoder就是如此(具體做的時候需要提前把未來待生成的詞做好mask,細節(jié)上通過上三角矩陣來實現(xiàn)),這也是OpenAI把他們的模型叫做'Generative'的原因所在。
“GPT則只用了單向模型,這是因為它沒有用上Transformer Encoder,只用了Decdoer的天生基因決定的” ,個人認為主要想表述的是 GPT 使用 Transformer 架構時,受限于傳統(tǒng)的語言模型,產(chǎn)生的假雙向的問題,簡單來說就是GPT并沒有像 Transformer 中的 encoder 一樣對整句話進行 self-attention ,而是像 Decoder 一樣,預測每個單詞時只有其上文進行了 self-attention
Masked-LM 雙向Transformer下的語言模型
然而在語言模型中,我們通過某個詞的上下文語境預測當前詞的概率,如果直接把這個套用到Transformer的Encoder中,會發(fā)現(xiàn)待預測的輸出和序列輸入已經(jīng)糅合在一塊了。那么,如何解決Self-attention中帶來了表征性能卓越的雙向機制,卻又同時帶來了信息泄露的這一問題?Bert 受到完形填空任務的啟發(fā):輸入序列依然和普通Transformer保持一致,只不過把挖掉的一個詞用'[MASK]'替換 ,Transformer的Encoder部分按正常進行,輸出層在被挖掉的詞位置,接一個分類層做詞典大小上的分類問題,得到被mask掉的詞概率大小。
直接把普通語言模型中的生成問題(正如GPT中把它當做一個生成問題一樣,雖然其本質(zhì)上也是一個序列生成問題),變?yōu)橐粋€簡單的分類問題,并且也直接解決了Encoder中多層Self-attention的雙向機制帶來的泄密問題(單層Self-attention是真雙向,但不會帶來泄密問題,只有多層累加的Self-attention才會帶來泄密問題),使得語言模型中的真雙向機制變?yōu)楝F(xiàn)實。
不過,BERT針對如何做“[MASK]”,做了一些更深入的研究,它做了如下處理
選取語料中所有詞的15%進行隨機mask
選中的詞在80%的概率下被真實mask
選中的詞在10%的概率下不做mask,而被隨機替換成其他一個詞
選中的詞在10%的概率下不做mask,仍然保留原來真實的詞
這使得Transformer編碼器不知道它將被要求預測哪些單詞或哪些單詞已被隨機單詞替換,因此它被迫保持每個輸入標記的分布式上下文表示。
預測下一句
利用和借鑒了Skip-thoughts方法中的句子預測問題,來學習句子級別的語義關系,具體做法則是將兩個句子組合成一個序列,當然組合方式會按照下面將要介紹的方式,然后讓模型預測這兩個句子是否是先后近鄰的兩個句子,也就是會把'Next Sentence Prediction'問題建模成為一個二分類問題。訓練的時候,數(shù)據(jù)中有50%的情況這兩個句子是先后關系,而另外50%的情況下,這兩個句子是隨機從語料中湊到一起的,也就是不具備先后關系,以此來構造訓練數(shù)據(jù)。句子級別的預測思路和之前介紹的Skip-thoughts基本一致,當然更本質(zhì)的思想來源還是來自于word2vec中的skip-gram模型。
要求模型除了做上述的Masked語言模型任務外,附帶再做個句子關系預測,判斷第二個句子是不是真的是第一個句子的后續(xù)句子。之所以這么做,是考慮到很多NLP任務是句子關系判斷任務,單詞預測粒度的訓練到不了句子關系這個層級,增加這個任務有助于下游句子關系判斷任務。所以可以看到,它的預訓練是個多任務過程。這也是Bert的一個創(chuàng)新。
spanBERT 與 RoBERTa 兩篇文章對此提出了質(zhì)疑,感興趣的讀者可以自行閱讀~
在預訓練階段,因為有兩個任務需要訓練:Mask-LM和Next Sentence Prediction,因此BERT的預訓練過程實質(zhì)上是一個Multi-task Learning,具體說來,BERT的損失函數(shù)由兩部分組成,第一部分是來自于Mask-LM的單詞級別的分類任務,另一部分是句子級別的分類任務,通過這兩個任務的聯(lián)合學習,可以使得BERT學習到的表征既有token級別的信息,同時也包含了句子級別的語義信息。具體的損失函數(shù)如下
Fine-Tuning 階段
輸入層:如果輸入只有一個句子的話,則直接在句子的前后添加句子的起始標記位和句子的結束符號,在BERT中,起始標記都用“[CLS]”來表示,結束標記符用'[SEP]'表示,對于兩個句子的輸入情況,除了起始標記和結束標記之外,兩個句子間通過'[SEP]'來進行區(qū)分。除了這些之外,BERT還用了兩個表示當前是句子A還是句子B的向量來進行表示,對于句子A來說,每一詞都會添加一個同樣的表示當前句子為句子A的向量,相應的,如果有句子B的話,句子B中的每一個詞也都會添加一個表示當前句子為句子B的向量。
NLP 的四大任務:
序列標注,這是最典型的NLP任務,比如中文分詞,詞性標注,命名實體識別,語義角色標注等都可以歸入這一類問題,它的特點是句子中每個單詞要求模型根據(jù)上下文都要給出一個分類類別。
分類任務,比如我們常見的文本分類,情感計算等都可以歸入這一類。它的特點是不管文章有多長,總體給出一個分類類別即可。
句子關系判斷,比如Entailment,QA,語義改寫,自然語言推理等任務都是這個模式,它的特點是給定兩個句子,模型判斷出兩個句子是否具備某種語義關系。
生成式任務,比如機器翻譯,文本摘要,寫詩造句,看圖說話等都屬于這一類。它的特點是輸入文本內(nèi)容后,需要自主生成另外一段文字。
對于種類如此繁多而且各具特點的下游NLP任務,Bert如何改造輸入輸出部分使得大部分NLP任務都可以使用Bert預訓練好的模型參數(shù)呢?上圖給出示例,對于句子關系類任務,很簡單,和GPT類似,加上一個起始和終結符號,句子之間加個分隔符即可。對于輸出來說,把第一個起始符號對應的Transformer最后一層位置上面串接一個softmax分類層即可。對于分類問題,與GPT一樣,只需要增加起始和終結符號,輸出部分和句子關系判斷任務類似改造;對于序列標注問題,輸入部分和單句分類是一樣的,只需要輸出部分Transformer最后一層每個單詞對應位置都進行分類即可。從這里可以看出,上面列出的NLP四大任務里面,除了生成類任務外,Bert其它都覆蓋到了,而且改造起來很簡單直觀。盡管Bert論文沒有提,但是稍微動動腦子就可以想到,其實對于機器翻譯或者文本摘要,聊天機器人這種生成式任務,同樣可以稍作改造即可引入Bert的預訓練成果。只需要附著在S2S結構上,encoder部分是個深度Transformer結構,decoder部分也是個深度Transformer結構。根據(jù)任務選擇不同的預訓練數(shù)據(jù)初始化encoder和decoder即可。這是相當直觀的一種改造方法。當然,也可以更簡單一點,比如直接在單個Transformer結構上加裝隱層產(chǎn)生輸出也是可以的。不論如何,從這里可以看出,NLP四大類任務都可以比較方便地改造成Bert能夠接受的方式。這其實是Bert的非常大的優(yōu)點,這意味著它幾乎可以做任何NLP的下游任務,具備普適性,這是很強的。
最后,我們再次總結下BERT的幾個主要特點:
Transformer Encoder因為有Self-attention機制,因此BERT自帶雙向功能
因為雙向功能以及多層Self-attention機制的影響,使得BERT必須使用Cloze版的語言模型Masked-LM來完成token級別的預訓練
為了獲取比詞更高級別的句子級別的語義表征,BERT加入了Next Sentence Prediction來和Masked-LM一起做聯(lián)合訓練
為了適配多任務下的遷移學習,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 ???”
為了有機會解決這個任務,模型必須學習語法、語義、對世界事實編碼等等。
給定足夠的數(shù)據(jù)、一個巨大的模型和足夠的計算,就可以完成一項合理的工作!
從經(jīng)驗上看,語言模型比翻譯,自編碼更有效:“Language Modeling Teaches You More Syntax than Translation Does” (Zhang et al. 2018)
預訓練的有趣屬性
1. 樣本高效
ELMo 中的實驗對比
預訓練的一個主要好處就是它減少了對有標注數(shù)據(jù)的需求。在實際使用中,與非預訓練模型相比,遷移學習模型通常只需要十分之一甚至更少的樣本數(shù)量就達到類似的表現(xiàn),如下圖(ULMFIT Howard and Ruder, 2018)所示。
ULMFit中的實驗對比
2. 擴大預訓練規(guī)模
上圖為 GloVe 中增加語料庫規(guī)模對模型準確度的影響。
數(shù)據(jù)集越大越好,并且維基百科數(shù)據(jù)集比新聞文本數(shù)據(jù)集要好
因為維基百科就是在解釋概念以及他們之間的相互關聯(lián),更多的說明性文本顯示了事物之間的所有聯(lián)系
而新聞并不去解釋,而只是去闡述一些事件
不同數(shù)據(jù)量的 Crawl 數(shù)據(jù)作為預訓練的平均 GLUE 效果
通常,我們可以通過同時增加模型參數(shù)和預訓練數(shù)據(jù)量的方式來改善預訓練表征。但隨著預訓練數(shù)據(jù)量的增長,回報率開始下降。但如上圖所示的當前的性能曲線,并不表示我們已達到了穩(wěn)定狀態(tài)。因此,我們期待可以在更多數(shù)據(jù)基礎上訓練出更大的模型。
最近的這種趨勢的例子是ERNIE 2.0,XLNet,GPT-2 8B, 和 RoBERTa。特別是后者發(fā)現(xiàn),簡單地對 BERT 進行更長時間和更多數(shù)據(jù)的訓練就可以得到更好的結果,而對 GPT-2 8B 進行更長時間和更多數(shù)據(jù)的訓練則可以減少語言建模數(shù)據(jù)集上的困惑度(盡管只是相對較小的因素)
跨語言預訓練
在訓練跨語言詞嵌入方面做了大量工作(Overview: Ruder et al. (2017))
想法:分別訓練每種語言,然后對齊
Recent work aligning ELMo: Schuster et al., (NAACL 2019)
ACL 2019 Tutorial on Unsupervised Cross-lingual Representation Learning
關鍵思想:通過在多種語言上訓練一個模型,實現(xiàn)跨語言的詞匯表和表示。
優(yōu)點:易于實現(xiàn),可單獨進行跨語言預培訓
缺點:低資源語言導致其表示學習的不夠好
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)
本期責任編輯:崔一鳴
本期編輯:顧宇軒
本文轉自:“哈工大SCIR”公眾號
聯(lián)系客服