前言
近兩年來由Mikolov等人提出的word2vec模型和應用引起了社會的極大的關注。使用word2vec模型學習的單詞的向量表示已經被證明能夠攜帶語義信息,且在各種NLP任務中都是有用的。越來越多的研究人員希望嘗試使用word2vec,但我注意到對於word2vec參數學習過程目前還缺乏一個全面解釋的資料,因此限制了許多神經網絡方面瞭解不深的人去理解word2vec的工作原理。
本文提供了word2vec模型的參數更新方程的詳細推導和解釋,包括原始的連續詞袋(CBOW)模型和skip-gram模型,以及一些高級技巧--分層的soft-max和負抽樣。
在閱讀前你需要一些基礎知識:
1 Continuous Bag-of-Word Model(CBOW)
1.1 One-word context (只考慮目標單詞前面一個單詞的情況)
在我的下篇博客中有對此原理做一定數學舉例:以解數學題的方式來理解word2vec
我們從Mikolov等人最簡單版本的連續詞袋模型(CBOW)開始介紹。連續詞袋模型做出這樣的假設一個單詞出現的可能性與其上下文的單詞組成有關,這意味着對於CBOW模型我們可以通過給定的上下文單詞環境來預測一個目標單詞,就像一個二元模型。
圖一爲簡化的通過上下文來定義詞向量的網絡模型,我們設置詞彙量的大小爲V,隱藏層的大小爲N,相鄰層上的節點完全連接。輸入向量是一個one-hot編碼的向量,對於給定的輸入上下文單詞,one-hot編碼中每個單詞的向量表示爲,其中只有一個節點爲1,而所有其他節點爲0。
輸入層和輸出層之間的權重可以由的矩陣表示。
其中矩陣的每一行代表的是一個與輸入層相關的單詞的維向量表示形式 。那麼假設我們給定了一個輸入單詞,其單詞向量的第個元素,其餘,則有:
(1)
向量完全是由矩陣第行計算出來的 (因爲除外,其餘都爲0),是輸入字的向量表示。
分析完輸入層到隱藏層之後,我們再看隱藏層到輸出層,有一個新的的權重矩陣,它也是一個矩陣。使用這些權重,我們可以計算詞彙表中每個單詞的分數:
(2)
其中是矩陣的第列,然後我們使用一個滿足多項式分佈的對數線性分類模型soft-max來獲取單詞的後驗概率。
(3)
其中是輸出層中節點的輸出,我們將式子(1)和(2)代入式子(3),得到:
(4)
注意和是單詞的兩種表示方式,是矩陣的一行,是由輸入層→隱藏層的權值矩陣。是矩陣的一列,是由隱藏層→輸出層的權值矩陣。在之後的分析中,我們默認將稱爲單詞的“input vector”,將稱爲單詞的“output vector”。
更新隱藏層→輸出層權重的等式
現在我們開始推到CBOW模型的權值更新方程。雖然實際的計算方式有點不切實際(之後解釋),但是這不妨礙我們推到這個方程來增加我們對這個原始模型的理解。推到過程需要一些神經網絡的知識基礎:有關反向傳播基礎知識的綜述,請參閱神經元網絡模型和反向傳播的基礎知識
由上一階段的描述可知,現在訓練的目標(這節只針對一個單詞)就是求公式(4)的最大值。其意在當我們給定了上下文信息以及其權值矩陣的情況下,在詞彙表中計算每個詞成爲中心單詞的概率,從而預測目標單詞。
(7)
這裏我們設置一個爲我們的損失函數(一個最小化的目標),是目標單詞在輸出層的索引。可以發現,對於這個損失函數的計算,我們可以將其理解爲一種特殊情況下對2個概率分佈的交叉熵測量。
現在我們來推到一下隱藏層到輸出層之前的權重更新方程,首選我們對損失函數求關於的偏導,這樣得:
(8)
其中,即當且僅當輸出層的第個單詞爲目標單詞時,的值爲1,其餘情況都爲0。可以看出這個導數實質上是輸出層的預測誤差。
接下來我們通過鏈式法則來求出損失函數在上的偏導, 並通過此來計算隱藏層到輸出層的梯度。
之後我們使用隨機梯度下降方法,得到最終的隱藏層→輸出層的權重更新方程
或者說:
(11)
其中爲梯度下降算法的學習率() ,,其中是隱藏層的第個神經元,是輸出單詞的向量表示。可以看出,通過對比輸出的可能性和期望的輸出(取值只能爲0或者1)來更新權重意味着我們需要遍歷詞彙表中所有單詞。
這個過程中:
- 當 ('高估')的時候,,那麼會從上減去隱藏向量的一部分,這樣向量就與向量相差更遠;
- 當 ('低估')的時候,,那麼會從上加上隱藏向量的一部分,這樣向量就與向量相差更近;
- 當 ('相近')的時候,,那麼會從的值在更新過程基本不會發生變化;
更新隱藏層→輸出層權重的等式
在介紹完hidden→output的權重矩陣更新公式之後,我們接着介紹input→hidden的權重矩陣的更新過程。在上面小節中我們解釋了損失函數,現在我們對在上求偏導:
(12)
其中爲隱藏層上第個神經元的輸出;,表示輸出層第j個神經單元的輸入;爲輸出層第j個單詞的預測誤差。所以我們設定一個維的向量,它的每一個元素代表的是詞彙表中的每個單詞的預測誤差與詞彙表中每個輸出單詞的向量的乘積之和。
接下來,我們需要求出損失函數關於權重矩陣的偏導數。首先,我們知道隱藏層激活單元的輸出是輸入層的值與其權重的線性組合,由此分解式子(1)我們可以得到:
(13)
對於權重矩陣的每一個元素,通過式(12)和式(13),我們可以求得其在損失函數上的偏導:
(14)
以線性代數的角度來說:
(15)
通過式(15)我們得到一個的矩陣,由於只有一個非零值(one-hot),所以的結果也只有一行是非零的,非零N維向量就是那一行的值,由此我們得到權重矩陣的更新方程:
(16)
其中是矩陣中輸入單詞(即one-hot編碼中非零的哪行對應的單詞)的輸入向量。我們不用去關心除外的其他行向量,因爲其的值爲0,由式(14)可以看出其偏導也爲0。
經過多次迭代反向傳播後,誤差等於等於,通過式子(12)中我們知道:
由此式子(16)我們可以這樣理解我們將詞彙表中的每個輸出向量的一部分添加到輸入單詞的詞向量上。這樣就和權值矩陣的更新類似了:
- 如果過高地估計了某個單詞作爲最終輸出單詞的概率(即:),則上下文單詞(context word )的輸入向量與單詞的輸出向量在更新的過程中距離就會越來越遠。
- 與之相反,如果某個單詞作爲最終輸出單詞的概率被低估(即:),則單詞的輸入向量與單詞的輸出向量在更新過程中距離就會越來越接近。
- 如果對於單詞的概率預測是準確的,則對於單詞的輸入向量在更新過程中幾乎保持不變。
由此可以發現輸入單詞詞向量的更新取決與其與詞彙表中所有單詞的預測誤差。預測誤差越大,則目標單詞(預測的單詞)對於輸入單詞詞向量的更新過程影響越大。這就是爲什麼word2vec可以得出‘國王’-'皇后'='男人'-'女人'的結論的原因。國王和皇后是經常一起組合出現的,男人和女人也是組合出現的,屬於聯想詞,所以說,一個詞的常規穩定的位置通常會由他的組合詞,也就是經常一起出現的詞決定的。所以這些最常出現的組合詞就決定了目標詞的更新規律
1.2 Multi-word context (考慮上下文多個單詞的情況)
考慮上下文多個單詞的CBOW模型如圖2所示,可以發現與上一節(one-word context)不同的是, Multi-word context 會去考慮目標單詞上下文的多個單詞,通過這些個單詞來確定目標單詞出現的可能性。
不同與之前方式,在計算Multi-word context 隱藏層的輸出值的過程中,會將輸入的上下文單詞的向量累加起來求均值,接着使用這個均值與input→hidden的權值矩陣相乘,作爲最終的結果。公式如下:
(18)
其中是上下文的單詞個數,指的是上下文的具體的單詞,是單詞的輸入向量。而損失函數就轉化爲:
Multi-word context 的損失函數與one-word context的目的一樣,公式也與(7)相同,除了用公式(18)的方式來替代了one-word context公式(1)的。
同時,Multi-word context 由隱藏層→輸出層的權值矩陣的更新的過程與one-word context也是一樣的。我們直接把之前的公式(11)寫在下面:
(22)
通過迭代我們將遍歷整個語料庫,以此來更新(隱藏層→輸出層的矩陣)。
更新輸入層→隱藏層權值矩陣的方程也與之前的公式(16)類似,只不過現在我們需要對上下文的每一個單詞都執行如下更新公式:
(23)
其中是輸入上下文單詞的第個單詞的輸入向量;表示大於零的學習率;由公式(12)確定。
2 Skip-Gram Model
skip-gram與上一章介紹的CBOW正好相反,skip-gram是通過中心單詞(target word)來預測其上下文的單詞(context words)。如圖3所示:
這裏我們依然用來表示輸入層上唯一的輸入單詞的向量,這樣我們對於隱藏層的輸出值的計算就可以照搬使用公式(1):
這意味着只是矩陣的其中一行。[輸入爲一個one-hot向量,轉置與權值矩陣的點積,結果就爲矩陣的其中一行]。在輸出層上,不同於CBOW模型輸出單個多項式分佈,Skip-garm模型的輸出層輸出多個多項式分佈。每個輸出都使用相同的隱藏層->輸出層矩陣計算:
其中表示輸出層的第c個panel的第j個單詞;實際上是輸出上下文的第c的單詞;是唯一的輸入單詞;是輸出層第c個panel上第j個神經元節點的輸出值(概率);輸出層在第c個panel上第j個節點的輸出值。但由於輸出層的所有panels共享同一權值矩陣,所以:
,
*panel:輸出層的表示每個上下文單詞的神經元的組合
其中是詞彙表中第j個單詞的輸出向量, 同樣,它也取自於隱藏層→輸出層權值矩陣的其中一列。
skip-gram模型參數更新的方法實際上與one-word-context模型的差別並不是很大。這裏我們將損失函數變爲:
其中實際上是第c個輸出層輸出的上下文單詞在語料庫中的索引。接下來,我們對輸出層的每一個panel上的所有激活單元的輸入值均求其關於的偏導數得:
和式子(8)一樣,代表着輸出層上每個神經元節點的預測誤差。爲了書寫方便,我們假設一個V維度的向量來表示所有上下文單詞的預測誤差之和,公式表示爲:
然後我們通過鏈式法則來求得隱藏層→輸出層的權值矩陣關於的偏導,得:
再由此推導出隱藏層→輸出層的權值矩陣的更新方程:
或者這樣表示:
這個公式的直觀理解與公式(11)的概念相同,除了一點:輸出層的預測誤差的計算是基於多個上下文單詞context words,而不是單個目標單詞 target word;需注意的是對於每一個訓練樣本,我們都要利用該參數更新公式來更新隱藏層→輸出層的權重矩陣的每個元素。
而對於輸入層→隱藏層的權值矩陣的更新過程,與公式(12)到公式(16)類似:
但需要注意的是,這裏的中累加的要用替代:
3.優化計算效率
到目前爲止,我們都在討論bigram,CBOW和skip-gram模型的原始形式,現在我們將介紹一些高級的tricks來優化運行的效率。
首先總結一下之前介紹的所有模型,詞彙表中的每個單詞都存在2種向量表示的方法:
輸入向量
輸出向量
對於輸入向量的學習成本並不高,而對於輸出向量的學習代價卻是昂貴的。 從參數更新方程(22)和(33)我們可以看出,爲了更新每一例輸出向量,我們需要迭代詞彙表裏面的每一個詞,計算他們的輸入值;預測值(skip-gram中是)的可能性;預測誤差(skip-gram中是);最後使用預測誤差來更新他們的輸出向量。
顯然對於訓練樣本的每個單詞做這樣的計算開銷太大,尤其是在語料庫很大的時候,這樣的計算方式顯得有些不切實際。解決這個問題,直觀的方式是限制必須要更新的訓練樣例的輸出向量的數目。一種有效的方式就是實現一個分層的soft-max;另一種方法也同樣簡單,通過採樣來解決,這個內容將會放在下一章討論。
這2中技巧都只是在優化更新輸出向量的計算量,在我們的推到過程中,我們主要關注3個數值:
- ,新的目標函數;
- ,輸出向量新的更新方程;
- ,更新輸入向量的反向傳播算法 的 預測誤差 之和。
3.1 Hierarchical Softm
分層soft-max是計算soft-max的有效方法,該模型使用二叉樹來表示詞彙表中的所有單詞,假設詞彙表有個單詞,那麼用二叉樹來表示這個單詞時,這些單詞都只能在葉子節點上。而由於二叉樹的性質,那些非葉子的節點爲個。對於每個葉子節點,存在也只存在一條從根節點出發到達此節點的絕對路徑。通過這條路徑,我們就能預估這個葉子節點表示的單詞的可能性。下面是一個二叉樹的示例:
上圖是一個分詞soft-max模型的二叉樹示例, 白色的節點代表的是詞彙表中的單詞,黑色的節點代表的是非葉子節點。其中加粗顯示的部分是從跟節點到單詞節點的路徑。該路徑長度爲,表示從跟節點到單詞的路徑中的第個節點。
在分層的soft-max模型中,單詞沒有了輸出向量的表示形式,取而代之的是,個非葉子節點中的每個節點都有一個輸出向量,這樣定義一個單詞成爲輸出單詞的可能性的公式就可以表示爲:
(37)
其中:
是節點的左孩子節點;
是節點的向量表示(即輸出向量);
是隱藏層的輸出值;(在Skip-gram模型中 ,在CBOW模型中)
是一個特殊的函數,定義爲:
下面,用一個例子來加深對公式(37)的理解:
回顧一下二叉樹示例的圖,假設我們要計算單詞成爲輸出單詞的可能性,我們將求解這個概率的問題定義爲求解從根節點隨機遊走到葉子節點的概率,在其路徑上的每個非葉子節點(包括跟節點),我們都要分析他走向左孩子節點和右孩子節點的概率。
這裏我們定義走向左孩子節點的概率爲:
(39)
從公式可以發現的值取決於非葉子節點的向量表示和隱藏層的輸出值(隱藏層的輸出值取決與輸入單詞的向量表示)。
顯然走向右孩子節點的概率我們就可以這樣定義:
根據二叉樹示例圖中從跟節點到的路徑,我們能計算出單詞成爲輸出單詞的可能性:
再回頭看看公式(37),用上面的例子來理解,是不難的。而且可以發現:
現在我們開始推導非葉子節點的向量表示形式的參數更新公式,爲了方便理解,我們還是先以one-word context(即只考慮上下文一個單詞的情況)示例,之後我們拓展到CBOW或者skip-gram都會很方便。
爲了簡化公式,方便理解,令:
則對於訓練樣本來說,其損失函數可以定義爲:
然後我們對去關於的偏導數,得:
當時,其餘.
接着我們計算內部節點的向量表示關於函數的偏導,得:
因此得到更新函數的公式爲:
可以將理解爲節點的預測誤差;並且這個公式需要循環迭代。每一個內部節點的“任務”就是預測其隨機遊走路徑是指向左孩子節點還是指向右孩子節點。
在等於時意味着節點的路徑指向左孩子節點;
在等於時意味着節點的路徑指向右孩子節點;
是預測的結果
對於一個訓練實例 , 如果內部節點的預測值非常接近於真實值,則它的向量表示的更新變化很小;否則向量指向一個適當的方向使得該實例的預測誤差逐漸減小。這種更新方式同樣可以應用與CBOW和skip-gram模型,只不過應用在skip-gram我們需要在輸出單詞上循環迭代C個輸出上下文中的每一個單詞。
爲了使用反向傳播算法來更新輸出層→隱藏層的權值矩陣,我們對隱藏層的輸出計算其關於損失函數的導數,得:
接下來我們根據公式(23)便可以獲得CBOW模型輸入向量的更新公式;對於skip-gram模型,我們需要計算上下文信息中的每個單詞的,並將帶入公式(35),就能夠得到輸入向量的更新公式。
從以上更新公式我們可以看出:經過改進的模型Hierarchical soft-max的每個訓練樣例的每個上下文單詞的計算複雜度從降爲。但是模型的參數幾乎沒有什麼改變(內部節點對應維向量,而原始模型的單詞的輸出向量維數爲)
3.2 Negative Sampling
Negative Sampling(負抽樣)的方法比分層soft-max來得更爲直截了當:在每次循環迭代過程中需要處理大量的節點上的計算,爲了解決這個問題,Negative Sampling提出了只更新其中一部分輸出向量的解決方案。
顯然,負抽樣的目的是爲了最終輸出的上下文單詞(正樣本)[基於訓練樣本的半監督學習]在採樣過程中應該保留下來並更新,同時也需要採集一些反面例子[與訓練樣本結果不符](也可以稱之爲“負樣本”)
那麼怎麼採集這些例子呢?這裏我們引入一個概念“噪聲分佈”,通過噪聲分佈函數來採集例子。噪聲分佈函數並是特指某一函數,而是任意能夠起到採樣的函數。當然,當你有足夠的經驗後,你會知道在什麼情況下應用什麼噪聲分佈函數會更爲合適。
那麼把Negative Sampling(負抽樣)應用到Word2vec上時,我們不用再使用那種能夠產生很好的後驗概率的多項式分佈的負採樣形式。Word2vec的作者們發現使用下面這種目標函數就能產生高質量且可靠的word embeddings:
其中:
是通過噪聲分佈函數採集的一系列樣本;
是隱藏層的輸出值;[在skip-gram中,在CBOW中]
向量代表輸入層上單詞的向量,它實際上是輸入矩陣的其中一行;
向量代表輸出層上單詞的向量,它實際上是輸出矩陣的其中一列;(說了N遍了,emmmm.....)
(每個單詞都有2中向量表示形式和)
我們對目標函數求其關於標量的偏導,得:
其中表示單詞的“類型”,當是正樣本時,及預測值與真實值相同時,反之。然後通過鏈式法則可以得到目標函數關於單個單詞輸出向量的導數,得:
所以我們的更新函數就可以表示爲:
(59)
negative sampling的關鍵就是公式(59)的更新過程只應用於詞彙表的子集,而並非應用於整個詞彙表,從而大大的減輕的計算量。除詞彙量的大小變了之外,其餘更新的方式是與式子(11)一樣的。公式(59)適用於CBOW和skip-gram模型,在skip-gram模型中,我們每次更新一個單詞。
接着利用反向傳播算法來計算目標函數關於隱藏層輸出值的偏導,得:
在CBOW模型中,我們將上面公式代入(23)即可完成對模型輸入向量矩陣的更新;
在skip-gram模型輸入向量矩陣的更新中,我們需要計算每個上下文單詞值的和然後再將其代入公式(35)。
4 Discussio
4.1爲什麼使用soft-max?
使用soft-max可以更好的幫助我們去定義單詞之間的概率分佈,改模型使用交叉熵作爲損失函數,從理論上說,你也可以使用平方和作爲損失函數,但是這樣的話針對soft-max開發的優化效率提升性能技巧將不再適用。
4.2輸入向量和輸出向量之間的關係是什麼?
輸入向量是輸入層→隱藏層的權值矩陣其中一行;輸出向量是隱藏層→輸出層的權值矩陣其中一列;
從定義上他們就是一個單詞的2種向量表示形式。
4.3Word2vec的目的是得到詞向量,是2組詞向量還是一組詞向量?
之前提到Word2vec訓練對每個單詞有2組詞向量,但是最終其實保留輸入層到隱藏層的這組詞向量,輸出層對應的 分層-softmax 也會生成一系列的向量,但最終都被拋棄,不會使用。
References
- Goldberg, Y. and Levy, O. (2014). word2vec explained: deriving mikolov et al.’s negativesampling word-embedding method. arXiv:1402.3722 [cs, stat]. arXiv: 1402.3722.
- Mikolov, T., Chen, K., Corrado, G., and Dean, J. (2013a). Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781.
- Mikolov, T., Sutskever, I., Chen, K., Corrado, G. S., and Dean, J. (2013b). Distributed representations of words and phrases and their compositionality. In Advances in Neural Information Processing Systems, pages 3111–3119.
- Mnih, A. and Hinton, G. E. (2009). A scalable hierarchical distributed language model.In Koller, D., Schuurmans, D., Bengio, Y., and Bottou, L., editors, Advances in Neural Information Processing Systems 21, pages 1081–1088. Curran Associates, Inc.
- Morin, F. and Bengio, Y. (2005). Hierarchical probabilistic neural network language model.In AISTATS, volume 5, pages 246–252. Citeseer.
關於word2vec的參數解釋到此結束了,對文章有疑問或者其他方面問題的可以通過下面方式聯繫作者:
QQ:470581985
微信:lsq960124
打賞一下作者: