大傢好,今天要講的內容是,連續詞袋模型CBOW。
連續詞袋模型,英文全稱是Continuous Bag of Words,簡稱CBOW。
它和skip-gram跳字模型同時是Word2Vec的實現方法。
![](https://news.xinpengboligang.com/upload/keji/4025da912815b8a9435e53fd77c6990c.jpeg)
其中,CBOW模型會根據上下文詞匯預測目標詞,而skip-gram恰好相反,根據目標詞匯預測上下文。
無論是CBOW還是skip-gram,它們的最終目標都是迭代出詞向量字典,也就是嵌入矩陣。
![](https://news.xinpengboligang.com/upload/keji/f6929e36ade6374c3a6239199ef173da.jpeg)
後面我們將詞向量字典稱為embeddings。
1.什麼是CBOW模型
考慮下面這個問題。
設某句話為“We are about to study the idea of deep learning.”
對於句子中的某個詞語,比如study,能否用它的上下文,表示出study呢?
對於某個詞的上下文,需要提前設置一個上下文窗口長度:
![](https://news.xinpengboligang.com/upload/keji/ec4ea6700b49a644034af514d991e9bc.jpeg)
例如,如果窗口長度為1,那麼study的上下文就是to和the兩個詞。
如果窗口長度為2,那麼上下文就是about、to、the、idea這四個詞。
設置好窗口的長度後,需要通過窗口內的詞語,預測目標詞。
假如將窗口長度設置為2,那麼就有如下的預測關系。
![](https://news.xinpengboligang.com/upload/keji/5303162e479b73becfd5b06120a37f1a.jpeg)
例如,使用We、are、to、study四個詞預測about。
使用are、about、study、the,預測to等等。
對於CBOW模型,它實際上是一個神經網絡:
![](https://news.xinpengboligang.com/upload/keji/411056cb84f59b2977de0bd7855e18b4.jpeg)
該神經網絡會接收上下文詞語,並將上下文詞語轉換為最有可能得目標詞。
例如,基於這個句子訓練CBOW模型,如果向模型輸入about、to、the、idea四個詞,那麼CBOW就會輸出study。
2.CBOW模型的embeddings層
首先,在CBOW模型中,有一個特殊的embeddings層:
![](https://news.xinpengboligang.com/upload/keji/b44f7702950456a85e97666b8e6b74e7.jpeg)
embeddings層是一個N*V的矩陣。
其中N為詞表中的詞語個數,V是詞向量的維度。它就是我們最終希望的得到的嵌入矩陣。
embeddings層的作用是將輸入的詞語轉換為詞向量。
例如,將詞語“We”輸入CBOW:
![](https://news.xinpengboligang.com/upload/keji/7a6e75b381684a08339f2c5f0de98b3b.jpeg)
首先,需要將“We”轉換為One-Hot形式,它是一個1*N的向量。
其中隻有與“We”對應的位置是1,其它都是0。
然後將這個1×N的向量與N*V的embeddings相乘,就得到了“We”的詞向量,它是一個1*V的向量。
這個過程實際上是從矩陣中選擇一個特定的行,也就是從embeddings中查找“We”的詞向量。
由於某個詞的上下文中,包括了多個詞語,這些詞語會同時輸入至embeddings層,每個詞語都會被轉換為一個詞向量。
![](https://news.xinpengboligang.com/upload/keji/e7e8a55c592ed631712d738b7b5d2c52.jpeg)
例如,這裡word1、2、3、4,被embeddings層轉換為v1、v2、v3、v4。
為了得到多個上下文詞的一個統一表示,我們將這些向量求和,再求平均,這樣就得到了多個上下文詞語的一個輸出。
也就是embeddings層的輸出結果,是一個將上下文語義信息平均的向量。
3.CBOW模型的線性層
在embeddings層後,會連接一個線性層,使用橙色表示。
![](https://news.xinpengboligang.com/upload/keji/958615bdae7dc6bec3376b51b15fcf84.jpeg)
一般情況下,它是一個不設置激活函數的線性層。
這個線性層的權重矩陣的維度是V*N,其中V是詞向量的維度,N是詞表中詞語的個數。
也就是這裡是一個包含了V個隱藏神經元,N個輸出神經元的神經網絡。
具體來說,我們將所有上下文詞向量的平均值,這裡標記為向量V。
輸入至該線性層,經過線性層的計算,可以得到一個1*N的向量。
將這個1*N的向量,再輸入至softmax層,最終計算出一個最有可能的輸出詞。
這個詞就是CBOW模型的預測目標詞。
![](https://news.xinpengboligang.com/upload/keji/e0e107bd57513c4e587016fc79bb4a7c.jpeg)
總結CBOW模型,它包括了兩個部分,分別是藍色標記的embeddings層和橙色標記的線性層。
embedding層將輸入的上下文詞語,都轉換為一個上下文詞向量,並繼續求出這些上下文詞向量的平均值,它是一個代表整個上下文的向量。
線性層接收這個向量,並將其轉換為一個輸出向量。這個輸出向量的維度與詞匯表的大小相同。
接著,使用softmax函數,將該輸出向量轉換為一個概率分佈,它表示每個詞作為目標詞的概率。
其中概率最大詞的就是CBOW模型的預測結果。
最後我們來看,如何使用Pytorch框架,實現CBOW模型。
4.CBOW模型的實現
定義CBOW模型類,它繼承nn.Module類:
![](https://news.xinpengboligang.com/upload/keji/79cf33db52cb5a20dac73a9e623f1782.jpeg)
實現類的初始化函數init,函數傳入參數vocab_size和embedding_dim,分別代表詞表中詞語的數量和詞向量的維度。
在init函數中,設置詞嵌入層embeddings,它可以直接使用nn.Embedding構造出來。
它是vocab_size乘embedding_dim的詞嵌入矩陣。
設置線性層linear,它的隱藏層中包括embedding_dim個神經元,輸出層包括vocab_size個神經元。
在forward函數中,函數傳入上下文詞語的索引context_idxs。
在函數中,首先使用embeddings計算每個詞語的詞向量,然後將這些詞向量求和,生成一個統一的上下文表示embeds。
最後使用線性層,計算輸出out,函數返回out。
另外要說明的是,softmax層可以直接放在損失函數CrossEntropyLoss中實現,因此就不在前向傳播forward中顯示的實現了。
那麼到這裡,連續詞袋模型CBOW,就講完了,感謝大傢的觀看,我們下節課再會。