本文概覽:
1. 背景知識
Word2Vec是語言模型中的一種,它是從大量文本預料中以無監督方式學習語義知識的模型,被廣泛地應用於自然語言處理中。
Word2Vec是用來生成詞向量的工具,而詞向量與語言模型有著密切的關係。因此,我們先來了解一些語言模型方面的知識。
1.1 統計語言模型
統計語言模型是用來計算一個句子的概率的概率模型,它通常基於一個語料庫來構建。那什麼叫做一個句子的概率呢?假設 表示由 個詞 按順序構成的一個句子,則 的聯合概率為:
被稱為語言模型,即用來計算這個句子概率的模型。利用Bayes公式,上式可以被鏈式地分解為:
其中的條件概率 就是語言模型的參數,若這些參數已經全部算得,那麼給定一個句子 ,就可以很快地計算出相應地概率 了。
看起來好像很簡單,是吧?但是,具體實現起來還是有點麻煩。例如,先來看看模型參數的個數。剛才是考慮一個給定的長度為T的句子,就需要計算T個參數。不防假設語料庫對應詞典 的大小(即詞彙量)為 ,那麼,如果考慮長度為 的任意句子,理論上就有 種可能,而每種可能都要計算 個參數,總共就需要計算 個參數。當然,這裡只是簡單估算,並沒有考慮重複參數,但這個量級還是有點嚇人。此外,這些概率計算好後,還得保存下來,因此,存儲這些信息也需要很大的內存開銷。
此外,這些參數如何計算呢?常見的方法有n-gram模型、決策樹、最大熵模型、最大熵馬爾可夫模型、條件隨機場、神經網絡等方法。本文只討論n-gram模型和神經網絡兩種方法。
1.2 N-gram模型
考慮 的近似計算。利用Bayes公式,有:
根據大數定理,當語料庫足夠大時, 可以近似地表示為:
其中, 表示詞串 在語料中出現的次數, 表示詞串 在語料中出現的次數。可想而知,當 很大時, 和 的統計將會多麼的耗時。
從公式(1)可以看出:一個詞出現的概率與它前面的所有詞都相關。如果假定一個詞出現的概率只與它前面固定數目的詞相關呢?這就是n-gram模型的基本思想,它做了一個 階的Markov假設,認為一個詞出現的概率就只與它前面的 個詞相關,即,
於是,公式(2)就變成了
以 為例,就有
這樣簡化,不僅使得單個參數的統計變得更容易(統計時需要匹配的詞串更短),也使得參數的總數變少了。
那麼,n-gram中的參數 取多大比較合適呢?一般來說,n的選取需要同時考慮計算複雜度和模型效果兩個因素。
表1:模型參數數量與n的關係
在計算複雜度方面,表1給出了n-gram模型中模型參數數量隨著 的逐漸增大而變化的情況,其中假定詞典大小 (漢語的詞彙量大大致是這個量級)。事實上,模型參數的量級是 的指數函數( ),顯然 不能取得太大,實際應用中最多是採用 的三元模型。
在模型效果方面,理論上是 越大,效果越好。現如今,網際網路的海量數據以及機器性能的提升使得計算更高階的語言模型(如 )成為可能,但需要注意的是,當 大到一定程度時,模型效果的提升幅度會變小。例如,當 從 到 ,再從 到 時,模型的效果上升顯著,而從 到 時,效果的提升就不顯著了(具體可以參考吳軍在《數學之美》中的相關章節)。事實上,這裡還涉及到一個可靠性和可區別性的問題,參數越多,可區別性越好,但同時單個參數的實例變少從而降低了可靠性,因此需要在可靠性和可區別性之間進行折中。
另外,n-gram模型中還有一個叫做平滑化的重要環節。回到公式(3),考慮兩個問題:
顯然不能,但這是一個無法迴避的問題,哪怕你的預料庫有多麼大。平滑化技術就是用來處理這個問題的,這裡不展開討論。
總結起來,n-gram模型是這樣一種模型,其主要工作是在語料中統計各種詞串出現的次數以及平滑化處理。概率值計算好之後就存儲起來,下次需要計算一個句子的概率時,只需找到相關的概率參數,將它們連乘起來就好了。
然而,在機器學習領域有一種通用的解決問題的方法:對所考慮的問題建模後先為其構造一個目標函數,然後對這個目標函數進行優化,從而求得一組最優的參數,最後利用這組最優參數對應的模型來進行預測。
對於統計語言模型而言,利用最大似然,可把目標函數設為:
其中, 表示語料(Corpus), 表示詞 的上下文,即 周邊的詞的集合。當 為空時,就取 。特別地,對於前面介紹的n-gram模型,就有 。
當然,實際應用中常採用最大對數似然,即把目標函數設為
然後對這個函數進行最大化。
從公式(4)可見,概率 已被視為關於 和 的函數,即:
其中 為待定參數集。這樣一來,一旦對公式(4)進行優化得到最優參數集 後, 也就唯一被確定了,以後任何概率 就可以通過函數 來計算了。與n-gram相比,這種方法不需要事先計算並保存所有的概率值,而是通過直接計算來獲取,且通選取合適的模型可使得 中參數的個數遠小於n-gram中模型參數的個數。
很顯然,對於這樣一種方法,最關鍵的地方就在於函數 的構建了。下一小節將介紹一種通過神經網絡來構造 的方法。之所以特意介紹這個方法,是因為它可以視為Word2Vec中算法框架的前身或者說基礎。
1.3 神經概率語言模型
本小節介紹 Bengio 等人於2003年在論文《A Neural Probabilistic Language Model》中提出的一種神經概率語言模型。該論文首次提出用神經網絡來解決語言模型的問題,雖然在當時並沒有得到太多的重視,卻為後來深度學習在解決語言模型問題甚至很多別的nlp問題時奠定了堅實的基礎,後人站在Yoshua Bengio的肩膀上,做出了更多的成就。包括Word2Vec的作者Tomas Mikolov在NNLM的基礎上提出了RNNLM和後來的Word2Vec。文中也較早地提出將word表示一個低秩的向量,而不是One-Hot。word embedding作為一個language model的副產品,在後面的研究中起到了關鍵作用,為研究者提供了更加寬廣的思路。值得注意的是Word2Vec的概念也是在該論文中提出的。
什麼是詞向量呢?簡單來說就是,對詞典 中的任意詞 ,指定一個固定長度的實值向量 , 就稱為 的詞向量, 為詞向量的長度。關於詞向量的進一步理解將放到下一節來講解。
既然是神經概率語言模型,其中當然要用到神經網絡了。 下圖給出了神經網絡的結構示意圖。模型一共三層,第一層是映射層,將 個單詞映射為對應word embeddings的拼接,其實這一層就是MLP的輸入層;第二層是隱藏層,激活函數用 ;第三層是輸出層,因為是語言模型,需要根據前 個單詞預測下一個單詞,所以是一個多分類器,用 。整個模型最大的計算量集中在最後一層上,因為一般來說詞彙表都很大,需要計算每個單詞的條件概率,是整個模型的計算瓶頸。
經過上面步驟的計算得到的 只是一個長度為 的向量,其分量不能表示概率。如果想要 的分量 表示當上下文為 時下一個詞恰為詞點 中第 個詞的概率,則還需要做一個Softmax歸一化,歸一化後, 就可以表示為:
其中 表示詞 在詞典 中的索引。
這裡,需要注意的是需要提前初始化一個word embedding矩陣,每一行表示一個單詞的向量。詞向量也是訓練參數,在每次訓練中進行更新。這裡可以看出詞向量是語言模型的一個副產物,因為語言模型本身的工作是為了估計給定的一句話有多像人類的話,但從後來的研究發現,語言模型成了一個非常好的工具。
Softmax是一個非常低效的處理方式,需要先計算每個單詞的概率,並且還要計算指數,指數在計算機中都是用級數來近似的,計算複雜度很高,最後再做歸一化處理。此後很多研究都針對這個問題進行了優化,比如層級softmax、softmax tree。
當然NNLM的效果在現在看來並不算什麼,但對於後面的相關研究具有非常重要的意義。論文中的Future Work提到了用RNN來代替MLP作為模型可能會取得更好的效果,在後面Tomas Mikolov的博士論文中得到了驗證,也就是後來的RNNLM。
與n-gram模型相比,神經概率語言模型有什麼優勢呢?主要有以下兩點:
舉例來說,如果某個(英語)語料中 出現了 次,而 只出現了 次。按照n-gram模型的做法, 肯定會遠大於 。注意, 和 的唯一區別在與dog和cat,而這兩個詞無論是句法還是語義上都扮演了相同的角色,因此, 和 應該很接近才對。事實上,由神經概率語言模型算得的 和 是大致相等的。原因在於:(1)在神經概率語言模型中假定了「相似的」的詞對應的詞向量也是相似的;(2)概率函數關於詞向量是光滑的,即詞向量中的一個小變化對概率的影響也只是一個小變化。這樣一來,對於下面這些句子, 只要在語料庫中出現一個,其他句子的概率也會相應的增大。
A dog is running in the room A cat is running in the room The cat is running in a room A dog is walking in a bedroom The dog was walking in the room
基於詞向量的模型自帶平滑化功能(由公式(5)可知, 不會為零),不再需要像n-gram那樣進行額外處理了。 最後,我們回過頭來想想,詞向量在整個神經概率語言模型中扮演了什麼角色呢?訓練時,它是用來幫助構造目標函數的輔助參數,訓練完成後,它也好像只是語言模型的一個副產品。但這個副產品可不能小覷,下一節將對其作進一步闡述。
2. 詞向量
自然語言處理相關任務中要將自然語言交給機器學習中的算法來處理,通常需要將語言數學化,因為機器不是人,機器只認數學符號。向量是人把自然界的東西抽象出來交給機器處理的東西,基本上可以說向量是人對機器輸入的主要方式了。
詞向量就是用來將語言中的詞進行數學化的一種方式,顧名思義,詞向量就是把一個詞表示成一個向量。 我們都知道詞在送到神經網絡訓練之前需要將其編碼成數值變量,常見的編碼方式有兩種:One-Hot Representation 和 Distributed Representation。
2.1 One-Hot Representation
一種最簡單的詞向量方式是One-Hot編碼 ,就是用一個很長的向量來表示一個詞,向量的長度為詞典的大小,向量中只有一個 , 其他全為 , 的位置對應該詞在詞典中的位置。
舉個例子:I like writing code,那麼轉換成獨熱編碼就是:
詞One-Hot 編碼I1 0 0 0like0 1 0 0writing0 0 1 0code0 0 0 1
這種One Hot編碼如果採用稀疏方式存儲,會是非常的簡潔:也就是給每個 詞分配一個數字 ID 。比如上面的例子中,code記為 ,like記為 。 如果要編程實現的話,用 Hash 表給每個詞分配一個編號就可以了。這麼簡潔的表示方法配 合上最大熵、 SVM 、 CRF 等等算法已經能很好地完成 NLP 領域的各種主流任務。
但這種詞表示有三個缺點:
(1)容易受維數災難的困擾,尤其是將其用於 Deep Learning的一些算法時;
當你的詞彙量達到千萬甚至上億級別的時候,你會遇到一個更加嚴重的問題,維度爆炸了.這裡舉例使用的是 個詞,你會發現,我們使用了四個維度,當詞數量達到 千萬的時候,詞向量的大小變成了 千萬維,不說別的,光內存你都受不了這麼大的詞向量,假設你使用一個bit來表示每一維,那麼一個單詞大概需要 GB的內存,但是注意這只是一個詞,一共會有上千萬的詞,這樣內存爆炸了。
( 2 )詞彙鴻溝,不能很好地刻畫詞與詞之間的相似性;
任意兩個詞之間都是孤立的,從這兩個向量中看不出兩個詞是否有關係。比如說,I、like之間的關係和like、writing之間的關係,通過 和 和 和 怎麼表現,通過距離?通過 的位置?你會發現獨熱編碼完全沒法表現單詞之間的任何關係。
(3)強稀疏性;
當維度過度增長的時候,你會發現0特別多,這樣造成的後果就是整個向量中有用的信息特別少,幾乎就沒法做計算。
由於One-hot編碼存在以上種種問題,所以研究者就會尋求發展,用另外的方式表示,就是Distributed Representation。
2.2 Distributed Representation
Distributed Representation最早是Hinton於1986年提出的,可以克服One-Hot Representation的上述缺點。其基本想法是:通過訓練將某種語言中的每一個詞 映射成一個固定長度的短向量(當然這裡的「短」是相對於One-Hot Representation的「長」而言的),所有這些向量構成一個詞向量空間,而每一個向量則可視為 該空間中的一個點,在這個空間上引入「距離」,就可以根據詞之間的距離來判斷它們之間的語法、語義上的相似性了。Word2Vec中採用的就是這種Distributed Representation 的詞向量。
為什麼叫做 Distributed Representation?很多人問到這個問題。一個簡單的解釋是這樣的:對於One-Hot Representation,向量中只有一個非零分量,非常 集中(有點孤注一擲的感覺);而對於Distributed Representation,向量中有大量非零分量,相對分散(有點風險平攤的感覺),把詞的信息分布到各個分量 中去了。這一點,跟並行計算裡的分布式並行很像。
如何獲取詞向量呢?有很多不同模型可以用來估計詞向量,包括有名的LSA(Latent Semantic Analysis)和LDA(Latent Dirichlet Allocation)。此外,利用神經 網絡算法也是一種常用的方法,上一節介紹的神經概率語言模型就是一個很好的實例。當然,在那個模型中,目標是生成語言模型,詞向量只是一個副產品。事實上, 大部分情況下,詞向量和語言模型都是捆綁在一起的,訓練完成後兩者同時得到。在用神經網絡訓練語言模型方面,最經典的論文就是Bengio於2003年發表的《A Neural Probabilistic Language Model》 ,其後有一系列相關的研究工作,其中也包括谷歌Tomas Mikolov團隊的Word2Vec。
3. Word2Vec的網絡結構
Word2Vec是輕量級的神經網絡,其模型僅僅包括輸入層、隱藏層和輸出層,模型框架根據輸入輸出的不同,主要包括CBOW和Skip-gram模型。 CBOW的方式是在知道詞 的上下文 的情況下預測當前詞 .而Skip-gram是在知道了詞 的情況下,對詞 的上下文 進行預測,如下圖所示:
3.1 CBOW3.1.1 Simple CBOW Model
為了更好的了解模型深處的原理,我們先從Simple CBOW model(僅輸入一個詞,輸出一個詞)框架說起。
如上圖所示:
input layer輸入的X是單詞的one-hot representation(考慮一個詞表
,裡面的每一個詞 都有一個編號 ,那麼詞 的one-hot表示就是一個維度為 的向量,其中第 個元素值非零,其餘元素全為 ,例如: );輸入層到隱藏層之間有一個權重矩陣 ,隱藏層得到的值是由輸入 乘上權重矩陣得到的(細心的人會發現, 向量乘上一個矩陣,就相當於選擇了權重矩陣的某一行,如圖:輸入的向量 是 , , , , , , 的轉置乘上 就相當於從矩陣中選擇第 行 作為隱藏層的值);隱藏層到輸出層也有一個權重矩陣 ,因此,輸出層向量 的每一個值,其實就是隱藏層的向量點乘權重向量 的每一列,比如輸出層的第一個數 ,就是向量 和列向量 , , 點乘之後的結果;最終的輸出需要經過softmax函數,將輸出向量中的每一個元素歸一化到 之間的概率,概率最大的,就是預測的詞。了解了Simple CBOW model的模型框架之後,我們來學習一下其目標函數。
輸出層通過softmax歸一化, 代表的是輸出層的原始結果。通過下面公式,我們的目標函數可以轉化為現在這個形式:
3.1.2 CBOW Multi-Word Context Model了解了Simple CBOW model之後,擴展到CBOW就很容易了,只是把單個輸入換成多個輸入罷了(劃紅線部分)。
對比可以發現,和simple CBOW不同之處在於,輸入由 個詞變成了 個詞,每個輸入 到達隱藏層都會經過相同的權重矩陣 ,隱藏層 的值變成了多個詞乘上權重矩陣之後加和求平均值。
3.2 Skip-gram Model有了CBOW的介紹,對於Skip-gram model 的理解應該會更快一些。
如上圖所示,Skip-gram model是通過輸入一個詞去預測多個詞的概率。輸入層到隱藏層的原理和simple CBOW一樣,不同的是隱藏層到輸出層,損失函數變成了 個詞損失函數的總和,權重矩陣 還是共享的。
一般神經網絡語言模型在預測的時候,輸出的是預測目標詞的概率,也就是說我每一次預測都要基於全部的數據集進行計算,這無疑會帶來很大的時間開銷。不同於其他神經網絡,Word2Vec提出兩種加快訓練速度的方式,一種是Hierarchical softmax,另一種是Negative Sampling。
4. 基於Hierarchical Softmax的模型基於層次Softmax的模型主要包括輸入層、投影層(隱藏層)和輸出層,非常的類似神經網絡結構。對於Word2Vec中基於層次Softmax的CBOW模型,我們需要最終優化的目標函數是 :
其中 表示的是單詞 的的上下文單詞。而基於層次Softmax的Skip-gram模型的最終需要優化的目標函數是:
4.1 基於Hierarchical Softmax的CBOW4.1.1 CBOW模型網絡結構下圖給出了基於層次Softmax的CBOW的整體結構,首先它包括輸入層、投影層和輸出層:
投影層:指的是直接對 個詞向量進行累加,累加之後得到下式:輸出層:是一個Huffman樹,其中葉子節點共 個,對應於 個單詞,非葉子節點 個(對應上圖中標成黃色的結點)。Word2Vec基於層次Softmax的方式主要的精華部分都集中在了哈夫曼樹這部分,下面詳細介紹。4.1.2 CBOW的目標函數為了便於下面的介紹和公式的推導,這裡需要預先定義一些變量:
:從根節點出發,然後到達單詞 對應葉子結點的路徑。 : 路徑 中對應的各個結點,其中 代表根結點,而 代表的是單詞 對應的結點。 : 單詞 對應的哈夫曼編碼,一個詞的哈夫曼編碼是由 位構成的, 表示路徑 中的第 個單詞對應的哈夫曼編碼,根結點不參與對應的編碼。 : 路徑 中非葉子節點對應的向量, 表示路徑 中第 個非葉子節點對應的向量。 這裡之所以給非葉子節點定義詞向量,是因為這裡的非葉子節點的詞向量會作為下面的一個輔助變量進行計算,在下面推導公式的時候就會發現它的作用了。既然已經引入了那麼多符號,我們通過一個簡單的例子把它們落到實處吧,我們考慮單詞w="足球"的情形。下圖中紅色線路就是我們的單詞走過的路徑,整個路徑上的 個結點就構成了路徑 ,其長度 ,然後 就是路徑 上的五個結點,其中 對應根結點。 分別為 ,即"足球"對應的哈夫曼編碼就是 。最後 就是路徑 上的 個非葉子節點對應的向量。
下面我們需要開始考慮如何構建條件概率函數 ,以上面的w="足球"為例,從根節點到"足球"這個單詞,經歷了 次分支,也就是那 條紅色的線,而對於這個哈夫曼樹而言,每次分支相當於一個二分類。
既然是二分類,那麼我們可以定義一個為正類,一個為負類。我們的"足球"的哈夫曼編碼為 ,這個哈夫曼編碼是不包含根節點的,因為根節點沒法分為左還是右子樹。那麼根據哈夫曼編碼,我們一般可以把正類就認為是哈夫曼編碼裡面的 ,而負類認為是哈夫曼編碼裡面的 。不過這只是一個約定而已,因為哈夫曼編碼和正類負類之間並沒有什麼明確要求對應的關係。事實上,Word2Vec將編碼為 的認定為負類,而編碼為 的認定為正類,也就是說如果分到了左子樹,就是負類;分到了右子樹,就是正類。那麼我們可以定義一個正類和負類的公式:
簡而言之就是,將一個結點進行分類時,分到左邊就是負類,分到右邊就是正類。
在進行二分類的時候,這裡選擇了Sigmoid函數。那麼,一個結點被分為正類的概率就是:
被分為負類的概率就是 。注意,公式裡面包含的有 ,這個就是非葉子對應的向量 。
對於從根節點出發到達「足球」這個葉子節點所經歷的4次二分類,將每次分類的概率寫出來就是:
但是,我們要求的是 ,即 足球 足球 ,它跟這 個概率值有什麼關係呢?關係就是:
至此,通過w="足球"的小例子,Hierarchical Softmax的基本思想就已經介紹完了。小結一下:對於詞典中的任意一個單詞 ,哈夫曼樹中肯定存在一條從根節點到單詞 對應葉子結點的路徑 ,且這條路徑是唯一的。路徑 上存在 個分支,將每個分支看做一次二分類,每一次分類就產生一個概率,將這些概率乘起來,就是所需要的 。
條件概率 的一般公式可寫為:
其中:
或者寫成整體表達式:
將公式(8)帶入公式(6)中,得到:
為了梯度推導方便起見,將上式中雙重求和符號下的內容簡記為 ,即:
至此,已經推導出了CBOW模型的目標函數公式(9),接下來就是討論如何優化它,即如何將這個函數最大化。Word2Vec裡面採用的是隨機梯度上升法。而梯度類算法的關鍵是給出相應的梯度計算公式,進行反向傳播。
4.1.3 參數更新首先考慮 關於 的梯度計算:
於是, 的更新公式可寫為:
接下來考慮 關於 的梯度:
到了這裡,我們已經求出來了 的梯度,但是我們想要的其實是每次進行運算的每個單詞的梯度,而 是 中所有單詞累加的結果,那麼我們怎麼使用 來對 中的每個單詞 進行更新呢?這裡原作者選擇了一個簡單粗暴的方式,直接使用 的梯度累加對 進行更新:
4.2 基於Hierarchical Softmax的Skip-gram本小節介紹Word2Vec中的另一個模型-Skip-gram模型,由於推導過程與CBOW大同小異,因此會沿用上小節引入的記號。
4.2.1 Skip-gram模型網絡結構下圖給出了Skip-gram模型的網絡結構,同CBOW模型的網絡結構一樣,它也包括三層:輸入層、投影層和輸出層。下面以樣本 為例,對這三層做簡要說明。
投影層:這是個恆等投影,把 投影到 。因此,這個投影層其實是多餘的,這裡之所以保留投影層主要是方便和CBOW模型的網絡結構做對比。輸出層:和CBOW模型一樣,輸出層也是一顆Huffman樹。4.2.2 Skip-gram的目標函數對於Skip-gram模型,已知的是當前詞 ,需要對其上下文 中的詞進行預測,因此目標函數應該形如公式(7),且關鍵是條件概率函數 的構造,Skip-gram模型中將其定義為:
上式中 可按照上小節介紹的Hierarchical Softmax思想,類似於公式(8),可寫為:
其中:
將公式(10)依次代回,可得對數似然函數公式(7)的具體表達式:
同樣,為了梯度推導方便,將三重求和符號裡的內容簡記為 ,即:
至此,已經推導出了Skip-gram模型的目標函數(公式11),接下來同樣利用隨機梯度上升法對其進行優化。而梯度類算法的關鍵是給出相應的梯度計算公式,進行反向傳播。
4.2.3 參數更新首先考慮 關於 的梯度計算:
於是, 的更新公式可寫為:
同理,根據對稱性,可以很容易得到 關於 的梯度:
我們也可以得到關於 的更新公式:
5. 基於Negative Sampling的模型本節將介紹基於Negative Sampling的CBOW和Skip-gram模型。Negative Sampling(簡稱為NEG)是Tomas Mikolov等人在論文《Distributed Representations of Words and Phrases and their Compositionality》中提出的,它是NCE(Noise Contrastive Estimation)的一個簡化版,目的是用來提高訓練速度並改善所得詞向量的質量。與Hierarchical Softmax相比,NEG不再使用複雜的Huffman樹,而是利用相對簡單的隨機負採樣,能大幅度提高性能,因而可作為Hierarchical Softmax的一種替代。
NCE 的細節有點複雜,其本質是利用已知的概率密度函數來估計未知的概率密度函數。簡單來說,假設未知的概率密度函數為X,已知的概率密度為Y,如果得到了X和Y的關係,那麼X也就可以求出來了。具體可以參考論文《 Noise-contrastive estimation of unnormalized statistical models, with applications to natural image statistics》。
5.1 負採樣算法簡單介紹顧名思義,在基於Negative Sampling的CBOW和Skip-gram模型中,負採樣是個很重要的環節,對於一個給定的詞 ,如何生成 呢?
詞典 中的詞在語料 中出現的次數有高有底,對於那些高頻詞,被選為負樣本的概率就應該比較大,反之,對於那些低頻詞,其被選中的概率就應該比較小。這就是我們對採樣過程的一個大致要求,本質上就是一個帶權採樣問題。
下面,先用一段通俗的描述來幫助讀者理解帶權採樣的機理。設詞典 中的每一個詞 對應一個線段 ,長度為:
這裡 表示一個詞在語料 中出現的次數(分母中的求和項用來做歸一化)。現在將這些線段首尾相連地拼接在一起,形成一個長度為 的單位線段。如果隨機地往這個單位線段上打點,則其中長度越長的線段(對應高頻詞)被打中的概率就越大。
接下來再談談Word2Vec中的具體做法。記 ,這裡 表示詞典中的第 個單詞,則以 為剖分結點可得到區間 上的一個非等距剖分, 為其 個剖分區間。進一步引入區間 上的一個等距離剖分,剖分結點為 ,其中 ,具體見下面給出的示意圖。
圖: 映射的建立示意圖
將內部剖分結點 投影到非等距剖分上,如上圖中的紅色虛線所示,則可建立 與區間 (或者說 )的映射關係。
有了這個映射,採樣就簡單了:每次生成一個 間的隨機整數 , 就是一個樣本。當然,這裡還有一個細節,當對 進行負採樣時,如果碰巧選到 自己該怎麼辦?那就跳過去,Word2Vec的代碼中也是這麼處理的。
值得一提的是,Word2Vec源碼中為詞典 中的詞設置權值時,不是直接用 ,而是對其做了 次冪,其中 ,即公式(12)變成了:
此外,代碼中取 ,原始碼中是變量 。而映射公式(13)則是通過一個名為InitUnigramTable的函數來完成。
5.2 基於Negative Sampling的CBOW上面已經介紹完了負採樣算法,下面開始推導出基於Negative Sampling的CBOW的目標函數。首先我們先選好一個關於 的負樣本子集 ,對於 ,我們定義單詞 的標籤為:
上式表示詞 的標籤,即正樣本的標籤為 ,負樣本的標籤為 。
對於一個給定的正樣本 ,我們希望最大化的目標函數是:
其中:
這裡 仍表示 中各個詞的詞向量之和,而 在這裡作為一個輔助向量,為待訓練的參數。
為什麼要最大化 呢?讓我們先來看看 的表達式,將公式(15)帶入公式(14),有:
其中, 表示當上下文為 時,預測中心詞為 的概率,而 則表示當上下文為 時,預測中心詞為 的概率,這裡可以看一個二分類問題。從形式上看,最大化 ,相當於最大化 ,同時最小化所有的 。這不正是我們希望的嗎?增大正樣本的概率同時降低負樣本的概率。於是,對於一個給定的語料庫 ,有函數:
可以作為最終的整體優化目標。當然,這裡為了求導方便,對 取對數,最終的目標函數就是:
同樣,為了求導方便,我們還是取 :
接下來,利用隨機梯度上升法求梯度。首先考慮 關於 的梯度計算:
那麼 的更新公式可以寫成:
同時根據對稱性,可以得到 的梯度:
那麼 的更新公式可以寫成:
5.3 基於Ngative Sampling的Skip-gram本小節介紹基於Negative Sampling的Skip-gram模型。它和上一小節介紹的CBOW模型所用的思想是一樣的,因此,這裡我們直接從目標函數出發,且沿用之前的記號。
對於一個給定的樣本 , 我們希望最大化:
其中:
或者寫成整體表達式:
這裡 表示處理詞 時生成的負樣本子集。於是,對於一個給定的語料庫 ,函數:
就可以作為整體優化的目標。同樣,我們取 的對數,最終的目標函數就是:
為了梯度推導的方便,我們依舊將三重求和符號下的內容提取出來,記為 ,即:
接下來,利用隨機梯度上升法求梯度。首先考慮 關於 的梯度計算:
然後得到 的更新公式:
同理根據對稱性,得到:
然後得到 的更新公式:
6. 關於Word2Vec若干問題的思考(1)Word2Vec兩個算法模型的原理是什麼,網絡結構怎麼畫?
(2)網絡輸入輸出是什麼?隱藏層的激活函數是什麼?輸出層的激活函數是什麼?
(3)目標函數/損失函數是什麼?
(4)Word2Vec如何獲取詞向量?
(5)推導一下Word2Vec參數如何更新?
(6)Word2Vec的兩個模型哪個效果好哪個速度快?為什麼?
(7)Word2Vec加速訓練的方法有哪些?
(8)介紹下Negative Sampling,對詞頻低的和詞頻高的單詞有什麼影響?為什麼?
(9)Word2Vec和隱狄利克雷模型(LDA)有什麼區別與聯繫?
以上問題可以通過本文和參考文章找到答案,這裡不再詳細解答。
(10)介紹下Hierarchical Softmax的計算過程,怎麼把 Huffman 放到網絡中的?參數是如何更新的?對詞頻低的和詞頻高的單詞有什麼影響?為什麼?
Hierarchical Softmax利用了Huffman樹依據詞頻建樹,詞頻大的節點離根節點較近,詞頻低的節點離根節點較遠,距離遠參數數量就多,在訓練的過程中,低頻詞的路徑上的參數能夠得到更多的訓練,所以效果會更好。
(11)Word2Vec有哪些參數,有沒有什麼調參的建議?
Skip-Gram 的速度比CBOW慢一點,小數據集中對低頻次的效果更好;Sub-Sampling Frequent Words可以同時提高算法的速度和精度,Sample 建議取值為 ;Hierarchical Softmax對低詞頻的更友好;Negative Sampling對高詞頻更友好;Window Size,Skip-Gram一般10左右,CBOW一般為5左右。(12)Word2Vec有哪些局限性?
Word2Vec作為一個簡單易用的算法,其也包含了很多局限性:
Word2Vec只考慮到上下文信息,而忽略的全局信息;Word2Vec只考慮了上下文的共現性,而忽略的了彼此之間的順序性;7. Word2Vec在工業界的應用Word2Vec主要原理是根據上下文來預測單詞,一個詞的意義往往可以從其前後的句子中抽取出來。
而用戶的行為也是一種相似的時間序列,可以通過上下文進行推斷。當用戶瀏覽並與內容進行交互時,我們可以從用戶前後的交互過程中判斷行為的抽象特徵,這就使得我們可以把詞向量模型應用到推薦、廣告領域當中。
7.1 NLP領域Word2Vec學習到的詞向量代表了詞的語義,可以用來做分類、聚類、也可以做詞的相似度計算。把Word2Vec生成的向量直接作為深度神經網絡的輸入,可以做sentiment analysis等工作。7.2 圖嵌入基於Word2Vec這一類的Graph Embedding方法有很多,具體可以參考論文:DeepWalk(是引入Word2Vec思想比較經典的圖嵌入算法),node2vec,struc2vec 等等。
7.3 推薦領域Airbnb在論文《Real-time Personalization using Embeddings for Search Ranking at Airbnb》中提出將用戶的瀏覽行為組成List,通過Word2Vec方法學習item的向量,其點擊率提升了21%,且帶動了99%的預定轉化率。該論文主要是在Skip-gram 模型的基礎上做了改進。
Yahoo在論文《E-commerce in Your Inbox: Product Recommendations at Scale》中提出Yahoo郵箱從發送到用戶的購物憑證中抽取商品並組成List,通過Word2Vec學習並為用戶推薦潛在的商品;
7.4 廣告領域Yahoo在論文《Scalable Semantic Matching of Queries to Ads in Sponsored Search Advertising》中提出將用戶的搜索查詢和廣告組成List,並為其學習特徵向量,以便對於給定的搜索查詢可以匹配適合的廣告。
8. Reference【1】Rong X. word2vec parameter learning explained[J]. arXiv preprint arXiv:1411.2738, 2014. 【2】【Paper】Word2Vec:詞嵌入的一枚銀彈,地址:https://mp.weixin.qq.com/s/7dsjfcOfm9uPheJrmB0Ghw 【3】Word2Vec詳解-公式推導以及代碼 - link-web的文章 - 知乎 https://zhuanlan.zhihu.com/p/86445394 【4】The Illustrated Word2vec,Jay Alammar,地址:https://jalammar.github.io/illustrated-word2vec/ 【5】圖解word2vec(原文翻譯),地址:https://mp.weixin.qq.com/s/Yq_-1eS9UuiUBhNNAIxC-Q 【6】word2vec 相比之前的 Word Embedding 方法好在什麼地方? - 知乎 https://www.zhihu.com/question/53011711 【7】[NLP] 秒懂詞向量Word2vec的本質 - 穆文的文章 - 知乎 https://zhuanlan.zhihu.com/p/26306795 【8】http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/ 【9】word2vec模型深度解析 - TianMin的文章 - 知乎 https://zhuanlan.zhihu.com/p/85998950 【10】 A Neural Probabilistic Language Model - 張俊的文章 - 知乎 https://zhuanlan.zhihu.com/p/21240807 【11】word2vec有什麼應用? - 知乎 https://www.zhihu.com/question/25269336
最後除引用文獻外也推薦一些看過的資料: 【1】《深度學習word2vec學習筆記》,北流浪子。 【2】《Word2Vec中的數學》,peghoty。 【3】《Deep Learning實戰之Word2Vec》,網易有道。
本文主要參考了peghoty的《Word2Vec中的數學》,寫的非常棒, 強烈推薦大家學習。此外,我把自己學習Word2Vec時,收集到的優質資料已經整理好了,公眾號後臺回復【Word2Vec】領取。