大語言基礎
GPT : Improving Language Understanding by Generative Pre-Training
提出背景
從原始文本中有效學習的能力對于減輕自然語言處理中對監督學習的依賴至關重要。很多深度學習方法需要大量人工標注的數據,限制了它們在很多領域的應用,收集更多的人工標注數據耗時且費錢。而且在有大量標注數據情況下,無監督學習到的好的向量表示能表現的更好。
但是從無標注的文本中利用信息有下面兩個挑戰
- 不清楚那種優化目標能最有效的向量表示,NLP中不同的任務(文本推理、文本問答、文本相似度評估等)用不同的目標,使得在僅在當前任務得到最優結果。
- 將學習到的文本表示遷移到目標任務上面的最有效的方法還沒有共識,有的改模型結構,有的增加輔助目標。
GPT使用無監督的預訓練(pre-training)和有監督的精調(fine-tuning)這種半監督的方式來解決這個問題,目標就是學習一個通用的向量表示,大量的下游任務僅需要做一點調整即可。
評估
四類語音理解任務:自然語言推斷、問答、語義相似性、文檔分類。
方案詳情
兩階段,第一階段在一個大的文本語料庫上面學習一個大容量的語言模型,第二階段針對下游具體任務精調。
第一階段:Unsuperviserd pre-training
對于token語料庫 U = { u 1 , u 2 , . . . , n n } \mathcal {U}=\{u_1,u_2, ..., n_n\} U={u1?,u2?,...,nn?},用標準的語言建模目標最大化下面的似然函數
L 1 ( U ) = ∑ i log ? P ( u i ∣ u i ? k , . . . , u i ? 1 ; Θ ) L_1(\mathcal{U} ) = \sum_i \log P(u_i|u_{i-k}, ..., u_{i-1};\Theta) L1?(U)=i∑?logP(ui?∣ui?k?,...,ui?1?;Θ)
這里 k k k表示上下文窗口size大小,模型參數 Θ \Theta Θ,使用SGD訓練。
U = ( u ? k , . . . , u ? 1 ) U=(u_{-k},...,u_{-1}) U=(u?k?,...,u?1?)表示上下文token向量, n n n表示decoder層數, W e W_e We?表示token的Embedding矩陣, W p W_p Wp?表示位置向量矩陣
h 0 = U W e + W p h_0=UW_e+W_p h0?=UWe?+Wp?
h l = t r a n s f o r m e r _ b l o c k ( h l ? 1 ) h_l=\mathrm{transformer\_block}(h_{l-1}) hl?=transformer_block(hl?1?)
P ( u ) = s o f t m a x ( h n W e T ) P(u)=\mathrm{softmax}(h_nW_e^T) P(u)=softmax(hn?WeT?)
GPT參數量計算,參考Attention機制
使用Transformer的decoder,因為沒有encoder,這里去掉了decoder里面需要encoder輸入的multi-head attention模塊,保留了masked multi-head attention。層數6->12,embedding維度512->768,注意力頭數head_num 8->12,FFN層的隱層維度1024->3072。
這里 N = 4 , d = 768 , V = 40000 N=4,d=768,V=40000 N=4,d=768,V=40000
GPT預訓練模型大小為
12 ? ( ( 4 + 2 ? 4 ) ? 76 8 2 + ( 5 + 4 ) ? 768 ) + 40000 ? 768 = 115737600 = 115 M 12*((4+2*4)*768^2+(5+4)*768)+40000*768=115737600=115\mathrm M 12?((4+2?4)?7682+(5+4)?768)+40000?768=115737600=115M
GPT還有最后的一個線性輸出層,參數量為 d ? V d*V d?V,加上精調線性層的任務參數,總量為
12 ? ( ( 4 + 2 ? 4 ) ? 76 8 2 + ( 5 + 4 ) ? 768 ) + 40000 ? 768 + 768 ? 40000 + 768 ? 40000 = 146457600 = 146 M 12*((4+2*4)*768^2+(5+4)*768)+40000*768 + 768*40000 + 768*40000 =146457600=146\mathrm M 12?((4+2?4)?7682+(5+4)?768)+40000?768+768?40000+768?40000=146457600=146M
第二階段:fine-tuning
精調階段的線性層
P ( y ∣ x 1 , . . . , x m ) = s o f t m a x ( h l W y ) P(y|x^1,...,x^m)=\mathrm{softmax}(h_lW_y) P(y∣x1,...,xm)=softmax(hl?Wy?)
精調階段最大化下面的似然函數
L 2 ( C ) = ∑ ( x , y ) log ? P ( y ∣ x 1 , . . . , x m ) L_2(C)=\sum_{(x,y)} \log P(y|x^1,...,x^m) L2?(C)=(x,y)∑?logP(y∣x1,...,xm)
最終的似然函數
L 3 = L 2 + L 1 L_3 = L_2 + L_1 L3?=L2?+L1?
模型結構
所有任務,都需要插入開始和結束符;
對于文本推斷任務,把前提和假設用分隔占位符concat起來;
對于語義相似評估任務,因為沒有順序,所以講text1和text2連接起來作為一個輸入,同時將text2和text1連接起來作為輸出,經過各個的Transformer后concat起來;
多項選擇任務,把context和各個候選答案分別concat起來作為輸入;
實驗
數據集:BookCorpus,超過7000本書,
預訓練參數配置
精調參數配置
在文本推斷任務的表現
在問答任務的表現
在文本分類任務的表現
Transformer層數的影響(下面左圖),層數越大效果越好;比較Zero-shot的表現,和LSTM比較,Transformer隨更新步數增長效果更好,LSTM就差很多,預訓練的模型容量比較重要。
消融分析
精調階段使用/不使用輔助的LM目標(aux LM);去掉預訓練;相同層數的LSTM(單層2048個unit);
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
提出背景
GPT是從左到右單向的語言模型,ELMo也是單向的(單向的從左到右和單向的從右到左,然后concat到一起),單向的語言模型會限制它在下游的表現。
BERT提出雙向的Transformer模型
方案詳情
示意圖如下
BERT的輸入包括三部分,Token Embedding、Segment Embedding(句子pair中的句子A還是句子B)、Position Embedding
和其他結構比較
BERT是雙向的Self-Attention,既可以看到前面的token,也可以看到后面的token,BERT的目標與GPT不一樣了,GPT是根據前面的詞預測后面的詞,BERT是根據前后的詞預測當前位置的詞,類似于完形填空。
為此BERT引入了掩碼語言任務(Masked LM),隨機mask一個token,然后根據這個token之前及之后的token來預測這個token;mask的token用[MASK]占位符替代,在每個sequence里面隨機mask15%的比例的token。但是[MASK]這個token并不在fine-tuning階段出現,為了緩解預訓練和精調之間這種不一致,預訓練在mask的時候并不總是用[MASK]這個token代替,80%的概率用[MASK]代替,10%的概率隨機選擇一個token代替,10%的概率就用原來的token不做替換。
這里mask策略也是調參調出來的
示意圖如下:
這里最上面是 MLM 的多分類任務,多出的這個線性層矩陣 W ∈ R d i m ? V W \in R^{dim*V} W∈Rdim?V是和輸入的詞匯表 embedding 矩陣共享的,就是多了一個偏置 b ∈ R 1 ? V b \in R^{1* V} b∈R1?V,也就是此處多了 V V V個模型參數。
很多NLP的任務像問答、推斷都是理解兩個句子的關系,語言模型不容易直接識別到時哪種任務,為了使模型理解兩個句子之間的關系,引入了下一個句子預測任務(Next Sentence Prediction , NSP),構造樣本的時候,句子A后面50%的概率是后面接著的句子B(label標記為IsNext),50%的概率從語料庫從語料庫隨機選(label標記為NotNext)
最上面是個二分類任務,有一個線性矩陣 W ∈ R d i m ? 2 W \in R^{dim*2} W∈Rdim?2 來表示。
fine-tuning細節和GPT一致
實驗
實驗配置, B E R T B A S E \mathrm {BERT_{BASE}} BERTBASE? 為了和GPT對比,和GPT的參數配置幾乎完全一樣。
B E R T B A S E \mathrm {BERT_{BASE}} BERTBASE? L=12,H=768,A=12
B E R T L A R G E \mathrm {BERT_{LARGE}} BERTLARGE? L=24,H=1024,A=16
token數量(V)和GPT不一樣,其他一致, N = 4 , d = 768 , V = 32000 N=4,d=768,V=32000 N=4,d=768,V=32000,不算后面fine-tuning階段線性層的參數
B E R T B A S E \mathrm {BERT_{BASE}} BERTBASE?預訓練模型大小為(加上每個位置的 embedding 512768、NSP 二分類任務參數 7682、MLM 多分類任務參數 32000(分類任務權重矩陣和詞表 embedding 矩陣共享,但是有獨立的偏置,參數量32000))
12 ? ( ( 4 + 2 ? 4 ) ? 76 8 2 + ( 5 + 4 ) ? 768 ) + 32000 ? 768 + 512 ? 768 + 768 ? 2 + 32000 = 110020352 = 110 M 12*((4+2*4)*768^2+(5+4)*768)+32000*768 + 512*768+768*2 + 32000=110020352=110\mathrm M 12?((4+2?4)?7682+(5+4)?768)+32000?768+512?768+768?2+32000=110020352=110M
B E R T L A R G E \mathrm {BERT_{LARGE}} BERTLARGE?預訓練模型大小為
24 ? ( ( 4 + 2 ? 4 ) ? 102 4 2 + ( 5 + 4 ) ? 1024 ) + 32000 ? 1024 + 512 ? 1024 + 1024 ? 2 + 32000 = 335537408 = 335 M 24*((4+2*4)*1024^2+(5+4)*1024)+32000*1024 + 512*1024 + 1024*2 + 32000=335537408=335\mathrm M 24?((4+2?4)?10242+(5+4)?1024)+32000?1024+512?1024+1024?2+32000=335537408=335M
實驗效果
RoBERTa: A Robustly Optimized BERT Pretraining Approach
BERT的升級優化版本
提出背景
BERT訓練不充分,還有很大的空間
提升措施:
- 讓模型訓練的更久、使用更大的batch size,使用更多的數據
- 去除下一個句子預測任務NSP
- 在更長的sequence序列上面訓練
- 在訓練數據中動態改變mask方式
方案詳情
增加語料庫
- BOOKCORPUS加上英語WIKIPEDIA,這是BERT用的語料庫(16GB)
- CC-NEWS,這是RoBERTa從CommonCrawl新聞數據集手機的,包含6300萬英語新聞文章(2016年至2019年)(76GB)
- OPENWEBTEXT開源的WebText語料庫,從Reddit上面根據URL抽取的web內容(38GB)
- STORIES包含了過濾的CommonCraw數據子集(31GB)
下游任務評估基準
GLUE:The General Language Understanding Evaluation,包含9個數據集來評估自然語言理解。
SQuAD:The Stanford Question Answering Dataset 提供一個上下文的段落及以問題,任務是通過抽取上下文回答問題。
RACE:The ReAding Comprehension from Examinations 大規模的閱讀理解數據集,包含28000篇文章和100000個問題,來自中國的中學英文考試題目。
改進BERT
配置和 B E R T B A S E \mathrm {BERT_{BASE}} BERTBASE?一樣 (L=12, H=768, A=12, 110M參數量)
BERT模型在數據預處理的時候就mask好了,稱為靜態mask(static masking)數據復制了10份,在40個epoch里面,每份訓練數據會相同mask4次。這里采用動態mask(dynamic masking)訓練數據每次都是動態mask,保證訓練時不會有重復的mask數據。動態masking效果更好,后面的評測均用動態masking。
原始BERT里面有個NSP任務,預測下一個句子的任務,去掉NSP會影響效果,但是有很多質疑的研究,起作用的主要是MLM,并不是NSP,為此做了一些消融實驗來驗證。
SEGMENT-PAIR+NSP:原始的BERT的方式,每個輸入是一個Segment pair對,每個Segment可以包含多個自然句子,多個句子的總長度不超過512個tokens。
SENTENCE-PAIR+NSP:每個輸入是一個自然句子pair對,因為這些句子顯著低于512個tokens,因此增大batch size使得batch內總的token數量與SEGMENT-PAIR+NSP相似,也有NSP loss。
FULL-SENTENCES:每個輸入是從一個或者多個文檔中連續采樣得來的,每個輸入最多512個tokens,輸入可能跨文檔,如果跨文檔,增加一個額外的分割token在里面,同時去除NSP loss。
DOC-SENTENCES:構造方式和FULL-SENTENCES類似,就是句子不跨文檔。那么采樣文檔末尾的句子的時候,token長度可能小于512個,那就動態增加batch size,使得batch內的token和FULL-SENTENCES相似。
結果如下:
SEGMENT-PAIR+NSP vs SENTENCE-PAIR+NSP 說明使用單個句子模型沒法學習到長距離依賴關系。
FULL-SENTENCES vs SEGMENT-PAIR+NSP:說明去除NSP loss會提升下游任務表現
FULL-SENTENCES vs DOC-SENTENCES:限制sequence來自同一個文檔有輕微提升,但是batch size是動態的,為了對比方便,后面都使用FULL-SENTENCES這一組。
更大的batch size
更大的batch size帶來更好的效果
文本編碼方式
Byte-Pair Encoding(BPE)是字符級和單詞級表示的混合,該編碼方案可以處理自然語言語料庫中常見的大量詞匯。BPE不依賴于完整的單詞,而是依賴于子詞(sub-word)單元,這些子詞單元是通過對訓練語料庫進行統計分析而提取的,其詞表大小通常在 1萬到 10萬之間。
原始的BERT使用的是字符級的編碼,詞匯量30K,RoBERTa使用BPE編碼,詞匯量50K,相對 B E R T B A S E \mathrm {BERT_{BASE}} BERTBASE?和 B E R T L A R G E \mathrm {BERT_{LARGE}} BERTLARGE?會多出15M到20M的參數量。