word2vector的原理,結構,訓練過程

2021-09-05 04:30:30 字數 3309 閱讀 9734

之前用word2vector模型,上網找原理,出現各種csdn上的解答。看了一下,都是copy某個人寫的東西,而且什麼cbow,什麼skip-gram,什麼哈夫曼樹,層次softmax,概念很多,繞都給繞暈了。

看了很多遍,只知道個大概,具體還是沒看懂。今天重新整理關於word2vector的原理。以乙個好的脈絡把這個模型理清楚。

大家看原理一定看過下面這張圖

nnlm模型

這個模型其實就是乙個結構簡單的神經網路,mlp模型。輸入層,隱藏層(也許有兩層,看個人設計),接softmax輸出。它的作用是通過前 n-1 個詞,推測出第 n 個詞是什麼

舉個栗子,有一句話 「我今天中午吃的涮羊肉」。這個詞要輸出模型的話得把它先分詞,分詞成

」我「, 」今天「,」中午「,」吃的「,」涮羊肉「。要做的事情就是通過」我「, 」今天「,」中午「,」吃的「這四個詞,來推測」涮羊肉「這個詞。

怎麼把這個場景建立模型呢。

輸入層首先建立乙個詞典,假設有30000個詞,那麼把」我「, 」今天「,」中午「,」吃的「用one-hot表示的話,每個詞向量為 300001。那個裡面的c是什麼呢,這裡叫做投影矩陣,

投影到詞空間的矩陣*。

到這裡很多人就搞不清楚這個到底是個啥了。

換個方式理解,我們用word2vec的時候,最後每乙個詞是不是都會用乙個向量表示,而表示方法是

[0.31343242, 0.65464122, 0.12343425, ..., -1.324344]

如果乙個詞是這樣表示,那麼整個詞典是什麼樣的,是不是乙個矩陣?這個矩陣就是投影矩陣訓練完成,迭代得到的最後結果。

如果我們設定的矩陣維度d(超引數),那個這個投影矩陣的維度就是 d * v, c * 詞向量(one-hot表示既在投影矩陣中取第n列來表示對應的詞),維度表示是 d * v * v * 1 = d * 1

隱藏層輸出層

這裡接的是乙個softmax,有多少個類呢,30000個。從詞典中**出現"涮羊肉"的概率。這就導致了乙個問題,如果詞典特別大,那麼這一層的引數直接**。2023年只有cpu用,這導致了模型效果並不好。巨神bengio也在**裡說了這個模型要從最後一層進行改進。具體流程和計算公式可以看**原文。

訓練過程

這裡我用的一句話, 「我今天中午吃的涮羊肉」,去前4個詞推第5個詞。如果我取3個詞,推第4個詞,那麼就是用」我「, 」今天「,」中午「,推"吃的", 」今天「,」中午「,」吃的「,推「涮羊肉」。相當於有乙個滑動視窗不斷在移動,逐漸訓練模型的引數。

時間到了2023年,google另一位巨神mikolov掏出了word2vector。而我們知道的cbow(continuous bag-of-words model)和skip-gram (continuous skip-gram model),是word2vec的兩種訓練模式

負取樣(negative sample)和層次softmax(hierarchical softmax)則是兩種加速訓練的方法

cbow / skip-gram

cbow的意思就是用上下文來**當前詞,如下圖所示:

cbow模型

而skip-gram就是用當前詞來**上下文,如下圖所示:

skip-gram模型

兩種形式大體上其實差不多,這裡講一下cbow。

還是剛才那個句子,「我今天中午吃的涮羊肉」,而現在我需要用」我「, 」今天「,」吃的「,」涮羊肉「,來推出「中午」這個詞。為什麼要這樣做呢,因為之前那個模型只考慮了前文,並沒有後文的資訊加入到**中,word2vec把前後文資訊也加入了。

這裡的輸入層處理方式和nnlm裡是一樣的,也是乘乙個投影矩陣,最後我們需要的也是那個投影矩陣。

需要說一下的是隱藏層處理。這4個詞得到4個詞向量,在cbow裡,我們需要的是將這4個詞向量做乙個sum操作,成為乙個向量。

然後接乙個softmax輸出,還是類別數還是詞典的大小。

結構如下圖所示:

具體例子可以看對cbow具體理解 這篇部落格。

而skip-gram就是從乙個詞推多個詞,結構類似。具體可以看對skip-gram的舉例理解 這篇部落格。

那麼到這裡,模型解決了,但是還是面臨著softmax有太多引數,所以需要優化,加速訓練。這裡採用層次softmax和負取樣的辦法。

層次softmax

hierarchical softmax,層次softmax是一種加速訓練的技巧,要解決的問題是原來softmax的引數太多的問題,所以不管是層次softmax也好,還是負取樣也好,都是對最後的softmax做乙個處理

層次softmax的核心內容是哈夫曼樹(huffman tree),樹的核心概念是出現概率越高的符號使用較短的編碼(層次越淺),出現概率低的符號則使用較長的編碼(層次越深)。

比如說乙個二叉樹結構,「我」肯定是第一層葉子節點,「涮羊肉」肯定是在最後一層的葉子節點。如下圖:

哈夫曼樹

如果把哈夫曼結構替換掉之前的softmax,是不是在做一層層的二分類,最後分類需要的引數也會減少非常多。

這裡可以看基於層次softmax的cbow。

負取樣這裡還有一種解決問題的思路,我們最後的softmax分出來的類是整個詞袋的大小,那麼是不是可以把詞袋大小減小,因為有些出現概率低的詞我們根本可以不考慮。這就是負取樣的核心思想。

那麼怎麼選取頻率較高的詞,構成最後softmax要分的類呢。可以看這篇負取樣具體做法。 (實在不想複製貼上)

以上就是word2vector的全部內容。現在除了word2vector,還有glove做embedding,最後的結果類似。

word2vector存在的問題是,因為只考慮同時出現的概率,沒有考慮到語意,所以對於多義詞來說,word2vector就不好處理了。當然也有相關的改進,比如說加入人工標註等等。

今天就到這,下次進行rnn/lstm。

word2vector入門教程

w2v參考文章1 另外一篇是關於skip gram和cbow的介紹。skip gram cbow 邏輯比較清晰的綜述文章 綜述文章 數學原理很清晰很短的一篇文章 也有關於負取樣的簡單說明 參考文章 我們先來看乙個問題,假如有乙個句子 the dog bark at the mailman 假如用向量...

word2vector 理解入門

我們先來看乙個問題,假如有乙個句子 the dog bark at the mailman 假如用向量來表示每個單詞,我們最先想到的是用one hot 編碼的方式來表達每個單詞,具體來說。the 可以表示為 1,0,0,0,0 dog 可以表示為 0,1,0,0,0 bark 可以表示為 0,0,1...

word2vector 使用方法 計算語義相似度

參考 word2vector是乙個把詞轉換成詞向量的乙個程式,能夠把詞對映到k維向量空間,甚至詞與詞之間 的向量操作還能和語義相對應。如果換個思路,把詞當做feature,那麼word2vec就可以把feature對映到k維向量空間,一 什麼是 word2vec?採用的模型有 cbow contin...