Video: https://www.youtube.com/watch?v=1_gRK9EIQpc&feature=youtu.be
,https://www.youtube.com/watch?v=Bywo7m6ySlk&feature=youtu.be
Slides: http://speech.ee.ntu.edu.tw/~tlkagk/courses/DLHLP20/BERT%20train%20(v8).pdf
Overview
過去的NLP任務通常是一個任務一個模型,但如今已然邁向希望機器在general地了解人類語言之后,再去解各式各樣地任務。一個常見地做法是:根據大量的沒有標注的文本訓練一個模型,使其可以“讀懂”人類文字,通常將這一過程稱為Pre-train;接下來,針對某個想要解決的特殊任務,可以搜集相對較少的任務特定的帶有標注的資料對剛剛訓練好的模型進行微調,從而實現讓機器解各式各樣的任務,該過程稱為Fine-tune。
以芝麻街角色命名的模型
ELMo(Embeddings from Language Model)
BERT(Bidiractional Encoder Representations from Transformers)
ERNIE(Enhanced Representation through Knowledge Integration)
Grover(Generating aRticles by Only Viewing mEtadata Records)
BERT & PALs(Projected Attention Layers)
What is pre-train model
Why Pre-train Models
GLUE Scores(反映了模型了解人類語言的能力)顯示加入Pre-train Model后,在GLUE Benchmark Corpus上,機器的能力與人類已經不相上下了。
More Reference:https://arxiv.org/abs/1908.05620
之前的Pre-train Model
期望將每一個輸入的token表示為一個embedding vector,用于表示該token的語義,意思相近的token擁有相近的embedding,embedding的某些維度應當可以看出與語義的關聯性。
將token映射為embedding的做法包括:simply a table look-up(如Word2vec、Glove)、English word as token(如FastText,以英文字母作為輸入,輸出整個單詞的向量)、將中文的字作為Image,通過字的偏旁部首學習字的語義……
以上模型均存在沒有考慮token上下文的缺點,繼而產生了Contextual Word Embedding的概念,ELMo、BERT都屬于這一類。同樣都是每一個token對應一個embedding,但contextual Word Embedding會在看完整個句子之后再輸入句子中每個token特有的embedding。
Contextual Word Embedding
模型結構類似于Encoder,這樣的模型通常都由多層構成,內部可以使用LSTM(ELMo)、Self-attention layers(BERT)、Tree-based model(編碼語法信息,但這類方法尚未流行)。
Make model smaller
針對BERT發展而來的Smaller Model:Distill BERT、Tiny BERT、Mobile BERT、Q8BERT、ALBERT
How to make model smaller?:Network pruning、knowledge distillation、Parameter Quantization、Architecture Design
Excellent Reference:http://mitchgordon.me/machine/learning/2019/11/18/all-the-ways-to-compress-BERT.html
Network Architecture
大多新架構目標都是想讓機器可以讀更長的sequence(一篇文章甚至一整本書),例如:
Transformer-XL: Segment-Level Recurrence with State Reuse
還有一些架構期望可以減少self-attention所帶來的運算量(n^2),例如:
Reformer、Longformer
How to fine-tune
在有了Pre-train Model之后,我們希望在上面疊一些Task-specific的部分,從而將這個完整的模型用于特定的NLP任務上。接下來的問題就是對Pre-Train Model進行適當修改,使其可以解決不同類型的NLP問題。
對于輸入是multiple sentences的情況,如QA問題中的Query-Document,NLI問題中的Premise和Hypothesis,通常做法是在兩個sentence中添加一個特殊token“<SEP>”,用作兩個語句之間的分割。
對于輸出one class的情況,BERT中的做法是在輸入中添加token“<CLS>”,在pretrain時對于<CLS>,需要在該位置輸出與整個句子有關的embedding,繼而將這個embedding輸入到task specific model(可以是簡單的Linear Transform,也可以是很復雜的變換模型)中進行分類。也有做法是不引入特殊token,而是將所有token的embedding作為輸入進行分類。
對于輸出是class for each token的情況,則將每個token對應的embedding輸入Task Specific Model(可以是LSTM)中,為每一個token輸出一個class。
對于輸出需要copy from input的情況,如Extraction-based QA任務,輸入Document和Query,輸出兩個非負整數s和e表示問題答案為Document中的第s個word到第e個word中的內容。BERT中的做法是分別使用兩個向量表示s和e,依次與document中的每個token的embedding向量做dot product,最終經過softmax得到s和e的位置。
對于輸出是General Sequence的情況,即如何將pre-train model用于Seq2seq model中,最直覺的做法是將pre-train model作為encoder,將Task Specific Model作為Decoder,這樣做的缺點是Task Specific Model是沒有經過Pre-Train的,因為用于Task Specific Model的帶標注的數據沒有很多,因此我們期望Task Specific越小越好,整個模型中的多數參數都是Pre-train過的。另一種可行做法是,在輸入input sequence后,再輸入一個特殊token“<SEP>”,該token位置輸出的embedding將被輸入一個Task Specific Model中,得到output sequence的第一個詞匯,接下來再將這個詞匯丟到Pre-TrainModel中,循環往復,依次得到output sequence的所有詞匯,直到輸出“<EOS>”,從而實現將Pre-train Model作為Decoder使用。
具體的Fine-tune過程有兩種做法:第一種是將訓練好的Pre-trained Model作為Feature Extractor,即所有參數將被固定,只對Task-specific Model進行Fine-tune;另一種做法是對Pre-trained Model和Task-specific Model同時進行Fine-tune。實驗表明后者performance更佳。
然而,對Pre-trained Model和Task-specific Model同時Fine-tune可能會遇到以下問題:同一個Pre-trained Model經過不同任務下的fine-tune會變得不一樣,每一個任務都需要保存一個新模型,這樣的模型如今往往非常巨大,因此產生了Adaptor的概念。其主要思想在于對Pre-trained Model進行微調時,只調其中還的一部分,做法是在Pre-trained Model中加入一些layers,稱為Adaptor,只有Adaptor部分會連同Task-Specific Model進行Fine-tune,從而大大減小了存儲模型所需的空間。Adaptor的架構仍是一個值得研究的問題。另一種做法是考慮到Pre-trained Model中的不同層可能抽取特征的側重有所不同,因此對不同層的輸出做Weighted Sum,這里的權重則是下游特定任務所要學習的,加權求和后的結果輸出到Task-Specific Model中,這樣的做法稱為Weighted Features。
How to pre-train
Target:期望輸出每個token的contextual embedding vector。
Pre-training by Translation
Context Vector(CoVe):將Pre-train Model視為Translation的Encoder,準備另一個Model作為Decoder,實現Language A到Language B的翻譯。選擇翻譯任務用于Pre-train直觀上便于獲得每個token的representation,但該任務需要大量的pair data(Language A和Language B的語句對),這樣的收集任務是比較困難的,因此我們期望基于唾手可得的沒有標注的文字(Text without annotation)訓練得到pre-train model。這樣的方法之前稱為Unsupervised Learning,但近年來更常被叫做Self-supervised Learning。
Self-supervised Learning
:In self-supervised learning, the system learns to predict part of its input from other parts of its input.
Predict Next Token
Predict next Token任務是Self-supervised learning的經典做法之一,輸入token ,經過pre-trained model得到該token的representation
,經過Linear Transform(也可以是更復雜的層)和softmax得到一個over token的probability distribution,訓練目標是輸出得到的probability distribution和target之間的cross entropy越小越好,這里的target就是
,即期望token
的probability為1,而其它token的probability為0。
在設計Predict next token任務的model時,需要注意不能一次性將所有的token輸入進模型,否則在預測時模型可能會直接將輸入中當前token的下一token作為進行接下來的預測,這樣的模型就無法學到需要的東西。
Predict next Token是早期的Unsupervised pre-train model,而Language Model(LM)要做的事情正是Predict next token,所以上述Model正是一個Language Model。早期一般采用LSTM作為模型架構進行pre-train,其中最著名的就是ELMo,類似的還有Universal Language Model FIne-tuning(ULMFiT)。如今很多模型傾向于使用Self-attention替代LSTM,例如GPT、GPT-2、Megatron、Turing NLG等等。但在使用self-attention時,需要注意控制attention的范圍,因為self-attention會將整個sequence平行的讀入,每一個位置都會attend到其它位置,而當前任務的需求是只需要attend到當前token位置來對下一位置的token進行預測,以此避免model在attention時看到未來token的答案。
Predict Next Token除了可以獲得pre-train model繼而進行fine-tune之外,因其作為一個Language Model,尤其適用于生成任務(do generation)。
Predict Next Token - Bidirectional
在predict next token任務中,包含了從
到
(
and its left context)的信息。ELMo額外考慮了right context的信息。在ELMo中,會基于正向的LSTM由
得到一個embedding去預測
,基于逆向的LSTM由
得到另一個embedding去預測
,ELMo會將這兩個embedding拼接起來作為
的contextual representation,由此這個representation考慮了整個sequence蘊含的信息。
但ELMo存在的問題是,正反向編碼的過程彼此獨立,簡單的拼接過程使得left context和right context并不存在任何交集,BERT針對這一問題進行了改善。
Masking Input
BERT會將輸入中的部分token“蓋住”,一種做法是將要蓋住的token替換為一個特殊的token “<MASK>”,另一種做法是替換為隨機采樣的token,此時pre-train model要做的就是根據被蓋住位置輸出的embedding預測被蓋住的token是什么。BERT使用的Network架構為Transformer,其中的self-attention每一個位置是會attend到其它所有位置的,而不同于之前Predict next Token任務中需要加以限制,因為要預測的內容已經過mask處理,因此不必擔心會看到答案。
BERT的想法和之前Word2Vec中的CBOW方法基本思想很相似,但CBOW可以看到的鄰接token受限于固定的窗口長度,另外BERT采用了較復雜的模型,而CBOW只是經過簡單到的Projection和Output兩層操作,即簡單的線性變換進行預測。
原始BERT中需要MASK的token是隨機決定的,但隨機決定的mask token可能無法學到特別long term的dependency,因此有人提出了新的mask方案。例如Whole Word Masking(WWM),即每次mask的是一個完整的詞而非字或更小的單位級別。類似的還有短語級別的(phrase-level)和實體級別的(Entity-level,需要先做NER)的mask方案,這便是ERNIE采用的方案。還有一種MASK方案稱為SpanBert,每次mask掉一定范圍長度的token,不同的范圍長度對應不同的mask機率。
SpanBert —— Span Boundary Objective(SBO)
該目標是根據mask span的左右相鄰的兩個token,給定一個要預測的mask span的相對位置,預測該位置的token(例如被mask了范圍長度為4的tokens,預測這個范圍內的第三個token)。設計這樣的目標是期望一個span其左右兩邊的token embedding包含其內部整個span的信息,SBO會對coference類的任務有好處。
XLNet
XL指的是Transformer-XL,該架構可以跨segment獲取信息,采用relative position embedding。XLNet強調原始BERT存在的一個問題是:假設給定句子“This is New York city”,原始BERT會將“New”和“York”兩個token同時蓋住,從而無法學習這兩個token間的相互預測,即“New”和“York”會彼此獨立的被預測出來,缺少這兩個詞之間的dependency(實際上如果是random sample,該問題應該沒有那么嚴重)。從Language Model的角度來看,XLNet通過隨機打亂sequence內部token的順序解決一般LM中只獲取left context信息的問題;從BERT的角度出發,XLNet并非根據整個sentence去預測被mask的內容,而是根據整個sentence隨機決定的一部分以及被mask的部分的位置信息(不包含被mask的部分內容信息)去預測被MASK的內容。
BERT cannot talk?
對于傳統的autoregressive model(從左到右生成句子的情況,不過近期已有一些non-autoaggressive的做法),BERT相較LM而言能力有所欠缺,即BERT缺乏generation的能力,或許不太適合作為seq2seq任務的pre-train model,對于這類任務,bert可能只能作為encoder,decoder部分并沒有被pre-train到。為了基于self-supervised learning的方法實現整個seq2seq model的pretrain,首先輸入一個word sequence進入encoder,decoder通過attention從encoder中獲取信息,輸出另一個word sequence,此時的目標是reconstruct the input,即輸出的是原來的word sequence。此時就需要對輸入部分進行corrupted操作,也就是一定程度的破壞。MASS(MAsked Sequence to Sequence pre-training)和BART(Bidirectional and Auto-Regressive Transformers)就是針對訓練可以pre-train的seq2seq model時可采用的corrupt操作展開研究。MASS的思想類似于原始BERT,random mask掉部分token,此時MASS只要求還原被mask的部分;BART除了mask之外,還嘗試了delete、permutation、rotation、Text Infilling(隨機插入不代表任何token的mask或以一個mask蓋住多個token)等操作對input進行corrupt,實驗結果表明permutation和rotation效果不佳,Text Infilling效果最佳。
而UniLM可以同時作為ENcoder、Decoder和Seq2Seq,該模型同時進行Bidirectional LM(同BERT)、Left-to-Right LM(同GPT,此時內部的attention需要加以限制,以避免看到未來的token)、Seq2Seq LM(同BART和MASS,將輸入分為兩份部分,第一部分中的attention可以直接做self-attention,而第二個部分中的token只能看到left context)三種訓練。
ELECTRA
上述pre-train的方法都是預測某些token,這樣的預測需要的運算量、訓練強度是很大的。ELECTRA(Efficiently Learning an Encoder that Classifies Tken Replacements Accurately)避開預測任務,只回答binary的問題。對于輸入的token sequence,ELECTRA會將其中部分token置換成其它詞匯,輸出結果則是當前單詞是否被置換。這樣做的好處是:預測yes/no會比reconstruction要簡單得多,同時每一個position在輸出時都是需要的(而BERT只對被mask的部分進行預測)。該問題的難點在于如何進行恰當的置換,使其僅在語義上有所偏差,這里是使用了一個small BERT去預測將要替換的部分。
Sentence Level
上述pre-train都是給每個token一個embedding,接下來我們希望給整個input tokens sequence一個global embedding。可以采用Skip Thought的想法,輸入一個sentence,經過encoder編碼為一個embedding,decoder根據這個embedding對下一句進行預測,然而這種方法訓練的運算量往往比較大。另一個進階版本稱為Quick Thought,該方法同ELECTRA一樣盡量避開generation這一計算量較大的工作,將兩個句子分別通過Encoder得到各自的embedding,如果兩個句子是相鄰的,我們就讓它們的embedding距離越相近越好。
在原始BERT中,存在<CLS> token,我們正期望該位置輸出的embedding代表整個input token sequence的信息,因此期望能有一個global task,由此BERT采用的是NSP(Next Sequence Prediction)任務,輸入兩個句子,用<SEP>隔開,<CLS>位置輸出的embedding會經過一個Linear Classifier預測兩個句子是否相接。但RoBERTa(Robustly optimized BERT approach)以及XLNET均提出NSP任務結果不盡如人意。另一種方法叫做SOP(Sentence order prediction),即輸入兩個相接的句子,模型會輸出yes,而當將這兩個句子調換順序輸入時,模型會輸出No,該任務被用于ALBERT中。另一種方法structBERT,也稱為Alice,其中結合使用了NSP和SOP的方法。
如何比較各種pre-train方法?
Google提出T5(Transfer Text-to-Text Transformer)對各種pre-train方案進行了比較試圖得到一系列結論,其中用了一個名為C4(Colossal Clean Crawled Corpus)的語料庫
More Model
Enhanced Language RepresentatioN with Informative Entities(ERNIE)希望在pre-train時加入external knowledge。即BERT + External Knowledge = ERNIE。
Audio BERT,語音版的BERT。