語言模型結構分類
- Encoder-Decoder(Transformer): Encoder 部分是 Masked Multi-Head Self-Attention,Decoder 部分是 Casual Multi-Head Cross-Attention 和 Casual Multi-Head Self-Attention 兼具。比如T5,BART,MASS
- 因果語言模型(Causal Language Model, CLM): 即Transformer的Decoder,比如GPT。也叫自回歸語言模型(Auto-Regressive Language Models)
- 掩蔽語言模型(Masked Language Model, MLM): 即Transformer的Encoder,相比自回歸模型,自編碼模型的學習過程,能看到待預測詞的前后內容,所以對文本的理解是更深入的,在同等成本的情況下理論上自編碼模型對文本的分類、回歸方面的 NLU 問題會有更好性能表現。典型的自編碼模型有 BERT、ERNIE、ALBERT、RoBERTa、DistilBERT、ConvBERT、XLM、XLM-RoBERTa、FlauBERT、ELECTRA、Funnel Transformer。
- 前綴語言模型(Prefix language model):如UniLM。與自回歸語言模型相比,前綴語言模型在抽取輸入文本特征時用了 Fully-Visible Mask(Encoder 用的掩碼,能看到「過去」和「未來」)而不是 Future Mask(Decoder 用的掩碼,只能看到「過去」),而生成本文部分則與自回歸語言模型一樣,只看到左側
Pre-trained Language Model(PLM)模型
- BERT?Tokenizer
- Flan-T5:instruction-finetuned
- Falcon 7B:
- RoBERTa
- DeBERTa
- AlBERT
- ELECTRA
1. BERT(2018)
Bidirectional Encoder Representations from Transformers
BERT 具有兩種輸出,一個是pooler output,對應的[CLS]的輸出,以及sequence output,對應的是序列中的所有字的最后一層hidden輸出。所以BERT主要可以處理兩種,一種任務是分類/回歸任務(使用的是pooler output),一種是序列任務(sequence output)
?輸入層
為了使得BERT模型適應下游的任務(比如說分類任務,以及句子關系QA的任務),輸入將被改造成[CLS]+句子A(+[SEP]+句子B+[SEP]) 其中
- [CLS]:代表的是分類任務的特殊token,它的輸出就是模型的pooler output
- [SEP]:分隔符
- 句子A以及句子B是模型的輸入文本,其中句子B可以為空,則輸入變為[CLS]+句子A
BERT預訓練和微調
1. Mask Language Model(MLM):類似于完形填空(Cloze task)
具體的做法: 我們會隨機mask輸入的幾個詞,然后預測這個詞。但是這樣子做的壞處是因為fine-tuning階段中并沒有[MASK] token,所以導致了pre-training 和 ?ne-tuning的不匹配的情況。所以為了減輕這個問題,文章中采用的做法是:對于要MASK 15%的tokens,
- (1) 80%的情況是替換成[MASK]
- (2) 10%的情況是替換為隨機的token
- (3) 10%的情況是保持不變
for index in cand_indexes:if len(masked_lms) >= num_to_predict: # 15% of total tokensbreak...masked_token = None# 80% of the time, replace with [MASK]if rng.random() < 0.8:masked_token = "[MASK]"else:# 10% of the time, keep originalif rng.random() < 0.5:masked_token = tokens[index]# 10% of the time, replace with random wordelse:masked_token = vocab_words[rng.randint(0, len(vocab_words) - 1)]output_tokens[index] = masked_token
注意,這邊的token的level是采用Byte Pair Encoding (BPE)生成word piece級別的,什么是word piece呢,就是一個subword的編碼方式,經過WordpieceTokenizer 之后,將詞變為了word piece, 例如:
# input = "unaffable"
# output = ["un", "##aff", "##able"]
這樣子的好處是,可以有效的解決OOV(Out-Of-Vocabulary)的問題,但是mask wordpiece的做法也被后來(ERNIE以及SpanBERT等)證明是不合理的,沒有將字的知識考慮進去,會降低精度,于是google在此版的基礎上,進行Whole Word Masking(WWM)的模型。需要注意的是,中文的每個字都是一個word piece,所以WWM的方法在中文中,就是MASK一個詞組
2.?Next sentence order(NSP)?預測兩個句子是不是下一句的關系
具體來說:50%的概率,句子A和句子B是來自同一個文檔的上下句,標記為is_random_next=False
, 50%的概率,句子A和句子B不是同一個文檔的上下句,具體的做法就是,采用從其他的文檔(document)中,加入新的連續句子(segments)作為句子B。具體參考create_instances_from_document
函數
首先我們會有一個all_documents存儲所有的documents,每個documents是由句子segemnts組成的,每個segment是由單個token組成的。我們首先初始化一個chunk數組,每次都往chunk中添加同一個document中的一個句子,當chunk的長度大于target的長度(此處target的長度一般是max_seq_length
,但是為了匹配下游任務,target的長度可以設置一定比例short_seq_prob
的長度少于max_seq_length
)的時候,隨機選擇一個某個句子作為分割點,前面的作為句子A,后面的作為句子B。 chunk = [Sentence1, Sentence2,..., SentenceN], 我們隨機選擇選擇一個句子作為句子A的結尾,例如2作為句子結尾,則句子A為=[Sentence1, Sentence2]。我們有50%的幾率選擇剩下的句子[Sentence3,...SentenceN]作為句子B,或者50%的幾率時的句子B是從其他文檔中的另外多個句子。
這時候可能會導致我們的訓練樣本的總長度len(input_ids)
大于或者小于我們的需要的訓練樣本長度max_seq_length
。
- 如果
len(input_ids) > max_seq_length
, 具體的做法是分別刪除比較長的一個句子中的頭(50%)或尾(50%)的token - 如果
len(input_ids) < max_seq_length
, 采用的做法是補0。
根據我們的兩個任務,我們預訓練模型的輸入主要由以下7個特征組成。
input_ids
: 輸入的token對應的idinput_mask
: 輸入的mask,1代表是正常輸入,0代表的是padding的輸入segment_ids
: 輸入的0:代表句子A或者padding句子,1代表句子Bmasked_lm_positions
:我們mask的token的位置masked_lm_ids
:我們mask的token的對應idmasked_lm_weights
:我們mask的token的權重,1代表是真實mask的,0代表的是padding的masknext_sentence_labels
:句子A和B是否是上下句
features = collections.OrderedDict()features["input_ids"] = create_int_feature(input_ids)features["input_mask"] = create_int_feature(input_mask)features["segment_ids"] = create_int_feature(segment_ids)features["masked_lm_positions"] = create_int_feature(masked_lm_positions)features["masked_lm_ids"] = create_int_feature(masked_lm_ids)features["masked_lm_weights"] = create_float_feature(masked_lm_weights)features["next_sentence_labels"] = create_int_feature([next_sentence_label])
3. fine-tuning
在Fine-Tuning階段的時候,我們可以簡單的plugin任務特定的輸入和輸出,作為訓練。 例如:
- 2句子 pairs: 相似度任務,
- 假設-前提 pairs: 推理任務,
- 問題-文章 pairs : QA任務
- text???pair: 文本分類 or 序列標注.
在這個任務中,就不需要MLM任務以及NSP任務所需要的輸入了,所以就只有固定輸入features(input_ids
,?input_mask
,?segment_ids
)以及任務特定features
例如分類任務的輸入特征:
input_ids
: 輸入的token對應的idinput_mask
: 輸入的mask,1代表是正常輸入,0代表的是padding的輸入segment_ids
: 輸入的0:代表句子A或者padding句子,1代表句子Blabel_ids
:輸入的樣本的label
features["input_ids"] = create_int_feature(feature.input_ids)
features["input_mask"] = create_int_feature(feature.input_mask)
features["segment_ids"] = create_int_feature(feature.segment_ids)
features["label_ids"] = create_int_feature([feature.label_id])
2. XLNet
BERT的缺點很明顯。從建模本身來看,隨機選取15%的字符mask忽視了被mask字符之間可能存在語義關聯的現象,從而丟失了部分上下文信息。同時,微調階段沒有mask標記,導致預訓練與微調的不一致

XLNet是一種廣義的自回歸預訓練方法。XLNet本質上是用自回歸語言模型來同時編碼雙向語義信息的思路,可以克服BERT存在的依賴缺失和訓練/微調不一致的問題。同時為了彌補自回歸模型訓練時無法同時看到上下文的缺陷,XLNet曲線救國地提出了PLM排列語言模型的訓練方式。
Permutation Language Model?排列語言模型
為了在不改變AR模型基本結構的條件下引入下文信息,XLNet使用了對輸入序列“排列組合”的方法,把下文信息排到前面,賦予了單向模型感知下文的能力。例如,現有序列?[1→2→3→4]?,只需改變其順序,變換出[2→4→3→1]?、[1→4→2→3]?、[4→3→1→2]?等序列,即可讓3看到4,2看到3和4,1看到2、3、4。下圖為不同排列方式下,位置"3"所能關注的位置示意圖(只能關注序列中在它之前的部分):
注意,排列組合并不是真的使用原始序列生成新的排列組合序列,并抽樣產生新的增強數據集來完成的,因為這種做法仍然會造成Pre-train和Fine-tune的語料分布不一致。XLNet的做法是在計算attention時mask掉對應位置,不同的mask對應不同的序列。
Two-Stream Self-Attention?雙流注意力
為了實現 Permutation 加上 AR 預測過程,首先我們會發現,打亂順序后位置信息非常重要,同時對每個位置來說,需要預測的是內容信息(對應位置的詞),于是輸入就不能包含內容信息,不然模型學不到東西,只需要直接從輸入復制到輸出就好了。
于是這里就造成了位置信息與內容信息的割裂,因此在 BERT 這樣的位置信息加內容信息輸入 Self-Attention (自注意力) 的流(Stream)之外,作者還增加了另一個只有位置信息作為 Self-Attention 中 query 輸入的流。文中將前者稱為?Content Stream,而后者稱為?Query Stream。Query流中當前token只能關注到前面的token和自身的位置信息,Content流中當前token可以關注到自身。
這樣就能利用 Query Stream 在對需要預測位置進行預測的同時,又不會泄露當前位置的內容信息。具體操作就是用兩組隱狀態(hidden states)?g 和???。其中?g?只有位置信息,作為 Self-Attention 里的 Q。???包含內容信息,則作為 K 和 V。具體表示如下圖所示

假如,模型只有一層的話,其實這樣只有 Query Stream 就已經夠了。但如果將層數加上去的話,為了取得更高層的 h,于是就需要 Content Stream 了。h 同時作為 Q K V。所有組合起來:?
上圖中我們需要理解兩點:
- 第一點,最下面一層藍色的 Content Stream 的輸入是 e(xi)?,這個很好懂就是 x 對應的詞向量 (Embedding),不同詞對應不同向量,但看旁邊綠色的 Query Stream,就會覺得很奇怪,為什么都是一樣的?w??這個和Relative Positional Encoding 有關。
- 第二點,Query stream attention圖中為了便于說明,只將當前位置之外的 h 作為 K 和 V,但實際上實現中應該是所有時序上的 h 都作為 K 和 V,最后再交給上圖中的 Query stream 的 Attention Mask 來完成位置的遮蓋。
Partial Prediction
XLNet還使用了部分預測(Partial Prediction)的方法。因為LM是從第一個Token預測到最后一個Token,在預測的起始階段,上文信息很少而不足以支持Token的預測,這樣可能會對分布產生誤導,從而使得模型收斂變慢。為此,XLNet只預測后面一部分的Token,而把前面的所有Token都當作上下文。具體來說,對長度為?T 的句子,我們選取一個超參數?K?,使得后面?1/K?的Token用來預測,前面的?1?1/K?的Token用作上下文。注意,?K?越大,上下文越多,模型預測得就越精確。
例如[1→2→3→4]只預測3和4,把1和2當作上下文信息。
3. RoBERTa
A Robustly Optimized BERT Pretraining Approach
此方法屬于BERT的強化版本,也是BERT模型更為精細的調優版本。在模型規模、算力和數據上,與BERT相比主要有以下幾點改進:
- 更大的模型參數量(論文提供的訓練時間來看,模型使用 1024 塊 V100 GPU 訓練了 1 天的時間)
- 更大bacth size。RoBERTa 在訓練過程中使用了更大的bacth size。嘗試過從 256 到 8000 不等的bacth size。
- 更多的訓練數據(包括:CC-NEWS 等在內的 160GB 純文本。而最初的BERT使用16GB BookCorpus數據集和英語維基百科進行訓練)
另外,RoBERTa在訓練方法上有以下改進:
- 去掉下一句預測(NSP)任務
- 動態掩碼。BERT 依賴隨機掩碼和預測 token。原版的 BERT 實現在數據預處理期間執行一次掩碼,得到一個靜態掩碼。 而 RoBERTa 使用了動態掩碼:每次向模型輸入一個序列時都會生成新的掩碼模式。這樣,在大量數據不斷輸入的過程中,模型會逐漸適應不同的掩碼策略,學習不同的語言表征。
- 文本編碼。Byte-Pair Encoding(BPE)是字符級和詞級別表征的混合,支持處理自然語言語料庫中的眾多常見詞匯。原版的 BERT 實現使用字符級別的 BPE 詞匯,大小為 30K,是在利用啟發式分詞規則對輸入進行預處理之后學得的。Facebook 研究者沒有采用這種方式,而是考慮用更大的 byte 級別 BPE 詞匯表來訓練 BERT,這一詞匯表包含 50K 的 subword 單元,且沒有對輸入作任何額外的預處理或分詞。
Static vs. Dynamic Masking?動態掩碼與靜態掩碼
○ BERT依賴于隨機mask和預測標記。原始的BERT實現在數據預處理期間執行一次mask,從而產生一個靜態mask。為了避免對每個epoch中的每個訓練實例使用相同的mask,訓練數據被復制了10次,以便在40個epoch中,每個序列以10種不同的方式被mask訓練。因此,在訓練過程中,每個訓練序列都被用同一個mask觀看四次。
我們將這種策略與動態mask進行比較,在動態mask中,我們每次向模型提供一個序列時都會生成mask模式。當進行更多步驟的預訓練或使用更大的數據集時,這一點變得至關重要。
○ 動態mask:對每個序列進行mask的操作是在喂給模型該序列時執行的。這在預訓練更多步驟或更大數據集時,至關重要。
對NSP訓練策略的探索
為了探索NSP訓練策略對模型結果的影響,將一下4種訓練方式及進行對比:
- SEGMENT-PAIR + NSP:這是原始 BERT 的做法。輸入包含兩部分,每個部分是來自同一文檔或者不同文檔的 segment (segment 是連續的多個句子),這兩個segment 的token總數少于 512 。預訓練包含 MLM 任務和 NSP 任務。
- SENTENCE-PAIR + NSP:輸入也是包含兩部分,每個部分是來自同一個文檔或者不同文檔的單個句子,這兩個句子的token 總數少于 512。由于這些輸入明顯少于512 個tokens,因此增加batch size的大小,以使 tokens 總數保持與SEGMENT-PAIR + NSP 相似。預訓練包含 MLM 任務和 NSP 任務。
- FULL-SENTENCES:輸入只有一部分(而不是兩部分),來自同一個文檔或者不同文檔的連續多個句子,token 總數不超過 512 。輸入可能跨越文檔邊界,如果跨文檔,則在上一個文檔末尾添加文檔邊界token 。預訓練不包含 NSP 任務。
- DOC-SENTENCES:輸入只有一部分(而不是兩部分),輸入的構造類似于FULL-SENTENCES,只是不需要跨越文檔邊界,其輸入來自同一個文檔的連續句子,token 總數不超過 512 。在文檔末尾附近采樣的輸入可以短于 512個tokens, 因此在這些情況下動態增加batch size大小以達到與 FULL-SENTENCES 相同的tokens總數。預訓練不包含 NSP 任務。
- (1)作者發現使用單個句子會損害下游任務的性能,作者推測這是因為該模型無法學習遠程依賴關系。
- (2)去掉NSP任務會有略微的提升。
- (3)DOC-SENTENCES比FULL-SENTENCES表現好。
文本編碼 - Text Encoding
字節對編碼(Byte-Pair Encoding, BPE) 是字符級和單詞級表示的混合,該編碼方案可以處理自然語言語料庫中常見的大量詞匯。BPE不依賴于完整的單詞,而是依賴于子詞(sub-word)單元,這些子詞單元是通過對訓練語料庫進行統計分析而提取的,其詞表大小通常在 1萬到 10萬之間。當對海量多樣語料建模時,unicode characters占據了該詞表的大部分。Radford et al.(2019)的工作中介紹了一個簡單但高效的BPE, 該BPE使用字節對而非unicode characters作為子詞單元。
總結下兩種BPE實現方式:
- 基于 char-level :原始 BERT 的方式,它通過對輸入文本進行啟發式的詞干化之后處理得到。
- 基于 bytes-level:與 char-level 的區別在于bytes-level 使用 bytes 而不是 unicode 字符作為 sub-word 的基本單位,因此可以編碼任何輸入文本而不會引入 UNKOWN 標記。
當采用 bytes-level 的 BPE 之后,詞表大小從3萬(原始 BERT 的 char-level )增加到5萬。這分別為 BERT-base和 BERT-large增加了1500萬和2000萬額外的參數。之前有研究表明,這樣的做法在有些下游任務上會導致輕微的性能下降。但是作者相信:這種統一編碼的優勢會超過性能的輕微下降。且作者在未來工作中將進一步對比不同的encoding方案。
- 字節對編碼(BPE)是字符級和單詞級表示形式的混合體,可以處理自然語言語料庫中常見的大詞匯。
- Radford在GPT2里提出了一種更巧妙的BPE實現版本byte-level text encoding,該方法使用bytes作為基礎的子詞單元,這樣便把詞匯表的大小控制到了5w。它可以在不需要引入任何未知字符前提下對任意文本進行編碼。
- BERT原始版本使用字符級(character-level)的BPE詞匯表,大小是3w,是用啟發式分詞規則對輸入進行預處理學習得到的。
- 之前的一些實驗結果表明,這兩種文本編碼的實驗性能區別不大,可能Radford BPE Encoding在某些任務上的終端性能略微差點,但是RoBerta作者堅信通用的編碼模式比性能上的輕微損失更重要,所以在實驗中采用了byte-level text encoding。
4. DeBERTa(2021)
Decoding-enhanced BERT with Disentangled Attention
- 解耦注意力(disentangled attention)機制:將內容和位置的注意力分開來,由4部分組成,內容到內容(C2C),內容到位置(C2P),位置到內容(P2C)和位置到位置(P2P);
- 增強型掩碼解碼器(EMD):在所有Transformer層之后,各種最后輸出頭之前,將絕對位置合并。BERT模型在輸入層中合并了絕對位置。;
- 一種用于微調的虛擬對抗訓練方法(Scale-invariant-Fine-Tuning,規模不變微調SiFT):SiFT首先將單詞嵌入向量歸一化為隨機向量,然后將擾動應用于歸一化的嵌入向量。 歸一化大大改善了微調模型的性能。
解耦注意力(disentangled attention)
對于序列中位置i處的token,我們使用兩個向量,?{H_i}?和?{P_i|j}?表示它,它們分別表示其內容和與位置j處的token的相對位置。 token i和j之間的交叉注意力得分的計算可以分解為四個部分:
?也就是說,一個單詞對的注意力權重可以使用其內容和位置的解耦的矩陣計算為四個注意力(內容到內容,內容到位置,位置到內容和位置到位置)的得分的總和。
這和把兩個向量級聯,然后相乘的區別在哪里?
舉例子,假設都是2維行向量:
Hi = [hi1, hi2], Pi|j = [pi1, pi2];
Hj = [hj1, hj2], Pj|i = [pj1, pj2];
那么按照上面的計算公式,我們得到的是:
hi1 * hj1 + hi2 * hj2 + (content to content)
hi1 * pj1 + hi2 * pj2 + (我是新的; content to position)
pi1 * hj1 + pi2 * hj2 + (我也是!position to content)
pi1 * pj1 + pi2 * pj2 (position to position)
而如果級聯之后呢,得到的是:
[hi1, hi2, pi1, pi2] * [hj1, hj2, pj1, pj2]
= hi1 * hj1 +
hi2 * hj2 +
pi1 * pj1 +
pi2 * pj2
可以看到多出來了內容向量和位置向量的“交互”
SiFT規模不變微調
Scale-invariant-Fine-Tuning 不變微調(SiFT) 是Miyato等人(Jiang et al2020)中描述的算法的一種變體,用于微調。
虛擬對抗訓練是一種改進模型泛化的正則化方法。 它通過對抗性樣本提高模型的魯棒性,對抗性樣本是通過對輸入進行細微擾動而創建的。 對模型進行正則化,以便在給出特定于任務的樣本時,該模型產生的輸出分布與該樣本的對抗性擾動所產生的輸出分布相同。
對于NLP任務,擾動將應用于單詞嵌入,而不是原始單詞序列。 但是,嵌入向量的value范圍(范數)在不同的單詞和模型之間有所不同。 對于具有數十億個參數的較大模型,方差會變大,從而導致對抗訓練有些不穩定。
受層歸一化的啟發(Ba et al.,2016),我們提出了SiFT算法,該算法通過應用擾動的歸一化的詞嵌入來提高訓練穩定性。 具體來說,在我們的實驗中將DeBERTa微調到下游NLP任務時,SiFT首先將單詞嵌入向量(word embedding vectors)歸一化為隨機向量,然后將隨機擾動應用于歸一化的嵌入向量。?我們發現,歸一化大大改善了微調模型的性能。 對于較大的DeBERTa模型,此改進更為突出。 我們將SiFT的全面研究留給未來的工作。
5. ALBERT(2020)
A Lite BERT for Self-supervised Learning of Language Representations
ALBERT 結合了兩種技術同時解決了內存和訓練時長的問題:
- 分解 Embedding 的參數
- 跨層參數共享
還有個增益是可以充當正則化的形式,從而穩定訓練并有助于泛化。對 Bert 模型進行了三個方面調整:
- 分解 Embedding 參數:WordPiece Embedding 學習的是?context-independent?表示;hidden-layer Embedding 學習的是?context-dependent?表示。前者 Size 取小點就可以縮小參數規模,因此本文將 Embedding 的參數分解為兩個較小的矩陣。即首先將 One-hot 投影到尺寸為 E(128) 的較低維嵌入空間中,然后再將其投影到隱藏空間中。參數規模從 O(V × H) 減小到 O(V × E + E × H)。
- 跨層共享:共享了層間的所有參數。這里作者對比了 Bert 和 ALBERT 層輸入和輸出的相似度,發現 ALBERT 的結果更加平滑,說明權重共享對穩定網絡參數有影響。另外相似度的結果是振蕩的,不是像 DQEs(見《相關工作》)所說的達到了平衡點(對于該平衡點,特定層的輸入和輸出嵌入保持不變)。
- 句子連貫性損失函數:Bert 的 NSP(Next Sentence Prediction) 被發現不可靠,本文作者猜測任務難度相比 MLM 來說太小,其實它可以看作一個任務做了主題預測和連貫性預測,但主題預測很容易,而且和 MLM 有重疊。因此本文提出了 SOP(Sentence-order Prediction),聚焦在句子連貫的建模上,具體做法是:Positive 和 Bert 一樣,來自同一個文檔的兩個連續片段;Negative 用的還是這兩個片段,只不過交換了一下順序。事實證明 NSP 根本無法解決 SOP 任務(即,它最終學習了更容易的主題預測信號,并在 SOP 任務上以隨機基線水平執行),而 SOP 可以將 NSP 任務解決為合理的程度。
6. T5
Transfer Text-to-Text Transformer
T5 模型其實就是個 Transformer 的 Encoder-Decoder 模型。
對預訓練目標的大范圍探索實驗
總共從四方面來進行比較。
第一個方面,高層次方法(自監督的預訓練方法)對比,總共三種方式。
- 語言模型式,就是 GPT-2 那種方式,從左到右預測;
- BERT-style 式,就是像 BERT 一樣將一部分給破壞掉,然后還原出來;
- Deshuffling (順序還原)式,就是將文本打亂,然后還原出來。
其中發現 Bert-style 最好,進入下一輪。
第二方面,對文本一部分進行破壞時的策略,也分三種方法。
- Mask 法,如現在大多模型的做法,將被破壞 token 換成特殊符如 [M];
- replace span(小段替換)法,可以把它當作是把上面 Mask 法中相鄰 [M] 都合成了一個特殊符,每一小段替換一個特殊符,提高計算效率;
- Drop 法,沒有替換操作,直接隨機丟棄一些字符。
此輪獲勝的是?Replace Span 法,類似做法如 SpanBERT 也證明了有效性。
第三方面,到底該對文本百分之多少進行破壞呢,挑了 4 個值,10%,15%,25%,50%,最后發現 BERT 的?15%?就很 ok了。這時不得不感嘆 BERT 作者 Devlin 這個技術老司機直覺的厲害。
接著進入更細節,第四方面,因為 Replace Span 需要決定對大概多長的小段進行破壞,于是對不同長度進行探索,2,3,5,10 這四個值,最后發現?3?結果最好。
終于獲得了完整的 T5 模型,還有它的訓練方法。
- Transformer Encoder-Decoder 模型;
- BERT-style 式的破壞方法;
- Replace Span 的破壞策略;
- 15 %的破壞比;
- 3 的破壞時小段長度。
7. Flan-T5
Scaling Instruction-Finetuned Language Models:One Model for ALL Tasks
這里的Flan指的是(Instruction finetuning),即"基于指令的微調";T5是2019年Google發布的一個語言模型了。注意這里的語言模型可以進行任意的替換(需要有Decoder部分,所以「不包括BERT這類純Encoder語言模型」),論文的核心貢獻是提出一套多任務的微調方案(Flan),來極大提升語言模型的泛化性。
微調任務
(1) 「任務收集」:工作的第一步是收集一系列監督的數據,這里一個任務可以被定義成<數據集,任務類型的形式>,比如“基于SQuAD數據集的問題生成任務”。需要注意的是這里有9個任務是需要進行推理的任務,即Chain-of-thought (CoT)任務。
(2) 「形式改寫」:因為需要用單個語言模型來完成超過1800+種不同的任務,所以需要將任務都轉換成相同的“輸入格式”喂給模型訓練,同時這些任務的輸出也需要是統一的“輸出格式”。輸入輸出格式如圖所示,根據 “是否需要進行推理 (CoT)” 以及 “是否需要提供示例(Few-shot)” 可將輸入輸出劃分成四種類型:
?(3) 「訓練過程」:采用恒定的學習率以及Adafactor優化器進行訓練;同時會將多個訓練樣本“打包”成一個訓練樣本,這些訓練樣本直接會通過一個特殊的“結束token”進行分割。訓練時候在每個指定的步數會在“保留任務”上進行模型評估,保存最佳的checkpoint。
?
評測數據集
- SQuAD(Standford Question Answering Dataset) :提供了一段上下文和一個問題。任務是回答這個問題通過從上下文中提取相關span
- RACE (ReAding?Comprehension from?Examinations):大規模的閱讀理解數據集。該數據集收集自中國為中學生設計的英語考試。在比賽中,每篇文章都有多個問題。對于每個問題的任務是從四個選項中選擇一個正確答案
- GLUE?(General?Language?Understanding?Evaluation):評估自然語言理解系統的9個數據集的集合。6項任務分為單句分類任務和句子對分類任務
References
文本生成系列之前綴語言模型 - 知乎
人工智能 LLM 革命破曉:一文讀懂當下超大語言模型發展現狀
BERT 詳解 - 知乎
XLNet原理淺析 - 知乎
RoBERTa - 論文解讀 - 簡書
DEBERTA:解耦注意力的解碼增強型BERT - 知乎
[細讀經典]DeBERTa-使用解綁注意力的解碼增強BERT - 知乎