我們先來看乙個問題,假如有乙個句子 " the dog bark at the mailman"。
假如用向量來表示每個單詞,我們最先想到的是用one hot 編碼的方式來表達每個單詞,具體來說。
the 可以表示為 [1,0,0,0,0]
dog 可以表示為 [0,1,0,0,0]
bark 可以表示為 [0,0,1,0,0]
at 可以表示為[0,0,0,1,0]
mailman可以表示為[0,0,0,0,1]
我們可以看到每個單詞其實就用乙個向量來表示。我們發現幾個問題:
第一,每個向量之間相互正交的(內積為0)。也就是說詞與詞之間是沒有任何關係的。
第二,每個詞的向量維度和不同詞的個數有關。比方說,在上面的這個句子裡,有5個不同的詞,所以向量的維度是5。然而往往現實中,一篇文章的中不同的詞的個數是很多的。這樣,向量的維度會非常的高。
這種對詞的向量表示方法存在著以上的問題,忽略了詞與詞之間的關係(比如說,dog和cat都是動物,並非完全無關係)。維度太高的向量作為模型輸入會導致模型變的複雜(模型複雜需要更多的訓練樣本才能夠收斂)
那麼是否存在一種更加合理的對詞的用向量的表達方式呢?有的,其實就是word embedding。
word embedding說的簡單一點其實就是將高維稀疏的向量降維成稠密的低維向量。(一種高維到低維的對映)
那麼如和實現word embedding?
w2v其實就是一種高效實現word embedding的工具。
所以,如果用一句話來描述word2vector的話你會怎麼描述?簡單的說,我覺得可以這麼說w2v其實是一種將單詞轉化向量的工具。這一種向量的其實是對單詞更有效的表達。
上面提到為了得到表達能力更強的詞向量,我們可以進行word embedding。那麼w2v是如何實現word embedding的呢?
在介紹w2v模型之前,先介紹兩個模型。乙個是skip-gram和cbow(continuous bag-of-words)。
首先看cbow,它的做法是,將乙個詞所在的上下文中的詞作為輸入,而那個詞本身作為輸出。
再來看skip-gram,它的做法和cbow相反,將乙個詞所在的上下文中的詞作為輸出,而詞本身作為輸入。(下面有例子說明)
另外,我們介紹這兩個模型都會涉及到的乙個重要引數。
window_size:視窗大小。
舉乙個例子,還是上面那句話:" the dog bark at the mailman"
假設window_size取1時,利用cbow模型可以得到:
([the,bark],dog)
([dog,at],bark)
([bark,the],at)
([at,mailman],the)
一共4組資料。
同樣滴,假設window_size還是1,利用skip-gram模型可以得到:
(dog,[the,bark])
(bark,[dog,at])
(at,[bark,the])
(the,[at,mailman])
對於每組資料會稍微做一下處理。
比如對於第一組 (dog,[the,bark])一般處理成
(dog,the),(dog,bark)。類似有:
(bark,dog),(bark,at),(at,bark),(at,the),(the,at),(the,mailman)共8組資料。
下面就可以直接介紹如何進行w2v,上面提到w2v可以看作是乙個將高維空間對映到低維空間的過程,用乙個單層神經網路就可以實現這種功能(和自編碼器有點類似其實)。
對於cbow,假如還是上面的句子,訓練資料是([the,brak],dog)那麼網路的輸入輸出如下圖所示:
這裡有幾個細節:
1.上面介紹cbow模型的時有乙個模型的結構圖,其中的sum意思其實就是把各個上下文的詞one-hot後的向量相加。
比如對於the的向量是[1,0,0,0,0]。bark向量是[0,0,1,0,0],sum之後就是[1,0,1,0,0]這就是網路的輸入。
輸出就是[0,1,0,0,0]-dog
2.我們所謂的embedding vetcor其實就第二個紅框裡的線,每一根線其實就是乙個權值。
3.第二個框裡的紅線其實就是dog這個單詞的embedding結果(由5維變成3維)
4.這個單層nn訓練完畢之後有用的部分就是embedding martrix這部分,其大小為 輸入個數(詞彙表長度)×embedding後的維度。
類似對於skip-gram模型有:
當取訓練資料(dog,bark)時,網路結構如上圖,對比上面的cbow最大的不同其實就是在於輸入資料。
上面只是關於w2v乙個非常淺顯方面的介紹,其實還有比如 負取樣(negative sampling),層級softmax以及**解讀等,自己嘗試寫了幾次,但是感覺都並沒有太多的新東西,也沒有什麼犀利的見解。所以就沒貼上來,下面只是簡單概括一下負取樣。
1.為什麼需要負取樣?
其實理由很簡單,比如對於cbow模型,已經知道詞w的上下文context(w)。如果希望**詞w,因此,當給定context(w)時,詞w就是乙個正樣本,其他詞就是負樣本。在上面的網路裡面我們可以容易地看出輸出有多少個就是詞彙表裡有多少個詞。通常來說,我們的詞彙表是非常龐大的,對於某乙個詞w,每個負樣本逐個去算一次計算的代價是很大的。
w2v參考文章1
另外一篇是關於skip-gram和cbow的介紹。
skip-gram&cbow
邏輯比較清晰的綜述文章:
綜述文章
數學原理很清晰很短的一篇文章(也有關於負取樣的簡單說明)
參考文章
僅為學習記錄之用,侵刪。
參考:
word2vector入門教程
w2v參考文章1 另外一篇是關於skip gram和cbow的介紹。skip gram cbow 邏輯比較清晰的綜述文章 綜述文章 數學原理很清晰很短的一篇文章 也有關於負取樣的簡單說明 參考文章 我們先來看乙個問題,假如有乙個句子 the dog bark at the mailman 假如用向量...
word2vector的原理,結構,訓練過程
之前用word2vector模型,上網找原理,出現各種csdn上的解答。看了一下,都是copy某個人寫的東西,而且什麼cbow,什麼skip gram,什麼哈夫曼樹,層次softmax,概念很多,繞都給繞暈了。看了很多遍,只知道個大概,具體還是沒看懂。今天重新整理關於word2vector的原理。以...
word2vector 使用方法 計算語義相似度
參考 word2vector是乙個把詞轉換成詞向量的乙個程式,能夠把詞對映到k維向量空間,甚至詞與詞之間 的向量操作還能和語義相對應。如果換個思路,把詞當做feature,那麼word2vec就可以把feature對映到k維向量空間,一 什麼是 word2vec?採用的模型有 cbow contin...