詞向量背后精妙的數(shù)學(xué)
來自 |?知乎? ?作者 | 潘小小
詞向量在NLP領(lǐng)域已經(jīng)是一個通用的預(yù)處理方法了。隨遇幾乎所有處理語言的程序,它們現(xiàn)在的默認輸入就已經(jīng)是詞向量了。然而,對于最簡單的word2vec,我們似乎仍有一些不了解的地方。
? ?Word2Vec的Skip-gram架構(gòu)
Word2Vec的核心思想,就是要用一些較短的向量來表示不同的詞。而向量與向量之間的關(guān)系,則可以表示詞與詞之間的關(guān)系??偨Y(jié)來說,常常使用的有兩種關(guān)系:
首先是向量之間的夾角,用以表示詞與詞之間「含義的相似度」。夾角越小,方向就越一致,詞的意思也就越相似。另一種關(guān)系,則是詞語含義的隱藏維度。這里有一個非常著名的例子:

兩邊各自做減法,得到的差向量居然幾乎一樣。這種現(xiàn)象的出現(xiàn),正是因為word2vec的詞向量中還隱藏著詞語的抽象維度。國王的向量,減去王后的向量,就恰好得到了性別的維度。

正式這兩個重要的性質(zhì),賦予了詞向量強大的力量。
要實現(xiàn)這一性質(zhì),核心在于定義什么叫「相似」。
符號、字形、發(fā)音,這些都不重要,最重要的是關(guān)系。
兩個詞,「貓」、「狗」,它們都和「寵物、擼、可愛、動物……」一起出現(xiàn),那「貓」和「狗」就很相似。這就是結(jié)構(gòu)主義的思想。
為了方便后面論述,我們稱「寵物、擼、可愛、動物」等與「貓」一起出現(xiàn)的詞為「貓的上下文」。貓則是「目標(biāo)詞」。
這個時候,如果我們給貓、狗各一個向量,并要求用這個向量預(yù)測它們的上下文,就是所謂的skip-gram算法。由于它們的上下文幾乎一樣,所以作為輸入的詞向量也會幾乎一樣。這樣,我們就實現(xiàn)了一個重要的目標(biāo):上下文相似的幾個詞語,它們的詞向量也相似。
更準(zhǔn)確的,對于兩個共同出現(xiàn)的詞語i與j,我們會要求優(yōu)化一個loss函數(shù)l:

在這個函數(shù)中,第一部分就是預(yù)測的部分。向量?
?與向量?
?做內(nèi)積,內(nèi)積越大loss就會越小。我們還可以從預(yù)測的角度來看這個內(nèi)積,?
?越大,代表模型認為i與j共同出現(xiàn)的概率越大。從而,用這種方法,我們可以用詞向量的點積預(yù)測它的上下文。
函數(shù)的第二部分稱為「負采樣」,我們從一個分布?
?中隨機采樣出一個詞n,然后會希望?
?越小越好。
從直覺上看,這個優(yōu)化過程在做兩件事:
讓相連的詞的詞向量?
?與?
?靠近;讓不相連的詞的詞向量?
?與?
?遠離。
這里有一個至關(guān)重要的細節(jié):我們拉近的不是?
?與?
?,而是?
?與?
?。這意味著,詞向量嵌入并不是簡單的把共同出現(xiàn)的詞拉近,而是將詞與它的上下文拉近。在這里,w是詞的嵌入,而v是上下文的嵌入。正是通過這個方法,實現(xiàn)了開頭對于「相似」的定義——擁有相似上下文的詞,其詞向量嵌入也相似。

? ?詞向量的兩個空間
詞向量嵌入的兩個空間常常被人忽視。在實際應(yīng)用中,使用的也通常只是詞的嵌入,也就是w。但是,w與v放在一起,才可以得到最完整的信息。在一篇叫做《Improving Document Ranking with Dual Word Embeddings》[1]的小眾論文中,作者展示了這樣一個有意思的表格:

表格中的IN代表詞的嵌入,也就是上面說的w;OUT代表上下文的嵌入,也就是前面說的v。舉個例子,如果考察Yale(耶魯)這個詞,那么與Yale的詞嵌入最近的詞嵌入是Harvard, NYU, Cornell這樣的大學(xué)。它們都有相同的性質(zhì),那就是「它們都是大學(xué)」。
但如果考察Yale的詞嵌入與上下文嵌入的關(guān)系,就會出現(xiàn)一個有趣的現(xiàn)象:在上下文的空間中,與Yale的詞空間向量嵌入最接近變成了faculty, alumni, orientation這樣的詞匯。它們都是大學(xué)之中的事物。實際上,它們就對應(yīng)了數(shù)據(jù)中共同出現(xiàn)的詞匯。
作者還實驗了使用IN-OUT替代IN-IN做一些工程實驗,取得了比之前更好的結(jié)果。但這里我們按下不表,相比于工程的成功,這個細節(jié)可以引出一個更有意思的觀點——Skip-gram的詞向量嵌入,實際上是在做(加權(quán)的)矩陣分解。
? ?Skip-gram的數(shù)學(xué)
現(xiàn)在我們知道了詞向量嵌入存在兩個空間,w與v。對于?
?與?
?,它們點乘總能得到一個標(biāo)量?
?。我們可以反過來看,認為詞向量的訓(xùn)練就是在對?
?做矩陣分解。
那么,問題就來了,M 矩陣是什么?
要回答這個問題,就要從頭對skip-gram的數(shù)學(xué)做一個推導(dǎo)。2014年的這篇文章[2]給出了詳細的推導(dǎo),這里我簡略的敘述一下。
在一開始,我給出了對于共同出現(xiàn)的兩個詞i與j貢獻的loss值:

對于真正的訓(xùn)練,其loss實際上要乘上(i,j)出現(xiàn)的的概率。所以,理論上的loss期望值是:

也就是:

這里用?
?代表數(shù)據(jù)中i,j共同出現(xiàn)的概率,以及出現(xiàn)i的邊緣分布。用?
?表示負采樣的概率分布。通過這種方法,我們就消去了一開始的?
?,式子中就只有一個?
?了。
令?
?,原式變?yōu)椋?/p>

這樣,我們就只需要求?
?的解,就能得知M的形式了:

可以很容易地解得:

這個形式就很有意思了。我們考慮兩種負采樣的分布,一種令?
?,用數(shù)據(jù)中的出現(xiàn)頻率作為負采樣;另一種令?
?為一個均勻的負采樣,N是詞的總量。
帶入前者,得到的就是?
?,其中PMI就是Pointwise Mutual Information的簡稱,即「點互信息」,描述的是詞i與詞j之間的一種相關(guān)性,即:知道了詞i出現(xiàn)后,對于詞j是否出現(xiàn)的不確定度的消減程度。其值越高,意味著i與j的正向關(guān)聯(lián)越大。
而如果帶入后者,?
?,就會得到?
?,也就是條件概率的對數(shù)。
同時,我們也能看到一個有意思的結(jié)果——負采樣是必須的,而不是錦上添花的「優(yōu)化」。不做負采樣,就意味著k=0。要使得loss最小,M就必須逼近正無窮大。而只要對每一對數(shù)據(jù)做一次負采樣,就足以消除這種可能性。
? ?詞向量究竟在做什么?
有了前面的理論基礎(chǔ),我們終于可以討論詞向量的行為了。詞向量在對什么進行建模?兩個詞的詞向量(w)如果相似,到底是什么相似?
答案呼之欲出——詞向量在對PMI或者是條件概率進行建模。具體是哪一種,要取決于負采樣的方式。詞向量通過矩陣分解的方式將PMI(或條件概率)矩陣降維,得到我們所需的向量。
詞向量分解相比于SVD的一個好處,在于這里的分解還是加權(quán)的!經(jīng)常出現(xiàn)的詞,其重構(gòu)的誤差就越??;而少量出現(xiàn)的詞,其誤差的容忍度就越大。這是傳統(tǒng)SVD難以做到的。
而要討論「詞向量的相似」是什么意思,可以以PMI作為例子,來看一個具體的問題:如果兩個詞,例如「貓」、「狗」的詞向量相似,到底意味著什么相似?我們來看看下面這張圖:

對于一個有N個詞、嵌入到d維的詞向量訓(xùn)練結(jié)果,當(dāng)貓與狗的詞向量幾乎一樣時,其意味著點乘得到的PMI矩陣的貓、狗行向量幾乎一樣。
這說明,詞向量(w)相似,意味著兩個詞與其他所有詞的PMI都相似。換成另一種負采樣,就是兩個詞的上下文的條件概率相似。
這里有一個非常值得思考的現(xiàn)象:我們直接訓(xùn)練的是w與v,而M作為w與v的函數(shù),是一個非常有意義的量。我們?nèi)绾螌⑦@個過程反轉(zhuǎn)過來——我需要PMI,如何設(shè)計一個簡潔優(yōu)雅的訓(xùn)練?而且,直接被訓(xùn)練的還不一定是PMI。
參考
^Nalisnick, E., Mitra, B., Craswell, N., & Caruana, R. (2016, April). Improving document ranking with dual word embeddings. In Proceedings of the 25th International Conference Companion on World Wide Web (pp. 83-84).?https://www.microsoft.com/en-us/research/wp-content/uploads/2016/04/pp1291-Nalisnick.pdf ^Levy, O., & Goldberg, Y. (2014). Neural word embedding as implicit matrix factorization. In Advances in neural information processing systems (pp. 2177-2185).?http://papers.nips.cc/paper/5477-neural-word-embedding-as-implicit-matrix-factorization.pdf
—完— 推薦閱讀: Pandas數(shù)據(jù)可視化原來也這么厲害 畫圖神器pyecharts-旭日圖 刷爆網(wǎng)絡(luò)的動態(tài)條形圖,3行Python代碼就能搞定 Python中讀取圖片的6種方式 2020年11月國內(nèi)大數(shù)據(jù)競賽信息-獎池5000萬 Python字典詳解-超級完整版 刷爆網(wǎng)絡(luò)的動態(tài)條形圖,3行Python代碼就能搞定 一個有意思還有用的Python包-漢字轉(zhuǎn)換拼音
學(xué)習(xí)交流群
↓掃碼關(guān)注本號↓
