word2vec使用了cbow與skip-gram來訓練模型與得到詞向量,但是並沒有使用傳統的dnn模型。最先優化使用的資料結構是用霍夫曼樹來代替隱藏層和輸出層的神經元,即霍夫曼樹的:
葉子節點:起到輸出層神經元的作用,葉子節點的個數即為詞彙表的小大。
內部節點:起到隱藏層神經元的作用。
霍夫曼樹的建立過程如下:
輸入:權值為(w1,w2,...wn)的n個節點
輸出:對應的霍夫曼樹
處理步驟:
1)將(w1,w2,...wn)看做是有n棵樹的森林,每個樹僅有乙個節點。
2)在森林中選擇根節點權值最小的兩棵樹進行合併,得到乙個新的樹,這兩顆樹分布作為新樹的左右子樹。新樹的根節點權重為左右子樹的根節點權重之和。
3) 將之前的根節點權值最小的兩棵樹從森林刪除,並把新樹加入森林。
4)重複步驟2)和3)直到森林裡只有一棵樹為止。
下面我們用乙個具體的例子來說明霍夫曼樹建立的過程,我們有(a,b,c,d,e,f)共6個節點,節點的權值分布是(20,4,8,6,16,3)。首先是最小的b和f合併,得到的新樹根節點權重是7.此時森林裡5棵樹,根節點權重分別是20,8,6,16,7。此時根節點權重最小的6,7合併,得到新子樹,依次類推,最終得到下面的霍夫曼樹。
那麼霍夫曼樹有什麼好處呢?一般得到霍夫曼樹後我們會對葉子節點進行霍夫曼編碼,由於權重高的葉子節點越靠近根節點,而權重低的葉子節點會遠離根節點,這樣我們的高權重節點編碼值較短,而低權重值編碼值較長。這保證的樹的帶權路徑最短,也符合我們的資訊理論,即我們希望越常用的詞擁有更短的編碼。
如何編碼呢?一般對於乙個霍夫曼樹的節點(根節點除外),可以約定左子樹編碼為0,右子樹編碼為1。如上圖,則可以得到c的編碼是00。注意,是從左到右,從上到下(根節點除外)的順序開始編碼。
在word2vec中,約定編碼方式和上面的例子相反,即約定左子樹編碼為1,右子樹編碼為0,同時約定左子樹的權重不小於右子樹的權重。
與word2vec 原來word2vec那麼簡單
說到word2vec,它可謂非結構化資料裡面的佼佼者,尤其是在推薦和nlp當中,足以體現它的優勢所在,並且多年一直備受工業界喜愛.那麼word2vec到底是怎麼個原理的,發現身邊總是有很多人問,確不能準確的說出為什麼是兩個矩陣,到底是怎麼自動反向傳播的,以及對於softmax之後那麼大的維度資料,是...
Word2Vec裡實現Huffman樹
word2vec裡是拿陣列實現word2vec,效率很高,在學校裡經常見到的是遞迴迭代實現huffman樹,這對於處理大量葉子節點的問題不是乙個最佳方法。陣列法 include include include define max code length 40 巨集定義沒有 struct vocab...
word2vec學習參考
最近看nlp的東西比較多。就拿現在google 基於神經網路做的 word2vec 作為部落格的開始吧,今後會陸陸續續補充內容。基本是分4塊內容 1.神經網路語言模型 2.語言模型分層優化 3.word2vec 原理 4.google word2vec 看一點寫一點,先扔些參考資料鏈接上去。附上在研...