目錄:
由於word2vec模型學習生成的詞向量表示方法能夠攜帶句子的語義信息(semantic meanings),因此非常適用於多種NLP任務。
這篇論文詳細地推導和解釋了word2vec模型的參數更新公式,包括:CBOW(continuous bag-of-word)模型和SG(skip-gram)模型,以及兩種參數優化技術:hierarchical softmax 和 negative sampling.
我們從CBOW模型的最簡單版本開始介紹——One-word context。即我們假定context(預測目標單詞的上下文信息)只有一個單詞,也就是說One-word context 模型是在只要一個上下文單詞(one context word)的情況下來預測一個目標單詞(one target word)的。(注:對於初學神經網絡的讀者,建議先看完附錄A之後,在回到此處閱讀下文)。
如圖1描述的就是One-word context定義之下的神經網絡模型。這裏我們假設文本詞彙量的大小爲V,隱藏層的大小爲N,相鄰層的神經元是全連接的。輸入層是一個用one-hot方式編碼的單詞向量
,其中只有一個
爲1,其餘均爲0。
從輸入層到 隱藏層的權重值可以用一個
維的矩陣
來表示,即
其中
矩陣的每一行代表的是一個與輸入層相關的單詞的N維向量表示形式
。那麼假設我們給定了一個輸入單詞(a context),其單詞向量的第k個元素
,其餘均爲0,則有
從(1)式我們可以看出, 向量完全是從 矩陣第k行復制過來的(同 均爲N維向量)。 即爲輸入單詞 的一種向量表示(其實就是輸入向量,我們後面會提到)。
分析完輸入層到隱藏層之後,我們再看隱藏層到輸出層,同樣連接權重用一個新的N × V矩陣 來表示如下:
通過這些權重,我們可以爲詞表中的每一個單詞都計算出一個得分
其中, 即爲矩陣 的第j列向量(也是N維向量,其實就是單詞w的輸出向量,我們後面會提到)。
經過以上討論之後,我們可以使用一種對數-線性分類模型softmax函數來計算單詞的後驗分佈(是多項式分佈)
其中,
表示輸出層第j個神經單元的輸出值。將(1)式和(2)式代入(3)式我們可以得到:
注意:正如前文所述, 和 是單詞的兩種向量表示形式。其中 實際上是權重矩陣 (input->hidden)的某一行向量, 則是權重矩陣 (hidden->output)的某一列向量。我們將 和 分別稱爲「輸入向量(input vector)」和「輸出向量(output vector)」(二者均爲N維向量)。
接下來讓我們推到權重矩陣的更新公式,儘管在實際的計算過程中這樣做是不切實際的(我們在之後再談)。
在我們推導hidden→output權重的更新公式的過程中,需要用到神經網絡的反向傳播算法,對這部分內容不熟悉的讀者可以參考附錄A的內容。
由以上描述可知,該模型訓練的目標就是求公式(4)的最大值。公式(4)代表的就是給定上下文信息(這裏爲一個單詞
)以及其權重矩陣的情況下,預測其實際輸出單詞(即上下文信息的中心詞
)的條件概率。
現在我們開始推導從隱藏層到輸出層的權重矩陣在模型訓練過程中的參數更新公式。首先我們對損失函數
求關於得分
的偏導數,得結果爲:
其中, ,即當且僅當輸出層的第j個神經單元爲真實的輸出單詞時 的取值爲1。接下來我們根據鏈式法則求出損失函數 關於矩陣 元素 的偏導數爲:
因此,採用隨機梯度下降算法(SGD),我們最終得到了隱藏層到輸出層(hidden output)權重的更新公式如下:
其中, 爲參數更新的學習速率; ; 爲隱藏層的第i個神經單元; 爲 的輸出向量。
由公式(11)我們可以看出:在更新權重參數的過程中,我們需要檢查詞彙表中的每一個單詞,計算出它的輸出概率 ,並與期望輸出 (取值只能爲0或者1)進行比較。比較過程如下:
1)如果
(「overestimating」),那麼就從向量
中減去隱藏向量
的一部分(例如
),這樣向量
就會與向量
相差更遠。
2)如果
(「underestimating」,這種情況只有在
時,纔會發生,此時
),則將隱藏向量
的一部分加入
,使得
與
更接近。
3)如果
與
非常接近,則此時
由於(公式(8))非常接近於0,故更新參數基本上沒什麼變化。
這裏需要再次提醒的是: 和 是單詞 的兩種不同的向量表示形式。
在介紹完hidden
output的權重矩陣更新公式之後,我們接着介紹input
hidden的權重矩陣
的更新過程。我們繼續對損失函數
求關於隱藏層
的偏導數,得:
其中 爲隱藏層第i個神經單元的輸出; 在公式(2)中已經定義,表示輸出層第j個神經單元的輸入; 爲輸出層第j個單詞的預測誤差。因此EH應該是一個N維向量,它的每一個元素代表的是詞彙表中的每個單詞的預測誤差 與 在j=1到V上的乘積之和。
接下來,我們需要求出損失函數 關於權重矩陣 的偏導數。首先,分解公式(1),我們知道隱藏層激活單元的輸出 是輸入層 與權重的線性組合,即
因此對於權重矩陣 的每一個元素,我們求關於 的偏導數,得到:
因此我們利用張量乘積的方式,便可得到:
我們再次得到了一個
的矩陣。由於
向量只有一個非0元素,因此
只有一行是N維非0向量
,因此矩陣
的更新公式爲:
其中 是矩陣 的其中一行,是唯一的上下文單詞(context word)的「輸入向量」,也是矩陣 唯一的導數非0的行向量。 除了 以外,矩陣 的其他行向量在參數更新迭代過程中都會保持不變(因爲其導數爲0)。
與矩陣 的更新過程相似,對於公式(16),我們分析如下:
1)如果過高地估計了某個單詞 作爲最終輸出單詞的概率(即: ),則上下文單詞 (context word )的輸入向量與單詞 的輸出向量在更新的過程中會相差越來越大。
2)如果相反,某個單詞 作爲最終輸出單詞的概率被低估(即: ),則單詞 的輸入向量與單詞 的輸出向量在更新過程中會越來越接近。
3)如果對於單詞 的概率預測是準確的,則對於單詞的輸入向量在更新過程中幾乎保持不變。
因此,上下文單詞 (context word )的輸入向量的更新取決於詞彙表中所有單詞的預測誤差。預測誤差越大,則該單詞對於上下文單詞的輸入向量的更新過程影響越大。
在介紹完One-word context的CBOW模型之後,我們接着介紹multi-word context下的CBOW模型。
根據字面意思我們就可以看出,基於multi-word context的CBOW模型就是利用多個上下文單詞來推測中心單詞target word的一種模型。其結構如圖2所示:
其隱藏層的輸出值的計算過程爲:首先將輸入的上下文單詞(context words)的向量疊加起來並取其平均值,接着與input hidden的權重矩陣相乘,作爲最終的結果,公式如下:
其中 爲上下文單詞的個數, 爲上下文單詞, 爲單詞 的輸入向量。損失函數爲:
同樣,由hidden output的權重更新公式與one-word-context模型下的一模一樣,即類似於公式(11),我們直接寫在下面:
由input
hidden 的權重矩陣更新公式與公式(16)類似,只不過現在我們需要對每一個上下文單詞
都執行如下更新公式:
其中 爲上下文context中第c 個單詞的輸入向量; 爲正學習速率; 由公式(12)給出。
與CBOW模型正好相反,Skip-Gram模型是根據中心單詞(target word)來預測其上上下文信息(context words)。如圖3所示,爲Skip-Gram模型的結構示意圖。
我們仍然使用 來表示輸入層上唯一的那個單詞的輸入向量,因此,我們對於隱藏層的輸出值 的計算公式與第一節公式(1)相同,表示如下:
公式(24)顯示:
向量其實就是input->hidden權重矩陣
的某一行結合輸入單詞
的向量拷貝。在輸出層,與CBOW模型的輸出爲單個多項式分佈不同的是,SG模型在輸出層輸出了C個多項式分佈。每個輸出都使用相同的hidden->output矩陣計算:
其中, 表示輸出層的第c個panel的第j個單詞(何爲panel?就是輸出層的表示每個上下文單詞的神經元的組合,圖中一種有C個context words,所以總共有C個panel); 實際上表示的是輸出上下文單詞(output context words)的第c個單詞; 是唯一的輸入單詞; 爲輸出層的第c個panel上的第j個神經單元的概率輸出值; 表示的是輸出層第c個panel的第j個神經元的輸入值;由於輸出層的所有panels共享同一權重矩陣 ,因此:
其中,
爲詞彙表第j個單詞
的輸出向量;同樣,它也是取自於hidden
output權重矩陣
的一列。
SG模型參數更新公式的推導過程與one-word-context 模型的推導過程大體上一樣。這裏我們將損失函數變爲:
其中,
爲第c個輸出層輸出的上下文單詞在詞彙表中的真實索引。
在得到損失函數
之後,我們對輸出層的每一個panel上的所有激活單元的輸入值
,均求其關於
的偏導數,得:
其中
爲輸出層神經元的預測誤差,與公式(8)類似。爲了簡化符號,我們定義一個
維的向量
作爲所有上下文單詞的預測誤差之和,
用公式定義如下:
接下來,我們計算hidden->output權重矩陣 關於 的偏導數爲:
這樣,我們就得到了hidden output權重矩陣 的參數更新公式爲:
或者
上述參數更新公式的直觀概念理解與上文公式(11)無二,除了一點就是:輸出層的預測誤差的計算是基於多個上下文單詞context words,而不是單個目標單詞 target word;需注意的是對於每一個訓練樣本,我們都要利用該參數更新公式來更新hidden output權重矩陣 的每個元素。
同樣,對於input
hidden權重矩陣
的參數更新公式的推導過程,除了考慮要將預測誤差
替換爲
外,其他也與上文公式(12)到公式(16)類似。這裏我們直接給出更新公式:
其中,
是一個
維向量,組成該向量的每一個元素可以用如下公式表示:
公式(36)的直觀理解與公式(16)類似,這裏不作描述。
總結以上的模型介紹,我們發現所有模型的詞彙表中的每個單詞都存在兩個向量表示形式:輸入向量
與輸出向量
.對於輸入向量的參數學習成本並不高,但對於輸出向量的學習成本代價是非常昂貴的。根據更新公式(22)和(23),我們可以發現,爲了更新輸出向量
,對於每一個訓練樣例,我們必須迭代遍歷詞彙表中所有的單詞
,計算出它們的輸入值
、概率預測值
(或者SG模型中的
),預測誤差
(或者SG模型的
)。最終使用預測誤差更新它們的輸出向量
.
顯然,對於每一個訓練樣例都要對所有單詞計算上述各值,其成本是昂貴的。特別是對於大型的詞彙表,這種計算方式是不切實際的。因此爲了解決這個問題,直觀的方式是限制必須要更新的訓練樣例的輸出向量的數目。一種有效的實現方式就是:hierarchical softmax(分層softmax),另一種實現通過採樣的方式解決,我們在下個章節來討論。
這兩種方法都是通過只優化輸出向量更新的計算過程來實現的。在我們的公式推導過程中,我們關心的有三個值:(1)
,新的目標函數;(2)
,新的關於輸出向量的更新公式;(3)
,爲了更新輸入向量反向傳播的預測誤差的加權和。
Hierarchical softmax 是一種有效的計算 softmax 的方式。該模型使用一棵二叉樹來表示詞彙表中的所有單詞。所有的
個單詞都在二叉樹的葉節點上。非葉子節點一共有
個。對於每個葉子節點,從根節點root到該葉子節點只有一條路徑;這條路徑用來評估用該葉子節點代表該葉子節點上單詞的概率值。二叉樹的結構如圖4所示:
Figure 4: An example binary tree for the hierarchical softmax model.
其中白色的樹節點代表的是詞彙表中的單詞,灰色節點爲內部節點。圖中高亮顯示的是一條從根節點到
的路徑。該條路徑的長度爲
。
表示從根節點到單詞
的路徑上的第j個節點。
在hierarchical softmax模型中,所有的詞彙單詞沒有輸出向量表示形式。不同的是,二叉樹的每一個內部節點都有一個輸出向量
。因此一個單詞作爲輸出單詞的概率計算公式定義如下:
其中, 爲節點 的左孩子節點; 是內部節點 的向量表示(輸出向量); 是隱藏層的輸出值(在SG模型中, ;而在CBOW模型中, ); 是一種特殊的函數定義如下:
接下來,我們通過一個直觀地例子來理解公式(37)。如圖4所示,假定我們需要計算單詞 作爲輸出單詞的概率。我們將這個概率定義爲從根節點開始隨機遊走到葉節點 的概率。則在每一個內部節點(包括根節點),我們都需要確定其路徑指向左孩子節點還是右孩子節點的概率。我們將經過內部節點的路徑指向左孩子的概率定義爲:
我們可以看出,公式(39)的值取決於內部節點的向量表示 和隱藏層的輸出值 ( 的值取決於輸入單詞的向量表示)。顯然,內部節點的路徑指向右孩子的概率則可以表示爲:
順着圖4中從根節點到單詞 節點的路徑,我們可以計算出 作爲輸出單詞的概率爲:
不難證明
現在我們開始推導內部節點的向量表示形式的參數更新公式。爲了簡化步驟,我們首先考慮單個上下文單詞(one-word context)的模型。
爲了簡化公式,我們定義子公式的簡化符號如下:
則,給定一個訓練樣例,其誤差函數我們可以定義如下:
對於誤差函數 ,我們取其關於 的偏導數,得:
其中 (如果 )或者 (如果 )。
緊接着我們計算內部節點 的向量表示 關於函數 的偏導數,得:
因此,更新公式爲:
我們可以將 理解爲內部節點 的預測誤差。每一個內部節點的「任務」就是預測其隨機遊走路徑是指向左孩子節點還是指向右孩子節點。 意味着節點 的路徑指向左孩子節點; 則表示指向右孩子節點。 是預測結果。對於一個訓練實例,如果內部節點的預測值非常接近於真實值,則它的向量表示 的更新變化很小;否則