推薦系統實踐 0x13 Word2Vec

NoMornings發表於2021-01-04

Word2Vec是谷歌團隊提出的,讓詞向量在自然語言處理當中再度流行,並且推廣到了廣告、搜尋、推薦等各個領域當中。Word2Vec顧名思義,就是一個生成對詞的向量表達的模型。假設我們使用一組句子組成的語料庫作為訓練資料,其中一句長度為\(T\)的句子為\(w_1,w_2,...,w_T\),假設每個詞都與最相鄰的詞關係最為密切。那麼這種密切的關係可以分為兩種:

  1. CBOW。 每個詞都是由相鄰的詞決定的。cbow輸入是某一個特徵詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量,即先驗概率。
  2. Skip-gram。每個詞都都決定了相鄰的詞。Skip-Gram模型和CBOW的思路是反著來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量,即後驗概率。

這裡借用一下參考圖示:

不過從經驗上來講,Skip-gram效果要好一些。

訓練過程

假如我們選取了\(2c+1\)長度的滑動視窗,從語料庫中抽取一個句子然後從左到右不斷滑動視窗。每移動一次,視窗中的詞就形成了一個訓練樣本。有了訓練樣本,我們就可以定義優化目標。以Skip-gram為例,每個詞\(w_t\)都決定了相鄰詞\(w_{t+j}\),基於極大似然估計的方法,我們希望所有樣本的條件概率\(p(w_{t+j}|w_t)\)之積最大,我們使用對數概率來表示目標函式為

\[\frac{1}{T}\sum_{t=1}^{T}\sum_{-c\le j \le c,j\ne 0}\log p(w_{t+j}|w_t) \]

那麼我們如何定義條件概率\(p(w_{t+j}|w_t)\)呢?在多分類問題當中,通常使用softmax函式。我們希望,通過詞向量的向量表示,可以用內積直觀的表示出語義的接近程度。那麼我們可以用\(w_o\)代表\(w_{t+j}\),也就是輸出詞;用\(w_i\)表示\(w_t\),也就是輸入詞。

\[p(w_o|w_i)=\frac{exp(V_{w_o}'^T V_{w_1})}{\sum_{w_1}^{W}exp(V_{w_o}'^T V_{w_1})} \]

我們容易忽略一個事實,那就是輸入詞和輸出詞的向量表達並不在一個向量空間當中,輸入向量表達和輸出向量表達可以用如下圖來表示:

在這裡,輸入向量表達就是輸入層到隱層的權重矩陣\(W_{v\times N}\),而輸出向量表達就是隱層到輸出層的權重矩陣\(W'_{Nt\times V}\)。由於輸入向量一般是one-hot形式的向量,那麼輸入向量矩陣\(W_{v\times N}\)的每一行對應的權重向量就是同樣意義上的“詞向量”,它也可以被看做是一個查詢表,如如數向量是10000詞的one-hot向量,隱層維度為300,那麼輸入層到隱層的權重向量為\(10000\times 300\)。在轉化為詞向量的查詢表之後,每行的權重變成了對應詞的Embedding向量。

負取樣

由於語料庫中的詞數量巨大,對每個詞都要預測誤差是巨大的計算量,因此,為了減輕訓練復旦,往往採用負樣本的方法進行訓練,也就是需要對取樣出的幾個負樣本進行計算預測誤差。從多分類問題退化成了一個近似二分類問題。如下所示:

\[E=-\log\sigma({v'_{w_o}}^T h)-\sum_{w_j \in W'_{neg}}\log \sigma({v'_{w_j}}^T h) \]

\(v'_{w_o}\)是輸出詞向量(正樣本),而\(W_{neg}\)是負樣本集合,\(v'_{w_j}\)是負樣本詞向量,由於負樣本集合的大小非常有限,通常來說小於10,在每次梯度下降爹地啊過程中,計算複雜度可以縮小為原來的1/1000(假設詞表為10000)。

參考

cbow與skip-gram
(二)通俗易懂理解——Skip-gram和CBOW演算法原理

相關文章