CBOW(Continuous Bag of Words)是一種常用於自然語言處理的詞嵌入模型,屬於Word2Vec的一部分。CBOW模型的目標是透過上下文詞來預測中心詞。它透過在大規模語料庫中學習詞彙之間的共現關係,生成詞向量表示。
CBOW模型的工作原理
-
上下文視窗:CBOW模型的核心思想是利用上下文視窗中的詞來預測中心詞。假設我們有一個句子,比如“我喜歡學習自然語言處理”,如果我們選擇“學習”作為中心詞,那麼它的上下文可能是“我”、“喜歡”和“自然”、“語言”、“處理”。
-
輸入和輸出:對於CBOW模型,輸入是上下文詞的集合(通常用詞的詞向量表示),輸出是中心詞的詞向量。模型的目標是最大化這些上下文片語合預測出中心詞的機率。
-
實現步驟:
-
詞嵌入矩陣:首先,每個詞被表示為一個固定維度的向量,這些向量通常是隨機初始化的。詞彙表中每個詞都有對應的詞嵌入向量。
-
輸入層:將上下文詞對映為詞嵌入向量。假設上下文視窗有
2n
個詞(即中心詞的左右兩邊各有n
個詞),每個詞被對映為一個向量,這些向量會被平均(或求和)以生成一個固定大小的上下文表示。 -
隱藏層:上下文表示被傳遞到隱藏層(可以看作一個線性層),產生一個隱藏表示。
-
輸出層:隱藏表示被傳遞到輸出層,輸出層是一個softmax層,用來預測中心詞的機率分佈。
-
損失函式:模型的目標是最大化正確預測的中心詞的機率,即最小化負對數似然損失函式。
-
訓練:透過反向傳播和梯度下降最佳化模型引數。隨著訓練的進行,詞嵌入矩陣中的向量逐漸調整,使得語義相近的詞在向量空間中的距離更近。
-
CBOW的優缺點
-
優點:
- 計算效率高:相比於另一種Word2Vec模型——Skip-gram,CBOW的計算效率更高,適合在大規模語料上訓練。
- 捕捉語境資訊:CBOW透過上下文詞來預測中心詞,能較好地捕捉詞彙的語境資訊。
-
缺點:
- 資訊丟失:由於對上下文詞進行平均操作,可能會丟失一些詞序資訊。
- 不適合稀有詞:CBOW對於頻率較低的詞的效果可能不如Skip-gram。
程式碼實現(簡要)
以下是一個簡化的CBOW模型的PyTorch實現:
import torch
import torch.nn as nn
import torch.optim as optim
class CBOW(nn.Module):
def __init__(self, vocab_size, embedding_dim):
super(CBOW, self).__init__()
self.embeddings = nn.Embedding(vocab_size, embedding_dim)
self.linear = nn.Linear(embedding_dim, vocab_size)
def forward(self, context_words):
embeds = self.embeddings(context_words)
combined = torch.mean(embeds, dim=1)
out = self.linear(combined)
log_probs = torch.log_softmax(out, dim=1)
return log_probs
# 示例初始化
vocab_size = 10000 # 假設詞彙表大小
embedding_dim = 300 # 詞向量維度
model = CBOW(vocab_size, embedding_dim)
# 輸入是上下文詞的索引列表
context_words = torch.tensor([[2, 3, 4, 5]], dtype=torch.long) # 假設4個上下文詞
output = model(context_words)
這個實現演示了CBOW模型的基本架構:從上下文詞嵌入,到生成中心詞的機率分佈。實際應用中會需要更多的細節處理和最佳化。