1. 程式人生 > >Word2vec之CBOW模型和Skip-gram模型形象解釋

Word2vec之CBOW模型和Skip-gram模型形象解釋

Word2vec中兩個重要模型是:CBOW和Skip-gram模型

首先Wordvec的目標是:將一個詞表示成一個向量

這裡首先說下我對CBOW模型的理解

這是主要是舉個例子簡化下

首先說下CBOW的三層結構:輸入層,投影層(中間層),輸出層

假設語料庫有10個詞: 【今天,我,你,他,小明,玩,北京,去,和,好】

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

很顯然,對這個句子分詞後應該是:

今天  我  和  小明  去  北京  玩

對於小明而言,選擇他的前三個詞和後三個詞作為這個詞的上下文

接下來,將這些分別全部表示成一個one-hot向量(向量中只有一個元素值為1,其他都是0)

則向量如下:

今天:[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] 

可以看出來,向量的維度就是語料庫中詞的個數

接下來,將這6個向量求和,作為神經網路模型的輸入,即

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

則X就是輸入層,即輸入層是由小明的前後三個詞生成的一個向量,為1*10維(這裡的10是語料庫中詞語的個數)

我們這裡是根據一個詞語的上下文來預測這個詞究竟是哪個,這個例子中就是根據小明這個詞的前後三個詞來預測小明這個位置出現各個詞的概率,因為訓練資料中這個詞就是小明,所以小明出現的概率應該是最大的, 所以我們希望輸出層的結果就是小明對應的向量

所以本例中,輸出層期望的資料實際就是小明這個詞構成的向量(可以認為是訓練資料的標籤) 即:

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

那麼神經網路模型可以畫成如下形狀




這裡我們可以隨意設定投影層的維度,即m的值,則:

輸入層和投影層的連線就可以構成一個引數矩陣1, 即w,該矩陣的維度為10*m(這裡10是語料庫中詞語的個數), 可以隨機初始化這個矩陣的引數值

投影層和輸出層的連線就可以構成一個引數矩陣2,即b, 該矩陣的維度為m*10, 可以隨機初始化這個矩陣的引數值

這樣最終的輸出層的維度1*10 = (1*10) * (10*m) * (m*10) 

引數矩陣1為:w

引數矩陣2為:b

那麼模型的目標函式是什麼呢?

就是損失函式,就是實際輸出和期望輸出的差值,我可以定義為平方差

首先,期望輸出就是“小明” 對應的向量

Y_ = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0] 
這個可以認為是訓練資料的標籤

實際輸出就是根據輸入X以及兩個引數矩陣w和b計算後輸入到softmax函式所得的結果:

即將 X * w * b的值 輸入到softmax函式得到實際的輸出 

Y =  [y1, y2, y3, y4, y5, y6, y7, y8, y9, y10]

則損失函式可以定義為:

J(θ) = (y1-0)*(y1-0) +  (y2-0)*(y2-0) +  (y3-0)*(y3-0) +  (y4-0)*(y4-0) +  (y5-1)*(y5-1) +  (y6-0)*(y6-0) +  (y7-0)*(y7-0) +  (y8-0)*(y8-0) +  (y9-0)*(y9-0) +  (y10-0)*(y10-0) 

這裡實際就是計算的兩個向量的距離,當然你可以採用別的演算法

這個損失函式是關於w和b的函式, 目標就是極小化損失函式

採用梯度下降法來不斷調整w和b的值(即不斷給w和b的引數值一個增量), 當模型的輸出滿足某個設定的條件時,則停止訓練

注意: 模型輸出的結果不會剛好就是一個one-hot向量, 可以認為趨近於0的就是0,趨近於1的就是1,當然為1的肯定只有一個元素

為了加快訓練速度,可以一個批次一起訓練,將多個句子的損失函式求和來訓練

最終訓練結束後,就要將一個詞表示成一個向量,那麼怎麼表示呢?

輸入X中第一個元素的值為1, 這表示的其實就是“今天” 這個詞,那麼“今天”就用它對應的連線上的權重引數來表示

今天 =  [w11, w12... w1m]
我   =  [w21, w22... w2m]
至於為什麼要這樣表示,至今沒有人能解釋

但是注意:這裡只能將X中元素為1的詞表示成向量,即只能將句子中出現的詞表示成向量,即“小明”的前後三個詞

然後說下我對Skip-gram模型的理解

其實理解了CBOW模型後,要理解Skip-gram模型就非常簡單了,CBOW模型是用詞的前後幾個詞來預測這個詞,而Skip-gram模型則是用一個詞來預測他周圍的詞。圖還是跟上面畫的那個圖是一樣的,只不過輸入X不是那幾個詞的向量和了,而是“小明” 對應的向量,即輸入只有一個,輸出也是隻有一個,每次只預測一個詞Skip-gram模型最終的結果是將小明表示成一個向量,而CBOW模型是將“小明”前後三個詞表示成向量