word2vector的原理,結(jié)構(gòu),訓(xùn)練過程

之前用word2vector模型,上網(wǎng)找原理,出現(xiàn)各種CSDN上的解答??戳艘幌拢际莄opy某個(gè)人寫的東西,而且什么CBOW,什么Skip-Gram,什么哈夫曼樹,層次softmax,概念很多,繞都給繞暈了。
看了很多遍,只知道個(gè)大概,具體還是沒看懂。今天重新整理關(guān)于word2vector的原理。以一個(gè)好的脈絡(luò)把這個(gè)模型理清楚。


原型:NNLM(Neural Network Language Model)

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


NNLM模型

這個(gè)模型其實(shí)就是一個(gè)結(jié)構(gòu)簡單的神經(jīng)網(wǎng)絡(luò),MLP模型。輸入層,隱藏層(也許有兩層,看個(gè)人設(shè)計(jì)),接softmax輸出。它的作用是通過前 N-1 個(gè)詞,推測出第 N 個(gè)詞是什么。

舉個(gè)栗子,有一句話 “我今天中午吃的涮羊肉”。這個(gè)詞要輸出模型的話得把它先分詞,分詞成
”我“, ”今天“,”中午“,”吃的“,”涮羊肉“。要做的事情就是通過”我“, ”今天“,”中午“,”吃的“這四個(gè)詞,來推測”涮羊肉“這個(gè)詞。

怎么把這個(gè)場景建立模型呢。

輸入層

首先建立一個(gè)詞典,假設(shè)有30000個(gè)詞,那么把”我“, ”今天“,”中午“,”吃的“用one-hot表示的話,每個(gè)詞向量為 300001。那個(gè)圖片里面的C是什么呢,這里叫做投影矩陣,投影到詞空間的矩陣*。

到這里很多人就搞不清楚這個(gè)到底是個(gè)啥了。
換個(gè)方式理解,我們用word2vec的時(shí)候,最后每一個(gè)詞是不是都會(huì)用一個(gè)向量表示,而表示方法是

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

如果一個(gè)詞是這樣表示,那么整個(gè)詞典是什么樣的,是不是一個(gè)矩陣?這個(gè)矩陣就是投影矩陣訓(xùn)練完成,迭代得到的最后結(jié)果。

如果我們設(shè)定的矩陣維度D(超參數(shù)),那個(gè)這個(gè)投影矩陣的維度就是 D * V, C * 詞向量(one-hot表示既在投影矩陣中取第n列來表示對應(yīng)的詞),維度表示是 D * V * V * 1 = D * 1

隱藏層

假設(shè)只有一個(gè)隱藏層,把 上一層中的詞向量乘投影矩陣輸入到這一層中,就是有一個(gè)權(quán)重矩陣H,(BP過程需要更新投影矩陣C和投影矩陣H),在通過tanh激活輸出到下一層中。

輸出層

這里接的是一個(gè)softmax,有多少個(gè)類呢,30000個(gè)。從詞典中預(yù)測出現(xiàn)"涮羊肉"的概率。這就導(dǎo)致了一個(gè)問題,如果詞典特別大,那么這一層的參數(shù)直接爆炸。2003年只有CPU用,這導(dǎo)致了模型效果并不好。巨神Bengio也在論文里說了這個(gè)模型要從最后一層進(jìn)行改進(jìn)。具體流程和計(jì)算公式可以看論文原文。

訓(xùn)練過程

這里我用的一句話, “我今天中午吃的涮羊肉”,去前4個(gè)詞推第5個(gè)詞。如果我取3個(gè)詞,推第4個(gè)詞,那么就是用”我“, ”今天“,”中午“,推"吃的", ”今天“,”中午“,”吃的“,推“涮羊肉”。相當(dāng)于有一個(gè)滑動(dòng)窗口不斷在移動(dòng),逐漸訓(xùn)練模型的參數(shù)。


word2vecor

時(shí)間到了2013年,google另一位巨神Mikolov掏出了word2vector。而我們知道的CBOW(Continuous Bag-of-Words Model)和Skip-gram (Continuous Skip-gram Model),是word2vec的兩種訓(xùn)練模式。

負(fù)采樣(Negative Sample)和層次softmax(Hierarchical Softmax)則是兩種加速訓(xùn)練的方法。

CBOW / Skip-gram

CBOW的意思就是用上下文來預(yù)測當(dāng)前詞,如下圖所示:


CBOW模型

而Skip-gram就是用當(dāng)前詞來預(yù)測上下文,如下圖所示:


Skip-gram模型

兩種形式大體上其實(shí)差不多,這里講一下CBOW。
還是剛才那個(gè)句子,“我今天中午吃的涮羊肉”,而現(xiàn)在我需要用”我“, ”今天“,”吃的“,”涮羊肉“,來推出“中午”這個(gè)詞。為什么要這樣做呢,因?yàn)橹澳莻€(gè)模型只考慮了前文,并沒有后文的信息加入到預(yù)測中,word2vec把前后文信息也加入了。

這里的輸入層處理方式和NNLM里是一樣的,也是乘一個(gè)投影矩陣,最后我們需要的也是那個(gè)投影矩陣。

需要說一下的是隱藏層處理。這4個(gè)詞得到4個(gè)詞向量,在CBOW里,我們需要的是將這4個(gè)詞向量做一個(gè)SUM操作,成為一個(gè)向量。

然后接一個(gè)softmax輸出,還是類別數(shù)還是詞典的大小。
結(jié)構(gòu)如下圖所示:


cbow

具體例子可以看對CBOW具體理解 這篇博客。

而Skip-gram就是從一個(gè)詞推多個(gè)詞,結(jié)構(gòu)類似。具體可以看對Skip-gram的舉例理解 這篇博客。

那么到這里,模型解決了,但是還是面臨著softmax有太多參數(shù),所以需要優(yōu)化,加速訓(xùn)練。這里采用層次softmax和負(fù)采樣的辦法。

層次softmax

Hierarchical Softmax,層次softmax是一種加速訓(xùn)練的技巧,要解決的問題是原來softmax的參數(shù)太多的問題,所以不管是層次softmax也好,還是負(fù)采樣也好,都是對最后的softmax做一個(gè)處理。

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

比如說一個(gè)二叉樹結(jié)構(gòu),“我”肯定是第一層葉子節(jié)點(diǎn),“涮羊肉”肯定是在最后一層的葉子節(jié)點(diǎn)。如下圖:
哈夫曼樹

如果把哈夫曼結(jié)構(gòu)替換掉之前的softmax,是不是在做一層層的二分類,最后分類需要的參數(shù)也會(huì)減少非常多。

這里可以看基于層次softmax的CBOW。

負(fù)采樣

這里還有一種解決問題的思路,我們最后的softmax分出來的類是整個(gè)詞袋的大小,那么是不是可以把詞袋大小減小,因?yàn)橛行┏霈F(xiàn)概率低的詞我們根本可以不考慮。這就是負(fù)采樣的核心思想。

那么怎么選取頻率較高的詞,構(gòu)成最后softmax要分的類呢。可以看這篇負(fù)采樣具體做法。 (實(shí)在不想復(fù)制粘貼)

以上就是word2vector的全部內(nèi)容。現(xiàn)在除了word2vector,還有GloVe做embedding,最后的結(jié)果類似。
word2vector存在的問題是,因?yàn)橹豢紤]同時(shí)出現(xiàn)的概率,沒有考慮到語意,所以對于多義詞來說,word2vector就不好處理了。當(dāng)然也有相關(guān)的改進(jìn),比如說加入人工標(biāo)注等等。
推薦一個(gè)博客,講的很透徹負(fù)采樣
今天就到這,下次進(jìn)行RNN/LSTM。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容