word2vec連續詞袋模型CBOW詳解,使用Pytorch實現

2024年2月6日 33点热度 0人点赞

大傢好,今天要講的內容是,連續詞袋模型CBOW。

連續詞袋模型,英文全稱是Continuous Bag of Words,簡稱CBOW。

它和skip-gram跳字模型同時是Word2Vec的實現方法。

其中,CBOW模型會根據上下文詞匯預測目標詞,而skip-gram恰好相反,根據目標詞匯預測上下文。

無論是CBOW還是skip-gram,它們的最終目標都是迭代出詞向量字典,也就是嵌入矩陣。

後面我們將詞向量字典稱為embeddings。

1.什麼是CBOW模型

考慮下面這個問題。

設某句話為“We are about to study the idea of deep learning.”

對於句子中的某個詞語,比如study,能否用它的上下文,表示出study呢?

對於某個詞的上下文,需要提前設置一個上下文窗口長度:

例如,如果窗口長度為1,那麼study的上下文就是to和the兩個詞。

如果窗口長度為2,那麼上下文就是about、to、the、idea這四個詞。

設置好窗口的長度後,需要通過窗口內的詞語,預測目標詞。

假如將窗口長度設置為2,那麼就有如下的預測關系。

例如,使用We、are、to、study四個詞預測about。

使用are、about、study、the,預測to等等。

對於CBOW模型,它實際上是一個神經網絡:

該神經網絡會接收上下文詞語,並將上下文詞語轉換為最有可能得目標詞。

例如,基於這個句子訓練CBOW模型,如果向模型輸入about、to、the、idea四個詞,那麼CBOW就會輸出study。

2.CBOW模型的embeddings層

首先,在CBOW模型中,有一個特殊的embeddings層:

embeddings層是一個N*V的矩陣。

其中N為詞表中的詞語個數,V是詞向量的維度。它就是我們最終希望的得到的嵌入矩陣。

embeddings層的作用是將輸入的詞語轉換為詞向量。

例如,將詞語“We”輸入CBOW:

首先,需要將“We”轉換為One-Hot形式,它是一個1*N的向量。

其中隻有與“We”對應的位置是1,其它都是0。

然後將這個1×N的向量與N*V的embeddings相乘,就得到了“We”的詞向量,它是一個1*V的向量。

這個過程實際上是從矩陣中選擇一個特定的行,也就是從embeddings中查找“We”的詞向量。

由於某個詞的上下文中,包括了多個詞語,這些詞語會同時輸入至embeddings層,每個詞語都會被轉換為一個詞向量。

例如,這裡word1、2、3、4,被embeddings層轉換為v1、v2、v3、v4。

為了得到多個上下文詞的一個統一表示,我們將這些向量求和,再求平均,這樣就得到了多個上下文詞語的一個輸出。

也就是embeddings層的輸出結果,是一個將上下文語義信息平均的向量。

3.CBOW模型的線性層

在embeddings層後,會連接一個線性層,使用橙色表示。

一般情況下,它是一個不設置激活函數的線性層。

這個線性層的權重矩陣的維度是V*N,其中V是詞向量的維度,N是詞表中詞語的個數。

也就是這裡是一個包含了V個隱藏神經元,N個輸出神經元的神經網絡。

具體來說,我們將所有上下文詞向量的平均值,這裡標記為向量V。

輸入至該線性層,經過線性層的計算,可以得到一個1*N的向量。

將這個1*N的向量,再輸入至softmax層,最終計算出一個最有可能的輸出詞。

這個詞就是CBOW模型的預測目標詞。

總結CBOW模型,它包括了兩個部分,分別是藍色標記的embeddings層和橙色標記的線性層。

embedding層將輸入的上下文詞語,都轉換為一個上下文詞向量,並繼續求出這些上下文詞向量的平均值,它是一個代表整個上下文的向量。

線性層接收這個向量,並將其轉換為一個輸出向量。這個輸出向量的維度與詞匯表的大小相同。

接著,使用softmax函數,將該輸出向量轉換為一個概率分佈,它表示每個詞作為目標詞的概率。

其中概率最大詞的就是CBOW模型的預測結果。

最後我們來看,如何使用Pytorch框架,實現CBOW模型。

4.CBOW模型的實現

定義CBOW模型類,它繼承nn.Module類:

實現類的初始化函數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,就講完了,感謝大傢的觀看,我們下節課再會。