您當前的位置:首頁 > 文化

(二)通俗易懂理解——Skip-gram和CBOW演算法原理

作者:由 夢裡尋夢 發表于 文化時間:2018-07-13

什麼是Word2Vec和Embeddings?

Word2Vec是從大量文字語料中以無監督的方式學習語義知識的一種模型,它被大量地用在自然語言處理(NLP)中。那麼它是如何幫助我們做自然語言處理呢?Word2Vec其實就是透過學習文字來用詞向量的方式表徵詞的語義資訊,即透過一個嵌入空間使得語義上相似的單詞在該空間內距離很近。Embedding其實就是一個對映,將單詞從原先所屬的空間對映到新的多維空間中,也就是把原先詞所在空間嵌入到一個新的空間中去。

我們從直觀角度上來理解一下,cat這個單詞和kitten屬於語義上很相近的詞,而dog和kitten則不是那麼相近,iphone這個單詞和kitten的語義就差的更遠了。透過對詞彙表中單詞進行這種數值表示方式的學習(也就是將單詞轉換為詞向量),能夠讓我們基於這樣的數值進行向量化的操作從而得到一些有趣的結論。比如說,如果我們對詞向量kitten、cat以及dog執行這樣的操作:kitten - cat + dog,那麼最終得到的嵌入向量(embedded vector)將與puppy這個詞向量十分相近。

模型

Word2Vec模型中,主要有Skip-Gram和CBOW兩種模型,從直觀上理解,Skip-Gram是給定input word來預測上下文。而CBOW是給定上下文,來預測input word。

(二)通俗易懂理解——Skip-gram和CBOW演算法原理

skip-gram模型的輸入是一個單詞W1,它的輸出是W1的上Wo1,。。。,Woc,上下文的視窗大小為C。舉個例子,這裡有個句子“I drive my car to the store”。我們如果把”car”作為訓練輸入資料,單片語{“I”, “drive”, “my”, “to”, “the”, “store”}就是輸出。所有這些單詞,我們會進行one-hot編碼。

假如我們有一個句子

“The dog barked at the mailman”。

首先我們選句子中間的一個詞作為我們的輸入詞,例如我們選取“dog”作為input word;

有了input word以後,我們再定義一個叫做skip_window的引數,它代表著我們從當前input word的一側(左邊或右邊)選取詞的數量。如果我們設定

skip\_window=2

,那麼我們最終獲得視窗中的詞(包括input word在內)就是

['The', 'dog','barked', 'at']

skip\_window=2

代表著選取左input word左側2個詞和右側2個詞進入我們的視窗,所以整個視窗大小

span=2\times 2=4

。另一個引數叫num_skips,它代表著我們從整個視窗中選取多少個不同的詞作為我們的output word,當

skip\_window=2

num\_skips=2

時,我們將會得到兩組

(input word, output word)

形式的訓練資料,即

('dog', 'barked'),('dog', 'the')

神經網路基於這些訓練資料將會輸出一個機率分佈,這個機率代表著我們的詞典中的每個詞是output word的可能性。這句話有點繞,我們來看個栗子。第二步中我們在設定skip_window和num_skips=2的情況下獲得了兩組訓練資料。假如我們先拿一組資料

('dog', 'barked')

來訓練神經網路,那麼模型透過學習這個訓練樣本,會告訴我們詞彙表中每個單詞是“barked”的機率大小。

下面這個例子展示了從“The quick brown fox jumps over the lazy dog。“ 中找到的一些詞對。 我使用了window size=2,而藍色標出的詞為輸入詞。

(二)通俗易懂理解——Skip-gram和CBOW演算法原理

模型細節

我們如何來表示這些單詞呢?

首先,我們都知道神經網路只能接受數值輸入,我們不可能把一個單詞字串作為輸入,因此我們得想個辦法來表示這些單詞。最常用的辦法就是基於訓練文件來構建我們自己的詞彙表(vocabulary)再對單詞進行one-hot編碼。

假設從我們的訓練文件中抽取出10000個唯一不重複的單片語成詞彙表。我們對這10000個單詞進行one-hot編碼,得到的每個單詞都是一個10000維的向量,向量每個維度的值只有0或者1,假如單詞ants在詞彙表中的出現位置為第3個,那麼ants的向量就是一個第三維度取值為1,其他維都為0的10000維的向量(

ants=[0, 0, 1, 0, ..., 0]

)。

模型的輸入如果為一個10000維的向量,那麼輸出也是一個10000維度(詞彙表的大小)的向量,它包含了10000個機率,每一個機率代表著當前詞是輸入樣本中output word的機率大小。

重點內容

其實在閱讀各種部落格的時候,我最想知道的就是怎麼輸入怎麼輸出,對於很多原理介紹不是特別關心,不過由於寫的算是一篇技術貼,就copy他人的內容作為一些基礎介紹。接下來談談自己的理解。

以“The quick brown fox jumps over the lazy dog。“為例。

首先輸入就是一個one-hot向量,假設我們語料中有10000個詞,那輸入一個1*10000的one-hot矩陣來表示brown,接下來我們的隱藏層設定為300個神經單元,這個300個神經單元就是我們要的維度,如果你想要設定成100維的詞向量,那麼這個神經元就設定成100。

那麼在輸入和隱藏層之間就會產生一個10000*300的權重矩陣,而這個矩陣就是我們需要的詞向量。這個詞向量怎麼來的,那麼要看接下去的連線。

在隱藏層後面將再接一層,這一層具有10000個神經元,這10000個神經元代表的是總共的詞彙量10000個,而至於這層形成的權重矩陣不用管,雖然權重矩陣為300*10000。

這時候我們得到10000個輸出,這10000個輸出將代入softmax轉化為10000個機率,這10000個機率值加總和為1。

這就是整個skip-gram的網路層。我們以brown為例,將形成四組訓練資料(brown,The)、(brown,quick)、(brown,fox)、(brown,jumps)。

如何進行權重最佳化呢?拿(brown,fox)來說,brown的輸出為10000個機率,形式為1*10000,而fox為1*10000的one-hot形式,我們的代價函式就是可以最小化這兩個矩陣的交叉熵,也可以求這兩個矩陣的差平方,即損失值。

經過不斷的迭代,最終輸入層和隱藏層形成了一個10000*300的權重矩陣,那麼這個權重矩陣將一一對應輸入層當中詞彙向量,至於為何可以這樣,暫時沒有搞明白。

(二)通俗易懂理解——Skip-gram和CBOW演算法原理

另外,我們如果按照一般的神經網路訓練,那輸入跟隱藏層之間的權重將無比巨大,導致計算緩慢,假設我們有320000個詞彙,那將有320000*300個權值需要訓練。這時候就會根據one-hot的特點進行權值索引,解決這個難題。這也是為何把這個層也叫做投影層,不做運算只是投影。

如下圖所示,輸入的是一個one-hot,經過權值矩陣運算,相當於是對其進行索引,輸入在第4列,那麼輸出就是第4行,這樣避免了計算。

(二)通俗易懂理解——Skip-gram和CBOW演算法原理

到此,skip-gram演算法原理介紹結束,至於訓練過程中的一些加快訓練方法可以參考相關部落格,如負取樣的運用等。

CBOW模型

CBOW模型跟skip-gram的原理是一樣的,只不過在輸入的時候是該詞周圍的詞向量加總作為輸入。

現在有這樣一句話:今天我和小明去北京玩

今天:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 記為x1

我 :[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 記為x2

和 :[0, 0, 0, 0, 0, 0, 0, 0, 1, 0] 記為x3

去 :[0, 0, 0, 0, 0, 0, 0, 1, 0, 0] 記為x4

北京:[0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 記為x5

玩 :[0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 記為x6

小明的向量表示為:

小明 :[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

我們的輸入就是:

X = x1 + x2 + x3 + x4 + x5 + x6 = [1, 1, 0, 0, 0, 1, 1, 1, 1, 0]

這個輸入是把‘小明’這個詞的上下文全部作為輸入,而如果我們只是要前後的一個,那就只要加總‘和’‘去’。其他的就跟skip-gram是一樣的。

本文基於對其他部落格的解讀,如有錯誤,歡迎指正。

參考作者:天雨粟:理解 Word2Vec 之 Skip-Gram 模型

https://

blog。csdn。net/u01173414

4/article/details/78668518

http://

mccormickml。com/2016/04

/19/word2vec-tutorial-the-skip-gram-model/

標簽: 10000  向量  單詞  輸入  word