前段時(shí)間大火的工具Github Copilot
想必大家都略有耳聞,我們只需要輸入一些注釋說明你需要的函數(shù)功能,AI就會(huì)自動(dòng)幫你編寫完整的函數(shù)代碼,代碼邏輯、規(guī)范甚至比自己寫的都好,可謂是讓人瑟瑟發(fā)抖的結(jié)對(duì)編程好兄弟。
而這個(gè)工具背后的大boss就是參數(shù)量讓人瑟瑟發(fā)抖的GPT-3
語言模型。本文不僅介紹大哥大GPT-3
,還對(duì)他的同胞兄弟GPT-1, GPT-2
也進(jìn)行介紹,講解他們之間的演化過程。強(qiáng)烈推薦李沐老師的b站講解視頻,本文內(nèi)容與之強(qiáng)相關(guān),算是李沐老師講解視頻的一個(gè)筆記。
首先,簡要介紹下,孕育這三兄弟的機(jī)構(gòu)是OpenAI
。
GPT-1:Improving Language Understanding by Generative Pre-Training
GPT-2:Language Models are Unsupervised Multitask Learners
GPT-3:Language Models are Few-Shot Learners
GPT-1 (生于2018年)
在自然語言處理任務(wù)中,存在大量無標(biāo)簽的語料數(shù)據(jù),而有標(biāo)簽的語料數(shù)據(jù)相對(duì)較少,因此基于有監(jiān)督訓(xùn)練的模型性能的提升大大受限于數(shù)據(jù)集。為了解決這個(gè)問題,作者提出先在大量的無標(biāo)簽數(shù)據(jù)上訓(xùn)練一個(gè)語言模型,然后再在下游具體任務(wù)的有標(biāo)簽數(shù)據(jù)集上進(jìn)行fine-tune。
利用無標(biāo)簽數(shù)據(jù)的難點(diǎn)
- 設(shè)計(jì)何種目標(biāo)函數(shù)來學(xué)習(xí)文本表示。已有的各種目標(biāo)函數(shù)和子任務(wù)的相關(guān)度比較高,沒有說哪一種目標(biāo)函數(shù)特別好。
- 如何有效地把語言模型學(xué)到的文本表示遷移到下游子任務(wù)上。因?yàn)镹LP領(lǐng)域的各種任務(wù)差別比較大,沒有一個(gè)統(tǒng)一有效的方式使得一種文本表示能夠很好地遷移到各種子任務(wù)上。
算法關(guān)鍵
-
無監(jiān)督訓(xùn)練的模型采用Transformer的decoder,目標(biāo)函數(shù)采用標(biāo)準(zhǔn)的語言模型的目標(biāo)函數(shù),即通過前文預(yù)測下一個(gè)詞。
這個(gè)目標(biāo)函數(shù)其實(shí)是比BERT模型那種完形填空式的語言模型目標(biāo)函數(shù)要難,因?yàn)?strong>預(yù)測未來要比預(yù)測中間難。這可能也是導(dǎo)致GPT在訓(xùn)練和效果上比BERT差一些的一個(gè)原因。反過來說,如果你的模型真能預(yù)測未來,那么要比BERT這種通過完形填空訓(xùn)練的模型的強(qiáng)大很多,這也是作者一直將GPT模型不斷做大,誕生三兄弟的一個(gè)原因吧。 - 有監(jiān)督fine-tune采用標(biāo)準(zhǔn)的分類目標(biāo)函數(shù)。此外,作者發(fā)現(xiàn)在有監(jiān)督訓(xùn)練時(shí)額外加上語言模型的目標(biāo)函數(shù)更好,能夠提高模型的泛化性和加速模型收斂。
輸入形式
對(duì)于不同的下游任務(wù),將數(shù)據(jù)轉(zhuǎn)換成統(tǒng)一的形式送入預(yù)訓(xùn)練好的語言模型,再接一層線性層進(jìn)行分類等。可以發(fā)現(xiàn),在fine-tune時(shí),僅需要對(duì)預(yù)訓(xùn)練的語言模型做很小的結(jié)構(gòu)改變,即加一層線性層,即可方便地應(yīng)用于下游各種任務(wù)。
GPT-2 (生于2019年)
GPT-2模型依舊使用Transformer模型的decoder,但相比于GPT-1,數(shù)據(jù)和模型參數(shù)變得更大,大約是之前的10倍,主打zero-shot
任務(wù)。
現(xiàn)有基于監(jiān)督學(xué)習(xí)訓(xùn)練的模型的泛化性不是很好,在一個(gè)任務(wù)上訓(xùn)練好的模型也很難遷移到下一個(gè)任務(wù)上。多任務(wù)學(xué)習(xí)(Multitask learning)是指在訓(xùn)練一個(gè)模型時(shí),同時(shí)看多個(gè)任務(wù)的數(shù)據(jù)集,而且可能通過多個(gè)損失函數(shù)來達(dá)到一個(gè)模式在多個(gè)任務(wù)上都能用的效果,但是在NLP領(lǐng)域用的不多。NLP領(lǐng)域主流的做法還是像GPT-1或BERT那樣先在大量無標(biāo)簽數(shù)據(jù)上預(yù)訓(xùn)練語言模型,然后在每個(gè)下游任務(wù)上進(jìn)行有監(jiān)督的fine-tune,但是這樣也有兩個(gè)問題:
- 對(duì)于下游的每個(gè)任務(wù),還是要重新訓(xùn)練模型
- 需要收集有標(biāo)簽的數(shù)據(jù)
這樣導(dǎo)致在拓展到新任務(wù)上時(shí)還是有一定的成本。因此,GPT-2提出利用語言模型做下游任務(wù)時(shí),不需要下游任務(wù)的任何標(biāo)注信息,即zero-shot
設(shè)定,也不用訓(xùn)練模型。因此基本實(shí)現(xiàn)一勞永逸,訓(xùn)練一個(gè)模型,在多個(gè)任務(wù)上都能用。
此時(shí),我們需要考慮一個(gè)問題,如圖1所示,GPT-1在做下游任務(wù)時(shí)會(huì)對(duì)輸入進(jìn)行構(gòu)造,引入了一些模型在預(yù)訓(xùn)練時(shí)沒見過的符號(hào)(預(yù)訓(xùn)練時(shí)見到的是自然文本),比如Start、Delim、Extract
,但因?yàn)橛衒ine-tune的環(huán)節(jié),所以模型會(huì)去認(rèn)識(shí)這些符號(hào)。
然而,現(xiàn)在要做zero-shot,也就是在做下游任務(wù)時(shí),模型不能被調(diào)整了,如果還引入一些模型之前沒見過的符號(hào)的話,模型就會(huì)很困惑。因此,在構(gòu)造下游任務(wù)的輸入時(shí),我們就不能引入模型未見過的符號(hào),而要使得輸入像模型預(yù)訓(xùn)練時(shí)見到的自然文本一樣,比如:
- 機(jī)器翻譯任務(wù):
translate to french, english text, french text
。“translate to french”這三個(gè)詞可以被認(rèn)為是一個(gè)特殊的分隔符,后面叫Prompt。 - 閱讀理解任務(wù):
answer the question, document, question, answer
下圖所示為GPT-2在不同任務(wù)上進(jìn)行預(yù)測時(shí)采用的Prompt:
GPT-3 (生于2020年)
GPT-3結(jié)構(gòu)和GPT-2一樣,但是數(shù)據(jù)約為GPT-2的1000倍,模型參數(shù)約為GPT-2的100倍,暴力出奇跡,使得效果很驚艷。
GPT-3不再追求極致的zero-shot學(xué)習(xí),即不給你任何樣例去學(xué)習(xí),而是利用少量樣本去學(xué)習(xí)。因?yàn)槿祟愐膊皇遣豢慈魏螛永龑W(xué)習(xí)的,而是通過少量樣例就能有效地舉一反三。
由于GPT-3龐大的體量,在下游任務(wù)進(jìn)行fine-tune的成本會(huì)很大。因此GPT-3作用到下游子任務(wù)時(shí),不進(jìn)行任何的梯度更新或fine-tune。
這里
=>
可以看成是一個(gè)Prompt。
GPT-3可以生成人類都很難分辨的新聞文章,瞎扯起來像模像樣,比如:
局限性
- 雖然效果比GPT-2好很多,但是在文本生成上還是比較弱的。假如讓GPT-3生成一個(gè)很長的文本,可能給了幾段之后,就會(huì)重復(fù)起來
- 結(jié)構(gòu)和算法的局限性。GPT-3是語言模型,不能像bert那樣雙向看。
- 均勻地預(yù)測下一個(gè)詞。不能判斷哪個(gè)詞重要,哪個(gè)詞不重要,導(dǎo)致語言模型可能會(huì)花很長時(shí)間去學(xué)習(xí)一些常見的虛詞,不像人類學(xué)習(xí)的劃重點(diǎn)。
- 樣本有效性不夠。基本上把整個(gè)網(wǎng)絡(luò)上的文章下載下來了。
- 做few-shot時(shí),模型真的是根據(jù)你給的樣本從頭學(xué)習(xí)的嗎?這樣碰到訓(xùn)練樣本上沒有出現(xiàn)的任務(wù),也能夠泛化過去;還是根據(jù)這些樣本,從訓(xùn)練記憶里找出相關(guān)的,認(rèn)出了這個(gè)任務(wù),那拼的就是訓(xùn)練數(shù)據(jù)的大小了。
- 不具有可解釋性
Improving Language Understanding by Generative Pre-Training
Language Models are Unsupervised Multitask Learners
Language Models are Few-Shot Learners
https://www.bilibili.com/video/BV1AF411b7xQ