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