




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ChatGPT原理與應(yīng)用開(kāi)發(fā)目錄TOC\h\h第1章基礎(chǔ)知識(shí)\h第2章相似匹配\h第3章句詞分類\h第4章文本生成\h第5章復(fù)雜推理\h第6章工程實(shí)踐\h第7章局限與不足\h第8章商業(yè)應(yīng)用第1章基礎(chǔ)知識(shí)——大語(yǔ)言模型背后本章共包括三部分內(nèi)容。本章首先簡(jiǎn)要回顧自然語(yǔ)言發(fā)展歷史,從語(yǔ)言、圖靈測(cè)試一直到2022年年底的新突破——ChatGPT;接下來(lái)介紹語(yǔ)言模型基礎(chǔ),包括Token、Embedding等基本概念和語(yǔ)言模型的基本原理,它們是自然語(yǔ)言處理(naturallanguageprocessing,NLP)最基礎(chǔ)的知識(shí);最后介紹與ChatGPT相關(guān)的基礎(chǔ)知識(shí),包括Transformer、GPT和RLHF。Transformer是ChatGPT的基石,準(zhǔn)確來(lái)說(shuō),Transformer的一部分是ChatGPT的基石;GPT(generativepre-trainedtransformer,生成式預(yù)訓(xùn)練Transformer)是ChatGPT的本體,從GPT-1,一直到現(xiàn)在的GPT-4,按照OpenAI自己的說(shuō)法,模型還是那個(gè)模型,只是它更大了,同時(shí)效果更好了;RLHF(reinforcementlearningfromhumanfeedback,從人類反饋中強(qiáng)化學(xué)習(xí))是ChatGPT的神兵利器,有此利刃,ChatGPT所向披靡。1.1自然語(yǔ)言背景1.1.1語(yǔ)言是智能的標(biāo)志很久以前,有一個(gè)神奇的星球,上面居住著各種各樣的生物。這些生物雖然各自擁有不同的能力,卻沒(méi)有辦法與其他種類的生物進(jìn)行有效溝通。因?yàn)樵谶@個(gè)星球上,每個(gè)生物都有自己獨(dú)特的交流方式,無(wú)法理解其他生物的語(yǔ)言。有一天,這個(gè)星球來(lái)了一個(gè)神秘的外星人。外星人告訴這些生物,他們可以通過(guò)學(xué)習(xí)一種全新的、獨(dú)特的溝通方式來(lái)實(shí)現(xiàn)相互之間的交流。這種溝通方式就是“語(yǔ)言”。外星人決定將這種神奇的溝通能力賦予其中一種生物,讓其成為這個(gè)星球上唯一掌握語(yǔ)言能力的生物。為公平起見(jiàn),外星人決定舉辦一場(chǎng)比賽,看哪種生物能夠最先學(xué)會(huì)這種神奇的語(yǔ)言。最終,只有人類表現(xiàn)出驚人的潛力。人類不僅迅速掌握了語(yǔ)言的基本知識(shí),還能夠不斷地創(chuàng)造新的詞匯和表達(dá)方式。神秘的外星人宣布人類獲得了這場(chǎng)比賽的勝利,并將語(yǔ)言能力賦予人類。自此,人類成為這個(gè)星球上唯一掌握語(yǔ)言能力的生物。他們開(kāi)始利用語(yǔ)言建立起復(fù)雜的社會(huì)體系,發(fā)展科學(xué)技術(shù),創(chuàng)作美麗的藝術(shù)作品,使得人類在這個(gè)星球上獨(dú)樹(shù)一幟。當(dāng)然,這個(gè)故事并非真實(shí)發(fā)生,但是客觀來(lái)說(shuō),語(yǔ)言的確是人類所獨(dú)有的。在大自然億萬(wàn)年的進(jìn)化過(guò)程中,每個(gè)特定的物種都擁有一些獨(dú)特的、精妙的技能。有些蝙蝠能用聲吶來(lái)鎖定飛行的昆蟲(chóng),有些候鳥(niǎo)則能在星座的導(dǎo)航下飛行數(shù)千千米。在這場(chǎng)“選秀比賽”中,人類成為唯一可以對(duì)呼氣時(shí)發(fā)出的聲音進(jìn)行各種調(diào)控,以達(dá)到交流信息、描述事件目的的靈長(zhǎng)類動(dòng)物。正是因?yàn)檎莆樟苏Z(yǔ)言這一強(qiáng)大的工具,人類得以在漫長(zhǎng)的歷史進(jìn)程中不斷地發(fā)展和進(jìn)行創(chuàng)新。無(wú)論是社會(huì)交往、科學(xué)探索還是藝術(shù)創(chuàng)作,語(yǔ)言都發(fā)揮著至關(guān)重要的作用,成為人類獨(dú)特的精神象征。而語(yǔ)言也自然而然地成為了人類有別于其他物種的標(biāo)志性特征。換句話說(shuō),如果哪個(gè)物種掌握了語(yǔ)言,也就意味著這個(gè)物種誕生了智能。因此,從人工智能(artificialintelligence,AI)的概念建立伊始,機(jī)器能否具備使用自然語(yǔ)言同人類溝通交流的能力,就成了機(jī)器是否具有類人智能的一條重要標(biāo)準(zhǔn)。1.1.2從圖靈測(cè)試到ChatGPT1950年,圖靈發(fā)表論文“ComputingMachineryandIntelligence”,提出并嘗試回答“機(jī)器能否思考”這一關(guān)鍵問(wèn)題。在這篇論文中,圖靈提出了“圖靈測(cè)試”(即模仿游戲)的概念,用來(lái)檢測(cè)機(jī)器智能水平。圖靈測(cè)試的核心思想是,如果一個(gè)人(代號(hào)C)使用測(cè)試對(duì)象都能理解的語(yǔ)言詢問(wèn)兩個(gè)他不能看見(jiàn)的對(duì)象任意一串問(wèn)題,其中一個(gè)是正常思維的人(代號(hào)B),另一個(gè)是機(jī)器(代號(hào)A)。如果經(jīng)過(guò)若干詢問(wèn)以后,測(cè)試者C不能得出實(shí)質(zhì)的區(qū)別來(lái)分辨A與B的不同,則機(jī)器A通過(guò)圖靈測(cè)試(見(jiàn)圖1-1)。圖1-1圖靈測(cè)試1956年,人工智能正式成為一個(gè)科學(xué)上的概念,隨后涌現(xiàn)了很多新的研究目標(biāo)與方向。雖然圖靈測(cè)試只是一個(gè)啟發(fā)性的思想實(shí)驗(yàn),而非可以具體執(zhí)行的判斷方法,但圖靈通過(guò)這個(gè)假設(shè),闡明了“智能”判斷的模糊性與主觀性。從此以后,圖靈測(cè)試成為NLP任務(wù)的一個(gè)重要評(píng)測(cè)標(biāo)準(zhǔn)。圖靈測(cè)試提供了一種客觀和直觀的方式來(lái)評(píng)估機(jī)器是否具有智能,即通過(guò)讓機(jī)器與人進(jìn)行對(duì)話來(lái)判斷機(jī)器的智能水平。這種方式可以避免對(duì)智能本質(zhì)的哲學(xué)爭(zhēng)論,也可以繞開(kāi)智能具體表現(xiàn)形式的技術(shù)細(xì)節(jié)。因此,很多NLP任務(wù)都可以用圖靈測(cè)試來(lái)進(jìn)行評(píng)測(cè),如聊天機(jī)器人、問(wèn)答系統(tǒng)、文本生成等。NLP是計(jì)算機(jī)科學(xué)、人工智能和語(yǔ)言學(xué)的交叉領(lǐng)域,關(guān)注的是計(jì)算機(jī)和人類語(yǔ)言之間的相互作用。常見(jiàn)的NLP任務(wù)和應(yīng)用包括信息抽取、文本分類、文本摘要、機(jī)器翻譯、問(wèn)答系統(tǒng)、聊天機(jī)器人等。圖靈測(cè)試與NLP任務(wù)有著密切而復(fù)雜的關(guān)系,可以從以下兩個(gè)方面來(lái)概括?!D靈測(cè)試是NLP任務(wù)的一個(gè)重要驅(qū)動(dòng)力。圖靈測(cè)試提出了一個(gè)具有挑戰(zhàn)性和吸引力的目標(biāo),即讓機(jī)器能夠用自然語(yǔ)言與人類進(jìn)行流暢、智能、多樣化的對(duì)話。為了達(dá)到這個(gè)目標(biāo),NLP領(lǐng)域不斷地發(fā)展和創(chuàng)新各種技術(shù)和方法,以提高機(jī)器對(duì)自然語(yǔ)言的理解和生成能力。例如,為了讓機(jī)器能夠回答用戶提出的問(wèn)題,就需要研究問(wèn)答系統(tǒng)這一NLP任務(wù);為了讓機(jī)器能夠根據(jù)用戶提供的信息生成合適的文本,就需要研究文本生成這一NLP任務(wù);為了讓機(jī)器能夠適應(yīng)不同領(lǐng)域和場(chǎng)景的對(duì)話,就需要研究領(lǐng)域適應(yīng)和情境感知這一NLP任務(wù);等等。·圖靈測(cè)試是NLP任務(wù)的一個(gè)重要目標(biāo)。圖靈測(cè)試提出了一個(gè)具有前瞻性和理想性的愿景,即讓機(jī)器能夠達(dá)到與人類相同甚至超越人類的智能水平。這個(gè)愿景激發(fā)了很多NLP領(lǐng)域的研究者和開(kāi)發(fā)者,使他們不斷地探索和創(chuàng)新,以期實(shí)現(xiàn)真正意義上的自然語(yǔ)言的理解和生成。例如,為了讓機(jī)器能夠理解用戶提出的問(wèn)題,就需要研究語(yǔ)義分析、知識(shí)表示、邏輯推理;為了讓機(jī)器能夠生成符合用戶需求的文本,就需要研究文本規(guī)劃、文本風(fēng)格、文本評(píng)價(jià);為了讓機(jī)器能夠與用戶建立信任和情感的聯(lián)系,就需要研究情感分析、情感生成、情感對(duì)話;等等。NLP與人工智能發(fā)展史有著密切而復(fù)雜的關(guān)系。它們相互促進(jìn)、相互影響、相互依存、互為目標(biāo)。NLP在人工智能發(fā)展史上有很多有著里程碑意義的成果?!?954年,IBM實(shí)現(xiàn)了世界上第一個(gè)機(jī)器翻譯系統(tǒng)——將俄語(yǔ)翻譯成英語(yǔ)?!?966年,JosephWeizenbaum開(kāi)發(fā)了ELIZA——一種模擬心理治療師的聊天機(jī)器人?!?972年,TerryWinograd開(kāi)發(fā)了SHRDLU——一種能夠理解和生成自然語(yǔ)言的程序,用于控制一個(gè)虛擬的機(jī)器人在一個(gè)虛擬的世界中進(jìn)行操作?!?011年,蘋(píng)果公司推出了Siri——一種基于NLP技術(shù)的智能語(yǔ)音助手。同年,IBM的Watson戰(zhàn)勝了《危險(xiǎn)邊緣》節(jié)目的冠軍選手,展示了NLP技術(shù)在問(wèn)答領(lǐng)域的強(qiáng)大能力。·2013年,谷歌公司推出了Word2Vec——一種基于神經(jīng)網(wǎng)絡(luò)的詞向量表示方法,開(kāi)啟了NLP領(lǐng)域的深度學(xué)習(xí)時(shí)代?!?016年,F(xiàn)acebook(如今的Meta)發(fā)布了fastText——一種文本分類工具,它可以在處理大規(guī)模文本分類任務(wù)時(shí)取得很好的效果?!?017年,谷歌公司發(fā)布了一篇很可能是人工智能發(fā)展史上最重要的一篇論文“AttentionisAllYouNeed”,這篇論文的作者在其中提出了Transformer——一個(gè)具有多頭注意力機(jī)制的模型,它在文本特征提取方面取得了優(yōu)異的效果?!?018年,谷歌公司發(fā)布了BERT(bidirectionalencoderrepresentationsfromtransformers,基于Transformer的雙向編碼器表示)預(yù)訓(xùn)練模型,它在多項(xiàng)NLP任務(wù)上取得了最佳效果。·2020年,OpenAI發(fā)布的GPT-3模型有多達(dá)1750億個(gè)參數(shù),它可以在提供少量樣本或不提供樣本的前提下完成大多數(shù)NLP任務(wù)。以上這些成果依賴于NLP技術(shù)的不斷發(fā)展。時(shí)間來(lái)到2022年,終于輪到我們的主角隆重登場(chǎng)。2022年11月30日,OpenAI發(fā)布了一款智能聊天機(jī)器人——ChatGPT(見(jiàn)圖1-2)。ChatGPT一經(jīng)發(fā)布就立刻點(diǎn)燃了人工智能圈,僅僅5天用戶量就達(dá)到了100萬(wàn)。OpenAI不得不緊急擴(kuò)容,用戶發(fā)現(xiàn)ChatGPT不僅能很自然流暢地和人聊天,還能寫(xiě)論文、講笑話、編段子、生成演講稿、寫(xiě)請(qǐng)假條、模仿導(dǎo)師寫(xiě)推薦信,甚至幫你寫(xiě)代碼、寫(xiě)營(yíng)銷策劃案等。擁有了ChatGPT,就像你的身邊有了一個(gè)功能強(qiáng)大的秘書(shū)。到了2023年1月,ChatGPT就成為史上用戶量最快達(dá)到1億的應(yīng)用。圖1-2ChatGPT官方網(wǎng)站(圖片源自O(shè)penAI)無(wú)論是ChatGPT,還是其他后來(lái)的追隨者,它們其實(shí)都是語(yǔ)言模型,準(zhǔn)確來(lái)說(shuō)是大語(yǔ)言模型。在使用它們時(shí),無(wú)論是調(diào)用接口還是開(kāi)源項(xiàng)目,總有一些參數(shù)可能需要調(diào)整。對(duì)大部分業(yè)內(nèi)人員來(lái)說(shuō),這應(yīng)該都不成問(wèn)題;但對(duì)非業(yè)內(nèi)人員來(lái)說(shuō),這就有點(diǎn)稍顯專業(yè)了。本章接下來(lái)主要介紹ChatGPT相關(guān)技術(shù)的基本原理,我們盡量以淺顯的語(yǔ)言來(lái)表述,雖不能深入細(xì)節(jié),但知曉原理足以讓讀者很好地使用ChatGPT。1.2語(yǔ)言模型基礎(chǔ)1.2.1最小語(yǔ)義單位Token與Embedding首先,我們需要解釋一下如何將自然語(yǔ)言文本表示成計(jì)算機(jī)所能識(shí)別的數(shù)字。對(duì)于一段文本來(lái)說(shuō),要做的首先就是把它變成一個(gè)個(gè)Token。你可以將Token理解為一小塊,可以是一個(gè)字,也可以是兩個(gè)字的詞,或三個(gè)字的詞。也就是說(shuō),給定一個(gè)句子,我們有多種獲取不同Token的方式,可以分詞,也可以分字。英文現(xiàn)在都使用子詞,比如單詞annoyingly會(huì)被拆成如下兩個(gè)子詞。["annoying","##ly"]子詞把不在詞表里的詞或不常見(jiàn)的詞拆成比較常見(jiàn)的片段,“##”表示和前一個(gè)Token是直接拼接的,沒(méi)有空格。中文現(xiàn)在基本使用字+詞的方式。我們不直接解釋為什么這么做,但你可以想一下完全的字或詞的效果,拿英文舉例更直觀。如果只用26個(gè)英文字母,雖然詞表很小(加上各種符號(hào)可能也就100來(lái)個(gè)),但粒度太細(xì),每個(gè)Token(即每個(gè)字母)幾乎沒(méi)法表示語(yǔ)義;如果用詞,這個(gè)粒度又有點(diǎn)太大,詞表很難涵蓋所有詞。而子詞可以同時(shí)兼顧詞表大小和語(yǔ)義表示,是一種折中的做法。中文稍微簡(jiǎn)單一些,就是字+詞,字能獨(dú)立表示意義,比如“是”“有”“愛(ài)”;詞是由一個(gè)以上的字組成的語(yǔ)義單位,一般來(lái)說(shuō),把詞拆開(kāi)可能會(huì)丟失語(yǔ)義,比如“長(zhǎng)城”“情比金堅(jiān)”。當(dāng)然,中文如果非要拆成一個(gè)一個(gè)字也不是不可以,具體要看任務(wù)類型和效果。當(dāng)句子能夠表示成一個(gè)個(gè)Token時(shí),我們就可以用數(shù)字來(lái)表示這個(gè)句子了,最簡(jiǎn)單的方法就是將每個(gè)Token用一個(gè)數(shù)字來(lái)表示,但考慮這個(gè)數(shù)字的大小其實(shí)和Token本身沒(méi)有關(guān)系,這種單調(diào)的表達(dá)方式其實(shí)只是一種字面量的轉(zhuǎn)換,并不能表示豐富的語(yǔ)言信息。我們稍微多想一點(diǎn),因?yàn)橐呀?jīng)有一個(gè)預(yù)先設(shè)計(jì)好的詞表,那么是不是可以用詞表中的每個(gè)Token是否在句子中出現(xiàn)來(lái)表示?如果句子中包含某個(gè)Token,對(duì)應(yīng)位置為1,否則為0,這樣每句話都可以表示成長(zhǎng)度(長(zhǎng)度等于詞表大小)相同的1和0組成的數(shù)組。更進(jìn)一步地,還可以將“是否出現(xiàn)”改成“頻率”以凸顯高頻詞。事實(shí)上,在很長(zhǎng)一段時(shí)間里,自然語(yǔ)言都是用這種方法表示的,它有個(gè)名字,叫作詞袋模型(bagofwords,BOW)。從名字來(lái)看,詞袋模型就像一個(gè)大袋子,能把所有的詞都裝進(jìn)來(lái)。文本中的每個(gè)詞都被看作獨(dú)立的,忽略詞之間的順序和語(yǔ)法,只關(guān)注詞出現(xiàn)的次數(shù)。在詞袋模型中,每個(gè)文本可以表示為一個(gè)向量,向量的每個(gè)維度對(duì)應(yīng)一個(gè)詞,維度的值表示這個(gè)詞在文本中出現(xiàn)的次數(shù)。這種表示方法如表1-1所示,每一列表示一個(gè)Token,每一行表示一個(gè)句子,每個(gè)句子可以表示成一個(gè)長(zhǎng)度(就是詞表大小)固定的向量,比如第一個(gè)句子可以表示為[3,1,1,0,1,1,0,…]。表1-1詞袋模型這里的詞表是按照拼音排序的,但這個(gè)順序其實(shí)不重要,讀者不妨思考一下為什么。另外,注意這里只顯示了7列,也就是詞表中的7個(gè)Token,但實(shí)際上,詞表中的Token一般都在“萬(wàn)”這個(gè)級(jí)別。所以,表1-1中的省略號(hào)實(shí)際上省略了上萬(wàn)個(gè)Token。這種表示方法很好,不過(guò)有兩個(gè)比較明顯的問(wèn)題。第一,由于詞表一般比較大,導(dǎo)致向量維度比較高,而且比較稀疏(大量的0),計(jì)算起來(lái)不太方便;第二,由于忽略了Token之間的順序,導(dǎo)致部分語(yǔ)義丟失。比如“你愛(ài)我”和“我愛(ài)你”的向量表示一模一樣,但其實(shí)意思不一樣。于是,詞向量(也叫詞嵌入)出現(xiàn)了,它是一種稠密表示方法。簡(jiǎn)單來(lái)說(shuō),一個(gè)Token可以表示成一定數(shù)量的小數(shù)(一般可以是任意多個(gè),專業(yè)叫法是詞向量維度,根據(jù)所用的模型和設(shè)定的參數(shù)而定),一般數(shù)字越多,模型越大,表示能力越強(qiáng),不過(guò)即使再大的模型,這個(gè)維度也會(huì)比詞表小很多。如下面的代碼示例所示,每一行的若干(詞向量維度)的小數(shù)就表示對(duì)應(yīng)位置的Token,詞向量維度常見(jiàn)的值有200、300、768、1536等。愛(ài)[0.61048,0.46032,0.7194,0.85409,0.67275,0.31967,0.89993,...]不[0.19444,0.14302,0.71669,0.03338,0.34856,0.6991,0.49111,...]對(duì)[0.24061,0.21482,0.53269,0.97885,0.51619,0.07808,0.9278,...]古琴[0.21798,0.62035,0.89935,0.93283,0.24022,0.91339,0.6569,...]你[0.392,0.13321,0.00597,0.74754,0.45524,0.23674,0.7825,...]完[0.26588,0.1003,0.40055,0.09484,0.20121,0.32476,0.48591,...]我[0.07928,0.37101,0.94462,0.87359,0.55773,0.13289,0.22909,...].........................................................................細(xì)心的讀者可能會(huì)有疑問(wèn):“句子該怎么表示?”這個(gè)問(wèn)題非常關(guān)鍵,其實(shí)在深度NLP(deepNLP)早期,往往是對(duì)句子的所有詞向量直接取平均(或者求和),最終得到一個(gè)和每個(gè)詞向量同樣大小的向量——句子向量。這項(xiàng)工作最早要追溯到Y(jié)oshuaBengio等人于2003年發(fā)表的論文“Aneuralprobabilisticlanguagemodel”,他們?cè)谟?xùn)練語(yǔ)言模型的同時(shí),順便得到了詞向量這個(gè)副產(chǎn)品。不過(guò),最終開(kāi)始在實(shí)際中大規(guī)模應(yīng)用,則要追溯到2013年谷歌公司的TomasMikolov發(fā)布的Word2Vec。借助Word2Vec,我們可以很容易地在大量語(yǔ)料中訓(xùn)練得到一個(gè)詞向量模型。也正是從那時(shí)開(kāi)始,深度NLP逐漸嶄露頭角成為主流。早期的詞向量都是靜態(tài)的,一旦訓(xùn)練完就固定不變了。隨著NLP技術(shù)的不斷發(fā)展,詞向量技術(shù)逐漸演變成基于語(yǔ)言模型的動(dòng)態(tài)表示。也就是說(shuō),當(dāng)上下文不一樣時(shí),同一個(gè)詞的向量表示將變得不同。而且,句子的表示也不再是先拿到詞向量再構(gòu)造句子向量,而是在模型架構(gòu)設(shè)計(jì)上做了考慮。當(dāng)輸入句子時(shí),模型經(jīng)過(guò)一定計(jì)算后,就可以直接獲得句子向量;而且語(yǔ)言模型不僅可以表示詞和句子,還可以表示任意文本。類似這種將任意文本(或其他非文本符號(hào))表示成稠密向量的方法,統(tǒng)稱Embedding表示技術(shù)。Embedding表示技術(shù)可以說(shuō)是NLP領(lǐng)域(其實(shí)也包括圖像、語(yǔ)音、推薦等領(lǐng)域)最基礎(chǔ)的技術(shù),后面的深度學(xué)習(xí)模型都基于此。我們甚至可以稍微夸張點(diǎn)說(shuō),深度學(xué)習(xí)的發(fā)展就是Embedding表示技術(shù)的不斷發(fā)展。1.2.2語(yǔ)言模型是怎么回事語(yǔ)言模型(languagemodel,LM)簡(jiǎn)單來(lái)說(shuō),就是利用自然語(yǔ)言構(gòu)建的模型。自然語(yǔ)言就是我們?nèi)粘I睢W(xué)習(xí)和工作中常用的文字。語(yǔ)言模型就是利用自然語(yǔ)言文本構(gòu)建的,根據(jù)給定文本,輸出對(duì)應(yīng)文本的模型。語(yǔ)言模型具體是如何根據(jù)給定文本輸出對(duì)應(yīng)文本呢?方法有很多種,比如我們寫(xiě)好一個(gè)模板:“XX喜歡YY”。如果XX是我,YY是你,那就是“我喜歡你”,反過(guò)來(lái)就是“你喜歡我”。我們這里重點(diǎn)要說(shuō)的是概率語(yǔ)言模型,它的核心是概率,準(zhǔn)確來(lái)說(shuō)是下一個(gè)Token的概率。這種語(yǔ)言模型的過(guò)程就是通過(guò)已有的Token預(yù)測(cè)接下來(lái)的Token。舉個(gè)簡(jiǎn)單的例子,比如你只告訴模型“我喜歡你”這句話,當(dāng)你輸入“我”的時(shí)候,它就已經(jīng)知道你接下來(lái)要輸入“喜歡”了。為什么?因?yàn)樗摹澳X子”里就只有這4個(gè)字。好,接下來(lái),我們要升級(jí)了。假設(shè)我們給了模型很多資料,多到現(xiàn)在網(wǎng)上所能找到的資料都給了它。這時(shí)候你再輸入“我”,此時(shí)它大概不會(huì)說(shuō)“喜歡”了。為什么呢?因?yàn)橐?jiàn)到了更多不同的文本,它的“腦子”里已經(jīng)不只有“我喜歡你”這4個(gè)字了。不過(guò),如果我們考慮的是最大概率,也就是說(shuō),每次都只選擇下一個(gè)最大概率的Token,那么對(duì)于同樣的給定輸入,我們依然會(huì)得到相同的對(duì)應(yīng)輸出(可能還是“喜歡你”,也可能不是,具體要看給的語(yǔ)料)。對(duì)于這樣的結(jié)果,語(yǔ)言模型看起來(lái)比較“呆”。我們把這種方法叫作貪心搜索(greedysearch),因?yàn)樗煌罂匆粋€(gè)詞,只考慮下一步最大概率的詞!為了讓生成的結(jié)果更加多樣和豐富,語(yǔ)言模型都會(huì)在這個(gè)地方執(zhí)行一些策略。比如讓模型每一步多看幾個(gè)可能的詞,而不是就看概率最大的那個(gè)詞。這樣到下一步時(shí),上一步最大概率的Token,加上這一步的Token,路徑概率(兩步概率的乘積)可能就不是最大的了。舉個(gè)例子,如圖1-3所示,先看第一步,如果只選概率最大的那個(gè)詞,那就變成“我想”了。但是別急,我們給“喜歡”一點(diǎn)機(jī)會(huì),同時(shí)考慮它們兩個(gè)。再往下看一步,“喜歡”和“想”后面最大概率的都是“你”,最后就有了下面幾句(我們附上了它們的概率)。·“我喜歡你”,概率為0.3×0.8=0.24?!ぁ拔蚁矚g吃”,概率為0.3×0.1=0.03?!ぁ拔蚁肽恪保怕蕿?.4×0.5=0.2?!ぁ拔蚁肴ァ?,概率為0.4×0.3=0.12。圖1-3語(yǔ)言模型如何預(yù)測(cè)下一個(gè)詞多看一步大不一樣!看看概率最大的成誰(shuí)了,變成了“我喜歡你”。上面這種方法叫作集束搜索(beamsearch),簡(jiǎn)單來(lái)說(shuō),就是一步多看幾個(gè)詞,看最終句子(比如生成到句號(hào)、感嘆號(hào)或其他停止符號(hào))的概率。在上面的例子中,num_beams=2(只看了兩個(gè)詞),看得越多,越不容易生成固定的文本。好了,其實(shí)在最開(kāi)始的語(yǔ)言模型中,基本就到這里,上面介紹的兩種不同搜索方法(貪心搜索和集束搜索)也叫解碼策略。當(dāng)時(shí)更多被研究的還是模型本身,我們經(jīng)歷了從簡(jiǎn)單模型到復(fù)雜模型,再到巨大復(fù)雜模型的變遷過(guò)程。簡(jiǎn)單模型就是把一句話拆成一個(gè)個(gè)Token,然后統(tǒng)計(jì)概率,這類模型有個(gè)典型代表——N-Gram模型,它也是最簡(jiǎn)單的語(yǔ)言模型。這里的N表示每次用到的上下文Token的個(gè)數(shù)。舉個(gè)例子,看下面這句話:“人工智能讓世界變得更美好”。N-Gram模型中的N通常等于2或3,等于2的叫Bi-Gram,等于3的叫Tri-Gram。·Bi-Gram:人工智能/讓讓/世界世界/變得變得/更更/美好·Tri-Gram:人工智能/讓/世界讓/世界/變得世界/變得/更變得/更/美好Bi-Gram和Tri-Gram的區(qū)別是,前者的下一個(gè)Token是根據(jù)上一個(gè)Token來(lái)的,而后者的下一個(gè)Token是根據(jù)前兩個(gè)Token來(lái)的。在N-Gram模型中,Token的表示是離散的,實(shí)際上就是詞表中的一個(gè)個(gè)單詞。這種表示方式比較簡(jiǎn)單,再加上N不能太大,導(dǎo)致難以學(xué)到豐富的上下文知識(shí)。事實(shí)上,它并沒(méi)有用到深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò),只是一些統(tǒng)計(jì)出來(lái)的概率值。以Bi-Gram為例,在給定很多語(yǔ)料的情況下,統(tǒng)計(jì)的是從“人工智能”開(kāi)始,下個(gè)詞出現(xiàn)的頻率。假設(shè)“人工智能/讓”出現(xiàn)了5次,“人工智能/是”出現(xiàn)了3次,將它們出現(xiàn)的頻率除以所有的Gram數(shù)就是概率。訓(xùn)練N-Gram模型的過(guò)程其實(shí)是統(tǒng)計(jì)頻率的過(guò)程。如果給定“人工智能”,N-Gram模型就會(huì)找基于“人工智能”下個(gè)最大概率的詞,然后輸出“人工智能讓”。接下來(lái)就是給定“讓”,繼續(xù)往下走了。當(dāng)然,我們也可以用上面提到的不同解碼策略往下走。接下來(lái),讓每個(gè)Token成為一個(gè)Embedding向量。我們簡(jiǎn)單解釋一下在這種情況下怎么預(yù)測(cè)下一個(gè)Token。其實(shí)還是計(jì)算概率,但這次和剛才的稍微有點(diǎn)不一樣。在剛才離散的情況下,用統(tǒng)計(jì)出來(lái)的對(duì)應(yīng)Gram數(shù)除以Gram總數(shù)就是出現(xiàn)概率。但是稠密向量要稍微換個(gè)方式,也就是說(shuō),給你一個(gè)d維的向量(某個(gè)給定的Token),你最后要輸出一個(gè)長(zhǎng)度為N的向量,N是詞表大小,其中的每一個(gè)值都是一個(gè)概率值,表示下一個(gè)Token出現(xiàn)的概率,概率值加起來(lái)為1。按照貪心搜索解碼策略,下一個(gè)Token就是概率最大的那個(gè),寫(xiě)成簡(jiǎn)單的計(jì)算表達(dá)式如下。#d維,加起來(lái)和1沒(méi)關(guān)系,大小是1×d,表示給定的TokenX=[0.001,0.002,0.0052,...,0.0341]#N個(gè),加起來(lái)為1,大小是1×N,表示下一個(gè)Token就是每個(gè)Token出現(xiàn)的概率Y=[0.1,0.5,...,0.005,0.3]#W是模型參數(shù),也可以叫模型X·W=Y#W可以是d×N大小的矩陣上面的W就是模型參數(shù),其實(shí)X也可以被看作模型參數(shù)(自動(dòng)學(xué)習(xí)到的)。因?yàn)槲覀冎懒溯斎牒洼敵龅拇笮?,所以中間其實(shí)可以經(jīng)過(guò)任意的計(jì)算,也就是說(shuō),W可以包含很多運(yùn)算。總之各種張量(三維以上數(shù)組)運(yùn)算,只要保證最后的輸出形式不變就行。各種不同的計(jì)算方式就意味著各種不同的模型。在深度學(xué)習(xí)早期,最著名的語(yǔ)言模型是使用循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrentneuralnetwork,RNN)訓(xùn)練的,RNN是一種比N-Gram模型復(fù)雜得多的模型。RNN與其他神經(jīng)網(wǎng)絡(luò)的不同之處在于,RNN的節(jié)點(diǎn)之間存在循環(huán)連接,這使得它能夠記住之前的信息,并將它們應(yīng)用于當(dāng)前的輸入。這種記憶能力使得RNN在處理時(shí)間序列數(shù)據(jù)時(shí)特別有用,例如預(yù)測(cè)未來(lái)的時(shí)間序列數(shù)據(jù)、進(jìn)行自然語(yǔ)言的處理等。通俗地說(shuō),RNN就像具有記憶能力的人,它可以根據(jù)之前的經(jīng)驗(yàn)和知識(shí)對(duì)當(dāng)前的情況做出反應(yīng),并預(yù)測(cè)未來(lái)的發(fā)展趨勢(shì),如圖1-4所示。圖1-4RNN(摘自Colah的博客文章“UnderstandingLSTMNetworks”)在圖1-4中,右邊是左邊的展開(kāi),A就是參數(shù),x是輸入,h就是輸出。自然語(yǔ)言是一個(gè)Token接著一個(gè)Token(TokenbyToken)的,從而形成一個(gè)序列。參數(shù)怎么學(xué)習(xí)呢?這就要稍微解釋一下學(xué)習(xí)(訓(xùn)練)過(guò)程。如圖1-5所示,第一行就是輸入X,第二行就是輸出Y,SOS(startofsentence)表示句子開(kāi)始,EOS(endofsentence)表示句子結(jié)束。注意,圖1-4中的h并不是那個(gè)輸出的概率,而是隱向量。如果需要概率,可以再對(duì)h執(zhí)行張量運(yùn)算,歸一化到整個(gè)詞表即可。圖1-5語(yǔ)言模型學(xué)習(xí)(訓(xùn)練)時(shí)的輸入輸出importtorchimporttorch.nnasnnrnn=nn.RNN(32,64)input=torch.randn(4,32)h0=torch.randn(1,64)output,hn=rnn(input,h0)output.shape,hn.shape#(torch.Size([4,64]),torch.Size([1,64]))上面的nn.RNN就是RNN模型。輸入是一個(gè)4×32的向量,換句話說(shuō),輸入是4個(gè)Token,維度d=32。h0就是隨機(jī)初始化的輸出,也就是4個(gè)Token中第1個(gè)Token的輸出,這里output的4個(gè)64維的向量分別表示4個(gè)輸出。hn就是最后一個(gè)Token的輸出(它和output的最后一個(gè)64維向量是一樣的),也可以看成整個(gè)句子的表示。注意,這里的output和圖1-5中的輸出Y還沒(méi)有關(guān)系。別急,繼續(xù)往下看。如果要輸出詞的概率,就需要先擴(kuò)充到詞表大小,再進(jìn)行歸一化。#假設(shè)詞表大小N=1000wo=torch.randn(64,1000)#得到4×1000的概率矩陣,每一行概率和為1probs=nn.Softmax(dim=1)(output@wo)probs.shape,probs.sum(dim=1)#torch.Size([4,1000]),tensor([1.0000,1.0000,1.0000,1.0000],#grad_fn=<SumBackward1>)這里的probs的每一行就是詞表大小的概率分布,概率和為1,意思是根據(jù)當(dāng)前Token生成下一個(gè)Token的概率,下一個(gè)Token有可能是詞表中的任意一個(gè)Token,但它們的概率和一定為1。因?yàn)槲覀冎澜酉聛?lái)每個(gè)位置的Token是什么(也就是圖1-5中的輸出Y)。這里得到最大概率的那個(gè)Token,如果正好是這個(gè)Token,則說(shuō)明預(yù)測(cè)對(duì)了,參數(shù)就不用怎么調(diào)整;反之,模型就會(huì)調(diào)整前面的參數(shù)(RNN、h0、input和wo)。你可能會(huì)疑惑為什么input也是參數(shù),其實(shí)前面我們偷懶了,本來(lái)的參數(shù)是一個(gè)1000×32的大矩陣,但我們使用了4個(gè)Token對(duì)應(yīng)位置的向量。這個(gè)1000×32的大矩陣其實(shí)就是詞向量(每個(gè)詞一行),開(kāi)始時(shí)全部隨機(jī)初始化,然后通過(guò)訓(xùn)練調(diào)整參數(shù)。訓(xùn)練完成后,這些參數(shù)就不變了,然后就可以用前面同樣的步驟來(lái)預(yù)測(cè)了,也就是給定一個(gè)Token,預(yù)測(cè)下一個(gè)Token。如果使用貪心搜索,則每次給定同樣的Token時(shí),生成的結(jié)果就一樣。其余的就和前面講的接上了。隨著深度學(xué)習(xí)的不斷發(fā)展,出現(xiàn)了更多比RNN還復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),而且模型變得更大,參數(shù)更多,但邏輯和方法是一樣的。好了,語(yǔ)言模型就介紹到這里。上面的代碼看不懂沒(méi)關(guān)系,你只需要大致了解每個(gè)Token是怎么表示、怎么訓(xùn)練和預(yù)測(cè)出來(lái)的就行。簡(jiǎn)單直觀地說(shuō),構(gòu)建(訓(xùn)練)語(yǔ)言模型的過(guò)程就是學(xué)習(xí)詞、句內(nèi)在的“語(yǔ)言關(guān)系”;而推理(預(yù)測(cè))就是在給定上下文后,讓構(gòu)建好的模型根據(jù)不同的解碼策略輸出對(duì)應(yīng)的文本。無(wú)論是訓(xùn)練還是預(yù)測(cè),都以Token為粒度進(jìn)行。1.3ChatGPT基礎(chǔ)1.3.1最強(qiáng)表示架構(gòu)Transformer設(shè)計(jì)與演變接下來(lái)出場(chǎng)的是Transformer,它是一個(gè)基于注意力機(jī)制的編碼器-解碼器(encoder-decoder)架構(gòu),剛開(kāi)始主要應(yīng)用在NLP領(lǐng)域,后來(lái)橫跨到語(yǔ)音和圖像領(lǐng)域,并最終統(tǒng)一幾乎所有模態(tài)(文本、圖像、語(yǔ)音)的架構(gòu)。Transformer來(lái)自谷歌公司在2017年發(fā)表的一篇論文“AttentionIsAllYouNeed”,其最重要的核心就是提出來(lái)的自注意力(self-attention)機(jī)制。簡(jiǎn)單來(lái)說(shuō),就是在語(yǔ)言模型構(gòu)建過(guò)程中,把注意力放在那些重要的Token上。Transformer簡(jiǎn)單來(lái)說(shuō),就是先把輸入映射到編碼器(encoder),這里大家可以把編碼器想象成前面介紹的RNN,解碼器(decoder)也可以想象成RNN。這樣,左邊負(fù)責(zé)編碼,右邊則負(fù)責(zé)解碼。這里不同的是,左邊因?yàn)槲覀兪侵罃?shù)據(jù)的,所以在建模時(shí)可以同時(shí)利用當(dāng)前Token的歷史(后面的)Token和未來(lái)(前面的)Token;但在解碼時(shí),因?yàn)槭且粋€(gè)個(gè)Token輸出來(lái)的,所以只能根據(jù)歷史Token以及編碼器的Token表示進(jìn)行建模,而不能利用未來(lái)Token。Transformer的這種架構(gòu)從更普遍的角度來(lái)看,其實(shí)是Seq2Seq(sequencetosequence)架構(gòu),簡(jiǎn)單來(lái)說(shuō)就是序列到序列的架構(gòu):輸入是一個(gè)文本序列,輸出是另一個(gè)文本序列。翻譯就是一個(gè)很好的例子,如圖1-6所示。圖1-6Seq2Seq架構(gòu)示意圖(摘自GitHub的“google/seq2seq”項(xiàng)目)剛剛已經(jīng)講了,編碼器和解碼器可以采用RNN,編碼器這一側(cè)的每個(gè)Token都可以輸出一個(gè)向量表示,而這些所有Token的輸出向量都可以在處理后作為整句話的表示。說(shuō)到這里,整句話又怎么表示呢?前面曾提到,對(duì)于RNN這種結(jié)構(gòu),可以把最后一個(gè)Token的輸出作為整個(gè)句子的表示。當(dāng)然,很符合直覺(jué)的,你也可以取每個(gè)詞向量的平均值。除了平均值,也可以求和、取最大值等,我們就不更深入討論了?,F(xiàn)在重點(diǎn)來(lái)了,看解碼的過(guò)程,仔細(xì)看,其實(shí)解碼器在生成每一個(gè)Token時(shí)都用到了編碼器中每一個(gè)Token的信息,以及已經(jīng)生成的那些Token的信息。前面這種關(guān)注編碼器中每個(gè)Token的信息的機(jī)制就是注意力(attention)機(jī)制。直觀的解釋,就是當(dāng)生成單詞“power”時(shí),“力量”兩個(gè)字會(huì)被賦予更多權(quán)重(注意力),其他情況也類似。好了,現(xiàn)在讓我們帶著之前的記憶,看一下Transformer的整體結(jié)構(gòu),如圖1-7所示。圖1-7Transformer的整體結(jié)構(gòu)(摘自論文“AttentionIsAllYouNeed”)在圖1-7中,左邊是編碼器,一共有N個(gè);右邊是解碼器,也有N個(gè)。為簡(jiǎn)單起見(jiàn),我們可以假設(shè)N=1,如此一來(lái),圖1-7的左邊就是一個(gè)編碼器,右邊則是一個(gè)解碼器。也可以把它們想象成一個(gè)RNN,這樣有助于從宏觀上把握?,F(xiàn)在,我們回到現(xiàn)實(shí),Transformer用到的東西其實(shí)和RNN并沒(méi)有關(guān)系,這一點(diǎn)通過(guò)圖1-7也可以很明顯地看出來(lái)。Transformer主要用了兩個(gè)模塊:多頭注意力(multi-headattention)和前饋(feedforward)網(wǎng)絡(luò)。對(duì)于多頭注意力,我們不妨回顧一下Seq2Seq架構(gòu)的注意力機(jī)制,它是解碼器中的Token和編碼器中每一個(gè)Token的重要性權(quán)重。多頭注意力中用到了自注意力(self-attention),自注意力和剛剛講的注意力非常類似,只不過(guò)自注意力是自己的每一個(gè)Token之間的重要性權(quán)重。簡(jiǎn)單來(lái)說(shuō),就是“一句話到底哪里重要”。自注意力機(jī)制可以說(shuō)是Transformer的精髓,無(wú)論是ChatGPT還是其他非文本的大語(yǔ)言模型,都用到了它,它可以說(shuō)是真正地“一統(tǒng)江湖”。多頭(multi-head)簡(jiǎn)單來(lái)說(shuō),就是把剛剛的這種自己注意自己重復(fù)多次,每個(gè)頭注意到的信息不一樣,這樣就可以捕獲到更多信息。比如我們前面提到過(guò)的一句話——“人工智能讓世界變得更美好”,有的頭“人工智能”注意到“世界”,有的頭“人工智能”注意到“美好”……這樣看起來(lái)更加符合直覺(jué)。前饋網(wǎng)絡(luò)主要引入非線性變換,幫助模型學(xué)習(xí)更復(fù)雜的語(yǔ)言特征和模式。另外,有個(gè)地方要特別注意,解碼器的淡黃色模塊內(nèi)有一個(gè)遮蓋多頭注意力(maskedmulti-headattention),它和多頭注意力的區(qū)別就是遮蓋(mask)了未來(lái)Token。以本小節(jié)開(kāi)頭提到的翻譯為例,當(dāng)給定“Knowledge”生成下一個(gè)Token時(shí),模型當(dāng)然不知道下一個(gè)Token就是“is”。還記得前面講過(guò)的學(xué)習(xí)(訓(xùn)練)過(guò)程嗎?下一個(gè)Token是“is”,這是訓(xùn)練數(shù)據(jù)里的,模型輸出什么要看Token最大概率是不是在“is”這個(gè)Token上,如果不在,參數(shù)就得更新。實(shí)際上,大多數(shù)NLP任務(wù)并不是Seq2Seq架構(gòu)的,最常見(jiàn)的任務(wù)主要包括如下幾種:句子分類、Token分類(也叫序列標(biāo)注)、相似匹配和文本生成,前三種應(yīng)用得最為廣泛。這時(shí)候,編碼器和解碼器就可以拆開(kāi)用了。左邊的編碼器在把句子表示成一個(gè)向量時(shí),可以利用上下文信息,也就是說(shuō),可以把它看作雙向的;右邊的解碼器不能看到未來(lái)Token,一般只利用上文信息,是單向的。雖然它們都可以用來(lái)完成剛才提到的幾種任務(wù),但從效果上來(lái)說(shuō),編碼器更適合非生成類任務(wù),解碼器則更適合生成類任務(wù)。在NLP領(lǐng)域,一般也會(huì)把它們分別叫作自然語(yǔ)言理解(naturallanguageunderstanding,NLU)任務(wù)和自然語(yǔ)言生成(naturallanguagegeneration,NLG)任務(wù)。上面提到的這些任務(wù),后面都會(huì)進(jìn)一步介紹,這里大致了解一下即可。我們首先介紹NLU任務(wù)。句子分類是指給定一個(gè)句子,輸出一個(gè)類別。因?yàn)榫渥涌梢员硎緸橐粋€(gè)向量,所以經(jīng)過(guò)張量運(yùn)算后,自然可以映射到每個(gè)類別的概率分布。這和前面提到過(guò)的語(yǔ)言模型的做法沒(méi)有本質(zhì)上的區(qū)別,只不過(guò)語(yǔ)言模型的類別是整個(gè)詞表大小,而分類的類別則要看具體的任務(wù),有二分類、多分類、多標(biāo)簽分類等。Token分類是指給定一個(gè)句子,給其中的每個(gè)Token輸出一個(gè)類別。這和語(yǔ)言模型就更像了,只不過(guò)把下一個(gè)Token換成了對(duì)應(yīng)的類別,比如命名實(shí)體抽取就是把句子中的實(shí)體(人名、地名、作品等你所關(guān)注的詞,一般是名詞)提取出來(lái)。如果以地名(location,LOC)舉例的話,對(duì)應(yīng)的類別是這樣的:B-LOC(beginofLOC)表示實(shí)體開(kāi)始、I-LOC(insideofLOC)表示實(shí)體中間。舉個(gè)例子:“中國(guó)的首都是北京”。注意此時(shí)的Token是字,每個(gè)Token對(duì)應(yīng)的類別為“B-LOC、I-LOC、O、O、O、O、B-LOC、I-LOC”,O表示Other。對(duì)于分類任務(wù),類別一般也叫作標(biāo)簽。相似匹配一般指給定兩個(gè)句子,輸出它們是否相似,其實(shí)可以將其看作特殊的分類任務(wù)。接下來(lái)介紹NLG任務(wù)。除文本續(xù)寫(xiě)外,其他常見(jiàn)的NLG任務(wù)還有文本摘要、機(jī)器翻譯、文本改寫(xiě)、文本糾錯(cuò)等。這里Seq2Seq架構(gòu)就比較常見(jiàn)了,體現(xiàn)了一種先理解再輸出的思路。而純生成類任務(wù),比如寫(xiě)詩(shī)、寫(xiě)歌詞、寫(xiě)小說(shuō),則幾乎是純解碼器架構(gòu)。此類任務(wù)稍微麻煩的是如何做自動(dòng)評(píng)測(cè),文本摘要、機(jī)器翻譯、文本改寫(xiě)、文本糾錯(cuò)等任務(wù)一般都會(huì)提供參考答案(reference),可以評(píng)估模型輸出和參考答案之間的重疊程度或相似程度,但純生成類任務(wù)就有點(diǎn)麻煩,這個(gè)好不好有時(shí)候其實(shí)很難衡量。不過(guò),針對(duì)有具體目標(biāo)的任務(wù)(如任務(wù)型聊天機(jī)器人的回復(fù)生成),還可以設(shè)計(jì)一些諸如“是否完成任務(wù)”“是否達(dá)到目標(biāo)”的評(píng)測(cè)方法。但對(duì)于沒(méi)有具體目標(biāo)的任務(wù)(比如閑聊),評(píng)測(cè)起來(lái)就見(jiàn)仁見(jiàn)智了,很多時(shí)候還得靠人工進(jìn)行評(píng)測(cè)。Transformer基于Seq2Seq架構(gòu),可以同時(shí)處理NLU和NLG任務(wù),而且這種自注意力機(jī)制的特征提取能力(表示能力)很強(qiáng)。其結(jié)果就是NLP取得了階段性的突破,深度學(xué)習(xí)開(kāi)始進(jìn)入微調(diào)模型時(shí)代,大概的做法就是,拿著一個(gè)開(kāi)源的預(yù)訓(xùn)練模型,在自己的數(shù)據(jù)上微調(diào)一下,讓它能夠完成特定的任務(wù)。這個(gè)開(kāi)源的預(yù)訓(xùn)練模型往往就是一個(gè)語(yǔ)言模型,在大量語(yǔ)料中,使用我們前面所講的語(yǔ)言模型的訓(xùn)練方法訓(xùn)練而來(lái)。偏NLU領(lǐng)域的第一個(gè)成果是谷歌公司的BERT,相信不少人即便不是這個(gè)行業(yè)的也大概聽(tīng)過(guò)。BERT就是使用了Transformer的編碼器(沒(méi)有使用解碼器),有12個(gè)Block(圖1-7左側(cè)的淡黃色模塊,每一個(gè)Block也可以叫作一層)和1億多個(gè)參數(shù)。BERT不預(yù)測(cè)下一個(gè)Token,而是隨機(jī)地把15%的Token蓋住(其中80%用[MASK]替換,10%保持不變,10%隨機(jī)替換為其他Token),然后利用其他沒(méi)蓋住的Token來(lái)預(yù)測(cè)蓋住位置的Token。這其實(shí)和根據(jù)上文信息預(yù)測(cè)下一個(gè)Token是類似的,所不同的是它可以利用下文信息。偏NLG領(lǐng)域的第一個(gè)成果是OpenAI的GPT,GPT就是使用了Transformer的解碼器(沒(méi)有使用編碼器),參數(shù)和BERT差不多。BERT和GPT都發(fā)布于2018年,然后分別走上了不同的道路。1.3.2生成語(yǔ)言模型GPT進(jìn)化與逆襲GPT,就是ChatGPT中的那個(gè)GPT,中文叫作生成式預(yù)訓(xùn)練Transformer。生成式的意思就是類似于語(yǔ)言模型那樣,一個(gè)Token一個(gè)Token地生成文本,也就是上面提到的解碼器的原理。預(yù)訓(xùn)練剛剛也提過(guò)了,就是在大量語(yǔ)料中訓(xùn)練語(yǔ)言模型。GPT模型從GPT-1到GPT-4,一共經(jīng)歷了5個(gè)版本,中間的ChatGPT是3.5版。GPT-1、GPT-2和GPT-3都是有論文發(fā)表的,接下來(lái)分別介紹它們的基本思想。ChatGPT沒(méi)有論文發(fā)表,不過(guò)它的姐妹版本InstructGPT有論文發(fā)表,我們放在1.3.3節(jié)介紹。GPT-4也沒(méi)有論文發(fā)表,只有技術(shù)報(bào)告,不過(guò)里面并沒(méi)有技術(shù)細(xì)節(jié)。因此,我們對(duì)GPT-4不做介紹,讀者可以將其看作能力更強(qiáng)的ChatGPT升級(jí)版。GPT-1和BERT一樣,用的是下游任務(wù)微調(diào)范式,也就是在不同下游任務(wù)數(shù)據(jù)上微調(diào)預(yù)訓(xùn)練模型,如圖1-8所示。圖1-8GPT-1基本結(jié)構(gòu)和下游任務(wù)微調(diào)范式(摘自GPT-1論文“ImprovingLanguageUnderstandingbyGenerativePre-Training”)關(guān)于圖1-8左邊的GPT-1基本結(jié)構(gòu),我們?cè)谇懊嬉呀?jīng)介紹過(guò)了,用的是Transformer的解碼器,不過(guò)這里因?yàn)闆](méi)有編碼器,所以不需要有和編碼器交互的多頭注意力模塊?,F(xiàn)在重點(diǎn)看看圖1-8的右邊,這是GPT-1在各種下游任務(wù)上的處理流程。簡(jiǎn)單來(lái)說(shuō),就是針對(duì)不同的任務(wù)構(gòu)造不同的輸入序列,然后丟給GPT-1獲取Token或句子的Embedding表示,再通過(guò)Linear+Softmax輸出結(jié)果。Linear是一種最基礎(chǔ)的網(wǎng)絡(luò)結(jié)構(gòu),也就是線性映射,這里用于維度轉(zhuǎn)換,轉(zhuǎn)為輸出需要的大小。Softmax主要用來(lái)把輸出映射到概率分布(概率和為1)。這種拼接輸入的方法在當(dāng)時(shí)非常流行,緊跟其后的BERT也使用類似的方式,并引領(lǐng)了一個(gè)時(shí)代,直至ChatGPT的出現(xiàn)讓我們進(jìn)入大語(yǔ)言模型時(shí)代(不過(guò),針對(duì)很多傳統(tǒng)NLP任務(wù)BERT依然具備優(yōu)勢(shì))。統(tǒng)一的處理方法能夠減小不同任務(wù)對(duì)模型的適配難度。因此不管什么任務(wù),都想方設(shè)法將其變成一個(gè)序列就行,比如在圖1-8中,相似匹配就是把兩句話直接拼接起來(lái),預(yù)測(cè)它們是否相似(輸出標(biāo)簽為1或0)。GPT-1的這篇論文還有幾個(gè)點(diǎn)在當(dāng)時(shí)看起來(lái)可能沒(méi)什么感覺(jué),現(xiàn)在回看卻有點(diǎn)意思。第一,預(yù)訓(xùn)練模型中的每一層(圖1-8中的淡黃色模塊)都包含用于解決目標(biāo)任務(wù)的有用功能,多層(意味著模型更深)有更多能力;第二,隨著參數(shù)的增加,零樣本獲得更好的性能。簡(jiǎn)單總結(jié)就是,模型大了不僅能學(xué)到更多知識(shí),有助于解決下游任務(wù),還表現(xiàn)出了零樣本能力。這里的零樣本(zero-shot)是指直接給模型輸入任務(wù),讓它輸出任務(wù)結(jié)果。與此類似的還有少樣本(few-shot)和單樣本(one-shot),即給模型提供一些(或一個(gè))示例,然后給出任務(wù),讓它輸出任務(wù)結(jié)果。有了上面的結(jié)論,你是不是想看看更多層(更多參數(shù))的表現(xiàn)如何?于是半年后,GPT-2來(lái)了,參數(shù)量從GPT-1的1.1億增加到了15億,增長(zhǎng)了十幾倍。更有意思的是,GPT-1的博客文章“Improvinglanguageunderstandingwithunsupervisedlearning”中有一個(gè)“未來(lái)工作列表”,排在第一位的就是擴(kuò)大規(guī)模,還有兩個(gè)分別是提升微調(diào),以及更好地理解為什么生成式預(yù)訓(xùn)練能提升NLU能力。GPT-1發(fā)布于2018年6月,GPT-2發(fā)布于2019年2月,GPT-2是GPT-1的升級(jí)版,主要在兩個(gè)方面進(jìn)行進(jìn)一步研究:首先是擴(kuò)大規(guī)模,然后是零樣本。如果說(shuō)GPT-1是觀察到了“規(guī)模大、能力強(qiáng)的零樣本”這個(gè)現(xiàn)象,那么GPT-2就是進(jìn)一步研究這個(gè)現(xiàn)象。其結(jié)果自然是,模型越來(lái)越大,參數(shù)越來(lái)越多,能力越來(lái)越強(qiáng)。GPT-2進(jìn)一步驗(yàn)證了GPT-1的想法,下一步要做的就是繼續(xù)擴(kuò)大規(guī)模。不過(guò)且慢,在此之前,我們不妨看一下GPT-2中的Token生成策略,也就是生成下一個(gè)Token的方法。前面介紹過(guò)比較優(yōu)秀的集束搜索,不過(guò)它有兩個(gè)比較明顯的問(wèn)題:第一是生成的內(nèi)容容易重復(fù),第二是高質(zhì)量的文本和高概率并不一定相關(guān)(有時(shí)甚至完全沒(méi)有關(guān)系)。簡(jiǎn)單來(lái)看,這兩個(gè)問(wèn)題其實(shí)可以歸結(jié)為一個(gè)問(wèn)題:生成的內(nèi)容依然確定性太大。人們更希望有“不一樣”的內(nèi)容,而不是完全可預(yù)測(cè)的內(nèi)容,比如張愛(ài)玲說(shuō)過(guò),“孤獨(dú)的人有他們自己的泥沼”,這種獨(dú)一無(wú)二的文字用高概率的詞大概率是得不到的?,F(xiàn)在,我們介紹一種基于采樣的方法,簡(jiǎn)單來(lái)說(shuō),就是根據(jù)當(dāng)前上下文得到的概率分布采樣下一個(gè)Token。這里可以用一個(gè)溫度(temperature)參數(shù)調(diào)整輸出的概率分布,參數(shù)值越大,分布看起來(lái)就越平滑,也就是說(shuō),高概率和低概率的差距變小了(對(duì)輸出不那么確定);當(dāng)然,這個(gè)參數(shù)值越小的話,高概率和低概率的差距就會(huì)更明顯(對(duì)輸出比較確定);如果這個(gè)參數(shù)值趨近于0,那就和貪心搜索一樣了。請(qǐng)看下面的代碼示例。importnumpyasnpnp.random.seed(42)logits=np.random.random((2,4))logits/=temperaturescores=np.exp(logits)probs=scores/np.sum(scores,axis=1,keepdims=True)我們讓溫度參數(shù)分別取0.1和0.9,結(jié)果如下。#temperature=0.1array([[0.003,0.873,0.098,0.026],[0.001,0.001,0.,0.998]])#temperature=0.9array([[0.176,0.335,0.262,0.226],[0.196,0.196,0.176,0.432]])以第一行為例,當(dāng)溫度為0.1時(shí),概率最大值為0.873;當(dāng)溫度為0.9時(shí),概率最大值依然在同樣位置(這是必然的),但值變?yōu)?.335。而且,你也可以很明顯地看出來(lái),當(dāng)溫度為0.9時(shí),4個(gè)數(shù)字看起來(lái)更加接近。還有一個(gè)重復(fù)懲罰參數(shù)(repetition_penalty),它可以在一定程度上避免生成重復(fù)的Token。它和溫度參數(shù)類似,只不過(guò)是將溫度放到了“已生成的Token”上。也就是說(shuō),如果有Token之前已經(jīng)生成過(guò)了,我們就會(huì)在生成下一個(gè)Token時(shí)對(duì)那些已生成的Token的分?jǐn)?shù)進(jìn)行平滑,讓它們的概率不那么大。所以,這個(gè)參數(shù)值越大,越有可能生成和之前不重復(fù)的Token。除了這些技巧,2018年的一篇論文“HierarchicalNeuralStoryGeneration”另外介紹了一種新的采樣方案,它很簡(jiǎn)單也很有效果,它就是GPT-2里使用到的Top-K采樣。簡(jiǎn)單來(lái)說(shuō),就是在選擇下一個(gè)Token時(shí),從Top-K(根據(jù)概率從大到小的前K個(gè))個(gè)Token里面選。這種采樣方案不錯(cuò),不過(guò)還有個(gè)小問(wèn)題,就是Top-K采樣其實(shí)是一種硬截?cái)?,根本不管第K個(gè)概率是高還是低。在極端情況下,如果某個(gè)詞的概率是0.99(剩下的所有詞加起來(lái)才0.01),K稍微大一點(diǎn)就必然會(huì)囊括進(jìn)來(lái)一些概率很低的詞。這會(huì)導(dǎo)致生成的內(nèi)容不連貫。于是,2019年的一篇論文“TheCuriousCaseofNeuralTextDegeneration”提出了另一種采樣方案——Top-P采樣,GPT-2里也有用到這種采樣方案。這種采樣方案是從累積概率超過(guò)P的詞里進(jìn)行選擇。這樣,對(duì)于概率分布比較均勻的情況,可選的詞就會(huì)多一些(可能幾十個(gè)詞的概率和才會(huì)超過(guò)P);對(duì)于概率分布不均勻的情況,可選的詞就會(huì)少一些(可能兩三個(gè)詞的概率和就超過(guò)了P)。Top-P采樣看起來(lái)更優(yōu)雅一些,兩者也可以結(jié)合使用。不過(guò)在大部分情況下,當(dāng)我們需要調(diào)參數(shù)的時(shí)候,調(diào)一個(gè)參數(shù)就好,包括前面的溫度參數(shù)。如果要調(diào)多個(gè)參數(shù),請(qǐng)確保理解每個(gè)參數(shù)的作用。最后需要說(shuō)明的是,任何一種采樣方案都不能100%保證每一次生成的效果都很好,也沒(méi)辦法完全避免生成重復(fù)的句子,也沒(méi)有任何一種采樣方案在任何場(chǎng)景下都適用。讀者在使用時(shí)需要根據(jù)實(shí)際情況多嘗試,選出效果最好的配置。不過(guò),建議讀者從官方給的默認(rèn)參數(shù)開(kāi)始嘗試。GPT-3發(fā)布于2020年7月,這在當(dāng)時(shí)也是個(gè)大新聞,因?yàn)樗膮?shù)已經(jīng)達(dá)到其他任何模型在當(dāng)時(shí)都望塵莫及的量級(jí)——1750億,是GPT-2的100多倍,沒(méi)有開(kāi)源。GPT-3既然有零樣本能力,那能不能不微調(diào)呢?碰到一個(gè)任務(wù)就微調(diào),這多麻煩。對(duì)于人來(lái)說(shuō),只要幾個(gè)例子(少樣本)和一些簡(jiǎn)單的說(shuō)明,就可以處理任務(wù)了。怎么辦?GPT-2不是進(jìn)一步確認(rèn)了零樣本能力嗎?繼續(xù)加大參數(shù)量,于是就有了GPT-3。也就是說(shuō),各種任務(wù)來(lái)吧,不調(diào)參數(shù),頂多就要幾個(gè)例子(預(yù)計(jì)下一步連例子也不要了),GPT-3就能幫你完成它們。其實(shí)現(xiàn)在回頭看,這篇論文是具有里程碑意義的,因?yàn)樗鼜母旧嫌|動(dòng)了原有的范式,而且是革命性的觸動(dòng)。關(guān)于這一點(diǎn),感興趣的讀者可以進(jìn)一步閱讀筆者的一篇文章《GPT-3和它的In-ContextLearning》?,F(xiàn)在回憶,1750億的參數(shù)量在當(dāng)時(shí)看太大了,而且也太貴了(幾百萬(wàn)美元),一般的單位和個(gè)人根本負(fù)擔(dān)不起。關(guān)于這一點(diǎn),不光小部分人沒(méi)意識(shí)到,可能是除了OpenAI團(tuán)隊(duì)之外的整個(gè)世界都沒(méi)意識(shí)到。請(qǐng)看圖1-9,橫坐標(biāo)是樣本數(shù)量,縱坐標(biāo)是精準(zhǔn)度。圖1-9提供了如下信息?!-shot(x表示zero、one、few)在不同參數(shù)規(guī)模下差別巨大,大語(yǔ)言模型有超能力?!ぴ诖笳Z(yǔ)言模型下,單樣本效果明顯大幅提升,增加提示詞會(huì)進(jìn)一步大幅提升效果?!ど贅颖镜倪呺H收益在遞減。大概在8樣本以下時(shí),提示詞作用明顯,但從單樣本到8樣本,提示詞的效果提升幅度也在遞減。當(dāng)超過(guò)10樣本時(shí),提示詞基本就沒(méi)有作用了。圖1-9x-shot在不同參數(shù)規(guī)模下的表現(xiàn)(摘自GPT-3論文“LanguageModelsareFew-ShotLearners”)總而言之,大語(yǔ)言模型具有In-Context(上下文)學(xué)習(xí)能力,這種能力使得它不需要針對(duì)不同任務(wù)再進(jìn)行適應(yīng)性訓(xùn)練(微調(diào)),大語(yǔ)言模型用的就是它自己本身的理解力。這本來(lái)應(yīng)該很讓人震驚(甚至有一點(diǎn)驚恐),不過(guò)大家可能都先被它的價(jià)格和規(guī)模震驚到了。接下來(lái),我們?cè)僦庇^地感受一下利用這種In-Context學(xué)習(xí)能力完成任務(wù)的方式,如圖1-10所示。圖1-10使用In-Context學(xué)習(xí)能力和微調(diào)完成任務(wù)(摘自GPT-3論文“LanguageModelsareFew-ShotLearners”)圖1-10右邊的微調(diào)方式需要先根據(jù)訓(xùn)練樣本更新模型參數(shù),之后再進(jìn)行預(yù)測(cè)。圖1-10左邊的三種方式都利用了大語(yǔ)言模型(largelanguagemodel,LLM)的In-Context學(xué)習(xí)能力,不需要更新模型,而且看起來(lái)也都不復(fù)雜,只需要按照格式把輸入構(gòu)建好,然后傳給模型進(jìn)行預(yù)測(cè)就可以了。這也是本書(shū)寫(xiě)作的初衷之一——人工智能已經(jīng)平民化,只要有手(可能以后不用手也行),通過(guò)使用LLM就可以做出人工智能應(yīng)用了。不過(guò)這里有一點(diǎn)需要說(shuō)明,為了簡(jiǎn)便,圖1-10中的樣本都比較簡(jiǎn)單,但實(shí)際中的樣本一般是完整的句子。最后值得一提的是GPT-3論文中的展望,在GPT-3論文的“局限”小節(jié)中,作者提出了GPT-3目前的一些問(wèn)題,其中有兩點(diǎn)需要特別指出,因?yàn)樗鼈兪窍乱淮鶬nstructGPT(也是ChatGPT的姐妹版)以及更高級(jí)版本的方向?!ぷ员O(jiān)督訓(xùn)練(也就是語(yǔ)言模型一般的訓(xùn)練方法)范式已到極限,新的訓(xùn)練方法迫在眉睫。未來(lái)的方向包括:從人類那里學(xué)習(xí)目標(biāo)函數(shù)、強(qiáng)化學(xué)習(xí)微調(diào)或多模態(tài)。·不確定少樣本是在推理時(shí)學(xué)習(xí)到新的任務(wù),還是識(shí)別出來(lái)了在訓(xùn)練時(shí)學(xué)到的任務(wù)。最終,甚至不清楚人類從零開(kāi)始學(xué)習(xí)與從之前的樣本中學(xué)習(xí)分別學(xué)到了什么。準(zhǔn)確理解少樣本的工作原理是未來(lái)的一個(gè)方向。上面的第一點(diǎn)在1.3.3節(jié)就會(huì)提到,這里主要說(shuō)說(shuō)第二點(diǎn)。當(dāng)我們給出一些示例(少樣本)時(shí),我們還無(wú)法精準(zhǔn)確定是在推理時(shí)“學(xué)習(xí)”到新任務(wù)的處理方法(在這種情況下,沒(méi)有示例就沒(méi)有能力;這里的“學(xué)習(xí)”要打引號(hào),因?yàn)樗徽{(diào)整參數(shù)),還是在訓(xùn)練時(shí)就已經(jīng)具備了這個(gè)能力,示例只是讓它“回想”起之前學(xué)的東西。這里有點(diǎn)繞,拿人來(lái)舉例,可能不太恰當(dāng),但能大致說(shuō)明問(wèn)題。假設(shè)當(dāng)你讀到一首詩(shī)時(shí),自己也詩(shī)興大發(fā)寫(xiě)了一句詩(shī)。你說(shuō)這句詩(shī)是因?yàn)槟阕x到這首詩(shī)時(shí)“領(lǐng)悟”到的,還是你本來(lái)就有這個(gè)積累(記憶),現(xiàn)在只是因?yàn)樽x這首詩(shī)而被激發(fā)出來(lái)?這可能涉及大腦、思維、意識(shí)等領(lǐng)域知識(shí),而人類至今也沒(méi)有弄清楚它們的原理,所以我們現(xiàn)在還不知道答案。1.3.3利器強(qiáng)化學(xué)習(xí)RLHF流程與思想RLHF(reinforcementlearningfromhumanfeedback,從人類反饋中強(qiáng)化學(xué)習(xí))聽(tīng)起來(lái)有點(diǎn)平淡無(wú)奇。確實(shí),RLHF的思想非常樸素、簡(jiǎn)單,但它有著不可忽視的效果。剛剛我們已經(jīng)提到了,GPT-3論文指出未來(lái)要找到新的訓(xùn)練方法,其中就包括從人類那里學(xué)習(xí)目標(biāo)函數(shù)、強(qiáng)化學(xué)習(xí)微調(diào)、多模態(tài)等。時(shí)至今日,從InstructGPT到ChatGPT,再到GPT-4,人類正一步一步地實(shí)現(xiàn)這些新的訓(xùn)練方法。這里有一點(diǎn)需要提醒,這些方向并不是一開(kāi)始就清晰地?cái)[在那里的,中間還有非常多的探索和階段性成果(既有OpenAI自己的研究,也有其他從業(yè)人員的研究)。千萬(wàn)不要看到結(jié)果覺(jué)得平淡無(wú)奇,這中間的艱難探索永遠(yuǎn)值得尊敬。另外,有時(shí)候即便知道了方法,要做出來(lái),還要做出效果來(lái),也是非常有難度的。而且本書(shū)只能介紹少部分內(nèi)容,雖然整體結(jié)構(gòu)比較完整,但總體還是比較簡(jiǎn)單??偟膩?lái)說(shuō),要做出來(lái)很有難度,不過(guò)我們?nèi)绻皇怯玫脑?,如前所述,有手就行。好了,言歸正傳,RLHF被人熟知應(yīng)該主要源自O(shè)penAI的InstructGPT論文“Traininglanguagemodelstofollowinstructionswithhumanfeedback”,更大范圍的熟知就是ChatGPT的發(fā)布。因?yàn)楹笳邲](méi)有論文發(fā)表,也沒(méi)有開(kāi)源,所以我們也只能“拿InstructGPT的管窺一窺ChatGPT的豹”。當(dāng)然,如果按照ChatGPT官方頁(yè)面上的說(shuō)法,ChatGPT是InstructGPT的姐妹版,那么這個(gè)“管”可能還比較粗。如果用簡(jiǎn)單的語(yǔ)言來(lái)描述InstructGPT,其實(shí)就是用強(qiáng)化學(xué)習(xí)的算法微調(diào)一個(gè)根據(jù)人類反饋來(lái)加以改進(jìn)的語(yǔ)言模型,重要的是還調(diào)出了效果——規(guī)模為130億的InstructGPT堪比規(guī)模為1750億的GPT-3。現(xiàn)在我們來(lái)看看具體是如何做的,RLHF在其中又起了什么作用,以及如何起作用。InstructGPT的整個(gè)流程分為三個(gè)步驟,如圖1-11所示。圖1-11InstructGPT流程圖(摘自InstructGPT論文“Traininglanguagemodelstofollowinstructionswithhumanfeedback”)·步驟一:SFT(supervisedfine-tuning,有監(jiān)督微調(diào))。顧名思義,SFT是在有監(jiān)督(有標(biāo)注)數(shù)據(jù)上微調(diào)訓(xùn)練得到的。這里的有監(jiān)督數(shù)據(jù)其實(shí)就是輸入提示詞,輸出相應(yīng)的回復(fù),只不過(guò)這里的回復(fù)是人工編寫(xiě)的。這個(gè)工作要求比一般標(biāo)注要高,其實(shí)算是一種創(chuàng)作。·步驟二:RM(rewardmodel,獎(jiǎng)勵(lì)模型)。具體來(lái)說(shuō),將一個(gè)提示詞丟給前一步的SFT,輸出若干(4~9個(gè))回復(fù),由標(biāo)注人員對(duì)這些回復(fù)進(jìn)行排序。然后從4~9個(gè)回復(fù)中每次取兩個(gè),因?yàn)槭怯行虻?,所以可以用?lái)訓(xùn)練RM,讓模型學(xué)習(xí)到好壞評(píng)價(jià)。這一步非常關(guān)鍵,它就是所謂的人類反饋(humanfeedback),用于引導(dǎo)下一步模型的更新方向?!げ襟E三:RL(reinforcementlearning,強(qiáng)化學(xué)習(xí)),使用PPO進(jìn)行訓(xùn)練。PPO(proximalpolicyoptimization,近端策略優(yōu)化)是一種強(qiáng)化學(xué)習(xí)優(yōu)化方法,它背后的主要思想是避免每次太大的更新,提高訓(xùn)練的穩(wěn)定性。具體過(guò)程如下:首先初始化一個(gè)語(yǔ)言模型,然后丟給它一個(gè)提示詞,生成一個(gè)回復(fù),用上一步的RM給這個(gè)回復(fù)打分,將這個(gè)打分回傳給模型更新參數(shù)。這里的語(yǔ)言模型在強(qiáng)化學(xué)習(xí)視角下就是一個(gè)策略。這一步有個(gè)很重要的動(dòng)作,就是在更新模型時(shí)考慮模型每一個(gè)Token的輸出和SFT輸出之間的差異性,要讓它們盡量相似。這是為了緩解強(qiáng)化學(xué)習(xí)可能的過(guò)度優(yōu)化。就這樣?對(duì),就這樣,RLHF都表現(xiàn)在上面了,效果大家都知道了。雖然ChatGPT沒(méi)有相關(guān)論文發(fā)表,但我們基本相信它也是基于類似的思路實(shí)現(xiàn)的。當(dāng)然,這里面細(xì)節(jié)非常多,即便知道了這個(gè)思路,也不一定能復(fù)現(xiàn)出來(lái)。這在深度學(xué)習(xí)時(shí)代很正常,里面的各種小設(shè)計(jì)、小細(xì)節(jié)實(shí)在太多了。當(dāng)它們堆積到一定量時(shí),造成的差別是很難一下子彌補(bǔ)的,如果別人不告訴你,那你就只能自己慢慢做實(shí)驗(yàn)去逐步驗(yàn)證了。下面我們強(qiáng)行解釋一下RLHF是如何起作用的,以及為什么它現(xiàn)在能成為一個(gè)基本的范式。其實(shí),對(duì)于將強(qiáng)化學(xué)習(xí)用在NLP領(lǐng)域一直以來(lái)都有研究,正好筆者也由于一些原因一直在關(guān)注文本生成,以及強(qiáng)化學(xué)習(xí)在文本生成方面的研究。這里可能有兩個(gè)難點(diǎn):一是訓(xùn)練的穩(wěn)定性;二是獎(jiǎng)勵(lì)函數(shù)的設(shè)計(jì)。前者有PPO與SFT的差異衡量,得到不小的改進(jìn);而對(duì)于后者,如果要從客觀角度考慮設(shè)計(jì)一個(gè)規(guī)則,就不那么容易了。筆者也曾設(shè)想過(guò)很多類似的方法,比如加入一些語(yǔ)法規(guī)則限制,甚至加入類似最省力法則這樣的規(guī)則。最省力法則:是由齊夫在HumanBehaviorandthePrincipleofLeastEffort:AnIntroductiontoHumanEcology一書(shū)中提出的。簡(jiǎn)單來(lái)說(shuō),就是語(yǔ)言具有惰性,它會(huì)朝著使用較少的詞語(yǔ)表達(dá)盡可能多的語(yǔ)義這個(gè)方向演化。InstructGPT使用人類反饋直接作為“規(guī)則”,把這種“規(guī)則”給隱式化,當(dāng)作黑盒。我們只管結(jié)果好壞,至于中間有什么規(guī)則,有多少種規(guī)則,怎么起作用,統(tǒng)統(tǒng)不關(guān)心。這是和深度學(xué)習(xí)類似的思路,相比而言,我們之前的想法可能有些過(guò)于想當(dāng)然了,畢竟語(yǔ)言學(xué)本身也有不少爭(zhēng)議,認(rèn)識(shí)并沒(méi)有得到統(tǒng)一,比如語(yǔ)言能力是不是人與生俱來(lái)的能力?InstructGPT的做法則更加簡(jiǎn)單、直接,而且有效。剩下要解決的就是怎么衡量“好壞”,畢竟最終是要有個(gè)結(jié)果的,既然要結(jié)果,就要有標(biāo)準(zhǔn)。讀者不妨思考一下,如果換作你,你會(huì)如何設(shè)計(jì)一些指標(biāo)來(lái)衡量?jī)啥屋敵鰞?nèi)容的好壞。這一步看似容易,其實(shí)特別難,因?yàn)橹笜?biāo)的設(shè)計(jì)會(huì)影響到模型的學(xué)習(xí)方向,最終就會(huì)影響到效果。因?yàn)檫@個(gè)輸出的好壞衡量標(biāo)準(zhǔn)太多了,雖然看起來(lái)是對(duì)給出的幾個(gè)結(jié)果進(jìn)行排序(上文的步驟二),但其實(shí)這個(gè)過(guò)程中間隱藏了大量人類的認(rèn)知,模型訓(xùn)練過(guò)程其實(shí)就是和步驟二這個(gè)衡量過(guò)程對(duì)齊的過(guò)程;所以,如果步驟二指標(biāo)沒(méi)設(shè)計(jì)好,步驟三就會(huì)白費(fèi)力氣。尤其是對(duì)于InstructGPT這樣要完成大量不同任務(wù)的設(shè)計(jì),衡量就更加不容易。以一個(gè)文本摘要任務(wù)為例,我們可能最關(guān)注的是能否準(zhǔn)確概括原文信息,而一個(gè)生成任務(wù)可能更關(guān)注流暢性和前后邏輯一致性。InstructGPT里面有10種任務(wù),分別針對(duì)每種任務(wù)設(shè)計(jì)指標(biāo),不僅麻煩,而且效果還不一定好,因?yàn)檫@些指標(biāo)并不一定都是一個(gè)方向。還有就是,萬(wàn)一又有了一個(gè)新任務(wù),難道要再去設(shè)計(jì)一套指標(biāo),全部重新訓(xùn)練一遍模型嗎?讓我們來(lái)看看InstructGPT是怎么設(shè)計(jì)衡量指標(biāo)的,筆者覺(jué)得這是InstructGPT論文最寶貴的地方,也是最值得我們思考和實(shí)踐的地方。感興趣的讀者可以進(jìn)一步閱讀筆者之前寫(xiě)的一篇專門(mén)介紹ChatGPT標(biāo)注的文章《ChatGPT標(biāo)注指南:任務(wù)、數(shù)據(jù)與規(guī)范》。首先,InstructGPT用了三大通用指標(biāo)——有幫助、真實(shí)性和無(wú)害性,有點(diǎn)類似于阿西莫夫的機(jī)器人三定律。也就是說(shuō),不管是什么任務(wù),都得朝著這三個(gè)方向靠攏。這個(gè)想法值得稱贊?,F(xiàn)在我們看到這個(gè)結(jié)果了,自然感覺(jué)好像沒(méi)什么,但如果事先不知道要去設(shè)計(jì)出來(lái),大部分人可能還是很容易陷入被任務(wù)影響的境地。其實(shí),OpenAI團(tuán)隊(duì)在“In-Context”學(xué)習(xí)能力上的堅(jiān)持也是一樣的。當(dāng)別人告訴你那個(gè)結(jié)果時(shí),你可能覺(jué)得好像沒(méi)有什么,甚至很多研究機(jī)構(gòu)、研究人員都有過(guò)這種想法。但在有效果之前,篤信一條罕有人走的路,且一直堅(jiān)定不移地走下去,這是很不容易的。有了剛剛的三大通用指標(biāo),接下來(lái)就是細(xì)化,使其具有可操作性。比如,對(duì)于通用指標(biāo)“有幫助”,InstructGPT給了一些屬于“有幫助”行為的示例,如下所示?!び们逦恼Z(yǔ)言寫(xiě)作?!せ卮鹚麄兿雴?wèn)的問(wèn)題,即使問(wèn)錯(cuò)了,也要回答?!?duì)國(guó)際性敏感(比如“football”不應(yīng)該指美式足球,“總統(tǒng)”不一定指美國(guó)總統(tǒng))?!と绻噶睿╥nstruction)太讓人困惑,要求澄清并解釋指令為什么讓人困惑。·不給出過(guò)長(zhǎng)或冗長(zhǎng)的答案,或重復(fù)問(wèn)題中的信息?!げ辉诮o定的內(nèi)容之外假設(shè)無(wú)關(guān)的額外上下文,除非是關(guān)于世界的事實(shí),或是任務(wù)的隱含部分。比如,如果要求“禮貌地回復(fù)這封電子郵件:{郵件內(nèi)容}”,則輸出不應(yīng)該假設(shè)“我這次不能來(lái),但下周末有空”。但如果要求“給蘇格拉底寫(xiě)一封電子郵件”,則可以放心地使用上面的假設(shè)。筆者相信實(shí)際上這個(gè)列表可能很長(zhǎng),有很多例子會(huì)在實(shí)際標(biāo)注過(guò)程中被依次添加進(jìn)去,直到能覆蓋絕大多數(shù)情況為止,即對(duì)于大部分要標(biāo)注的數(shù)據(jù),根據(jù)提供的細(xì)則很容易就判斷出來(lái)是否“有幫助”?,F(xiàn)在不妨停下來(lái)思考一下,如果一開(kāi)始就奔著這些細(xì)則設(shè)計(jì)獎(jiǎng)勵(lì)規(guī)則——只是想想就覺(jué)得不太現(xiàn)實(shí)。其他兩個(gè)通用指標(biāo)也有一些示例,這里不贅述,感興趣的讀者可以閱讀上面提到的筆者之前寫(xiě)的那篇文章,以及這篇文章最后所列的參考資料(因?yàn)橛行┪臋n資料在這篇文章中并沒(méi)有提及)。有了細(xì)則還沒(méi)完,接下來(lái)要解決的是指標(biāo)之間的沖突權(quán)衡問(wèn)題。因?yàn)檫@是一個(gè)比較任務(wù)(比較哪個(gè)輸出好),當(dāng)涉及多個(gè)指標(biāo)時(shí),一定會(huì)出現(xiàn)A指標(biāo)的一個(gè)結(jié)果好于另一個(gè)結(jié)果,但B指標(biāo)可能相反的情況。指標(biāo)越多,情況越復(fù)雜(好在只有三個(gè)指標(biāo))。對(duì)此,InstructGPT也給出了指導(dǎo)原則?!?duì)于大部分任務(wù),無(wú)害性和真實(shí)性比有幫助更加重要。·然而,如果一個(gè)輸出比另一個(gè)輸出更有幫助,或者該輸出只是稍微不那么真實(shí)或無(wú)害,又或者該任務(wù)似乎不屬于“高風(fēng)險(xiǎn)領(lǐng)域”(如貸款申請(qǐng)、醫(yī)療、法律咨詢等),則更有幫助的輸出得分更高?!ぎ?dāng)選擇同樣有幫助但以不同方式不真實(shí)或有害時(shí),問(wèn)自己哪個(gè)輸出更有可能對(duì)用戶(現(xiàn)實(shí)世界中受任務(wù)影響最大的人)造成傷害。這個(gè)輸出應(yīng)該排名較低。如果在任務(wù)中不清楚這一點(diǎn),則將這些輸出標(biāo)記為并列。對(duì)于邊界樣例的總體指導(dǎo)原則是,你更愿意從試圖幫助你完成此任務(wù)的客戶助理那里收到哪種輸出?這是一種設(shè)身處地的原則,把自己假想為任務(wù)提出者,然后問(wèn)自己期望得到哪種輸出??纯催@些,你是不是也覺(jué)得這一步?jīng)]那么容易了,它們雖然看起來(lái)沒(méi)那么“技術(shù)性”,想要很好地完成卻需要優(yōu)秀的設(shè)計(jì)能力、宏觀把控能力和細(xì)節(jié)感知能力。筆者更加相信這些細(xì)則是自底向上逐步構(gòu)建起來(lái)的,而不是一開(kāi)始就設(shè)想好的。它一定是在實(shí)踐中不斷產(chǎn)生疑惑,然后經(jīng)過(guò)仔細(xì)分析權(quán)衡,逐步加入一條條規(guī)則,最終逐步構(gòu)建起來(lái)的一整套系統(tǒng)方案。筆者覺(jué)得這套系統(tǒng)方案可能是比數(shù)據(jù)還要珍貴的資產(chǎn),它所產(chǎn)生的壁壘是用時(shí)間不斷實(shí)踐堆積出來(lái)的。InstructGPT或ChatGPT相比GPT-3有更強(qiáng)的零樣本能力,少樣本很多時(shí)候已經(jīng)用不著,但提示詞還是需要的,由此催生了一個(gè)新的行當(dāng)——提示工程。不過(guò),據(jù)OpenAI的CEO在一次采訪中所言,再過(guò)幾年提示工程也不需要了(可能在生成圖片時(shí)還需要一些),用戶要做的就是直接通過(guò)自然語(yǔ)言和人工智能交互。我們無(wú)法判斷他說(shuō)的會(huì)不會(huì)真的實(shí)現(xiàn),但有一點(diǎn)可以肯定,人工智能的門(mén)檻必定會(huì)進(jìn)一步降低,再過(guò)幾年,可能一名初中生都能通過(guò)已有的服務(wù)創(chuàng)造出不錯(cuò)的人工智能應(yīng)用。1.4本章小結(jié)我們正在經(jīng)歷并進(jìn)入一個(gè)新的時(shí)代,大語(yǔ)言模型作為一個(gè)外部“最強(qiáng)大腦”,未來(lái)一定會(huì)非常容易地被每個(gè)人獲取,至于用來(lái)做什么,取決于你的想象力。無(wú)論對(duì)于哪個(gè)行業(yè),相信這都是一個(gè)令人振奮的信號(hào),筆者就經(jīng)常激動(dòng)到夜不能寐。面對(duì)這種大變革,我們能做什么呢?筆者不知道,未來(lái)有太多可能,但我們相信最好的辦法就是擁抱它。讓我們擁抱大語(yǔ)言模型,一起創(chuàng)造時(shí)代,創(chuàng)造未來(lái)。我們相信世界必將因此而變得更加美好。第2章相似匹配——萬(wàn)物皆可Embedding第1章簡(jiǎn)單介紹了Embedding的概念,我們知道了Embedding可以用來(lái)表示一個(gè)詞或一句話。讀者可能會(huì)有困惑:這和ChatGPT或大語(yǔ)言模型有什么關(guān)系?為什么需要Embedding?在哪里需要Embedding?這三個(gè)問(wèn)題可以簡(jiǎn)單用一句話來(lái)概括回答:因?yàn)樾枰@取“相關(guān)”上下文。具體來(lái)說(shuō),NLP領(lǐng)域的不少任務(wù)以及大語(yǔ)言模型的應(yīng)用都需要一定的上下文知識(shí),而Embedding表示技術(shù)就是用來(lái)獲取這些上下文的。這一過(guò)程在NLP領(lǐng)域中也被叫作相似匹配——把相關(guān)內(nèi)容轉(zhuǎn)成Embedding表示,然后通過(guò)Embedding相似度來(lái)獲取最相關(guān)內(nèi)容作為上下文。在本章中,我們將首先進(jìn)一步了解相似匹配的基礎(chǔ)知識(shí),尤其是如何更好地表示一段自然語(yǔ)言文本,以及如何衡量Embedding的相似程度。接下來(lái),我們將介紹ChatGPT相關(guān)接口的用法,其他類似接口的用法也差不多。最后,我們將介紹與Embedding相關(guān)的幾個(gè)任務(wù)和應(yīng)用,這里面有些可以用大語(yǔ)言模型解決,但也可以不用大語(yǔ)言模型解決。無(wú)論是ChatGPT還是其他大語(yǔ)言模型,它們都只是我們工具箱中的工具,我們將側(cè)重任務(wù)和應(yīng)用,重點(diǎn)介紹如何解決此類問(wèn)題。我們期望讀者能在閱讀的過(guò)程中感受到目的和方法的區(qū)別,方法無(wú)論如何,總歸是為目的服務(wù)的。2.1相似匹配基礎(chǔ)2.1.1更好的Embedding表示1.Embedding表示技術(shù)回顧首先,我們簡(jiǎn)單回顧一下第1章介紹的Embedding表示技術(shù)。對(duì)于自然語(yǔ)言,因?yàn)檩斎胧且欢挝谋荆谥形睦锞褪且粋€(gè)一個(gè)字,或一個(gè)一個(gè)詞,業(yè)內(nèi)把這個(gè)字或詞叫作Token。如果要使用模型,拿到一段文本的第一件事,就是把這段文本Token化。當(dāng)然,可以按字,也可以按詞,或按你想要的其他方式,比如每?jī)蓚€(gè)字一組或每?jī)蓚€(gè)詞一組。我們來(lái)看下面這個(gè)例子?!そo定文本:人工智能讓世界變得更美好?!ぐ醋諸oken化:人工智能讓世界變得更美好?!ぐ丛~Token化:人工智能讓世界變得更美好?!ぐ醋諦i-GramToken化:人/工工/智智/能能/讓讓/世世/界界/變變/得得/更更/美美/好好/?!ぐ丛~Bi-GramToken化:人工智能/讓讓/世界世界/變得變得/更更/美好美好/。于是自然地就有了一個(gè)新的問(wèn)題:我們應(yīng)該怎么選擇Token化方式?其實(shí)每種不同的方式都有優(yōu)點(diǎn)和不足,英文一般用子詞表示,中文以前常見(jiàn)的是字或詞的方式,中文的大語(yǔ)言模型基本都使用字+詞的方式。如第1章所述,這種方式一方面能夠更好地表示語(yǔ)義,另一方面對(duì)于沒(méi)見(jiàn)過(guò)的詞又可以用字的方式來(lái)表示,避免了在遇到不在詞表中的詞時(shí)導(dǎo)致的無(wú)法識(shí)別和處理的情況。Token化之后,第二件事就是要怎么表示這些Token,我們知道計(jì)算機(jī)只能處理數(shù)字,所以要想辦法把這些Token變成計(jì)算機(jī)所能識(shí)別的數(shù)字才行。這里需要一個(gè)詞表,將每個(gè)詞映射成詞表中對(duì)應(yīng)位置的序號(hào)。以上面的句子為例,假設(shè)以字為粒度,那么詞表就可以用一個(gè)文本文件來(lái)存儲(chǔ),內(nèi)容如下。人工智能讓世界變得更美好一行一個(gè)字,將每個(gè)字作為一個(gè)Token,此時(shí),0=我,1=們,…,以此類推,我們假設(shè)詞表大小為N。這里有一點(diǎn)需要注意,就是詞表的順序無(wú)關(guān)緊要,不過(guò)一旦確定下來(lái),訓(xùn)練好模型后就不能再隨便調(diào)整了。這里所說(shuō)的調(diào)整包括調(diào)整順序、增加詞、刪除詞、修改詞等。如果只是調(diào)整順序或刪除詞,則不需要重新訓(xùn)練模型,但需要手動(dòng)將Embedding參數(shù)也相應(yīng)地調(diào)整順序或刪除對(duì)應(yīng)行。如果是增改詞表,則需要重新訓(xùn)練模型,獲取增改部分的Embedding參數(shù)。接下來(lái)就是將這些序號(hào)(TokenID)表示成稠密向量(Embedding表示),背后的主要思想如下?!ぐ烟卣鞴潭ㄔ谀硞€(gè)維度D,比如256、300、768等,這個(gè)不重要,總之不再是詞表那么大的數(shù)字?!だ米匀徽Z(yǔ)言文本的上下文關(guān)系學(xué)習(xí)一個(gè)由D個(gè)浮點(diǎn)數(shù)組成的稠密向量。接下來(lái)是Embedding的學(xué)習(xí)過(guò)程。首先,隨機(jī)初始化一個(gè)NumPy數(shù)組,就像下面這樣。importnumpyasnprng=np.random.default_rng(42)#詞表大小N=16,維度D=256table=rng.uniform(size=(16,256))table.shape==(16,256)假設(shè)詞表大小為16,維度為256,初始化后,我們就得到了一個(gè)16×256大小的二維數(shù)組,其中的每一行浮點(diǎn)數(shù)就表示對(duì)應(yīng)位置的Token。接下來(lái)就是通過(guò)一定的算法和策略來(lái)調(diào)整(訓(xùn)練)里面的數(shù)字(更新參數(shù))。當(dāng)訓(xùn)練結(jié)束時(shí),最終得到的數(shù)組就是詞表的Embedding表示,也就是詞向量。這種表示方法在深度學(xué)習(xí)早期(2014年左右)比較流行,不過(guò)由于這個(gè)矩陣在訓(xùn)練好后就固定不變了,因此它在有些時(shí)候就不合適了。比如,“我喜歡蘋(píng)果”這句話在不同的情況下可能是完全不同的意思,因?yàn)椤疤O(píng)果”既可以指水果,也可以指蘋(píng)果手機(jī)。我們知道,句子才是語(yǔ)義的最小單位,相比Token,我們其實(shí)更加關(guān)注和需要句子的表示。而且,如果我們能夠很好地表示句子,則由于詞也可以被看作一個(gè)很短的句子,表示起來(lái)自然也不在話下。我們還期望可以根據(jù)不同上下文動(dòng)態(tài)地獲得句子的表示。這中間經(jīng)歷了比較多的探索,但最終走向了在模型架構(gòu)上做設(shè)計(jì)——輸入任意一段文本,模型經(jīng)過(guò)一定計(jì)算后,就可以直接獲得對(duì)應(yīng)的向量表示。2.如何更好地表示前面我們都將模型當(dāng)作黑盒,默認(rèn)輸入一段文本就會(huì)給出一個(gè)表示。但這中間其實(shí)也有不少細(xì)節(jié),具體來(lái)說(shuō),就是如何給出這個(gè)表示。下面我們介紹幾種常見(jiàn)的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 錢(qián)江大橋橋墩施工方案
- 2025年時(shí)代青春面試試題及答案
- 2025年煤礦安全規(guī)程試題及答案
- 公路干線物流自動(dòng)駕駛行業(yè)研究報(bào)告
- 2025年遇到好難的面試題及答案
- 低溫低濁水處理成功案例
- cc結(jié)構(gòu)域蛋白互作
- 4年級(jí)上冊(cè)語(yǔ)文19課
- ansys結(jié)構(gòu)計(jì)算軸向加速度
- 樹(shù)木移植的施工方案
- 雙新背景下小學(xué)英語(yǔ)單元整體作業(yè)設(shè)計(jì)與優(yōu)化探索 論文
- 全過(guò)程造價(jià)咨詢服務(wù)實(shí)施方案
- 實(shí)用參考從合規(guī)到績(jī)效:宋志平談央企學(xué)習(xí)型董事會(huì)建設(shè)
- GB/T 912-2008碳素結(jié)構(gòu)鋼和低合金結(jié)構(gòu)鋼熱軋薄鋼板和鋼帶
- GB/T 26480-2011閥門(mén)的檢驗(yàn)和試驗(yàn)
- 中共一大會(huì)址
- 云南省煙草買賣合同(標(biāo)準(zhǔn)版)
- 2023個(gè)人獨(dú)資企業(yè)清算報(bào)告(精選4篇)
- 衛(wèi)生統(tǒng)計(jì)學(xué)(全套課件)
- 2021年6月浙江省高考讀后續(xù)寫(xiě)課件-高考英語(yǔ)復(fù)習(xí)備考
- 小學(xué)古詩(shī)詞80首(硬筆書(shū)法田字格)
評(píng)論
0/150
提交評(píng)論