1. 程式人生 > >word2vec:主要概念和流程

word2vec:主要概念和流程

問題 c中 分別是 represent 樹形結構 屬於 附近 二叉 ram

1.單詞的向量化表示

一般來講,詞向量主要有兩種形式,分別是稀疏向量和密集向量。

所謂稀疏向量,又稱為one-hot representation,就是用一個很長的向量來表示一個詞,向量的長度為詞典的大小N,向量的分量只有一個1,其他全為0,1的位置對應該詞在詞典中的索引。

至於密集向量,又稱distributed representation,即分布式表示。最早由Hinton提出,可以克服one-hot representation的上述缺點,基本思路是通過訓練將每個詞映射成一個固定長度的短向量,所有這些向量就構成一個詞向量空間,每一個向量可視為該空間上的一個點。

2.word2vec的語言模型

所謂的語言模型,就是指對自然語言進行假設和建模,使得能夠用計算機能夠理解的方式來表達自然語言。word2vec采用的是n元語法模型(n-gram model),即假設一個詞只與周圍n個詞有關,而與文本中的其他詞無關。

CBOW模型能夠根據輸入周圍n-1個詞來預測出這個詞本身,而skip-gram模型能夠根據詞本身來預測周圍有哪些詞。也就是說,CBOW模型的輸入是某個詞A周圍的n個單詞的詞向量之和,輸出是詞A本身的詞向量;而skip-gram模型的輸入是詞A本身,輸出是詞A周圍的n個單詞的詞向量。

3.基於Hierarchical Softmax的模型

理論上說,無論是CBOW模型還是skip-gram模型,其具體的實現都可以用神經網絡來完成。問題在於,這樣做的計算量太大了。我們可以簡略估計一下。首先定義一些變量的含義[3]


(1) n : 一個詞的上下文包含的詞數,與n-gram中n的含義相同
(2) m : 詞向量的長度,通常在10~100
(3) h : 隱藏層的規模,一般在100量級
(4) N :詞典的規模,通常在1W~10W
(5) T : 訓練文本中單詞個數

以CBOW為例,輸入層為n-1個單詞的詞向量,長度為m(n-1),隱藏層的規模為h,輸出層的規模為N。那麽前向的時間復雜度就是o(m(n-1)h+hN) = o(hN) 這還是處理一個詞所需要的復雜度。如果要處理所有文本,則需要o(hNT)的時間復雜度。這個是不可接受的。同時我們也註意到,o(hNT)之中,h和T的值相對固定,想要對其進行優化,主要還是應該從N入手。而輸出層的規模之所以為N,是因為這個神經網絡要完成的是N選1的任務。那麽可不可以減小N的值呢?答案是可以的。解決的思路就是將一次分類分解為多次分類

,這也是Hierarchical Softmax的核心思想。舉個栗子,有[1,2,3,4,5,6,7,8]這8個分類,想要判斷詞A屬於哪個分類,我們可以一步步來,首先判斷A是屬於[1,2,3,4]還是屬於[5,6,7,8]。如果判斷出屬於[1,2,3,4],那麽就進一步分析是屬於[1,2]還是[3,4],以此類推,如圖中所示的那樣。這樣一來,就把單個詞的時間復雜度從o(h*N)降為o(h*logN),更重要的減少了內存的開銷。

4.word2vec的大概流程

至此,word2vec中的主要組件都大概提到過一遍,現在應該把它們串起來,大概了解一下word2vec的運行流程。

(1) 分詞 / 詞幹提取和詞形還原。 中文和英文的nlp各有各的難點,中文的難點在於需要進行分詞,將一個個句子分解成一個單詞數組。而英文雖然不需要分詞,但是要處理各種各樣的時態,所以要進行詞幹提取和詞形還原。
(2) 構造詞典,統計詞頻。這一步需要遍歷一遍所有文本,找出所有出現過的詞,並統計各詞的出現頻率。
(3) 構造樹形結構。依照出現概率構造Huffman樹。如果是完全二叉樹,則簡單很多,後面會仔細解釋。需要註意的是,所有分類都應該處於葉節點,像下圖顯示的那樣[4]

技術分享

(4)生成節點所在的二進制碼。拿上圖舉例,22對應的二進制碼為00,而17對應的是100。也就是說,這個二進制碼反映了節點在樹中的位置,就像門牌號一樣,能按照編碼從根節點一步步找到對應的葉節點。
(5) 初始化各非葉節點的中間向量和葉節點中的詞向量。樹中的各個節點,都存儲著一個長為m的向量,但葉節點和非葉結點中的向量的含義不同。葉節點中存儲的是各詞的詞向量,是作為神經網絡的輸入的。而非葉結點中存儲的是中間向量,對應於神經網絡中隱含層的參數,與輸入一起決定分類結果。
(6) 訓練中間向量和詞向量。對於CBOW模型,首先將詞A附近的n-1個詞的詞向量相加作為系統的輸入,並且按照詞A在步驟4中生成的二進制碼,一步步的進行分類並按照分類結果訓練中間向量和詞向量。舉個栗子,對於綠17節點,我們已經知道其二進制碼是100。那麽在第一個中間節點應該將對應的輸入分類到右邊。如果分類到左邊,則表明分類錯誤,需要對向量進行修正。第二個,第三個節點也是這樣,以此類推,直到達到葉節點。因此對於單個單詞來說,最多只會改動其路徑上的節點的中間向量,而不會改動其他節點。


技術分享

word2vec:主要概念和流程