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