參考CS224N筆記
The Skip-Gram Model
word2vec paper
negative sampling paper
文章目錄
NLP
人類語言是獨特的傳達含義的系統,不同於計算機視覺及其他的機器學習任務。
NLP領域有着不同難度等級的任務,從語音處理到語義解釋等。NLP的目標是設計出算法令計算機“理解”自然語言以解決實際的任務。
- Easy的任務包括:拼寫糾正、關鍵詞搜索、同義詞查找等;
- Medium的任務包括:信息解析等;
- Hard任務包括:機器翻譯、情感分析、指代、問答系統等。
1、Word Vectors
英語中估計有13 million單詞,他們相互之間並不全是無關的,Feline to cat (貓科動物->貓)、hotel to motel (旅館->汽車旅館)等。我們希望用一些向量來編碼每個單詞,在同一詞空間內以點的形式進行表示。直接的方法是構建一個維度的空間,這個空間足夠將我們的單詞進行編碼,每個維度可以編碼某些我們語言的含義。這些維度可能表示時態、計數、性別等。
獨熱編碼是直接的編碼方法,將每個詞表示爲向量,該詞在固定順序下的索引處爲1,其他位置都爲0。如下
我們可以嘗試將維減小,對原來表示空間進行降維,來尋找一個子空間來進行詞關係的表示。
2、SVD Based Methods
奇異值分解方法的做法是,我們首先遍歷數據集,通過矩陣存儲單詞出現的共現次數,然後對進行奇異值分解得出分解。我們可以將的行值可以作爲詞表中所有詞的word embedding。
2.1 Word-Document Matrix
首先我們可以認爲,相關的詞總會出現在同一個文檔中。譬如,“bank”、“bongs”、“stocks”、“money"等更有可能同時出現,但是"bank”、“octopus”、"banana"等詞不可能總是同時出現。我們利用這種共現現象構建一個word-document matrix:X。遍歷大量的文檔數據集,每當單詞和單詞同時出現時,我們就在位置加1。很明顯這將是一個非常大的矩陣(),其中是文檔的個數。
2.2 Window based Co-occurrence Matrix(基於窗口的共現矩陣)
矩陣存儲着單詞的共現次數。這裏我們將在一個合適大小的窗口內來統計單詞的共現次數。通過下面的例子進行說明,數據集中有三個句子,窗口大小設定爲1:
1. I enjoy flying.
2. I like NLP.
3. I like deep learning.
根據窗口爲1的設定,統計結果矩陣如下:
2.3 奇異值分解
通過SVD方法得到word embedding的過程如下:
- 構建的共現矩陣,。
- 使用SVD得到,。
- 選擇的前個維度,得到維的詞向量。
- 表示前個維度的方差。
我們現在對進行SVD處理:
2.4 SVD方法小結
以上的兩種方法(Word-Document Matrix 和 Window based Co-occurrence Matrix)都比傳統的編碼形式有着跟多的語義信息,但是仍然存在着一些問題:
- 矩陣的維度大小不固定,會隨新詞的添加而變化,語料庫大小也隨之變化;
- 矩陣過於稀疏,大部分的單詞不會同時出現;
- 矩陣維度太高();
- 訓練成本太高();
- 需要加入一些隱含詞(不知道這麼理解對不對)來解決詞頻不均衡的問題。
針對以上的問題有一些解決方法:
- 忽略一些詞,例如"the"、“he”、"has"等;
- 窗口動態,即根據文檔中單詞之間的距離加權計算共現計數;
- 使用皮爾遜相關係數,Use Pearson correlation and set negative counts to 0 instead ofusing just raw count.
3、Iteration Based Methods - Word2vec
我們嘗試一種新得方法,通過構建模型能夠迭代學習,最終可以根據給定的上下文來對單詞的概率進行編碼。這個方法設計出的模型的參數就是詞向量。在每次的訓練迭代過程中,計算誤差,更新參數,最終學習出詞向量。這個想法可以追溯到1986年,稱之爲“反向傳播(backpropagating)”[Rumelhart et al., 1988],模型任務越簡單,訓練速度越快。有一些方法也被嘗試過,[[Collobert et al., 2011]構建了NLP模型,第一步是將每個詞轉爲向量,對於每種任務(命名實體識別,詞性標註等)不僅訓練模型參數同時訓練向量,在有不錯的效果的同時也得到了好的詞向量。
Word2vec是2013年Mikolov提出的簡單有效的方法[Mikolov et al., 2013](這種方法依賴於語言學中一個非常重要的假設,即分佈相似,即相似的詞有相似的語境。)Word2vec是一個算法包:
- 算法部分:continuous bag-of-words (CBOW) and skip-gram. CBOW是通過上下文預測中心詞,Skip-gram相反,給定中心詞預測上下文。
- 模型訓練: negative sampling and hierarchical softmax. 負採樣是採樣出一定比例的負例,層次softmax是通過一種有效的霍夫曼樹結構來計算詞的概率。
3.1 語言模型(unigrams,bigrams,trigrams等)
首先,我們需要構建一個模型來表示一個單詞序列的概率。一個好的語言模型會給有效的好句子一個高的概率值,但是句子"stock boil fish is toy"的概率會很低,因爲這不是一個正常有意義的句子。用數學來表達,當給定一個有個單詞的句子時,其概率爲:
我們採用unigrams(一元模型),即每個單詞都是獨立的,則:
這個表達式有個明顯的問題就是,如果有一組句子,雖然他們有着同樣的單詞,有的句子有意義,有的句子是亂序無意義的,但是他們的概率確實一樣的。因爲我們的句子都是有序的,一個單詞的概率很大程度上和上一個單詞有關係。我們需要基於相鄰的兩個單詞的概率來決定句子的概率,即bigrams(二元模型):
即使這樣,我們考慮的也是兩兩相鄰的單詞,而不是整個句子。
3.2 Continuous Bag of Words Model (CBOW)
對於上述的例子,我們通過上下文{“The”、“cat”、“over”、“the”、“puddle”}來預測或生成出中心詞"jumped",這種方式我們成爲Continuous Bag of Words Model (CBOW)。
對於CBOW模型,首先我們設定已知參數,即將輸入句子表示爲一個one-hot形式的詞向量。輸入的one-hot向量表示爲,輸出表示爲,CBOW模型只有一個輸出,這個爲已知的中心詞的one-hot向量。對於每個詞,我們通過CBOW都可以學習出兩個向量,
- :input vector,當詞爲上下文時
- :output vector,當詞爲中心詞時
首先介紹一些CBOW模型中涉及到的一些參數:
- :詞表中的第個詞
- :input word matrix
- :中的第行,表示的是的輸入向量
- :output word matrix
- :中的第行,表示的是的輸出向量
我們構建兩個矩陣和,其中是我們定義的embedding空間的大小。具體的模型構建步驟如下:
- 首先我們根據窗口大小確定我們的輸入one-hot詞向量:,中心詞爲
- 得到對應的輸入word embedding爲
- 將這些向量平均得到
- 計算出分數向量,點乘計算的是兩個向量的相似度,如果兩個詞比較接近,那麼將會有一個較高的分數
- 通過softmax將分數轉爲概率值,
- 我們希望生成的概率來匹配真實的概率,即輸出的對應的one-hot向量對應真實的單詞
如圖展示了CBOW模型細節,我們需要學習出兩個轉換矩陣。
我們需要學習出 和 這兩個矩陣,首先確定目標函數。當我們試圖從某個真實的概率中學習概率時,會考慮用信息論的方法來度量兩個分佈的距離,我們這裏選用交叉熵(cross entropy)來作爲目標函數:
是一個one-hot向量,簡化目標函數爲:
因此我們優化目標爲:
我們使用隨機梯度下降來更新所有相關的詞向量 和 。
3.3 Skip-Gram Model
Skip-gram是給出中心詞"jumped",來預測或生成上下文詞 “The”, “cat”, “over”, “the”, “puddle”。Skip-gram model大體上和COBW模型相似,不過我們需要將與互換,即這裏輸入的one-hot向量是一個,輸出向量是多個。我們同樣定義兩個矩陣 和 ,模型構建步驟如下:
- 首先生成中心詞輸入向量
- 得到中心詞的embedding詞向量
- 生成分數向量
- 轉爲概率值 ,是每個上下文詞的概率值
- 目標是讓概率分佈與真實的接近
其中 是概率分佈向量 和one-hot向量 的交叉熵。
3.4 Negative Sampling
我們注意到目標函數中的 的值是非常大的,結果就是每次更新或評估目標函數的時候我們都要花費 (計算softmax歸一化的時候),一個簡單的做法就是近似估計它就可以了。
在每次訓練的時候,我們不需要遍歷所有的詞表,只需要採樣少數的負樣本。我們基於噪聲分佈 採樣,其採樣概率和詞頻順序相匹配。
Negative Sampling見paper。負採樣基於Skip-Gram模型,實際上是優化不同的目標。考慮中心詞和上下文詞對,如果這個詞對來自語料數據集,則概率爲,相反,如果詞對不是來自語料庫的,則爲,首先,利用sigmoid函數表示概率值:
我們現在構建一個新的目標函數,其目標是maximize兩個概率值 和 ,我們利用最大化似然來估計這兩個概率分佈(這麼我們將作爲模型的參數,在這裏表示是 和 )
等同於最小化負的對數似然:
公式中的是負樣本集。
對於skip-gram模型,對於給定中心詞和上下文詞 表示爲:
對於CBOW模型,中心詞爲,給定的上下文向量爲,目標函數爲:
現在討論應該是什麼。相關大量的討論似乎是一元模型中的次方是最優,爲什麼是,如下:
"bombastic"的抽樣率變成了3倍,但是"is"只是增大了一點點。"is"是不重要的一類詞,其出現的概率本來就很大,不需要對其增加很多采樣。
3.5 Hierarchical Softmax
Mikolov同樣提出了層次softmax來解決歸一化softmax的問題。在實際中,層次softmax對低頻詞彙有更好的效果,負採樣對高頻詞和低維向量有着更好的效果。
層次softmax利用二叉樹來表示詞表中的所有詞,樹的每個葉子都是一個單詞,從根到葉子節點只有唯一的一條路徑。每個詞沒有輸出表示,圖的每個節點(除了根和葉)都是模型要學習的向量。
在層次softmax中,單詞的向量爲。是從根隨機遊走到葉子節點的概率。最大的優點就是這種計算概率的方式其成本爲,與路徑長度相關。
令爲從根到葉子路徑上的節點個數,令爲路徑上的第個節點。因此,是根節點,表示的是節點。對於每個節點,我們可以選擇其的一個孩子稱爲(總是左節點)。我們計算爲:
是sigmoid函數。
分析上述的公式,首先,我們根據根到葉子節點的路徑上各項的乘積。因爲我們假設了總是的左節點,因此當路徑遊走到左節點時爲1,遊走到右邊爲-1。
此外,是一種歸一化的方式。對於節點,計算遊走到左邊的概率和右邊的概率,對於每個的概率都是1:
這樣確保了,這是原本的softmax。
最後,我們比較利用點乘來比較輸入向量和每個內部的節點向量的相似度。對於二叉樹圖示中的例子來講,,我們需要從根部走兩個左邊和一個右邊達到:
訓練模型的時候,我們目標依然是最小化負對數似然:,但是這裏我們不需要更新每個單詞的向量,只需要更新該路徑上經過的節點的向量即可。
這種方法的速度取決於二叉樹的構造方式和單詞分配給葉節點的方式。Mikolovlion利用二叉霍夫曼樹,其特點是高頻詞在樹中有着更短的路徑。
References
[Rumelhart et al., 1988] Rumelhart, D. E., Hinton, G. E., and Williams, R. J. (1988).Neurocomputing: Foundations of research. chapter Learning Representations by Back-propagating Errors, pages 696-699. MIT Press, Cambridge, MA, USA.
[Collobert et al., 2011] Collobert, R., Weston, J., Bottou, L., Karlen, M., Kavukcuoglu, K., and Kuksa, P. P. (2011). Natural language processing (almost) from scratch. CoRR, abs/ 1103. 0398.
[Mikolov et al., 2013] Mikolov, T., Chen, K., Corrado, G., and Dean, J. (2013). Efficient estimation of word representations in vector space. CoRR, abs/ 1301. 3781.