Chapter7-3_BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, ELECTRA, and more
文章目錄
- 1 How to pre-train
- 2 Predict next token
- 3 Mask Input
- 4 seq2seq的pre-train model
- 5 ELECTRA
- 6 Sentence Embedding
本文為李弘毅老師【BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, ELECTRA, and more】的課程筆記,課程視頻youtube地址,點這里👈(需翻墻)。
下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權,必定刪除。
文章索引:
上篇 - 7-2 BERT and its family - Introduction and Fine-tune
下篇 - 7-4 來自獵人暗黑大陸的模型 GPT-3
總目錄
1 How to pre-train
上篇講了如何用pre-trained model去做一些NLP相關的任務,這篇就來講一下如何得到這個pre-trained model,也就是如果pre-train。
最早的一種pre-train的方法就是利用翻譯的任務去train一個encoder和decoder,而這個encoder就是我們想要的pre-trained model。用翻譯的任務來做是因為翻譯的時候需要考慮到上下文的信息,因此每個token對應的輸出也是考慮了上下文的,然后用這些輸出塞進decoder之后可以得到正確的翻譯說明了這些輸出特征包含了每個token的語義。但是,這樣做的話,有一個不好的地方就是,我們沒有那么多已經成對整理好的數(shù)據(jù),這個數(shù)據(jù)的成本將非常大。
因此我們希望有一種不需要標注數(shù)據(jù)的方法去進行pre-train,這種方法就叫做self-supervised learning。沒錯,這個也就是unsupervised learning,但是Yann LeCun呼吁我們改口稱之為self-supervised learning。因為其本質是用輸入的一部分去預測輸入的另一部分,還是有監(jiān)督的。下圖就是有監(jiān)督和自監(jiān)督的一個區(qū)別。
2 Predict next token
那么我們如何把一個句子xxx夠造成x′x'x′和x′′x''x′′呢?最常見的一種做法就是predict next token。我們會輸入w1w_1w1?希望模型預測出w2w_2w2?,然后再輸入w2w_2w2?希望模型預測出w3w_3w3?,以此類推,只要注意在設計模型的時候,不要讓模型看到它不該看到的答案就可以了。把這個輸入wiw_iwi?,輸出hih_ihi?的模型基于LSTM去設計,就有我們的ELMo了。如果是基于self-attention去做,就有GPT,Megatron和Turing NLG。這個模型也就是language model。
聰明的小伙伴也許已經意識到了,我在預測w2w_2w2?的時候,只看到了w1w_1w1?,為什么不能也看一下w3w_3w3?和w4w_4w4?呢?把句子除了w2w_2w2?之外的部分都看一遍,再去預測,才會比較準吧。沒錯,的確是需要這樣做的。ELMO就用了兩個LSTM分別從頭開始看和從尾開始看,比如看了w1w_1w1?到w4w_4w4?去預測w5w_5w5?,然后看了w7w_7w7?到w5w_5w5?去預測w4w_4w4?,最后把這兩個的features去concat得到最終w4w_4w4?對應的feature。
3 Mask Input
ELMO的做法有一個問題就是兩個LSTM是互相獨立的,它們之間沒有信息的交流。BERT則完美的解決了這個問題,BERT只要設計好一個MASK,然后蓋住模型要預測的那個token就可以了,這就是self-attention相比于LSTM的優(yōu)勢啊!順便一提,BERT的這種訓練方法和CBOW是非常像的,可以說是超級版的CBOW。
不過,只蓋住一個token就足夠了嗎?只蓋住一個token,模型可能無法學到一些long-term的東西,只要依賴于附近的幾個詞猜猜就行了。所以,有人就提出了蓋一個詞去做,這個叫做Whole Word Masking。也有人提出先對句子做entity recoganition然后蓋entity或者phrase,這個就是ERNIE。
還有一種叫做SpanBert的方法,就是隨機去蓋一排token,蓋住的token的length滿足一個分布,這個分布是蓋的越長概率越小的一個分布。SpanBert的訓練方法其實也和Bert有所不同,它用了一種叫做Span Boundary Objective的方法,就是利用被蓋住部分兩端最接近的兩個embedding,然后再輸入一個要預測被蓋住的第幾個token的數(shù)字,去預測最終的結果。這聽上去有些想不通,為什么要這么搞一下,原來的方法不香嗎?
再講一個叫做XLNet的模型,這個模型比較難懂,這里只是說一下它的做法,說實話搞不懂為什么要這么做,有時間去看看paper再回來說下感悟。它的做法就是,它在預測被蓋住的token的時候,是隨機取其他已有的embedding的信息去預測的,當然也需要一個position encoding告訴它要去預測哪個token。就是這樣,奇怪吧~
4 seq2seq的pre-train model
BERT在訓練的時候都是看整個句子去預測的,因此不太適用于generation的任務,就是給一段句子,去預測后面的部分。Language model在訓練的時候就是這么訓練的因此沒有太多問題。但是Bert都是給個mask然后去預測mask的內容的。硬要上的話,就是在句子的后面強加一個mask,然后讓BERT去預測預測看。這種從左往右預測的叫做autoregressive model,但是今天,我們不一定要讓模型從左往右去生成文本,如果是non-autoregressive model的話,說不定BERT就適用了。
seq2seq的pre-train model是如下圖這樣的,輸入一串tokens,經過一個encoder和decoder之后,希望得到同樣的一串tokens。當然,直接這么做的話未免太簡單,模型學不到什么東西,所以,一般會對input的sequence做一些破壞。
Bart嘗試了以下幾種破壞方式,第一種是隨機給一個token加mask;第二種是刪除某些輸入;第三種是對tokens做permutation;第四種是對tokens做rotation;第五中是在沒有token的地方插入mask,然后蓋住某些token,蓋住的部分可能有兩個token。其中效果最好的是最后的一種。第三和第四種效果最差。這樣的結果其實也可以預期到,給模型看大量的打亂順序的句子,模型就不知道什么是正常的句子了。
還有一種叫做UniLM的,是既可以像BERT那樣訓練(雙向language model),又可以像GPT那樣訓練(left-to-right language model),還可以像BART那樣訓練(Seq-to-seq language model)。這里只提一下這個模型,不細講了。
5 ELECTRA
還有一個叫做ELECTRA的模型,用一個更簡單的任務去預訓練模型。它把輸入中的某個token用另一個token替換調之后,輸入模型,讓模型去預測各個token有沒有被替換過。這樣一方面使得任務更為簡單,另一方面也可以監(jiān)督到每一個token的對應輸出。
當然,如果隨意替換的話,很容易就會被模型找出來了,學不到什么東西。所以,這篇文章的作者用了一個額外的small BERT來生成這個要被替換掉的位置的token。這個BERT不能太準,也不能太不準。太準的話就直接預測出原來的token了,太差的話和隨機選差別不大。這種做法挺像GAN的,但它不是GAN,上下兩個模型是各train各的,BERT沒有被設定為要騙過上面的model。
ELECTRA的效果還挺驚人的,它可以用更少的FLOPS得到和大模型非常接近的結果。
6 Sentence Embedding
有些時候,我們希望得到的并不是每個token的embedding,而是一個可以表示整個句子的sentence embedding。這個時候,又該如何訓練呢?
訓練sentence embedding的模型有兩種方法,一種叫做skip Thought,就是給定一個句子,讓模型去預測它的下一句話是什么,這樣的生成任務很難;另一種叫做Quick Thought,在encoder分別輸入句子1和句子2,encoder會分別輸出feature1和feature2,如果這兩個句子是相鄰的,那么我們希望feature1和feature2很相似。
Bert的做法是NSP(Next sentence prediction),就是輸入兩個句子,在兩個句子之間加一個"[SEP]“分隔符,然后用”[CLS]"這個token的輸出來預測這兩個句子是相鄰的,還是不是相鄰的。
NSP的這種做法的實際效果并不好,于是就有人提出了SOP(Sentence order prediction)。就是讓兩個句子來自于同一篇文章,如果這兩個相鄰的句子反了,那么它也是輸出的No,只有在既相鄰,順序又對的情況下輸出Yes。還有人提出了structBERT,就是結合了NSP和SOP。
最后來提一下T5(Transfer Text-to-Text Transformer),它是谷歌出的,用到了各式各樣的預訓練方法,真是有錢。
總結
以上是生活随笔為你收集整理的Chapter7-3_BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, ELECTRA, and more的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1802. 有界数组中
- 下一篇: Hive是如何让MapReduce实现S