NLP 笔记:Skip-gram
1 skip-gram舉例
假設在我們的文本序列中有5個詞,[“the”,“man”,“loves”,“his”,“son”]。
假設我們的窗口大小skip-window=2,中心詞為“loves”,那么上下文的詞即為:“the”、“man”、“his”、“son”。這里的上下文詞又被稱作“背景詞”,對應的窗口稱作“背景窗口”。
跳字模型能幫我們做的就是,通過中心詞“loves”,生成與它距離不超過2的背景詞“the”、“man”、“his”、“son”的條件概率,用公式表示即:
????????????????????????????????
進一步,假設給定中心詞的情況下,背景詞之間是相互獨立的,公式可以進一步得到
? ? ? ? ? ??
用概率圖表示為:
可以看得出來,這里是一個一對多的情景,根據一個詞來推測2m個詞,(m表示背景窗口的大小)。
2 skip-gram 逐步解析
2.1??one-hot word symbol(編碼)
在NLP學習筆記:word2vec_劉文巾的博客-CSDN博客?中我們說過 one-hot編碼有很多的弊端(需要的空間很冗余,且無法反映單詞之間的相似程度)。
但是計算機沒辦法識別“字符”,所有的數據必須先轉化成二進制的編碼形式,one-hot編碼就是最便捷的一種表達方式了。(這里的one-hot只是一種過渡)
2.2?詞嵌入(word embedding)
但是,one-hot表達的向量過于稀疏。我們需要用一個稠密的向量來表示單詞空間。(這個向量是可以在空間中表征一定單詞的含義)
我們必須先初始化一些這樣的表示單詞的稠密向量,然后通過學習的方式來更新向量的值(權重),然后得到我們最終想要的向量。
2.1中得到的每一個單詞的one-hot編碼,都需要映射到一個稠密的向量編碼中。
這個映射過程,就被稱作是嵌入(embedding),因為是單詞的映射,所以被叫做詞嵌入(word embedding)。
假設我們要把一個單詞映射到一個300維(這個300維是經過大量的實驗得出的,一般的映射范圍是200-500維)的向量中,那么我們直觀的做法就是:矩陣運算。
因為我們每個單詞現在的情況是N維的一個向量(N是字典中單詞的數量),如果映射到300維,需要的權重矩陣就是N ? 300,這樣得到的矩陣就是一個1 ? 300的矩陣(向量)。
2.2.1 詞嵌入舉例
假設我們字典中有5個單詞(即N=5),那么word embedding如下圖所示:
通過上圖,我們可以發現一個規律:
計算出來的這個“稠密的”向量,和我們單詞在one-hot編碼表的位置是有關系的。
如果單詞的one-hot編碼中,第i維是1,那么生成的稠密詞向量就是編碼表的第i行。
所以我們word embedding生成稠密詞向量的過程,就是一個查找編碼表的過程。而這個編碼表,我們可以想成是一個神經網絡的隱藏層(這個隱藏層沒有激活函數)。通過這個隱藏層,我們把one-hot編碼映射到一個低維度的空間里面。
3 skip-gram 數學原理
在skip-gram中,每個詞被表示成兩個d維向量,用來計算條件概率。
假設這個詞在詞典中索引為i,當它為中心詞時向量表示為 ,而為背景詞時向量表示為。
設中心詞在詞典中索引為c,背景在詞典中索引為o,給定中心詞生成一個背景詞的條件概率可以通過對向量內積做softmax運算而得到:
可以想成是以c為中心詞,o為背景詞的概率權重;
分母相當于以c為中心詞,生成其他各個詞的概率權重。
所以二者一除就是給定中心詞生成某一個背景詞的條件概率
由上面那個式子,我們可以得到:每一個中心詞,推斷兩邊分別m個位置的背景詞的概率:
其中,t表示窗口中心詞的位置;m表示推斷窗口的大小
我們為了求出“最好”的word embedding,可以最大化上面那個概率。
基于此,我們可以使用最大似然估計的方法。
但是一個函數的最大值往往不容易計算,因此,我們可以通過對函數進行變換,從而改變函數的增減性,以便優化。
其中,我們把帶到上式中,可以得到
通過上面一段的操作,我們把一個求最大值的問題轉換成了一個求最小值的問題。
求最小值,我們可以使用梯度下降法。
在優化之前,我們要搞清楚我們優化的目標是那個,哪些是參數。
我們要做一個假設,在對中心詞權重更新時,背景詞的權重是固定的,然后在以同樣的方式來更新背景詞的權重。
接下來我們求導計算梯度
這里就計算出來了中心詞的梯度,可以根據這個梯度進行迭代更新。
對于背景詞的更新是同樣的方法。(就是上式不是對的偏導數,而是每個的偏導數了。
但是要注意背景詞的個數不是唯一的,所以更新的時候要逐個更新。
訓練結束后,對于詞典中的任一索引為i ii的詞,我們均得到該詞作為中心詞和背景詞的兩組詞向量和
還有一個小問題要說明一下:
在詞典中所有的詞都有機會被當做是中心詞和背景詞。在更新的時候,都會被更新一遍,這種時候該怎么確定一個詞的向量到底該怎么選擇呢?
——在NLP應用中,一般使用中心詞向量作為詞的表征向量。
4 skip-gram流程總結
1)one-hot編碼。
每個單詞形成V?1的向量;對于整個詞匯表就是V?V的矩陣。
2)word embedding 詞嵌入。
根據索引映射,將每個單詞映射到d維空間。
通過這樣的方式就可以將所有的單詞映射到矩陣W上(矩陣W的形狀為V?d),并且每個單詞與矩陣中的某列一一對應。
3)skip-gram模型訓練。
初始化一個d維空間的矩陣作為權重矩陣W ′ ,該矩陣的形狀為V ? d 。
值得注意的是,目前我們已經有了兩個d維空間的矩陣,要清楚這兩個矩陣都是干什么的。
矩陣W的每一行對應的是單詞作為中心詞時的向量。
這里初始化的矩陣W'的每一列則對應的是單詞作為背景詞時的向量。
每個詞都有機會成為中心詞,同時也會成為其他中心詞的背景詞,因為窗口一直再變動。
4)取出一個詞作為中心詞。該詞的詞向量(它的形狀為d維的向量1?d),與背景詞權重矩陣W‘中的其他詞做內積。
此時會得到一個背景詞的計算結果,即: (假設背景詞的索引為o)。
重復計算,我們可以得到作為中心詞的時候,字典中每一個詞作為背景詞的概率權重。(字典中有V個詞,我們就可以得到V個概率權重)
5)softmax層的映射。
在上一步中得到了V個背景詞的概率權重,那么此時我們需要做的就是計算某一個詞作為背景詞的條件概率,即
6)概率最大化。
skip-gram的學習相當于監督學習,我們是有明確的背景詞輸入的。(就是知道這個地方的背景詞應該是哪個)
我們期望窗口內的詞的輸出概率最大。因此我們的目標變為極大化概率。
在不影響函數單調性的前提下我們變為極大化函數: l(對數似然)。
但是,計算一個函數的最大值不如計算一個函數的最小值來的方便,因此這里給這個函數進行單調性變換:
7)極小化目標函數。
通過上面的變換,此時已經變為一個數學優化問題,梯度下降法更新參數。
8)更新中心詞的向量
后面減去的即為梯度:
9) 8對應的梯度里面,相比于5,又多了一層對于j的求和,這個下標代表的背景詞,m是窗口的大小。這么做才能與我們最初的設定相對應:一個中心詞,推斷多個背景詞。
10).根據同樣的原理,在窗口進行移動了之后,可以進行同樣的更新。
11.在詞匯表中所有的詞都被訓練之后。我們得到了每個詞的兩個詞向量分別為。是作為中心詞時的向量,我們一般用這個作為最終的選擇。對應的就是作為背景詞時的向量了。
?5 skip-gram 優化
我們現在有一個包含10000個單詞的詞匯表,向量特征為300維。
那么對于這個詞匯量的skip-gram,將會有兩個weights矩陣----一個隱藏層和一個輸出層。
這兩層都會有一個300x10000=3000000的權重矩陣。
在如此大的神經網絡上進行梯度下降是非常慢的,更加嚴重的是,我們需要大量訓練數據去調整權重,以及避免過擬合。
在論文“Distributed Representations of Words and Phrases and their Compositionality”中,主要有三種方式來優化skip-gram:
5.1 在模型中將共同出現的單詞對或者短語當做單個“詞”
比如像“Boston Globe”(“波士頓環球報”,一種報紙)這樣的單詞對,在作為單獨的“Boston”和“Globe”來進行看待的時候有著非常不同的含義。
所以在將它作為一整個“Boston Globe”來說是非常有意義的,不論它出現在文中哪里,都將一整個當成一個單詞來看待,并且有它自己的詞向量。
論文中使用了1千億個來自谷歌新聞數據集的單詞來進行訓練。額外增加的短語使得這個模型的單詞尺寸縮減到了3百萬個單詞!
5.2 二次采樣
在一個很大的語料庫中,有一些很高頻率的一些詞(比如冠詞 a,the ;介詞 in,on等)。
這些詞相比于一些出現的次數較少的詞,提供的信息不多。同時這些詞會導致我們很多的訓練是沒有什么作用的。
為了緩解這個問題,論文中提出了二次采樣的思路:每一個單詞都有一定概率被丟棄。這個概率為:
f(wi)是單詞出現的次數與總單詞個數的比值。(例如“peanut”在1 billion 單詞語料中出現了1000次,那么z('peanut')=1E-6)
t是一個選定的閾值,一般在1E-5左右。
5.3 負采樣
在訓練skip-gram時,每接受一個訓練樣本,就需要調整所有神經單元權重參數,來使神經網絡預測更加準確。
換句話說,每個訓練樣本都將會調整所有神經網絡中的參數。
詞匯表的大小決定了我們skip-gram 神經網絡將會有一個非常大的權重參數,并且所有的權重參數會隨著數十億訓練樣本不斷調整。
負采樣的思路是:每次讓一個訓練樣本僅僅更新一小部分的權重參數,從而降低梯度下降過程中的計算量。
如果詞匯表的大小為1萬, 當輸入樣本 ( "fox", "quick") 到神經網絡時,在輸出層我們期望對應 “quick” 單詞的那個神經元結點輸出 1,其余 9999 個都應該輸出 0。在這里,這9999個我們期望輸出為0的神經元結點所對應的單詞我們稱之為 negative word。
負采樣的想法也很直接 ,將隨機選擇一小部分的 negative words,比如選 10個 negative words 來更新對應的權重參數。
在論文中作者指出指出對于小規模數據集,建議選擇 5-20 個 negative words,對于大規模數據集選擇 2-5個 negative words.
如果使用了負采樣,那么 僅僅需要去更新positive word- “quick” 和選擇的其他 10 個negative words 的結點對應的權重,共計 11 個輸出神經元,相當于每次只更新 300 x 11 = 3300 個權重參數。對于 3百萬 的權重來說,相當于只計算了千分之一的權重,這樣計算效率就大幅度提高。
這里指的權重是前面說的W'的權重,也就是背景詞矩陣的權重
5.3.1 負樣本(negative words)的選擇
論文中使用 一元模型分布 (unigram distribution) 來選擇 negative words。
一個單詞被選作 負樣本 的概率跟它出現的頻次有關,出現頻次越高的單詞越容易被選作負樣本,經驗公式為:
其中:
f(w) 代表 每個單詞被賦予的一個權重,即 它單詞出現的詞頻。
分母 代表所有單詞的權重和。
公式中指數3/4完全是基于經驗的,論文中提到這個公式的效果要比其它公式更加出色。
5.3.2 正樣本的概率
對于正樣本,Skig-Gram 模型的輸出是
引入負樣本之后,我們計算概率的函數不像之前是softmax了,而是sigmoid函數。
5.3.3 負樣本的概率
對于負樣本,Skig-Gram 模型的輸出是
5.3.4 總樣本
參考文獻
NLP之---word2vec算法skip-gram原理詳解_Ricky-CSDN博客_skipgram
Word2Vec教程-Skip-Gram模型 - 簡書 (jianshu.com)
Word2Vec教程-Negative Sampling 負采樣 - 簡書 (jianshu.com)
countries.capitals.projections.eps (arxiv.org)
Word2Vec導學第二部分 - 負采樣_陳誠的博客-CSDN博客_負采樣
Word2vec, Skip-Gram, CBOW, NEG, 負采樣 - 知乎 (zhihu.com)
總結
以上是生活随笔為你收集整理的NLP 笔记:Skip-gram的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文巾解题 183. 从不订购的客户
- 下一篇: 文巾解题 1418. 点菜展示表