我們在前面介紹的跳字模型與連續詞袋模型有個缺陷就是在計算梯度時的開銷随着詞典增大會變得很大,因為每一步的梯度計算都包含詞典大小數目的項的累加。
為了降低這種帶來的高計算複雜度,介紹兩種近似的處理方案:負采樣和層序softmax
負采樣(Negative Sampling)
我們回顧下跳字模型給定中心詞
生成背景詞
的條件機率:
該條件機率相應的對數損失如下表示:
可以看到softmax運算考慮了背景詞可能是詞典V中的任一詞,以上損失包含了詞典大小數目的項的累加,複雜度大,于是出現新的方法來降低複雜度。
負采樣修改了原來的目标函數,給定中心詞
的一個背景視窗,我們把背景詞
出現在該視窗當作一個事件,該事件的機率計算為:
其中的σ是sigmoid激活函數:
我們先考慮最大化文本序列中所有該事件的聯合機率來訓練詞向量。具體來說,給定一個長度為T的文本序列,時間步t的詞為
且背景視窗大小為m,最大化聯合機率:
然後,這裡的模型中包含的事件僅考慮了正樣本,這導緻當所有詞向量相等且值為無窮大時,上述聯合機率才被最大化為1,很明顯,這樣的詞向量毫無意義。負采樣通過采樣并添加負類樣本使目标函數更有意義。
設背景詞
出現在中心詞
的一個背景視窗為事件P,我們根據分布P(w)采樣K個未出現在該背景視窗的詞,即噪聲詞。設噪聲詞
(k=1,...,K)不出現在中心詞
的該背景視窗為事件
。假設同時含有正類樣本和負類樣本的事件P,
,...,
互相獨立,負采樣将以上需要最大化的僅考慮正類樣本的聯合機率改寫為:
其中條件機率被近似表示為:
設文本序列中時間步t的詞在詞典中的索引為
,噪聲詞
在詞典中的索引為
,有關以上條件機率的對數損失為:
現在的訓練中每步的梯度計算開銷就不再跟詞典大小有關,而跟K線性相關。是以當K較小時,負采樣每步的梯度計算開銷較小。
最後兩步的推導,使用sigmoid激活函數驗證下,是等價的
import numpy as np
np.log(sigmoid(-np.array([0.2,0.4,-0.8])))
np.log(1-sigmoid(np.array([0.2,0.4,-0.8])))
#array([-0.79813887, -0.91301525, -0.37110067])
層序softmax
另一種近似訓練法,就是層序softmax,使用的是二叉樹這樣的資料結構,樹的每個葉節點代表詞典V中的每個詞
假設L(w)為從二叉樹的根節點到詞w的葉節點的路徑(包括根節點和葉節點)上的結點數。設n(w,j)為該路徑上第j個結點,并設該節點的背景詞向量為
,畫圖來看下:
層序softmax将跳字模型中的條件機率近似表示為:
其中leftChild(n)表示結點n是否是左子節點,如果是的話就是1,反之為-1
這裡我們來計算下從給定詞
生成詞
的條件機率(方向經過左->右->左),我們需要将
的詞向量
和根節點到
路徑上的非葉節點向量一一求内積。
可以得到如下公式,注意方向就是正負的差別:
由于
,給定中心詞
生成詞典V中任一詞的條件機率之和為1這一條件也滿足
此外,由于L(
)-1的數量級為O(
),當詞典V很大時,層序softmax訓練中每一步的梯度計算開銷相較未使用近似訓練時大幅降低。
這兩節主要就是公式的熟悉和推導,接下來就是實戰了,感覺這個新的編輯器很好用,流暢和直覺,贊一個