GPT時(shí)代學(xué)算法:詞向量
這一篇文章我們來(lái)聊詞向量。
其實(shí)關(guān)于詞向量我們?cè)谥暗奈恼庐?dāng)中也曾經(jīng)討論過(guò),不過(guò)當(dāng)時(shí)我們是使用的樸素的onehot的方法來(lái)操作的。
我們當(dāng)時(shí)曾經(jīng)說(shuō)了,這是一種已經(jīng)過(guò)時(shí)的方法,現(xiàn)在已經(jīng)沒(méi)有人還在用了。因?yàn)槲覀円呀?jīng)有了更好的方法,這種方法就是Word2vec。它能構(gòu)建出非常出色的詞向量的表達(dá),為后來(lái)NLP領(lǐng)域的發(fā)展,甚至是如今大模型的出現(xiàn)打下了基礎(chǔ),可想而知它的重要性。
NPLM原理
表面上來(lái)看Word2vec只不過(guò)是一種將單詞轉(zhuǎn)化成向量,或者說(shuō)根據(jù)文本生成向量的技術(shù)。但在它的背后,有著一套非常嚴(yán)謹(jǐn)且科學(xué)的理論體系,這套理論體系和GPT模型的原理是一以貫之的。這套體系基于概率論,稱(chēng)為概率語(yǔ)言模型。
我們都知道自然語(yǔ)言非常復(fù)雜,就比如大多數(shù)人都學(xué)過(guò)好幾年的英語(yǔ),但真正碰到外國(guó)人還是免不了抓瞎,明明背了幾千個(gè)單詞,但一句完整的句子都說(shuō)不連貫。在我們?nèi)祟?lèi)眼里,自然語(yǔ)言是無(wú)比復(fù)雜的。
除了各種詞句、用法、固定搭配之外,還有豐富且靈活的語(yǔ)法,還有很多生僻詞,網(wǎng)絡(luò)流行詞等等。所以我們希望通過(guò)代碼和顯式的規(guī)則構(gòu)建出這樣一個(gè)語(yǔ)言模型幾乎是不可能的,它的復(fù)雜度超過(guò)了我們的想象。
早年的時(shí)候關(guān)于如何構(gòu)建語(yǔ)義模型也分為了兩派,一派認(rèn)為應(yīng)該針對(duì)語(yǔ)法規(guī)則建模,通過(guò)構(gòu)建詳細(xì)的語(yǔ)法結(jié)構(gòu)來(lái)提升模型的效果。另外一派認(rèn)為應(yīng)該走統(tǒng)計(jì)流,即不刻意構(gòu)建語(yǔ)法,而是通過(guò)大量的語(yǔ)料讓模型自己學(xué)習(xí)到其中的規(guī)律,即模仿人類(lèi)學(xué)習(xí)語(yǔ)言的過(guò)程。
雙方爭(zhēng)執(zhí)不下,經(jīng)過(guò)一段時(shí)間的競(jìng)爭(zhēng)之后,統(tǒng)計(jì)流派逐漸占據(jù)了上風(fēng),模型的泛化能力越來(lái)越強(qiáng),在更多的任務(wù)和問(wèn)題中展現(xiàn)了越來(lái)越好的效果。而相反,語(yǔ)法規(guī)則流則漸漸沒(méi)落,如今已經(jīng)幾乎無(wú)人問(wèn)津了。
關(guān)于這點(diǎn)有一個(gè)著名的笑話,說(shuō)是早年雙方還沒(méi)有分出勝負(fù)的時(shí)候,有某個(gè)國(guó)際上著名的NLP團(tuán)隊(duì)分享了自己的經(jīng)驗(yàn)心得:團(tuán)隊(duì)中每開(kāi)除一名語(yǔ)言學(xué)家,模型的效果就會(huì)提升。
圖片
統(tǒng)計(jì)學(xué)派的理論簡(jiǎn)單粗暴,一切都是概率。比如NLP中著名的N元語(yǔ)義模型,它做了一個(gè)大膽地假設(shè):放棄所有語(yǔ)法限制,只考慮單詞和單詞之間的概率關(guān)系。認(rèn)為句子中的每一個(gè)單詞只和它之前的N個(gè)單詞有關(guān)。
比如說(shuō),小王遲到了,他被公司___。理論上來(lái)說(shuō),如果N足夠大,并且模型見(jiàn)過(guò)的樣本足夠多,它就會(huì)知道在這句話后面出現(xiàn)懲罰的概率是最大的。
但同樣,這里的N越大,模型的參數(shù)空間也就越大,那么收斂需要的樣本就越多,模型的運(yùn)算就越慢。
所以在實(shí)際使用中,N的取值往往比較小,比如最常見(jiàn)的就是2或者3。通常當(dāng)N=3時(shí),模型就已經(jīng)足夠在大多數(shù)場(chǎng)景中表現(xiàn)出色了。
當(dāng)N=3時(shí),也就是說(shuō)我們認(rèn)為在句子當(dāng)中,每一個(gè)單詞只和它之前的3個(gè)單詞有關(guān)。也就是說(shuō)我們希望模型學(xué)習(xí)這樣一個(gè)函數(shù):
也就是根據(jù)前N個(gè)單詞,預(yù)測(cè)出最有可能出現(xiàn)的下一個(gè)單詞。
GPT模型能夠根據(jù)我們的問(wèn)題生成回答,看起來(lái)非常神奇,但其實(shí)內(nèi)部也采用了類(lèi)似的原理。模型會(huì)不停地根據(jù)之前的文本預(yù)測(cè)下一個(gè)最有可能出現(xiàn)的單詞(token)。如此循環(huán)往復(fù)來(lái)生成的回答,并非是一口氣一下子輸出的。
模型結(jié)構(gòu)
我們來(lái)設(shè)想一下訓(xùn)練好之后的NGram模型的結(jié)構(gòu),根據(jù)我們剛才的說(shuō)明,它能夠根據(jù)文本中連續(xù)的N個(gè)單詞預(yù)測(cè)下一個(gè)單詞。那么它的輸入和輸出分別是怎樣的呢?或者說(shuō)輸入和輸出的維度是多少呢?
可能一些人會(huì)想當(dāng)然地以為模型有N個(gè)輸入,一個(gè)輸出。這N個(gè)輸入就是這N個(gè)單詞,一個(gè)輸出就是下一個(gè)可能連接在這N個(gè)單詞之后的單詞。
但仔細(xì)想就會(huì)發(fā)現(xiàn)這是有問(wèn)題的,我們?nèi)祟?lèi)在根據(jù)上文猜測(cè)下文的時(shí)候,我們大腦中除了有上文的信息之外,還有一個(gè)潛在的詞表信息,即我們知道一共有哪些單詞。映射到模型當(dāng)中也是一樣的,只有上下文信息是不夠的,模型同樣也需要詞表信息,知道有哪些單詞可選。
不過(guò)這個(gè)詞表我們不是作為輸入傳進(jìn)去的,而是直接集成在模型輸出中的,模型在輸出的時(shí)候,并不是憑空蹦出來(lái)的結(jié)果,而是預(yù)測(cè)了詞表中每個(gè)單詞可能出現(xiàn)的概率。所以模型的結(jié)構(gòu)大概是這樣的:
圖片
詳細(xì)觀察一下上圖,輸入是document,它表示的是N個(gè)單詞的組合。然后有一個(gè)中間層,我們假設(shè)中間層的維度是,輸出層的維度是。這里的V指的是詞表,而F指的是一些附加信息,比如類(lèi)似停用詞之類(lèi)的標(biāo)點(diǎn)符號(hào)的集合。
這個(gè)模型訓(xùn)練好了之后,看起來(lái)有些無(wú)趣,好像沒(méi)什么特殊的用處。受制于模型的復(fù)雜度不高,它也不能生成什么像樣的內(nèi)容。
但突然有一天一位大佬突發(fā)奇想,如果我們訓(xùn)練好了模型之后,一次只輸入一個(gè)單詞的話,對(duì)于不同的單詞,中間層這d個(gè)節(jié)點(diǎn)的參數(shù)值似乎都是獨(dú)一無(wú)二的。
既然如此,我們能不能利用d這個(gè)節(jié)點(diǎn)的參數(shù)值來(lái)反向表示這個(gè)單詞呢?也就是說(shuō),我們把原本一個(gè)自然語(yǔ)言中的詞語(yǔ)轉(zhuǎn)化成了一個(gè)數(shù)學(xué)上的向量。我們能不能把這個(gè)向量當(dāng)做是這個(gè)單詞的全部信息呢?
光猜當(dāng)然是沒(méi)用的,需要實(shí)際試一下。
經(jīng)過(guò)實(shí)驗(yàn)之后,大家發(fā)現(xiàn)效果非常好。通過(guò)這種方式生成的向量展現(xiàn)出了許多特性,比如含義相近的單詞轉(zhuǎn)化成的向量在空間上也非常接近。
貓和狗雖然是不同的動(dòng)物,但是它們?cè)诳臻g中的向量表示很近似。這很好理解,因?yàn)樵诰渥赢?dāng)中它們常常是能夠進(jìn)行替換的。
比如我喜歡貓,因?yàn)樗偸菓醒笱蟮摹?/p>
把這句話中的貓換成狗,雖然賓語(yǔ)變了,但句子整體的意思也大差不差。
不僅如此,更神奇的是,這些向量還保留了一些向量本身的數(shù)學(xué)性質(zhì)。比如我們用king和queen兩個(gè)向量做差值,這個(gè)結(jié)果和man與woman的向量差值同樣非常接近。也就是說(shuō)queen = woman + king - man。
圖片
后來(lái),我們給通過(guò)這種方式生成的向量起了一個(gè)名字叫做embedding,這個(gè)詞的中文翻譯是嵌入的意思,但由于不是非常貼切的原因,業(yè)界一般不用嵌入這個(gè)中文詞,依然還是使用embedding的英文,或者稱(chēng)為向量。將單詞轉(zhuǎn)化成embedding的方法也就叫做Word2vec。
時(shí)至今日,深度學(xué)習(xí)高速發(fā)展,我們?cè)缫呀?jīng)對(duì)各種東西的embedding不陌生。但回過(guò)頭來(lái)看,這么一個(gè)小小創(chuàng)新的影響力是非常驚人的。無(wú)論是語(yǔ)言概率模型的思想還是將單詞這種原本很難表達(dá)的內(nèi)容轉(zhuǎn)化成向量的方法,都奠定了之后自然語(yǔ)言處理領(lǐng)域乃至整個(gè)深度學(xué)習(xí)領(lǐng)域的基礎(chǔ)。如今看起來(lái)不可思議的ChatGPT的最底層基石,同樣是詞向量和語(yǔ)言概率模型。