Word2Vec模型之CBOW

海_纳百川發表於2024-08-11

CBOW(Continuous Bag of Words)是一種常用於自然語言處理的詞嵌入模型,屬於Word2Vec的一部分。CBOW模型的目標是透過上下文詞來預測中心詞。它透過在大規模語料庫中學習詞彙之間的共現關係,生成詞向量表示。

CBOW模型的工作原理

  1. 上下文視窗:CBOW模型的核心思想是利用上下文視窗中的詞來預測中心詞。假設我們有一個句子,比如“我喜歡學習自然語言處理”,如果我們選擇“學習”作為中心詞,那麼它的上下文可能是“我”、“喜歡”和“自然”、“語言”、“處理”。

  2. 輸入和輸出:對於CBOW模型,輸入是上下文詞的集合(通常用詞的詞向量表示),輸出是中心詞的詞向量。模型的目標是最大化這些上下文片語合預測出中心詞的機率。

  3. 實現步驟

    • 詞嵌入矩陣:首先,每個詞被表示為一個固定維度的向量,這些向量通常是隨機初始化的。詞彙表中每個詞都有對應的詞嵌入向量。

    • 輸入層:將上下文詞對映為詞嵌入向量。假設上下文視窗有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模型的基本架構:從上下文詞嵌入,到生成中心詞的機率分佈。實際應用中會需要更多的細節處理和最佳化。

相關文章