【Graph Embedding】Word2Vec:詞嵌入詳解

Introduction

Word2Vec 是 Google 在 2013 年開源的一個詞向量(Word Embedding)計算工具,其用來解決單詞的分佈編碼問題,因其簡單高效引起了工業界和學術界極大的關注。

我們先嚐試着回答幾個問題,以檢測下自己對 Word2Vec 的理解。

  1. Word2Vec 兩個算法模型的原理是什麼,網絡結構怎麼畫?
  2. 網絡輸入輸出是什麼?隱藏層的激活函數是什麼?輸出層的激活函數是什麼?
  3. 目標函數/損失函數是什麼?
  4. Word2Vec 如何獲取詞向量?
  5. Word2Vec 的兩個模型哪個效果好哪個速度快?爲什麼?
  6. 推導一下參數如何更新?
  7. Word2Vec 加速訓練的方法有哪些?
  8. 介紹下 Hierarchical Softmax 的計算過程,怎麼把 Huffman 放到網絡中的?參數是如何更新的?對詞頻低的和詞頻高的單詞有什麼影響?爲什麼?
  9. 介紹下 Negative Sampling,對詞頻低的和詞頻高的單詞有什麼影響?爲什麼?
  10. Word2Vec 有哪些參數,有沒有什麼調參的建議?
  11. Word2Vec 有哪些侷限性?

注:由於本文公式比較多不適合 Wrod2Vec 入門,入門學習可以參考 McCormick 大佬的幾篇系列教程:《Word2Vec Tutorial》。

Word Embedding

在聊 Word2Vec 之前,我們先來了解一下詞向量,我們都知道字符變量在送到神經網絡訓練之前需要將其編碼成數值變量,常見的編碼方式有兩種:

  • One-Hot 編碼:以字符變量的種類爲向量長度,向量中僅一個元素爲 1 其它均爲 0,這種編碼方式的缺點是數據稀疏,不適合作爲神經網絡的輸入(參數更新慢,收斂速度慢,計算量大),且無法捕捉到詞與詞之間的關係(相互正交);
  • 分佈編碼:將字符變量映射到固定長度的向量中,向量空間中的點可以表示某個字符變量,且字符間的距離有意義。理想狀況下,兩個對象越相似其在空間中的距離就越近。

舉個簡單的例子,使用 One-Hot 編碼時 男=[1, 0],女=[0,1],而使用分佈編碼時,男=1, 女=0。我們可以看到分佈編碼佔用的空間比 One-Hot 要小。

今天要聊的 Word2Vec 是一種典型的分佈編碼方式,通過訓練淺層神經網絡獲得詞向量。

Structure

Word2Vec 有兩種網絡結構:CBOW 和 Skip-Gram,其結構如下圖所示:

model architectures

CBOW 是用上下文預測當前單詞,Skip-gram 是用當前詞預測上下文,兩種網絡都可以概括爲如下網絡:

simple model architectures

其中,網絡的輸入是 One-Hot 向量 wk=(x1,x2...xk...xV)w_k=(x_1,x_2...x_k...x_V),隱藏層無激活函數,輸出層有 Softmax 函數,輸出的是概率分佈,預測目標也爲 One-Hot 向量$w_j=(x_1,x_2…x_j…x_V) $。層與層之間採用全連接方式,並用反向傳播訓練網絡。

輸入層到隱藏層的映射矩陣爲 WV×NW_{V \times N},隱藏層到輸出層的映射矩陣爲 WN×VW_{N \times V}^{'},也就是說對於任意的單詞 $w_k $ 我們都可以有兩種表示向量:
vwj=XkWTvwj=XkW v_{w_j} = X_k W^T \quad v_{w_j}^{'} = X_k W^{'}
其中,XkX_k 爲單詞 k 的 One-Hot 編碼,大小爲 (1, N)。這個操作的本質是把 W 的第 k 行復制給 v。舉個例子:

matrix multiplicate

爲方便起見,我們將 vwjv_{w_j} 成爲輸入向量, 將 vwjv_{w_j}^{'} 成爲輸出向量。

輸出層 的計算方式採用 Softmax:
p(wjwk)=exp(vwjTvwk)i=1Vexp(vwiTvwk) p(w_j|w_k) = \frac{exp({v_{w_j}^{'}}^Tv_{w_k})}{\sum_{i=1}^V exp({v_{w_i}^{'}}^Tv_{w_k})}
我們目的是想讓 yjy_j 的第 j 個位置的值越大越好,其他位置的值越小越好。
max  p(wjwk)=max  log(p(wjwk))=vwjTvwklog(i=1Vexp(vwiTvwk)):=E max \; p(w_j|w_k) = max \; log(p(w_j|w_k)) \\ ={v_{w_j}^{'}}^Tv_{w_k} - log(\sum_{i=1}^V exp({v_{w_i}^{'}}^Tv_{w_k})) := -E
所以損失函數爲: E=log(p(wjwk))E=-log(p(w_j|w_k))

我們利用反向傳播來更新參數,首先輸出向量求偏導:
Ewi,j=Eujujwi,j=(yjpj)hi \frac{\partial E}{\partial w_{i,j}^{'}} = \frac{\partial E}{\partial u_{j}^{'}} \frac{\partial u_{j}^{'}}{\partial w_{i,j}^{'}} =(y_j-p_j) \cdot h_i \\
其中:uj=vwjTvwju_{j}^{'} = {v_{w_j}^{'}}^Tv_{w_j}yjy_j 爲 One-Hot 向量第 j 個位置的值,pjp_j 爲預測的向量中第 j 個位置的值。

輸出向量的參數更新爲:
wij(new)=wij(old)η(yjpj)hi {w_{ij}^{'}}^{(new)} = {w_{ij}^{'}}^{(old)} - \eta \cdot (y_j-p_j) \cdot h_i \\
值得注意的是,這個更新方程意味着我們需要遍歷所有的單詞(計算損失函數)

輸入向量的參數更新爲:
Ewki=Ehihiwki=j=1V(yjpj)wijxk \frac{\partial E}{\partial w_{ki}} = \frac{\partial E}{\partial h_i} \frac{\partial h_i}{\partial w_{ki}} = \sum_{j=1}^{V}(y_j-p_j) \cdot w_{ij}^{'} \cdot x_k
其中,hi=k=1Vxkwkih_i = \sum_{k=1}^{V} x_k \cdot w_{ki}xkx_k 爲輸入的詞向量中第 k 維的數值。

則輸入向量的參數更新爲:
wki(new)=wki(old)ηj=1V(yjpj)wijxk {w_{ki}}^{(new)} = {w_{ki}}^{(old)} - \eta \cdot \sum_{j=1}^{V}(y_j-p_j) \cdot w_{ij}^{'} \cdot x_k \\
瞭解到網絡的基本結構和訓練方法後,我們一起來看下 Word2vec 兩種特殊的網絡結構。

CBOW

CBOW 的全稱爲 Continuous Bag-of-Word Model,通過單詞的上下文來預測當前當前單詞。在計算隱藏層的輸出時,CBOW 並沒有直接使用上下文單詞的輸入向量,而是將其相加並取其均值(質心),即:
hi=1C(vw1+vw2+...+vwC) h_i = \frac{1}{C}(v_{w_1} + v_{w_2} + ... + v_{w_C}) \\
多個詞預測一個詞,所以損失函數爲:
$$
E=-log(p(w_j|w_{k,1},w_{k,2},…,w_{k,C})) \

= -{v_{w_j}{’}}T h_i + log(\sum_{i=1}^V exp({v_{w_i}{’}}Tv_{w_k})) \
$$
下圖爲 CBOW 的網絡結構,

CBOW

Skip-Gram

Skip-Gram 的結構如下圖所示,正好與 CBOW 結構相反。與上面的模型相比,其輸出的不再是一個多項式分佈,而是 C 個多項式分佈(要預測 C 個單詞),所以:
uc,j=uj=vwjTvwjc=1,2,...,C u_{c,j} = u_j = {v_{w_j}^{'}}^Tv_{w_j} \quad c=1,2,...,C
因爲預測數量增多,所以損失函數改爲:
E=log(p(w1,j,w2,j,...,wC,jwk))=logc=iCexp(vwcTvwk)i=1Vexp(vwiTvwk) E=-log(p(w_{1,j},w_{2,j},...,w_{C,j}|w_k)) \\ = -log \prod_{c=i}^C \frac{exp({v_{w_c}^{'}}^Tv_{w_k})}{\sum_{i=1}^V exp({v_{w_i}^{'}}^Tv_{w_k})}

Skip-Gram

到目前爲止,我們便介紹完了基本 Word2Vec 模型,但這種最原始的模型沒法應用於大規模訓練,所以我們還需要對模型進行改進。

Optimization

爲了更新輸出向量的參數,我們需要先計算誤差,然後通過反向傳播更新參數。在計算誤差是我們需要遍歷詞向量的所有維度,這相當於遍歷了一遍單詞表,碰到大型語料庫時計算代價非常昂貴。要解決這個問題,有三種方式:

  • Hierarchical Softmax:通過 Hierarchical Softmax 將複雜度從 O(n) 降爲 O(log n);
  • Sub-Sampling Frequent Words:通過採樣函數一定概率過濾高頻單詞;
  • Negative Sampling:直接通過採樣的方式減少負樣本。

Hierarchical Softmax

Hierarchical Softmax 是一種非常高效的訓練方法,模型使用 Huffman 二叉樹的葉節點來表示語料庫的所有單詞。以下圖爲例,黑色爲內部節點,白色的爲葉子節點表示一個單詞 wiw_i,每一個葉子節點都存在唯一的路徑通往根節點,高亮部分爲節點 w2w_2 通向根節點的路徑,L(w2)=4L(w_2) = 4,我們可以用這條路徑來評估單詞出現的概率。

Hierarchical Softmax

在 Hierarchical Softmax 模型中,葉子結點(單詞)沒有輸出向量,但每一個內部節點都有一個輸出向量 vnw,iv_{n_{w,i}}^{'},單詞作爲輸出的概率可以表示爲:
p(wwk)=i=1L(w)1σ[ρ[n(w,i+1)=ch(n(w,j)]vn(w,i)Tvwk)] p(w | w_k) = \prod_{i=1}^{L_(w)-1} \sigma \big[ \rho[n(w,i+1) =ch(n(w,j)] \cdot {v_{n(w,i)}^{'}}^T v_{w_k}) \big] \\
其中 ch(n)ch(n) 爲節點 n 的左子式(Work2Vec 使用的是 Huffman 樹,必有左子式),n(w,i)n(w,i) 表示根節點 到 單詞 w 的第 i 個單元,vn(w,i)v_{n(w,i)}^{'} 是內部節點 n(w,i)n(w,i) 的向量表示,h 是隱藏層的輸出值,σ()\sigma(\cdot) 爲 Sigmoid 函數,ρ[]\rho[\cdot] 有如下定義:
ρ[x]={1if x is true1if x is false \rho[x] = \left\{ \begin{aligned} 1 \quad if \ x \ is \ true \\ -1 \quad if \ x \ is \ false \end{aligned} \right. \\
以上圖爲例,假設我們需要計算 w2w_2 的輸出概率,等同於從根節點到葉節點做隨機遊走的概率。我們定義內部節點 n 左移和右移的概率:
p(n,left)=σ(vnTvk)p(n,right)=1σ(vnTvk)=σ(vnTvk) p(n,left) = \sigma({v_n^{'}}^T \cdot v_k) \\ p(n,right) = 1 - \sigma({v_n^{'}}^T \cdot v_k) = \sigma(-{v_n^{'}}^T \cdot v_k)\\
根據 w2w_2 的路徑我們有:
p(w2wk)=p(n(w2,1),left)p(n(w2,2),left)p(n(w2,3),right)=σ(vn(w2,1)Tvk)σ(vn(w2,2)Tvk)σ(vn(w2,3)Tvk) \begin{aligned} p(w_2 | w_k) &= p(n(w_2, 1), left) \cdot p(n(w_2, 2), left) \cdot p(n(w_2, 3), right) \\ &= \sigma({v_{n(w_2,1)}^{'}}^T \cdot v_k) \cdot \sigma({v_{n_(w_2,2)}^{'}}^T \cdot v_k)\cdot \sigma(-{v_{n_(w_2,3)}^{'}}^T \cdot v_k) \end{aligned} \\
不難得到:
i=1Vp(wiwk)=1 \sum_{i=1}^V p(w_i | w_k) = 1 \\
現在我們來看一下內部節點的參數 vn(wj,i)v_{n(w_j,i)} 是如何更新的。我們以單個輸入輸出的簡單模型爲例:
E=log(p(wwk))=i=1L(w)1log[σ(ρvn(w,i)Tvwk)] E = -log(p(w | w_k)) = - \sum_{i=1}^{L(w)-1} log\big[ \sigma(\rho \cdot {v_{n(w,i)}^{'}}^T v_{w_k}) \big ]
vn(w,i)Tvwk{v_{n(w,i)}^{'}}^T v_{w_k} 求偏導:
Evn(w,i)Tvwk=[σ(ρvn(w,i)Tvwk)]ρ={σ(vn(w,i)Tvwk)1if ρ=1σ(vn(w,i)Tvwk)if ρ=1=σ(vn(w,i)Tvwk)tn(w,i) \begin{aligned} \frac{\partial E}{\partial{{v_{n(w,i)}^{'}}^T v_{w_k}}} &= \big [ \sigma( \rho \cdot {v_{n(w,i)}^{'}}^T v_{w_k}) \big]\rho \\ &= \left\{ \begin{aligned} \sigma({v_{n(w,i)}^{'}}^T v_{w_k}) -1\quad if \ \rho =1 \\ \sigma({v_{n(w,i)}^{'}}^T v_{w_k}) \quad if \ \rho = -1 \end{aligned} \right. \\ &= \sigma({v_{n(w,i)}^{'}}^T v_{w_k}) - t_{n(w,i)} \end{aligned}
其中,當 ρ=1\rho= 1tn(w,i)=1t_{n(w,i)}=1 ,當 ρ=0\rho= 0tn(w,i)=0t_{n(w,i)}=0

我們再對內部節點向量 vn(w,i)v_{n(w,i)}^{'} 求偏導:
Evn(w,i)=Evn(w,i)Tvwkvn(w,i)Tvwkvn(w,i)=(σ(vn(w,i)Tvwk)tn(w,i))vwk \frac{\partial E}{\partial v_{n(w,i)}^{'}} = \frac{\partial E}{\partial{{v_{n(w,i)}^{'}}^T v_{w_k}}} \cdot \frac{ \partial{{v_{n(w,i)}^{'}}^T v_{w_k}}}{\partial {v_{n(w,i)}^{'}}} =\big( \sigma({v_{n(w,i)}^{'}}^T v_{w_k}) - t_{n(w,i)} \big) v_{w_k} \\
所以內部節點向量的更新公式爲:
vn(w,i)(new)=vn(w,i)(old)η(σ(vn(w,i)Tvwk)tn(w,i))vwk {v_{n(w,i)}^{'}}^{(new)} = {v_{n(w,i)}^{'}}^{(old)} - \eta \big( \sigma({v_{n(w,i)}^{'}}^T v_{w_k}) - t_{n(w,i)} \big) v_{w_k}
我們可以把 σ(vn(w,i)Tvwk)tn(w,i)\sigma({v_{n(w,i)}^{'}}^T v_{w_k}) - t_{n(w,i)} 理解爲內部節點路徑的預測誤差,在實際的訓練過程中,這個誤差會非常小。

在實際的應用中, Huffman 樹將代替原本的隱藏層到輸出層的結構。

Sub-Sampling

在訓練樣本中,類似 “the”、“a”、“an” 之類的停用詞非常多,重複訓練這些停用詞沒有多大意義,Word2Vec 通過實現 Sub-sampling 以一定概率捨棄單詞。

我們先感受一下使用 Sub-Sampling 能夠減少多少計算量:設窗口大小爲 10,如果捨去停用詞 “the” 可以減少 10 個訓練樣本,且這個 “the” 也不會出現在其他詞的上下文中。通常來說,Sub-sampling 能夠帶來 2~10 倍的性能提升。

我們來看一下 Word2Vec 使用的概率函數:
P(wi)=(f(wi)Sample+1)Samplef(wi) P(w_i) = (\sqrt{\frac{f(w_i)}{Sample}} + 1) \frac{Sample}{f(w_i)} \\
其中,z(wi)z(w_i) 表示 wiw_i 在語料庫中出現的頻率,Sample 可以用來控制採樣,默認爲 0.001,值越小保留的概率越低。下圖爲採樣函數:

Subsample Function

橫座標表示單詞的頻率,因爲語料庫比較大,頻率一般會很低,所以我們關注 x 軸的前半部分。可以看到單詞的保留概率與單詞的頻率成反比,正好可以過濾掉那些停用詞。

Negative Sampling

Negative Sampling 的思想是以一定概率的選取負樣本,使得每次迭代時只需修改一小部分參數,這是典型 Categorical Distribution Sampling 分佈問題——給定一些變量及其概率,隨機採樣使得其滿足變量出現的概率。

先來定量的感受下負採樣節省的計算量:假設有 1W 個單詞,300 個隱藏單元,則輸出向量的大小爲 (300, 10000),現在我們通過負採樣選取了 5 個負例,加上原本的 1 個正例共 6 個輸出神經元,此時只需要更新 300 * 6 個參數,相當於原來的 0.06%。另外,對於輸入向量來說,無論是否使用負採樣,其更新權重數量都不會改變。[2]^{[2]}

再來看一下 Word2Vec 使用的負採樣函數:
P(wi)=f(wi)3/4j=0n(f(wj)3/4) P(w_i)= \frac{f(w_i)^{3/4}}{\sum_{j=0}^n(f(w_j)^{3/4})} \\
其中,f(wi)f(w_i) 表示 wiw_i 在語料庫中出現的頻率; 3/4 是經驗所得。

我們知道了負採樣函數,那麼採樣過程具體是怎麼實現的呢?是類似於 Sub-Sampling Frequent Words,對每一個單詞都進行一個判斷嗎?那樣時間複雜度又回到了原來的 O(n)。

Word2Vec 實現方法如下:

先將概率以累積概率分佈的形式分佈到一條線段上,以 a=0.2,b=0.3,c=0.5a=0.2, b=0.3, c=0.5 爲例,aa 所處線段爲 [0,0.2][0, 0.2]bb 所處線段爲 [0.2,0.5][0.2, 0.5]cc 所處線段爲 [0.5,1][0.5, 1],然後定義一個大小爲 mm 的數組,並與上面的線段做一次映射,這樣我們便知道了數組內的每個單元所對應的字符了,這種情況下算法的時間複雜度爲 O(1)O(1),空間複雜度爲 O(m)O(m)mm 越小精度越大,但空間複雜度也會變得更大。

Parameter

  • Skip-Gram 的速度比 CBOW 慢一點,小數據集中對低頻次的效果更好;
  • Sub-Sampling Frequent Words 可以同時提高算法的速度和精度,Sample 建議取值爲 [105,103][10^{-5} ,10^{-3}]
  • Hierarchical Softmax 對低詞頻的更友好;
  • Negative Sampling 對高詞頻更友好;
  • 向量維度一般越高越好,但也不絕對;
  • Window Size,Skip-Gram 一般 10 左右,CBOW 一般爲 5 左右。

Application

Word2vec 主要原理是根據上下文來預測單詞,一個詞的意義往往可以從其前後的句子中抽取出來。

而用戶的行爲也是一種相似的時間序列,可以通過上下文進行推斷。當用戶瀏覽並與內容進行交互時,我們可以從用戶前後的交互過程中判斷行爲的抽象特徵,這就使得我們可以用詞向量模型應用到推薦、廣告領域當中。

Word2vec 已經應用於多個領域,並取得了巨大成功:

  • Airbnb 將用戶的瀏覽行爲組成 List,通過 Word2Vec 方法學習 item 的向量,其點擊率提升了 21%,且帶動了 99% 的預定轉化率;$^{[5]} $
  • Yahoo 郵箱從發送到用戶的購物憑證中抽取商品並組成 List,通過 Word2Vec 學習併爲用戶推薦潛在的商品;[6]^{[6]}
  • Google 將用戶的搜索查詢和廣告組成 List,併爲其學習特徵向量,以便對於給定的搜索查詢可以匹配適合的廣告。[7]^{[7]}

Conclusion

簡單總結一下: Word2Vec 是一個詞向量開源工具,包括 Skip-Gram 和 CBOW 的兩種算法,加速訓練的方法有:Hierarchical Softmax、Sub-Sampling 和 Negative Sampling。

  • Skip-Gram:利用中心詞預測上下文;
  • CBOW:利用上下文預測中心詞,速度比 Skip-Gram 快;
  • Hierarchical Softmax:引入 Hierarchical 加速 Softmax 的計算過程,對詞頻低的友好;
  • Sub-Sampling:依據詞頻進行採樣,對詞頻低的友好;
  • Negative Sampling:通過負採樣避免更新全部參數,對詞頻高的友好;

最後我們來看一下文章開始時提出的一部分不太好回答的問題:

  1. Word2Vec 的兩個模型哪個效果好哪個速度快?爲什麼?

    • 效果:CBOW 像是小學時做的填空題:I come ___ China,而 Skip-Gram 像是給你一個 from 讓你預測上下文,理論上來說應該是 CBOW 的效果更好,但實際情況卻恰恰相反。我覺得可能是因爲 CBOW 是取上下文的輸入向量的質心從而導致一部分有效信息損失,而 Skip-Gram 雖然看起來荒唐,但每個單詞都會得到單獨的訓練不會損失有效信息,其實 Skip-Gram 比 CBOW 的效果好,主要是針對低頻詞而言,舉個例子,讓你補全 It is a ___ day,是不是突然有很多可能的答案,你大概率會填寫一個高頻詞彙,如:nice、sun 等,而不會想到要填寫 gorgeous,而給你 gorgeous 單詞,其特徵很明顯會想到這可以用來形容 day、moon、girl 等等。其次 gorgeous 本身用量就沒有 nice 那麼多,如果再和其他上下文放在一起取質心,其很容易被忽略,從而沒法充分訓練。
    • 速度:我覺得 Skip-Gram 的速度慢可能是因爲其預測值比較多需要分別計算多個 Softmax,時間複雜度爲 O(kn),而 CBOW 雖然也有多個輸入,但我們求其質心簡化了操作,時間複雜度爲 O(n)。
  2. Hierarchical Softmax 對詞頻低的和詞頻高的單詞有什麼影響?爲什麼?

    H-S 利用了 Huffman 樹依據詞頻建樹,詞頻大的節點離根節點較近,詞頻低的節點離根節點較遠,距離遠參數數量就多,在訓練的過程中,低頻詞的路徑上的參數能夠得到更多的訓練,所以效果會更好。

  3. Word2Vec 有哪些侷限性?

    Word2Vec 作爲一個簡單易用的算法,其也包含了很多侷限性:

    • Word2Vec 只考慮到上下文信息,而忽略的全局信息;
    • Word2Vec 只考慮了上下文的共現性,而忽略的了彼此之間的順序性;

最後引用文獻外也推薦一些看過的資料:

  • 《word2vec Parameter Learning Explained》(Xin Rong 大佬);
  • 《word2vec 中的數學原理詳解》(北漂浪子)
  • 《萬物皆Embedding,從經典的word2vec到深度學習基本操作item2vec》(王喆大佬)
  • 《Word2Vec Tutorial》McCormick 大佬,有五篇教程,簡單明瞭)
  • 《Deep Learning 實戰之 word2vec》(網易有道,有源碼有公式推導有調參建議)

有需要資料的同學可以公衆號後臺回覆:word2vec

Reference

  1. 《word2vec Parameter Learning Explained》

  2. 《Word2Vec Tutorial part 2 - Negative Sampling》

  3. 《Applying word2vec to Recommenders and Advertising》

  4. 《Deep Learning 實戰之 word2vec》

  5. 《Real-time Personalization using Embeddings for Search Ranking at Airbnb》

  6. 《E-commerce in Your Inbox: Product Recommendations at Scale》

  7. 《Scalable Semantic Matching of Queries to Ads in Sponsored Search Advertising》

    歡迎大家關注我的公衆號追蹤最新筆記:阿澤的學習筆記

    阿澤的學習筆記

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