nlp相關

NLP之——Word2Vec詳解

一句話,word2vec就是用一個一層的神經網絡(CBOW的本質)把one-hot形式的詞向量映射到分佈式形式的詞向量,爲了加快訓練速度,用了Hierarchical softmax,negative sampling 等trick。

Word2vec總共有兩種類型--CBoW模型、Skip-gram模型,每種類型有兩個優化算法--層次Softmax(Hierarchical Softmax)負採樣(Negative Sampling),總共4種

 

CBoW模型(Continuous Bag-of-Words Model),是一種根據上下文的詞語預測當前詞語的出現概率的模型:

CBoW Model

其中w(t)代表當前詞語位於句子的位置t,同理定義其他記號。在窗口內(上圖爲窗口大小爲5),除了當前詞語之外的其他詞語共同構成上下文。

其學習目標是最大化對數似然函數:

屏幕快照 2016-07-14 下午7.45.11.png

其中,w表示語料庫C中任意一個詞。

輸入層是上下文的詞語的詞向量(什麼!我們不是在訓練詞向量嗎?不不不,我們是在訓練CBOW模型,詞向量只是個副產品,確切來說,是CBOW模型的一個參數。訓練開始的時候,詞向量是個隨機值,隨着訓練的進行不斷被更新)。

投影層/隱層對其求和,所謂求和,就是簡單的向量加法。

輸出層輸出最可能的w。由於語料庫中詞彙量是固定的|C|個,所以上述過程其實可以看做一個多分類問題。給定特徵,從|C|個分類中挑一個。

對於神經網絡模型多分類,最樸素的做法是softmax迴歸:

神經網絡依存句法分析29.png

softmax迴歸需要對語料庫中每個詞語(類)都計算一遍輸出概率並進行歸一化,在幾十萬詞彙量的語料上無疑是令人頭疼的。
 

然而,直接對詞典裏的V個詞計算相似度並歸一化,顯然是一件極其耗時的impossible mission。爲此,Mikolov引入了兩種優化算法:層次Softmax(Hierarchical Softmax)負採樣(Negative Sampling)

Hierarchical Softmax

層次Softmax的方法最早由Bengio在05年引入到語言模型中。它的基本思想是將複雜的歸一化概率分解爲一系列條件概率乘積的形式

p\left ( v |context \right ) =\prod_{i=1}^{m}p\left ( b_{i}\left ( v \right )|b_{1}\left ( v \right ),\cdots ,b_{i-1}\left ( v \right ),context \right )
其中,每一層條件概率對應一個二分類問題,可以通過一個簡單的邏輯迴歸函數去擬合。這樣,我們將對V個詞的概率歸一化問題,轉化成了對logV個詞的概率擬合問題。

我們可以通過構造一顆分類二叉樹來直觀地理解這個過程。首先,對於每一個非葉子節點,我們約定:節點爲負類編碼爲1,正類則編碼爲0,基於此規則可以生成一串編碼。我們將原始字典D劃分爲兩個子集D1、D2,並假設在給定context下,target word屬於子集D1的概率p(w_{t}\in D_{1}|context)服從logistical function的形式:

p(w_{t}\in D_{1}|context)=\frac{1}{1+e^{-U_{D_{root}}\cdot V_{w_{t}}}}
其中,U_{D_{root}}V_{w_{t}}都是模型的參數。

接下來,我們可以對子集D1和D2進一步劃分。重複這一過程,直到集合裏只剩下一個word。這樣,我們就將原始大小爲V的字典D轉換成了一顆深度爲logV的二叉樹。樹的葉子節點與原始字典裏的word一一對應;非葉節點則對應着某一類word的集合。顯然,從根節點出發到任意一個葉子節點都只有一條唯一路徑——這條路徑也編碼了這個葉子節點所屬的類別。

同時,從根節點出發到葉子節點也是一個隨機遊走的過程。因此,我們可以基於這顆二叉樹對葉子節點出現的似然概率進行計算。所以條件概率p(w_{t}|context)的一般公式

p(w_{t}|context)=\prod_{j=2}^{l^{w}}p\left ( d_{j}^{w}|x_{w},\theta _{j-1}^{w} \right )

其中l^{w}爲一條路徑上的節點數,d_{j}^{w}是詞w在第j個節點的編碼,取值0或1,x_{w}context\left ( w \right )中各詞的詞向量之和,\theta _{j-1}^{w}表示第j-1個非葉子節點對應的向量,

p\left ( d_{j}^{w}|x_{w},\theta _{j-1}^{w} \right)=\left\{\begin{matrix} \sigma \left ( x_{w}^{T}\theta _{j-1}^{w} \right ), & d_{j}^{w}=0 ;\\ \\ 1-\sigma \left ( x_{w}^{T}\theta _{j-1}^{w} \right ), & d_{j}^{w}=1 ; \end{matrix}\right.

或者寫成整體形式

p\left ( d_{j}^{w}|x_{w},\theta _{j-1}^{w} \right)=[\sigma \left ( x_{w}^{T}\theta _{j-1}^{w} \right )]^{1-d_{j}^{w}}\cdot [1-\sigma \left ( x_{w}^{T}\theta _{j-1}^{w} \right )]^{d_{j}^{w}}

舉例來說,對於訓練樣本里的一個target word w_{t},假設其對應的二叉樹編碼爲{1,0,1,...,1},則我們構造的似然函數爲:

p(w_{t}|context)=p\left ( D_{1}=1| context\right )p\left ( D_{2}=0|D_{1}=1\right )\cdots p\left (w_{t}| D_{k}=1\right )
乘積中的每一項都是一個邏輯迴歸的函數

我們可以通過最大化這個似然函數來求解二叉樹上的參數——非葉節點上的向量,用來計算遊走到某一個子節點的概率。

層次Softmax是一個很巧妙的模型。它通過構造一顆二叉樹,將目標概率的計算複雜度從最初的V降低到了logV 的量級。不過付出的代價是人爲增強了詞與詞之間的耦合性。例如,一個word出現的條件概率的變化,會影響到其路徑上所有非葉節點的概率變化,間接地對其他word出現的條件概率帶來不同程度的影響。因此,構造一顆有意義的二叉樹就顯得十分重要。在實際的應用中,以語料中出現的詞作爲葉子節點,以各詞在語料中出現的次數當權值構造出來的Huffman樹可以滿足大部分應用場景的需求。

Negative Sampling

比如我們有一個訓練樣本,中心詞是𝑤,它周圍上下文共有2𝑐個詞,記爲𝑐𝑜𝑛𝑡𝑒𝑥𝑡(𝑤)。由於這個中心詞𝑤,的確和𝑐𝑜𝑛𝑡𝑒𝑥𝑡(𝑤)相關存在,因此它是一個真實的正例。通過Negative Sampling採樣,我們得到neg個和𝑤不同的中心詞𝑤𝑖,𝑖=1,2,..𝑛𝑒𝑔,這樣𝑐𝑜𝑛𝑡𝑒𝑥𝑡(𝑤)和𝑤𝑖就組成了neg個並不真實存在的負例。利用這一個正例和neg個負例,我們進行二元邏輯迴歸,得到負採樣對應每個詞𝑤𝑖對應的模型參數𝜃𝑖,和每個詞的詞向量。


除了這裏介紹的層次Softmax和負採樣的優化算法,Mikolov在13年的論文裏還介紹了另一個trick:下采樣(subsampling)。其基本思想是在訓練時依概率隨機丟棄掉那些高頻的詞:

p_{discard}\left ( w \right )=1-\sqrt{\frac{t}{f\left ( w \right )}}
其中,t是一個先驗參數,一般取爲10^{-5}。𝑓(𝑤)是𝑓(𝑤)在語料中出現的頻率。

實驗證明,這種下采樣技術可以顯著提高低頻詞的詞向量的準確度。

 

從上圖可以看出,對於CBOW,

CBoW模型依然是從context對target word的預測中學習到詞向量的表達。反過來,我們能否從target word對context的預測中學習到word vector呢?答案顯然是可以的:

Skip-gram Model

這個模型被稱爲Skip-gram模型(名稱源於該模型在訓練時會對上下文環境裏的word進行採樣)。

如果將Skip-gram模型的前向計算過程寫成數學形式,我們得到:

 

p\left ( w{_{0}} | w{_{i}}\right )= \frac{e^{{U_{0}}\cdot V_{i}}}{\sum _{j} e^{{U_{j}}\cdot V_{i}}}


其中,𝑉𝑖是Embedding層矩陣裏的列向量,也被稱爲𝑤𝑖的input vector。𝑈𝑗是softmax層矩陣裏的行向量,也被稱爲𝑤𝑖的output vector。

輸入層是一個詞向量

投影層/隱層f\left ( t \right )=w\left ( t \right ),即實際上該隱含層什麼也沒做,只是爲了和CBoW模型結構保持一致才保留的。

輸出層輸出最可能的n個詞。

因此,Skip-gram模型的本質是計算輸入word的input vector與目標word的output vector之間的餘弦相似度,並進行softmax歸一化。我們要學習的模型參數正是這兩類詞向量。

 

模型參數優化建議:

1、模型選擇:skip-gram (slower, better for infrequent words) vs CBOW (fast)

2、優化算法選擇:hierarchical softmax (better for infrequent words) vs negative sampling (better for frequent words, better with low dimensional vectors)

3、sub-sampling of frequent words: can improve both accuracy and speed for large data sets (useful values are in range 1e-3 to 1e-5)

4、滑動窗口size: for skip-gram usually around 10, for CBOW around 5

 

 

 

參考文獻:

1、https://www.cnblogs.com/pinard/p/7160330.html

2、https://www.cnblogs.com/guoyaohua/p/9240336.html

3、https://blog.csdn.net/itplus/article/details/37969979

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