博客原文鏈接:

Road 2 NLP- Word Embedding詞向量(Word2vec) | Eajacks Blog?

eajack.github.io
圖標

PS:不得不說,某乎專欄公式書寫十分不友好:(1)不支持Mathjax/TeX語法,需要網頁編輯插入公式;(2)加入公式後的排版真心丑。

推薦電腦端網頁閱讀

1. 參考資料

  • Word2vec 開山之作1:《Distributed Representations of Sentences and Documents》,作者Mikolov
  • Word2vec 開山之作2:《Efficient estimation of word representations in vector space》,作者Mikolov
  • Word2vec論文講解:《word2vec Parameter Learning Explained》,作者Xin Rong
  • 知乎專欄文:[NLP] 秒懂詞向量Word2vec的本質
  • 博客文章:word2vec原理(三) 基於Negative Sampling的模型

以下為[NLP] 秒懂詞向量Word2vec的本質 的推薦資料分析:

1. Mikolov 兩篇原論文:
『Distributed Representations of Sentences and Documents』
貢獻:在前人基礎上提出更精簡的語言模型(language model)框架並用於生成詞向量,這個框架就是 Word2vec
『Efficient estimation of word representations in vector space』
貢獻:專門講訓練 Word2vec 中的兩個trick:hierarchical softmax 和 negative sampling
優點:Word2vec 開山之作,兩篇論文均值得一讀
缺點:只見樹木,不見森林和樹葉,讀完不得要義。
這裡『森林』指 word2vec 模型的理論基礎——即 以神經網路形式表示的語言模型
『樹葉』指具體的神經網路形式、理論推導、hierarchical softmax 的實現細節等等

2. 北漂浪子的博客:『深度學習word2vec 筆記之基礎篇』
優點:非常系統,結合源碼剖析,語言平實易懂
缺點:太啰嗦,有點抓不住精髓

3. Yoav Goldberg 的論文:『word2vec Explained- Deriving Mikolov et al.』s Negative-Sampling Word-Embedding Method』
優點:對 negative-sampling 的公式推導非常完備
缺點:不夠全面,而且都是公式,沒有圖示,略顯乾枯

4. Xin Rong 的論文:『word2vec Parameter Learning Explained』:
!重點推薦!
理論完備由淺入深非常好懂,且直擊要害,既有 high-level 的 intuition 的解釋,也有細節的推導過程
一定要看這篇paper!一定要看這篇paper!一定要看這篇paper!

5. 來斯惟的博士論文『基於神經網路的詞和文檔語義向量表示方法研究』以及他的博客(網名:licstar)
可以作為更深入全面的擴展閱讀,這裡不僅僅有 word2vec,而是把詞嵌入的所有主流方法通通梳理了一遍

6. 幾位大牛在知乎的回答:『word2vec 相比之前的 Word Embedding 方法好在什麼地方?』
劉知遠、邱錫鵬、李韶華等知名學者從不同角度發表對 Word2vec 的看法,非常值得一看

7. Sebastian 的博客:『On word embeddings - Part 2: Approximating the Softmax』
詳細講解了 softmax 的近似方法,Word2vec 的 hierarchical softmax 只是其中一種

對比上述所有資料,重點看《word2vec Parameter Learning Explained》,並期望基於此文完全弄懂Word2vec原理。

2. Word2vec原理(《word2vec Parameter Learning Explained》)

Word2vec = CBOW + Skip-Gram(Hierarchical Softmax & Negative Sampling)

其中,

  • CBOW:上下文詞語 預測 中心詞
  • Skip-Gram:中心詞 預測 上下文詞語

2.1. One-Word Context(CBOW & Skip-Gram一致的最簡單情形)

  • 問題描述:最簡單情形,input => 當前詞,output => 下一個詞,即輸入當前詞預測下一個詞
  • 模型框架

為方便解說,這裡不直接引用原論文圖,自己重新Visio畫。

(1). Input layer:輸入: X_{V*1} = OneHot(wordNow)(模型外部輸入input1), 初始化隨機矩陣 W_{V*N}PS: W_{V*N} 第w行的行向量 V_w ,稱作輸入向量(input vector),Size為:1xN,N為詞向量維度,V>>N)。輸出:h_{N*1}=W_{V*N}^{T}X_{V*1}

(2). Hidden layer:輸入:Input層輸出,初始化隨機矩陣 W^{}_{V*N}PS: W^{}_{V*N} 的第w列的列向量 , V^{}_w 稱作輸出向量(output vector),Size為:Nx1)。輸出: u_{V*1}=W^{T}_{N*V}h_{N*1}

(3). Output layer:輸入:Hidden層輸出 u 。輸出: y_j = frac{exp(u_j)}{sum_{a=1}^{V}exp(u_a)} (預測輸出Y_predict)。實際輸出(模型外部輸入input2) YReal=OneHot(wordNext) 。Y_predict & Y_real構造loss function更新權值 W、W^{}

輸入向量矩陣 W 、輸出向量矩陣 W^{} ,均可作為詞語的詞向量表示。但是Word2vec採用輸入向量矩陣 W 。原因:輸出向量矩陣 W^{} 更新代價大,以下為《word2vec Parameter Learning Explained》原文

1. 英文原文:
Learning the input vectors is cheap; but learning the output vectors is very expensive.

From the update equations (22)and (33), we can and that, in order to update v_w , for each training instance, we have to iterate through every word w_j in the vocabulary, compute their net input u_j , probability prediction y_j (or y_{cj} for skip-gram), their prediction error e_j (or EI_j for skip-gram), and finally use their prediction error to update their output vector v^{}_{j}.

Doing such computations for all words for every training instance is very expensive,
making it impractical to scale up to large vocabularies or large training corpora.

To solve this problem, an intuition is to limit the number of output vectors that must be updated per training instance. One elegant approach to achieving this is hierarchical softmax; another approach is through sampling, which will be discussed in the next section.

2. 中文翻譯(Google):
學習輸入向量很便宜; 但學習輸出向量非常昂貴。

從更新方程(22)和(33),我們可以和那個為了更新v_w,對於每個訓練實例,我們必須遍歷辭彙表中的每個單詞w_j,計算它們的凈輸入u_j,概率預測y_j( 或者y_ {cj}用於skip-gram),它們的預測誤差e_j(或者用於skip-gram的EI_j),並且最後使用它們的預測誤差來更新它們的輸出向量v^{}_{j}。

對每個訓練實例的所有單詞進行此類計算非常昂貴,
使擴展到大型辭彙表或大型培訓語料庫變得不切實際。

為了解決這個問題,直覺是限制每個訓練實例必須更新的輸出向量的數量。 實現這一目標的一個優雅方法是分層softmax; 另一種方法是通過抽樣,這將在下一節中討論。

這段文字有2個結論:(1)訓練輸入向量更容易;(2)Hierarchical Softmax & Negative Sampling 方法都是用於更新輸出向量的。

  • 模型本質

通過上面對3層分析,Word2vec模型本質:訓練更新權值矩陣W,即輸入向量矩陣,作為詞向量表。因為矩陣W尺寸為V*N,則每一行的行向量對應著該位置的詞的Word2vec詞向量

  • 模型例子

詞庫為:「我」、「喜歡」、「蘋果」,對應的One-Hot詞向量分別為[1,0,0]、[0,1,0]、[0,0,1]。輸入到One-Word-Context CBOW模型,取詞向量維度N=2(一般V>>N,此處V=3,作為例子取N=2)經過訓練得到W矩陣如下:

W = egin{bmatrix}0.2 & 0.4\0.6 &0.7\0.8 &0.1end{bmatrix}

尺寸為V x N,即3 x 2。因此,「我」的Word2vec詞向量為[0.2, 0.4],「喜歡」的Word2vec詞向量為[0.6, 0.7],「蘋果的」Word2vec詞向量為[0.8, 0.1]。

  • loss function

Output層的預測輸出: y_j = frac{exp(u_j)}{sum_{a=1}^{V}exp(u_a)}

聯合額外公式: h_{N*1}=W_{V*N}^{T}X_{V*1}=v_{wI}^{T}u_j=V_w^{T}h_{N*1} PS: u_j 為標量, V_w^{T} 尺寸為1xN。

推導出:

y_j = frac{exp(V_{w_j}^{T}v_{wI}^{T})}{sum_{a=1}^{V}{exp(V_{w_a}^{T}v_{wI}^{T}})}

令loss function為最大似然函數:

E=log(y_j)=u_j - log(sum_{a=1}^{V}exp(u_a))

  • 模型訓練:參數更新(BP/SGD演算法)

PS:此處涉及矩陣求導。。也不是很懂,儘可能去理解。部分公式可能編輯有問題,能理解原意即可。

(1). W^{} 更新: u→W^{} (output→hidden)

ufrac{partial E}{partial u_j}=y_j - t_j := e_jy_{i} 為實際輸出; t_j=1(j=j^{*})j 為預測輸出y位置, j^{*} 後者則為實際輸出; e_j 為預測error)

W^{}frac{partial E}{partial w_{ij}}=frac{partial E}{partial u_j} - frac{partial u_j}{partial w_{ij}} := e_j * h_i

更新公式

w_{ij}^{(new)} = w_{ij}^{(old)}  - η * e_j * h_i

V_{wj}^{(new)} = V_{wj}^{(old)}  - η * e_j * h

V_{wj}W^{} 矩陣的第j列的列向量,即輸出向量。

(2). W 更新: h→W (hidden→input)

h:frac{partial E}{partial h_i}=sum_{j=1}^{V}{frac{partial E}{partial u_j}frac{partial u_j}{partial h_i}} =sum_{j=1}^{V}{e_j * w^{}_{ij}}:= Z_i

W:frac{partial E}{partial w_{ki}}=frac{partial E}{partial h_i}*frac{partial h_i}{partial w_{ki}}=Z_i * X_k

PS: frac{partial E}{partial W}=X_{V*1} 叉乘 Z ,叉乘定義: a 叉乘 b = |a||b|sin 。由於 X 僅有唯一位置非0,則 frac{partial E}{partial W} 僅有唯一的一行非零向量,其值為 Z^T

更新公式

V^{(new)}_{wI}=V^{(old)}_{wI}-η*Z^{T}

V_{wI}W 矩陣的第 i 行的行向量,即輸入向量。

至此One-Word-Context所有原理結束,接下來的Multi-Word CBOW & Skip-Gram模型原理和這個差別不大,僅在此基礎上修改部分公式。

2.2 CBOW(Continuous Bag-of-Word Model)

2.2.1 Multi-Word Context

Multi-Word的意思是說,多個上下文詞語 => 中心詞(當前詞)。CBOW,即為One-Word-Context的Input layer擴展。此處直接借用文獻圖

  • 和One-Word-Context的唯一區別:

egin{aligned} h=frac{1}{C}W^{T}(x_{1}+x_{2}+···+x_{C})\ =frac{1}{C}(V_{w1}+V_{w2}+···+V_{wC})^{T} end{aligned}

即取上下文總共C個詞語的One-Hot編碼,上下文詞數分別為 frac{2}{C} ,求平均所有Input layer輸入

2.3 Skip-Gram

同CBOW理,Skip-Gram,即為One-Word-Context的Output layer擴展

  • 和One-Word-Context的唯一區別:loss function

egin{aligned} E &=-log pleft(w_{O, 1}, w_{O, 2}, cdots, w_{O, C} | w_{I}
ight) \ &=-log prod_{c=1}^{C} frac{exp left(u_{c, j_{c}^{*}}
ight)}{sum_{j^{prime}=1}^{V} exp left(u_{j^{prime}}
ight)} \ &=-sum_{c=1}^{C} u_{j_{c}^{*}}+C cdot log sum_{j^{prime}=1}^{V} exp left(u_{j^{prime}}
ight) end{aligned}

2.4 Hierarchical Softmax

分層softmax(Hierarchical Softmax)本質是優化版softmax,即引入Hierarchical Softmax僅是代替原來softmax結構,優化output vector計算複雜度

  • 原softmax: y_{i}=frac{exp(x_i)}{sum_{a=1}^{V}{exp(x_a)}} ,其中 x_i 為輸入向量 X_{V*1}i 位數值標量, y_i 則為對應輸出,輸出向量 Y_{V*1}

可以看出,計算一次 y_i 需要知道所有 x_{i} 值。複雜度為O(V)。

  • Hierarchical Softmax:引入霍夫曼樹,首先依據詞頻構建霍夫曼樹,詞語節點都是葉節點。q

如下圖為論文原圖

在Hierarchical Softmax中,舉例如上圖,計算詞語 w_{2} 對應的softmax近似概率(H-softmax計算近似值):

egin{aligned} y_{i}=P(w_{2}=w_{O})=P(n(w_2,1),left)P(n(w_2,2),left)P(n(w_2,3),right)\ =σ(v^{T}{n(w{2},1)}h)σ(v^{T}{n(w{2},2)}h)(1-σ(v^{T}{n(w{2},3)}h)) end{aligned}

其中 v^{T}{n(w_{2},1)}、v^{T}{n(w_{2},2)}、v^{T}{n(w_{2},3)} 分別為3個節點參數,需要訓練更新。

sum_{a=1}^{V}{P(w_{i}=w_{O})}=1

為表示方便,上圖例子公式如下

y_{i}=σ(θ^{T}{n(w{2},1)}h)σ(θ^{T}{n(w{2},2)}h)(1-σ(θ^{T}{n(w{2},3)}h))

其中, σ(x) 函數為二元邏輯回歸函數 y=frac{1}{1+exp(-X^{T}*θ)}

容易看出,上面計算 y_{i} 公式計算複雜度下降,不再需要計算V步,僅需要 log(V) 步(即 w_2 路徑長)。所以Hierarchical Softmax的計算複雜度為O(log(V))

參數更新:

	heta^{(new)}_j = 	heta^{(old)}_j – eta(sigma({	heta_j}^Th)-t_j)h

2.5 Negative Sampling

參考博客文章word2vec原理(三) 基於Negative Sampling的模型,總結如下。

Negative Sampling,是代替H-softmax方法的另一種優化計算output vector的方法。如其名,這方法涉及採樣(Sampling)。

  • 大致原理:現有訓練樣本,包括當前中心詞 w 和C個上下文詞 Context(w) (上下文分別 frac{2}{C} 個詞),命名為正例。對詞庫進行負採樣(Negative Sampling),得到 w 的N個中心詞 w_i(i=1,2,···,N) ,將N個樣本 w_i、Context(w)(i=1,2,···,N) (注意: Context(w) 沒變,只是中心詞 w 變了)一起作為訓練樣本,命名為負例。正例 & 負例 => loss function。
  • 2個問題:如上原理介紹,有2個問題:
  • Q1:如何Negative Sampling獲得 w 的N個中心詞 w_i(i=1,2,···,N)

  • Q2:如何根據正負樣例構造loss function?
  • Q1:Negative Sampling

詞庫詞語數量為V,引入長度為1的標準線L,將其分為V份,每一小段對應1個詞語。Word2vec中,定義每個詞語對應的長度為 len(w_{i})=frac{count(w_{i})^{3/4}}{sum_{a=1}^{V}{count(w_{i})^{3/4}}} ,且有 sum_{a=1}^{V}{len(w_i)=1}

採樣前,將標準線L等分為M份(M>>V,Word2vec中M取 10^{8} ),因此每個詞長可以對應若干個M小份長度。如下圖為博客圖片:

採樣時,隨機在M個位置中採樣N個 m_{i} 位置,則每一個位置肯定落入對應的1個詞語。注意:採樣詞不要重複且不能和當前中心詞 w 一樣。

  • Q2:loss function

定義當前詞 ww_{0} ,正例為 [w_{0},Context(w_{0})] ,負例為 [w_{i},Context(w_{i})](i=1,2,3,···,N)

根據邏輯函數有正例概率:

P(context(w_0), w_i) = sigma(x_{w_0}^T	heta^{w_i}) ,y_i=1, i=0

負例概率:

P(context(w_0), w_i) =1-  sigma(x_{w_0}^T	heta^{w_i}), y_i = 0, i=1,2,..N

最大化公式:

prod_{i=0}^{N}P(context(w_0), w_i) = sigma(x_{w_0}^T	heta^{w_0})prod_{i=1}^{N}(1-  sigma(x_{w_0}^T	heta^{w_i}))

似然函數:

Q=prod_{i=0}^{N} sigma(x_{w_0}^T	heta^{w_i})^{y_i}(1-  sigma(x_{w_0}^T	heta^{w_i}))^{1-y_i}

log似然:

L = sumlimits_{i=0}^{N}y_i log(sigma(x_{w_0}^T	heta^{w_i})) + (1-y_i) log(1-  sigma(x_{w_0}^T	heta^{w_i}))

參數更新:(SGD演算法)

類似前面操作,最終有參數 x_{w_0}, 	heta^{w_i},  i=0,1,..N 更新公式。具體參考word2vec原理(三) 基於Negative Sampling的模型。

3. 總結

  • Word2vec = CBOW + Skip-Gram(Hierarchical Softmax & Negative Sampling)。其中,CBOW:上下文詞語 預測 中心詞;Skip-Gram:中心詞 預測 上下文詞語
  • Word2vec詞向量僅是模型副產品,即輸入向量矩陣W

推薦閱讀:

相关文章