論文筆記:word2vec Parameter Learning Explained

論文學習:word2vec Parameter Learning Explained

這篇論文詳細的介紹了 word2vec 參數的計算更新步驟,就像作者在摘要裏所寫的一樣,Mikolov 的論文簡化了公式的推導,所以文章顯得比較晦澀。整篇論文可以分爲三個部分吧,分別是:

  • CBOW模型以及Skip-Gram模型在單輸入以及多輸入的情況下參數更新過程(這是沒有使用優化計算技巧的情況)
  • 兩種優化計算的方式:Hierarchical Softmax 以及 Native Sampling 情況下參數的更新過程
  • BP算法參數的更新過程(這一部分在附錄裏,算是補充內容,姑且算作第三部分吧)

其中,因爲很多方式的計算過程是一樣的,所以論文着重點在第一部分,準確說是 CBOW模型的在單個輸入的情況下參數的更新過程。下面簡單介紹我在學習論文時候的一些小問題,當然,具體的計算過程還是要看原論文。

第一部分 CBOW模型以及Skip-Gram模型的參數計算過程

我覺得注意點有:

  • 首先要明確的是幾個參數的含義,像 VV 表示的是我們詞彙表的長度, NN 是最終訓練得到的詞向量的維數,也就是對於每個單詞(字),對應的是一個 (1, N) 或者說是 (N, 1) 的詞向量。

  • 第二點要注意這裏計算過程中使用的向量都是列向量的形式,例如輸入是一個 (V, 1) 的 one-hot 編碼的列向量,在 input vector 和 output vector 之間的中間結果也是一個 (N, 1)的列向量,可能是我剛開始學習論文的原因,總覺得這樣計算過程不算很直觀,這樣的結果是公式中出現了很多轉置符號來保證結果的尺寸,不過,要理解計算過程也不難,例如 在得到中間變量 hh 的計算中: h=WT.xh = WT.x 這裏結合每一部分的意義來理解,也就是從矩陣 WW (也就是 input vector 矩陣)中拿出來要訓練的那個詞向量。第二個過程也是類的意義,其實理解一下矩陣乘法就好。

  • 第三點是參數的更新過程,注意這裏的損失函數的定義方式,在這裏,對於輸入的一個樣本,輸出的是一個長度爲 VV 的向量,表示的是對於這個輸入的樣本屬於某個單詞的度量,例如 V=(1.2, 3.4, 0.3, 2.3...)V = (1.2,\ 3.4,\ 0.3,\ -2.3...),當然爲了更直觀,這些數據會通過softmax方式處理爲一個概率分佈,因此,將目標定爲使得正確的分類概率最大即可,也就是論文中的:
    max(wOwI)=max yj max(w_{O}|w_{I})= max \ y_{j^{*}}
    這裏的 yjy_{j^{*}} 也就是輸入數據正確對應的分類(具體來說,比如在“天氣好”,如果分成“天氣”和“好”兩個詞語的話,在CBOW中可能是使用“天氣”來預測“好”,那麼輸入是“天氣”,那麼經過前向計算結果的正確分類就應該是“好”這個詞語,對於詞彙表來說,其中的每一個詞都是一個類別,只要讓“好”這個類別的概率最大就可以了)。使用最大似然中的方式,上式的最大值也就是求取對數之後式子的最大值,而且,按照一般定義損失函數最小的慣例,將上面的式子取負數,就得到了使用的損失函數:
    E=logjjVexp(uj)uj E = log\sum_{j^{j}}^{V}exp(u_{j^{'}}) - u_{j^{*}}
    接下來文章介紹的是參數更新的過程,主要也就是兩個矩陣的更新過程,根據鏈式法則對上面的損失函數求梯度,這裏注意上面的損失函數中的uju_{j^{*}}是指的正確的分類,所以,在計算某個uju_{j}的梯度的時候,這一項只有在正確的類別的時候,求導的結果纔會使1,其餘的情況都是0.這一點在論文中也做了解釋。
    文中爲了簡潔起見,對一些計算的過程重新命了名,這一點在推導時候稍微注意。

  • 在這一節的後半部分,介紹了多輸入情況下的計算,其實計算過程是一樣的,只是對多個輸入向量取了個均值,後面的計算過程就與單個輸入的計算一樣了。實際上,在實際計算詞向量的時候,對多輸入的情況就是取均值,很簡單但是也很有效的方式。

  • 對於 Skip-Gram Model,從介紹的頁數上就可以看出來,計算過程與之前的也是差不多的,注意這裏的損失函數的定義,因爲Skip-Gram是使用一箇中心詞來預測上下文詞語,在論文的公式中,使用的一個詞來預測上下文中的 CC個詞語,對於公式(27)-(29),我們定義的目標函數是聯合概率:p(wO,1,wO,2,...,wO,CwI)p(w_{O,1},w_{O,2},...,w_{O,C}|w_{I})最大,假設這裏每一個預測的過程是獨立的,那麼上面的式子展開也就是公式(28),可以看到,麼一部分的計算形式與之前的CBOW中是一樣的。那麼最終的優化目標就是權衡這CC個詞語,使它們總體的預測性能最好。

第二部分 兩種優化計算方式

在實際使用中,是不會像上面一樣計算詞向量的因爲計算的規模太大了,所以也就有了兩種優化的方式,第一種是Hierarchical
Softmax方式,也就是 層次 Softmax,這種方式是利用Huffman樹進行減少計算的,我們知道Huffman編碼可以根據詞頻產生編碼使得全部編碼的長度最小,這裏的葉子節點也就是詞彙表中的詞語,每一個詞語對應一個葉子節點,這一部分在論文中介紹的很清楚,具體的請參考論文,我覺得要注意的地方在有以下幾個:

  • 首先是從一個節點出發,走到左節點或者右節點的概率和是爲1的(好像很多餘。。。),在這裏對於每一個節點會使用一個函數δ\delta來將數據處理爲一個(01)(0-1)區間內的值,這個函數稱爲:Logistic 函數(其實就是Sigmoid函數 δ(u)=11+eu\delta(u)=\frac{1}{1+e^{-u}}). 在論文中規定左分支是1,右分支爲0,那麼在一個節點選擇1的概率是δ(x,h)\delta(x,h)的話,那麼選擇右分支的概率就是1δ(xh)1-\delta(x\cdot h),然後根據Logistic 函數的特點:1δ(u)=δ(u)1-\delta(u)=\delta(-u) ,所以右分支就可以表示爲δ(xh)\delta(-x\cdot h)。這一部分在論文中還介紹了一個詳細的例子。
  • 第二點是關於公式中的hh,這裏的hh也就是輸入的向量,單個輸入就是本身,如果是在CBOW中多個輸入的情況,也就是取均值之後的結果。這個hh注意,在所有的節點計算中都是一樣的,也就是原始輸入,並非是下面層的節點計算使用上面的結果。
  • 最終每一個節點的概率也就是路徑上每一部分連乘的結果,其實這樣的過程就是分割每一個節點概率的過程(好像不太好表述),就是公式(43)的計算。

第二中優化方法是 Negative Sampling 方式,也就是負採樣,其實使用層次 Softmax 方式,計算量依然很大(查資料也可以發現,使用負採樣的案例更多=_=||),這種方式更好理解,既然要減少計算量,原本我們在全部的詞彙表(共有VV個詞)中,只有一個是正確的,其他的都是負例,現在我們計算負例的時候只使用一部分,這也就是對負例進行採樣,所以就是“負採樣”了(個人解釋),在這一部分中,損失函數的思路與之前一樣,也就是讓p+ppp_{+}\cdot p_{-}\cdot p_{-}\cdot \cdot \cdot這個式子的值最大,這一部分在論文中沒有直接提到,其實就是公式(55)的原始形式吧,最開始也就是:
p+pp=δ(vwOh)wjnegδ(vwjh) p_{+}\cdot p_{-}\cdot p_{-}\cdot \cdot \cdot = \delta(v_{w_{O}}^{'} h)\prod_{w_{j}\in neg}\delta(-v_{w_{j}}^{'} h)
當然,這裏的δ(vwjh)\delta(-v_{w_{j}}^{'} h)是根據函數(1δ(vwjh)1-\delta(v_{w_{j}}^{'} h))的特點變換得到的。然後將上面的式子取對數,然後添負號把求最大值變成求最小值,結果也就是論文中的公式(55)了。

第三部分 附錄:反向傳播算法推導

這一部分並不是論文的重點,這裏對反向傳播算法的參數更新過程做了推導,如果對前面word2vec中兩個參數矩陣的參數更新方法不清楚,可以先看一下這一部分,寫的很直觀。

總結

第一篇認認真真看的論文(淚目~),希望自己能有更大的進步吧,未來不可期,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章