本將概要:
一、負採樣
二、窗口統計VS.全文統計
三、詞向量評估
SG演算法的核心思想是:
對於每一個窗口而言,我們只有2m+1個單詞(其中m表示窗口的半徑),因此我們計算出來的梯度向量是十分稀疏的。
因此解決辦法有兩個:
同時如果你有百萬級別的詞向量並進行分散式計算,最好不要執行巨大的更新
根據softmax公式可知,當我們計算分母時,我們需要遍歷整個語料庫,去計算中心單詞和周圍單詞的詞向量的內積,顯然,這種計算代價時很昂貴的。
因此我們可以使用負採樣來解決這個問題。負採樣的中心思想是:訓練一個二元邏輯回歸,其中包含一對真正的中心詞和上下文詞,以及一些噪音對(包含中心詞和一個隨機的單詞)。這種方法來源於這篇文獻:「Distributed Representations of Words and Phrases and their Compositionality」 (Mikolov et al. 2013)。具體的目標函數如下,其中k表示的是負樣本的個數,σ表示sigmoid函數。第二行第一項是正樣本,第二項是負樣本。換而言之,目標函數表示我們希望真正的上下文單詞出現的概率盡量大,而在中心詞外部周圍的隨機單詞出現的概率盡量小。
這裡有個小知識點:σ(-x) = 1 – σ(x) ,k是隨機選區的負樣本,因此有可能會取到真正的上下文單詞(正樣本),但是對於一個大的語料庫來說,這種概率非常小,忽略即可
我們假設隨機選取的噪音單詞是遵循下面的公式,其中U(W)表示一元模型的分佈,之所以加上一個3/4的冪是因為,我們希望減少那些常用的單詞被選中的概率。
word2vec的另外一種演算法是CBOW,主要的觀點是:從上下文向量的和來預測中心詞,正好與skip-grams相反。
word2vec通過對目標函數的優化,把相似的單詞在空間中投射到鄰近的位置。
通過word2vec的原理的觀察,我們可以發現實際上word2vec抓住的是兩個單詞同時出現(cooccurrence)的情況進行的建模。而我們也可以直接進行單詞同時出現(cooccurrence)的統計。
窗口統計:像word2vec一樣利用一個窗口來進行同時出現(cooccurrence)情況的統計,來抓住語義和句法上面的信息。
全文共詞矩陣可以給出一般的主題信息,這就是所說的LSA方法
以窗口統計為例:窗口長度是1,一般窗口長度是5-10;左右兩邊的窗口長度是對稱的,語料庫示例:
共詞矩陣如下所示:
這個矩陣存在的問題是:
解決的方法便是產生一些低維稠密的向量,將大部分重要的詞儲存在其中
對矩陣進行奇異值分解(SVD)。奇異值來源於積分方程(設A為mn階矩陣,q=min(m,n),AA的q個非負特徵值的算術平方根叫作A的奇異值。)。最初不是這個名字,而是為標準乘子(canonical multipliers),也就是標準型上的對角元素。奇異值分解方法如下下:
其中∑為半正定m×n階對角矩陣,對角線上的值即為奇異值。一般的,我們規定對角線的值按照從大到小排列。其目的一是為了保證對角矩陣的唯一性,目的二為儘可能保留原有信息量。U和V是正交的。
我們可以利用python來完成
取U中奇異值最大的前兩列作為坐標,將單詞繪製在二維圖中:
一些改進:
同時出現(cooccurrence)矩陣在句法和語義上的體現:
SVD存在的問題:
基於統計和基於直接預測兩種方法比較:
這個方法的目標函數如下:
其中f如下圖,目的是控制出現次數比較多的單詞對的權重。該方法的特點:
這個方法的訓練結果是u和v兩個矩陣,都代表了相似的同時出現(cooccurrence)的信息。最終,最好的X是U+V。
從Glove的訓練結果來看,這個模型對比較稀有的單詞也有比較好的效果。
NLP的評估分為兩種,Intrinsic 和extrinsic
利用詞向量類比詞類進行評估,如下圖,比如b代表woman,a代表man,c表示king,那麼在剩下的單詞中,正確的類比單詞應該是cosine相似度最高的。在實際中應該是queen,通過判斷d是不是queen可以用來評估這個詞向量的構造情況。
但有一個問題是,如果存在這個單詞,但是並非線性結構該怎麼辦?
詞向量類比詞的一些例子:Word Vector Analogies: Syntactic and Semantic examples from http://code.google.com/p/word2vec/source/browse/trunk/quesRonswords.txt
利用詞向量類比詞進行評估和超參的選擇:
其他內部的詞向量評估方法:計算詞向量的距離以及人工判斷之間的相關性(correlation)
這裡存在一詞多義的問題:你可能想用一個向量獲得一個單詞所有的信息,但是一個單詞往往具有不同的含義。其中一個解決方法是增加標號,同一個詞使用不同的標號表示不同的含義。
一個比較直接的例子是使用詞向量進行命名實體識別(named entity recognition)
推薦閱讀: