前言
最近一周多的時(shí)間,只要不是生活在火星,喜歡技術(shù)的同學(xué)一定都被OpenAI的ChatGPT給刷屏了。ChatGPT與以往的公開(kāi)提供服務(wù)的對(duì)話機(jī)器人相比,性能有了顯著的提高。它可以相對(duì)可靠地提供一些日常對(duì)話、知識(shí)獲取的功能,也可以它根據(jù)人類(lèi)提供的需求幫忙寫(xiě)文檔、寫(xiě)代碼,甚至可以修改文本中的各類(lèi)錯(cuò)誤或者代碼中的Bug。我相信很多非AI圈的同學(xué)肯定會(huì)有一種“為什么AI突然變得這么強(qiáng)?“的感受。這篇文章的目的也是為了回答這個(gè)問(wèn)題。在開(kāi)始之前,我覺(jué)得有必要先表達(dá)一下我自己的看法:NLP技術(shù)發(fā)生跨越式發(fā)展的標(biāo)志并不是ChatGPT本身,而應(yīng)該是2017年-2018年間相繼被提出的Transforme1r[1]和GPT[2]。
ChatGPT是Transformer和GPT等相關(guān)技術(shù)發(fā)展的集大成者??傮w來(lái)說(shuō),ChatGPT的性能卓越的主要原因可以概括為三點(diǎn):
使用的機(jī)器學(xué)習(xí)模型表達(dá)能力強(qiáng)。
訓(xùn)練所使用的數(shù)據(jù)量巨大。
訓(xùn)練方法的先進(jìn)性。我們接下來(lái)將會(huì)針對(duì)這三點(diǎn)進(jìn)行探討。
基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
視頻教程:https://doc.iocoder.cn/video/
機(jī)器學(xué)習(xí)模型
在步入正題之前,我們可以先梳理一下NLP發(fā)展的歷史。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
視頻教程:https://doc.iocoder.cn/video/
基于文法的模型
這個(gè)階段,大家處理自然語(yǔ)言的主要思路就是利用語(yǔ)言學(xué)家的智慧嘗試總結(jié)出一套自然語(yǔ)言文法,并編寫(xiě)出基于規(guī)則的處理算法進(jìn)行自然語(yǔ)言處理。這個(gè)方法是不是乍聽(tīng)起來(lái)還行?其實(shí)我們熟悉的編譯器也是通過(guò)這種方法將高級(jí)語(yǔ)言編譯成機(jī)器語(yǔ)言的??上У氖牵匀徽Z(yǔ)言是極其復(fù)雜的,基本上不太可能編寫(xiě)出一個(gè)完備的語(yǔ)法來(lái)處理所有的情況,所以這套方法一般只能處理自然語(yǔ)言一個(gè)子集,距離通用的自然語(yǔ)言處理還是差很遠(yuǎn)。
基于統(tǒng)計(jì)的模型
在這個(gè)階段,大家開(kāi)始嘗試通過(guò)對(duì)大量已存在的自然語(yǔ)言文本(我們稱(chēng)之為語(yǔ)料庫(kù))進(jìn)行統(tǒng)計(jì),來(lái)試圖得到一個(gè)基于統(tǒng)計(jì)的語(yǔ)言模型。比如通過(guò)統(tǒng)計(jì),肯定可以確定“吃”后面接“飯”的概率肯定高于接其他詞如“?!钡母怕?,即P(飯|吃)>P(牛|吃)。
雖然這個(gè)階段有很多模型被使用,但是本質(zhì)上,都是對(duì)語(yǔ)料庫(kù)中的語(yǔ)料進(jìn)行統(tǒng)計(jì),并得出一個(gè)概率模型。一般來(lái)說(shuō),用途不同,概率模型也不一樣。不過(guò),為了行文方便,我們接下來(lái)統(tǒng)一以最常見(jiàn)的語(yǔ)言模型為例,即建?!耙粋€(gè)上下文后面接某一個(gè)詞的概率“。剛才說(shuō)的一個(gè)詞后面接另一個(gè)詞的概率其實(shí)就是一元語(yǔ)言模型。
模型的表達(dá)能力
在這里,我們很適合插播一下模型表達(dá)能力這個(gè)概念。
模型表達(dá)能力簡(jiǎn)單來(lái)說(shuō)就是模型建模數(shù)據(jù)的能力,比如上文中的一元語(yǔ)言模型就無(wú)法建?!芭3圆荨焙汀拔页燥垺钡膮^(qū)別,因?yàn)樗5谋举|(zhì)統(tǒng)計(jì)一個(gè)詞后面跟另一個(gè)詞的概率,在計(jì)算是選“草”還是選“飯”的時(shí)候,是根據(jù)“吃”這個(gè)詞來(lái)的,而“?!焙汀拔摇边@個(gè)上下文對(duì)于一元語(yǔ)言模型已經(jīng)丟失。你用再多的數(shù)據(jù)讓一元語(yǔ)言模型學(xué)習(xí),它也學(xué)不到這個(gè)牛跟草的關(guān)系。
模型參數(shù)數(shù)量
有人說(shuō),既然如此,為啥我們不基于更多的上下文來(lái)計(jì)算下一個(gè)詞的概率,而僅僅基于前一個(gè)詞呢?OK,這個(gè)其實(shí)就是所謂的n元語(yǔ)言模型??傮w來(lái)說(shuō),n越大,模型參數(shù)越多,表達(dá)能力越強(qiáng)。當(dāng)然訓(xùn)練模型所需要的數(shù)據(jù)量越大(顯然嘛,因?yàn)樾枰y(tǒng)計(jì)的概率的數(shù)量變多了)。
模型結(jié)構(gòu)
然而,模型表達(dá)能力還有另一個(gè)制約因素,那就是模型本身的結(jié)構(gòu)。對(duì)于基于統(tǒng)計(jì)的n元語(yǔ)言模型來(lái)說(shuō),它只是簡(jiǎn)單地統(tǒng)計(jì)一個(gè)詞出現(xiàn)在一些詞后面的概率,并不理解其中的各類(lèi)文法、詞法關(guān)系,那它還是無(wú)法建模一些復(fù)雜的語(yǔ)句。比如,“我白天一直在打游戲”和“我在天黑之前一直在玩游戲“兩者語(yǔ)義很相似,但是基于統(tǒng)計(jì)的模型卻無(wú)法理解兩者的相似性。因此,就算你把海量的數(shù)據(jù)喂給基于統(tǒng)計(jì)的模型,它也不可能學(xué)到ChatGPT這種程度。
上文提到,統(tǒng)計(jì)語(yǔ)言模型的主要缺點(diǎn)是無(wú)法理解語(yǔ)言的深層次結(jié)構(gòu)。曾有一段時(shí)間,科學(xué)家們嘗試將基于文法的模型和基于統(tǒng)計(jì)的模型相結(jié)合。不過(guò)很快,風(fēng)頭就被神經(jīng)網(wǎng)絡(luò)搶了過(guò)去。
RNN & LSTM
剛開(kāi)始,流行的神經(jīng)網(wǎng)絡(luò)語(yǔ)言模型主要是循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)以及它的改良版本LSTM。
RNN的主要結(jié)構(gòu)如下, x是輸入,o是輸出,s是狀態(tài)。
如果RNN作為語(yǔ)言模型的話,那x可以作為順序輸入進(jìn)去的詞匯,而o就可以作為輸出的詞匯,而s就是通過(guò)x計(jì)算o的過(guò)程中生成的狀態(tài)變量,這個(gè)狀態(tài)變量可以理解為上下文,是對(duì)計(jì)算當(dāng)前詞匯時(shí)前文所有出現(xiàn)過(guò)的所有單詞的濃縮并在一次次的計(jì)算中不斷迭代更新。這也是為啥RNN可以建模詞與詞關(guān)系的根本原理。
與簡(jiǎn)單的基于統(tǒng)計(jì)的模型相比,循環(huán)神經(jīng)網(wǎng)絡(luò)的主要亮點(diǎn)就是能夠?qū)σ欢挝淖种胁煌~之間的關(guān)系進(jìn)行建模,這種能力在一定程度上解決了基于統(tǒng)計(jì)的模型無(wú)法理解深層次的問(wèn)題。
在更進(jìn)一步之前,我們不得不提一下注意力(Attention)機(jī)制。
這個(gè)機(jī)制主要針對(duì)RNN語(yǔ)言模型中狀態(tài)S作為上下文這一機(jī)制進(jìn)行改進(jìn)。。在RNN中計(jì)算當(dāng)前詞后的狀態(tài)Si主要是通過(guò)計(jì)算上一個(gè)詞時(shí)的狀態(tài)Si-1迭代出來(lái)的。它的主要缺點(diǎn)就是它假設(shè)了距離較近的詞匯之間的關(guān)系更密切。但是我們都知道,在自然語(yǔ)言中,這一假設(shè)并不是一直成立的。引入Attention之后,計(jì)算第i個(gè)詞后的狀態(tài)從單純的Si變成了S0,S1...Si的組合,而具體“如何組合”,即哪個(gè)狀態(tài)比較重要,也是通過(guò)數(shù)據(jù)擬合出來(lái)的。在這樣的情況下,模型的表達(dá)能力又得到了進(jìn)一步的提高,它可以理解一些距離較遠(yuǎn)但是又非常密切的詞匯之間的關(guān)系,比如說(shuō)代詞和被指代的名詞之間的關(guān)系。
Transformer
接下來(lái),我們終于可以祭出之前提過(guò)的NLP跨越式發(fā)展的標(biāo)志之一,Transformer的提出!
其實(shí)在有了Attention之后,Transformer的提出已經(jīng)是順理成章了。Transformer的主要貢獻(xiàn)在于
將Multi-Head Self-Attention直接內(nèi)建到網(wǎng)絡(luò)中。所謂Multi-Head Self-Attention其實(shí)就是多套并行的Self-Attention,可以用于建模的詞與詞之間的多類(lèi)不同地關(guān)系。
利用專(zhuān)用位置編碼來(lái)替代之前RNN用輸入順序作為次序,使得并行計(jì)算成為了可能。
舉一個(gè)形象但不準(zhǔn)確的例子,對(duì)于句子I often play skating board which is my favorite sport. 如果使用Multi-Head Self-Attention,那就可以有一套Attention專(zhuān)門(mén)用來(lái)建模play和skating board的謂賓關(guān)系,有一套Attention用來(lái)建模skating board與favorite的修飾關(guān)系。從而使得模型的表達(dá)能力又得到了提高。
ChatGPT所依賴(lài)GPT3.5語(yǔ)言模型的的底層正是Transformer。
訓(xùn)練數(shù)據(jù)
OK,我們現(xiàn)在有一個(gè)名為T(mén)ransformer模型了,這個(gè)模型通過(guò)Multi-head Self-Attention,使得建立詞與詞之間的復(fù)雜關(guān)系成為了可能。因此可以說(shuō)是一個(gè)表達(dá)力很強(qiáng)的語(yǔ)言模型了。然而,單有語(yǔ)言模型沒(méi)有數(shù)據(jù)就是巧婦難為無(wú)米之炊。
GPT-3.5的相關(guān)數(shù)據(jù)并未被公開(kāi)。我們就只說(shuō)說(shuō)它的上一代GPT-3。GPT-3整個(gè)神經(jīng)網(wǎng)絡(luò)就已經(jīng)有1750億個(gè)參數(shù)了。這不難理解,想一想Attention憑什么確定在當(dāng)前上下文下哪些詞比較重要?而網(wǎng)絡(luò)又怎樣通過(guò)Attention和輸入生成輸出?這些都是由模型里面的參數(shù)決定的。這也是為啥模型結(jié)構(gòu)一樣的情況下參數(shù)越多表達(dá)能力越強(qiáng)。那這些模型的參數(shù)怎么拿到?從數(shù)據(jù)中學(xué)習(xí)!其實(shí)大多數(shù)所謂的神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)就是在學(xué)參數(shù)。
好家伙,要訓(xùn)練1750億個(gè)參數(shù)的神經(jīng)網(wǎng)絡(luò)要喂多少數(shù)據(jù)呢?這么多!(from wikipedia)
?
Dataset | # Tokens | Weight in Training Mix |
---|---|---|
Common Crawl | 410 billion | 60% |
WebText2 | 19 billion | 22% |
Books1 | 12 billion | 8% |
Books2 | 55 billion | 8% |
Wikipedia | 3 billion | 3% |
?
可以預(yù)想的是,表達(dá)能力如此之強(qiáng)的模型,在喂入萬(wàn)億級(jí)的數(shù)據(jù)之后,其對(duì)語(yǔ)言本身的理解已經(jīng)開(kāi)始接近人類(lèi)了。比如它處理句子的時(shí)候,會(huì)通過(guò)訓(xùn)練Attention參數(shù)理解到句子中哪些詞之間存在關(guān)系的?哪些詞和哪些詞之間是同義的?等一系列比較深度的語(yǔ)言問(wèn)題。
這還只是2020年的GPT-3。如今已經(jīng)2022年了,相信GPT-3.5的模型表達(dá)能力比GPT-3又有相當(dāng)大地提升。
訓(xùn)練方法
監(jiān)督學(xué)習(xí) vs 無(wú)監(jiān)督學(xué)習(xí)
簡(jiǎn)單來(lái)說(shuō),監(jiān)督學(xué)習(xí)就是在“有答案”的數(shù)據(jù)集上學(xué)習(xí)。如果我們要用監(jiān)督學(xué)習(xí)(supervised learning)訓(xùn)練一個(gè)中文到英文的機(jī)器翻譯模型,我們就需要有中文以及其對(duì)應(yīng)的英文。整個(gè)訓(xùn)練過(guò)程就是不斷地將中文送入到模型中,模型會(huì)給出一個(gè)英文的輸出,這個(gè)時(shí)候我們對(duì)比一下英文的輸出與標(biāo)準(zhǔn)答案的差距遠(yuǎn)不遠(yuǎn)(Measured by Loss Function),如果差距比較大,那我們就調(diào)整模型參數(shù)。這也成為早期針對(duì)機(jī)器翻譯模型的主要訓(xùn)練方法。
遷移學(xué)習(xí)
然而,“有答案”的數(shù)據(jù)終究是有限的。這也是限制之前很多自然語(yǔ)言學(xué)習(xí)的模型設(shè)計(jì)復(fù)雜度的原因。不是不想提高模型的表達(dá)能力,而是提上去之后,參數(shù)太多,我們沒(méi)有足量的“有答案”的數(shù)據(jù)來(lái)訓(xùn)練這個(gè)模型。
2018年,另一個(gè)我認(rèn)為NLP跨越式發(fā)展的標(biāo)志來(lái)了,那就是GPT的提出。
GPT的主要貢獻(xiàn)在于,它提出了自然語(yǔ)言的一種新的訓(xùn)練范式。即現(xiàn)通過(guò)海量的數(shù)據(jù)的無(wú)監(jiān)督學(xué)習(xí)來(lái)訓(xùn)練一個(gè)語(yǔ)言模型。正如我們之前提到過(guò)的,所謂語(yǔ)言模型即是在一個(gè)上下文中預(yù)測(cè)下一個(gè)詞,這個(gè)顯然是不需要帶有標(biāo)注的數(shù)據(jù)的,現(xiàn)有的任何語(yǔ)料都可以作為訓(xùn)練數(shù)據(jù)的。由于GPT的底層借用了表達(dá)能力很強(qiáng)的Transformer,互聯(lián)網(wǎng)經(jīng)過(guò)長(zhǎng)時(shí)間的發(fā)展,海量的無(wú)標(biāo)記的自然語(yǔ)言數(shù)據(jù)也并不再是稀缺的事物。導(dǎo)致了訓(xùn)練出來(lái)的模型其實(shí)對(duì)語(yǔ)言有了相當(dāng)深入地理解。
這個(gè)時(shí)候,如果你想讓這個(gè)語(yǔ)言模型能夠陪你聊天,那在一個(gè)已經(jīng)理解語(yǔ)言的模型的基礎(chǔ)上,你只需要喂一些聊天的對(duì)話數(shù)據(jù),使用監(jiān)督學(xué)習(xí)來(lái)對(duì)模型進(jìn)行針對(duì)性的微調(diào)(fine-tune),就可以使它學(xué)會(huì)如何聊天了。這個(gè)操作也叫做遷移學(xué)習(xí)(Transfer Learning)。
在遷移學(xué)習(xí)的過(guò)程中,微調(diào)一般是通過(guò)簡(jiǎn)單的監(jiān)督學(xué)習(xí)來(lái)進(jìn)行。簡(jiǎn)單來(lái)說(shuō),ChatGPT通過(guò)構(gòu)建一些聊天的Prompt,讓人類(lèi)標(biāo)注一些想要的回復(fù),并用這些數(shù)據(jù)進(jìn)行監(jiān)督學(xué)習(xí)來(lái)微調(diào)。
強(qiáng)化學(xué)習(xí)
ChatGPT在使用進(jìn)行微調(diào)之外,還使用了一種叫做reinforcement learning from human feedback (RLHF)的技術(shù)。這個(gè)技術(shù)在ChatGPT的主要作用是將預(yù)訓(xùn)練的模型的目標(biāo)對(duì)齊到聊天這一具體的下游應(yīng)用上。它也較大地提升了ChatGPT的聊天能力。
其總體原理如下圖所示,在完成模型微調(diào)之后,先在人類(lèi)的幫助下訓(xùn)練一個(gè)獎(jiǎng)賞網(wǎng)絡(luò),這個(gè)獎(jiǎng)賞網(wǎng)絡(luò)具有對(duì)多個(gè)聊天回復(fù)好壞進(jìn)行排序的能力。接著,利用這個(gè)獎(jiǎng)賞網(wǎng)絡(luò),進(jìn)一步通過(guò)強(qiáng)化學(xué)習(xí)(reinforcement learning)優(yōu)化了聊天模型。該訓(xùn)練方法的細(xì)節(jié)可以參考論文[3]
在這一通操作之后,ChatGPT就變成了我們現(xiàn)在看到的這樣子。
其他
至此,我們基本上就已經(jīng)能明白為什么ChatGPT這么強(qiáng)了,但是我相信很多同學(xué)肯定會(huì)表示“就這?我不信,它都會(huì)改bug了,給他一段代碼他都知道代碼是干什么的了?!?/p>
Okay,我們可以首先解釋一下為什么它可以做到修改代碼中的bug,根據(jù)OpenAI提供的信息 :"GPT-3.5 series is a series of models that was trained on a blend of text and code from before Q4 2021.",我們可以知道GPT-3.5中的訓(xùn)練數(shù)據(jù)其實(shí)是包含了海量的代碼數(shù)據(jù)。所以說(shuō)GPT-3.5對(duì)代碼的理解也是相當(dāng)強(qiáng)的。從論文[4]可以看到,將代碼放入語(yǔ)言模型中進(jìn)行訓(xùn)練后,訓(xùn)練出的語(yǔ)言模型已經(jīng)可以做到代碼語(yǔ)義級(jí)的搜索。
而ChatGPT又是怎么知道代碼的功能的呢?目前我還沒(méi)看到相關(guān)論文,不過(guò)可以參考一下OpenAI在GPT-3上做的代碼訓(xùn)練的工作[5],大概就是將代碼和其功能docstring注釋放在一起做對(duì)比預(yù)訓(xùn)練(contrastive pretrain),這樣可以讓語(yǔ)言模型理解代碼和其功能的關(guān)系。
總結(jié)
總之,ChatGPT并沒(méi)有那么神秘,它本質(zhì)上就是將海量的數(shù)據(jù)結(jié)合表達(dá)能力很強(qiáng)的Transformer模型結(jié)合,從而對(duì)自然語(yǔ)言進(jìn)行了一個(gè)非常深度的建模。對(duì)于一個(gè)輸入的句子,ChatGPT是在這個(gè)模型參數(shù)的作用下生成一個(gè)回復(fù)。
有人會(huì)發(fā)現(xiàn)ChatGPT也經(jīng)常會(huì)一本正經(jīng)胡說(shuō)八道,這也是這一類(lèi)方法難以避免的弊端。因?yàn)樗举|(zhì)上只是通過(guò)概率最大化不斷生成數(shù)據(jù)而已,而不是通過(guò)邏輯推理來(lái)生成回復(fù)。
向ChatGPT詢問(wèn)比較嚴(yán)肅的技術(shù)問(wèn)題也可能會(huì)得到不靠譜的回答。
Reference
Vaswani, Ashish, et al. "Attention is all you need." Advances in neural information processing systems 30 (2017).
Radford, Alec, et al. "Improving language understanding by generative pre-training." (2018).
Ouyang, Long, et al. "Training language models to follow instructions with human feedback." arXiv preprint arXiv:2203.02155 (2022).
Chen, Mark, et al. "Evaluating large language models trained on code." arXiv preprint arXiv:2107.03374 (2021).
Neelakantan, Arvind, et al. "Text and code embeddings by contrastive pre-training." arXiv preprint arXiv:2201.10005 (2022).
編輯:黃飛
評(píng)論
查看更多