Word2Vec是谷歌團隊提出的,讓詞向量在自然語言處理當中再度流行,並且推廣到了廣告、搜尋、推薦等各個領域當中。Word2Vec顧名思義,就是一個生成對詞的向量表達的模型。假設我們使用一組句子組成的語料庫作為訓練資料,其中一句長度為\(T\)的句子為\(w_1,w_2,...,w_T\),假設每個詞都與最相鄰的詞關係最為密切。那麼這種密切的關係可以分為兩種:
- CBOW。 每個詞都是由相鄰的詞決定的。cbow輸入是某一個特徵詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量,即先驗概率。
- Skip-gram。每個詞都都決定了相鄰的詞。Skip-Gram模型和CBOW的思路是反著來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量,即後驗概率。
這裡借用一下參考圖示:
不過從經驗上來講,Skip-gram效果要好一些。
訓練過程
假如我們選取了\(2c+1\)長度的滑動視窗,從語料庫中抽取一個句子然後從左到右不斷滑動視窗。每移動一次,視窗中的詞就形成了一個訓練樣本。有了訓練樣本,我們就可以定義優化目標。以Skip-gram為例,每個詞\(w_t\)都決定了相鄰詞\(w_{t+j}\),基於極大似然估計的方法,我們希望所有樣本的條件概率\(p(w_{t+j}|w_t)\)之積最大,我們使用對數概率來表示目標函式為
那麼我們如何定義條件概率\(p(w_{t+j}|w_t)\)呢?在多分類問題當中,通常使用softmax函式。我們希望,通過詞向量的向量表示,可以用內積直觀的表示出語義的接近程度。那麼我們可以用\(w_o\)代表\(w_{t+j}\),也就是輸出詞;用\(w_i\)表示\(w_t\),也就是輸入詞。
我們容易忽略一個事實,那就是輸入詞和輸出詞的向量表達並不在一個向量空間當中,輸入向量表達和輸出向量表達可以用如下圖來表示:
在這裡,輸入向量表達就是輸入層到隱層的權重矩陣\(W_{v\times N}\),而輸出向量表達就是隱層到輸出層的權重矩陣\(W'_{Nt\times V}\)。由於輸入向量一般是one-hot形式的向量,那麼輸入向量矩陣\(W_{v\times N}\)的每一行對應的權重向量就是同樣意義上的“詞向量”,它也可以被看做是一個查詢表,如如數向量是10000詞的one-hot向量,隱層維度為300,那麼輸入層到隱層的權重向量為\(10000\times 300\)。在轉化為詞向量的查詢表之後,每行的權重變成了對應詞的Embedding向量。
負取樣
由於語料庫中的詞數量巨大,對每個詞都要預測誤差是巨大的計算量,因此,為了減輕訓練復旦,往往採用負樣本的方法進行訓練,也就是需要對取樣出的幾個負樣本進行計算預測誤差。從多分類問題退化成了一個近似二分類問題。如下所示:
\(v'_{w_o}\)是輸出詞向量(正樣本),而\(W_{neg}\)是負樣本集合,\(v'_{w_j}\)是負樣本詞向量,由於負樣本集合的大小非常有限,通常來說小於10,在每次梯度下降爹地啊過程中,計算複雜度可以縮小為原來的1/1000(假設詞表為10000)。