詞嵌入技術解析(二) 詞嵌入的那些事兒(一)

在文章詞嵌入的那些事兒(一)中,咱們獲得瞭如下結論:html

  1. 詞嵌入是一種把詞從高維稀疏向量映射到了相對低維的實數向量上的表達方式。
  2. Skip-Gram和CBOW的做用是構造神經網絡的訓練數據。
  3. 目前設計的網絡結構其實是由DNN+softmax()組成。
  4. 計算詞嵌入向量實際上就是在計算隱藏層的權矩陣。
  5. 對於單位矩陣的每一維(行)與實矩陣相乘,能夠簡化爲查找元素1的位置索引從而快速完成計算。

本文主要是在上文的基礎上,對模型的隱藏層-輸出層的設計作進一步探索。算法

1. 霍夫曼編碼

霍夫曼編碼(Huffman Coding),又譯爲哈夫曼編碼、赫夫曼編碼,是一種用於無損數據壓縮的熵編碼(權編碼)算法。網絡

霍夫曼樹常處理符號編寫工做。根據整組數據中符號出現的頻率高低,決定如何給符號編碼。若是符號出現的頻率越高,則給符號的碼越短,相反符號的號碼越長。假設咱們要給一個英文單字"F O R G E T"進行霍夫曼編碼,而每一個英文字母出現的頻率分別以下圖所示。dom

1.1 建立霍夫曼樹

進行霍夫曼編碼前,咱們先建立一個霍夫曼樹,具體步驟以下:機器學習

  1. 將每一個英文字母依照出現頻率由小排到大,最小在左,如上圖所示。
  2. 每一個字母都表明一個終端節點(葉節點),比較F.O.R.G.E.T六個字母中每一個字母的出現頻率,將最小的兩個字母頻率相加合成一個新的節點。如Fig.2所示,發現FO的頻率最小,故相加2+3=5。
  3. 比較5.R.G.E.T,發現RG的頻率最小,故相加4+4=8。
  4. 比較5.8.E.T,發現5E的頻率最小,故相加5+5=10。
  5. 比較8.10.T,發現8T的頻率最小,故相加8+7=15。
  6. 最後剩10.15,沒有能夠比較的對象,相加10+15=25。
  7. 最後產生的樹狀圖就是霍夫曼樹,參考下圖。 

 

1.2 進行編碼

給霍夫曼樹的全部左節點設置爲'0',全部右節點設置爲'1'。函數

從根節點到葉子節點依序記錄全部字母的編碼,以下圖所示:post

以上步驟就是對詞進行霍夫曼編碼的操做步驟。能夠看到,詞的出現頻率越高,越靠近根節點,且編碼長度越短。學習

2. Hierarchical Softmax的理解

首先回顧一下softmax函數。softmax(規範化指數函數)是網絡輸出層的函數,用於計算包含至少兩種不一樣類型的詞嵌入向量。此外,它也常常被用做爲神經網絡的激活函數,相似的還包括sigmoid和tanh等函數。softmax的公式以下:編碼

其中,激活輸出向量的每一個元素都是在給定輸入單詞I的狀況下,等於詞彙表中第j個單詞時的機率。同時,激活輸出向量的全部元素之和等於1且每一個元素映射到區間[0,1]。這個算法的計算複雜度便是詞彙表的大小O(V)。實踐代表,咱們能夠經過使用二叉樹結構來有效地地減小此計算複雜度。下面,將介紹Hierarchical Softmax。url

使用Hierarchical Softmax的主要緣由是其計算複雜度是以2爲底V的對數。

每一個單詞均可以經過從根節點-內部節點的路徑到達,此外,對這個路徑的度量能夠由沿着這條路徑的各機率乘積表示。各個機率值由sigmoid函數產生:

其中x由輸入和輸出向量的點積求出,n(w,j)表示爲從根節點到葉子結點w(即上下文單詞)的路徑上的第j個節點。

實際上,咱們能夠用機率p來代替sigmoid函數。對於每一個內部節點,咱們都選擇了一個任意子節點(左或右),並將正的sigmoid函數值賦給其中的一個(一般是左子節點)。

經過保留這些約束,節點n的左子節點的sigmoid函數能夠描述爲:

同理,節點n的右子節點的sigmoid函數能夠描述爲:

因此,輸出詞的計算機率爲:

其中,L(w)表示霍夫曼樹的深度,ch(n)表示節點n的子節點;角大括號表示布爾檢驗是否爲真或假:若是布爾檢驗爲True,說明節點n與其子節點ch(n)都在樹的左邊,即其子節點爲左子節點。反之,若是布爾值爲False,即其子節點ch(n)爲右子節點。

回顧詞嵌入的那些事兒(一)基於Tensorfow的Skip-Gram極簡實現的內容,模型輸出的實際上是預測目標詞的機率,也就是說每一次預測都要基於所有的數據集進行softmax()機率計算。神經網絡結構以下圖所示:

而採用Hierarchical Softmax後,因爲替換了以前的softmax()函數,因此,隱藏層的詞嵌入向量不須要對詞彙表每一個單詞計算其爲輸出詞的機率。

例如假設輸出詞是w2,所以能夠沿着霍夫曼樹從根節點(即詞嵌入向量)一直走到咱們的葉子節點w2(輸出詞)。由下圖能夠觀察到,僅需執行3步的sigmoid函數計算,就能夠肯定葉子節點w2的位置。這無疑大大減小了操做數。

實際上,咱們在計算詞嵌入向量所採用的霍夫曼編碼與第一節的介紹基本一致,區別只是對左右節點的0 1計數有所不一樣,好比:

3. Negative Sampling的理解

那麼,霍夫曼樹是否是計算詞嵌入向量的最優解?假設咱們的訓練樣本里的中心詞w是一個很生僻的詞,那麼就得在霍夫曼樹中一直往下尋找路徑。能不能不用搞這麼複雜的一顆霍夫曼樹,將模型變的更加簡單呢?Negative Sampling就是這麼一種求解word2vec模型的方法,它摒棄了霍夫曼樹,採用了Negative Sampling(負採樣)的方法來求解,下面咱們就來看看Negative Sampling的求解思路。

首先,須要瞭解噪聲對比估計(NCE)。

3.1 噪聲對比估計(NCE)

噪聲對比估計(NCE)的核心思想是經過logistic迴歸將一個多分類問題轉化爲一個二分類問題,同時保留學習到的詞向量的質量。在NCE中,詞向量再也不是經過從中心詞中預測上下文單詞來學習,相反經過學習如何從(target, random word from vocabulary)對中區分出真實的(target, context)對從而完成詞向量的計算。換句話說,若是一個模型可以從隨機噪聲中分辨出實際的目標詞對和上下文詞對,那麼好的詞向量就會被學習。

3.2 Negative Sampling

而Negative Sampling是基於噪聲對比估計(相似於生成對抗性網絡)的一種方法。

即一個好的模型應該經過邏輯迴歸來區分假信號和真實信號。同時Negative Sampling背後的思想相似於隨機梯度降低:不是每次都改變全部的權重,考慮到咱們所擁有的成千上萬的觀測數據,咱們只使用了其中的K個,而且顯著地提升了計算效率:

正如上圖公式,與隨機梯度降低法的區別在於,咱們不只考慮了一個觀測結果還考慮了其中的K個。

對於訓練數據集,咱們使用的是具備噪聲分佈的數據集。之因此使用這種噪聲分佈數據集,是爲了區分真實數據和咱們試圖解決的假數據。具體來講,對於每一個正樣本(即 true target/context pair),咱們從噪聲分佈中隨機抽取k個負樣本,並feed進模型。對於小的訓練數據集,建議k值在5到20之間,而對於很是大的數據集,k值在2到5之間就足夠了。咱們的模型只有一個輸出節點,它能夠預測這對數據是隨機噪聲數據仍是真實有效的target/context對。

因爲採用了隨機採樣,因此須要假定一個機率分佈。在詞彙表中每一個單詞wi被採樣到的機率由下式決定,其中冪爲3/4。之所取3/4是由於能夠減弱因爲不一樣頻次差別過大形成的單詞采樣差別的影響,使得小頻次的單詞也有必定被採樣的機率。f(w)是詞彙表中單詞w出現的頻率:

舉例說明:

在採樣前,咱們將長度爲1的線段劃分紅M等份,這裏M>>V,這樣能夠保證每一個詞對應的線段都會劃分紅對應的區間塊。在採樣時,咱們只須要從M個區間中採樣出neg個區間,此時採樣到的每個區間塊對應到的線段所屬的詞就是咱們的負例詞。 

可能會有疑問:使用Negative Sampling後,負樣本數量較多,正樣本只有一個,會不會出現樣本不均衡的現象從而致使邏輯迴歸模型分錯左右子節點?實際上,樣本不均衡這種問題主要出如今分類算法中。而咱們這裏詞向量的訓練本質不是一個分類問題,因此問題不大。

最後,通常來說,NCE是一種漸近無偏的通常參數估計技術,而Negative Sampling更常常被用在二分類模型(例如邏輯迴歸)中,它們對詞向量學習有用,但不是做爲通用估計器去執行其餘機器學習任務。具體能夠參考這篇論文:Notes on Noise Contrastive Estimation and Negative Sampling 。

4. 總結

  1. 霍夫曼編碼會使得出現頻率最高的詞編碼長度最短,且路徑最短。
  2. Negative Sampling的核心思想是每次訓練只隨機取一小部分的負例使他們的機率最小,以及對應的正例機率最大。
  3. 相比於Hierarchical Softmax,Negative Sampling再也不採用霍夫曼樹,而是採用隨機負採樣。
  4. 從計算效率上講,Negative Sampling優於Hierarchical Softmax優於Softmax。

5. 參考資料

[1] 維基百科:霍夫曼編碼

[2] Language Models, Word2Vec, and Efficient Softmax Approximations

[3] word2vec(cbow skip-gram hierarchical softmax Negative sampling)模型深度解析

相關文章
相關標籤/搜索