Word2Vec(Word to Vector)是 2013 年由 Google 團隊提出的無監督詞嵌入模型,是一種靜態詞嵌入技術,核心目標是將自然語言中的離散詞匯映射為低維、稠密的實數向量(即 “詞向量”),讓向量空間的距離和方向能夠反映詞匯的語義關聯(如 “國王” 與 “女王” 的向量差近似 “男人” 與 “女人” 的向量差)。它解決了傳統文本表示(如 One-Hot 編碼)“維度災難” 和 “語義孤立” 的問題,成為 現代自然語言處理(NLP)的基礎技術之一。
核心背景:為什么需要 Word2Vec?
在 Word2Vec 出現前,主流的文本表示方法存在明顯缺陷,無法捕捉語義信息:
- One-Hot 編碼:將每個詞表示為長度等于詞匯表大小的向量,僅對應詞的位置為 1,其余為 0。
- 缺陷:維度極高(詞匯表 10 萬則向量長度 10 萬)、稀疏性強,且無法體現詞與詞的語義關聯(如 “貓” 和 “狗” 的向量點積為 0,無任何相似性)。
- Bag of Words(詞袋模型):統計詞在文本中的出現頻率,忽略語序和語義。
- 缺陷:同樣無法捕捉語義,且 “重要” 和 “不重要” 的詞權重無差異(需依賴 TF-IDF 優化,但仍無語義關聯)。
Word2Vec 的核心突破是:用低維向量的 “數值關系” 刻畫詞匯的 “語義關系”,例如:
- 向量計算:vec(國王) - vec(男人) + vec(女人) ≈ vec(女王)
式子變換一下可以這樣理解:vec(國王) - vec(女王) ≈ vec(男人) - vec(女人)
- 相似性:cos( vec(貓), vec(狗) ) 的值遠大于 cos( vec(貓), vec(汽車) )
Word2Vec 算法的兩大核心模型(落地的實現技術)
Word2Vec 并非單一模型,而是包含兩種互補的無監督學習架構,二者均基于 “上下文與目標詞的共現關系”(即 “通過周圍詞預測中心詞,或通過中心詞預測周圍詞”)構建語義關聯。
1. CBOW 模型(Continuous Bag of Words,連續詞袋模型)
核心思想:用 “上下文詞” 預測 “中心詞”
例如句子 “我 愛 自然 語言 處理”,若以 “自然” 為中心詞,上下文窗口(假設窗口大小為 2)為 “愛” 和 “語言”,CBOW 的任務是:輸入 “愛” 和 “語言” 的向量,輸出 “自然” 的概率。
模型結構(3 層神經網絡)
- 輸入層:上下文詞的 One-Hot 向量(假設窗口大小為 2,共 2 個向量,每個長度為 V,V 為詞匯表大小)。
- 隱藏層:對輸入的上下文詞向量取平均(或求和),得到一個長度為 N 的向量(N 為詞向量維度,通常取 50-300),此層無激活函數。
- 輸出層:Softmax 層,輸出詞匯表中每個詞作為 “中心詞” 的概率,目標是讓真實中心詞的概率最大。
特點
- 對小數據集更魯棒:上下文詞的平均操作能降低噪聲影響。
- 訓練速度更快:每次輸入多個上下文詞,對高頻詞的處理更高效。
2. Skip-gram 模型(跳字模型)
核心思想:用 “中心詞” 預測 “上下文詞”
仍以句子 “我 愛 自然 語言 處理” 為例,以 “自然” 為中心詞,上下文窗口為 2,Skip-gram 的任務是:輸入 “自然” 的向量,輸出 “愛” 和 “語言” 的概率。
模型結構(3 層神經網絡)
- 輸入層:中心詞的 One-Hot 向量(長度為 V)。
- 隱藏層:將輸入向量與權重矩陣(V×N)相乘,得到長度為 N 的詞向量,無激活函數(此向量即為最終的詞嵌入結果)。
- 輸出層:Softmax 層,輸出詞匯表中每個詞作為 “上下文詞” 的概率,目標是讓真實上下文詞的概率最大。
特點
- 對低頻詞更友好:能從少量低頻詞的共現中學習到更準確的語義(例如 “量子”“區塊鏈” 等低頻專業詞)。
- 語義捕捉更精準:在大數據集上表現優于 CBOW,是 Word2Vec 中更常用的架構。
兩種模型對比
關鍵優化:解決 Softmax 計算瓶頸
Word2Vec 的原始模型(尤其是輸出層的 Softmax)存在嚴重的計算瓶頸:
Softmax 的概率計算需遍歷整個詞匯表(P(w_i) = exp(z_i) / Σ_{j=1 to V} exp(z_j))
,若詞匯表大小 V=100 萬,則每次預測需計算 100 萬次指數和求和,訓練效率極低。
為解決此問題,Word2Vec 引入了兩種核心優化方法:
1. 負采樣(Negative Sampling,NS)
核心思想:將 “多分類問題” 轉化為 “二分類問題”
- 原始任務:判斷 “中心詞與上下文詞是否為真實共現對”(需區分 V 個詞,多分類)。
- 優化后任務:對1 個真實共現對(正樣本) 和K 個隨機采樣的非共現對(負樣本) ,訓練模型區分 “正 / 負樣本”(二分類)。
具體步驟
- 對當前中心詞 w 和上下文詞 c,標記為正樣本((w,c) 是真實共現對)。
- 從詞匯表中隨機采樣 K 個詞(通常 K=5-20),確保這些詞與 w 無共現關系,標記為負樣本((w,c1), (w,c2), …, (w,cK))。
- 用 Sigmoid 函數替代 Softmax,計算每個樣本的 “正例概率”,目標是讓正樣本概率接近 1,負樣本概率接近 0。
優勢
- 計算量從 O (V) 降至 O (K),K 遠小于 V(如 V=100 萬,K=10),訓練速度提升 10 萬倍。
- 負樣本采樣遵循 “高頻詞更易被采樣” 的原則(用
P(w) ∝ f(w)^0.75
,f (w) 為詞的頻率),更符合真實語言規律。
2. 層次 Softmax(Hierarchical Softmax)
核心思想:用 “二叉樹” 替代 “全連接 Softmax”
將詞匯表中的所有詞作為二叉樹的葉子節點,每個非葉子節點代表一個二分類決策(左子樹為 “0”,右子樹為 “1”)。從根節點到葉子節點的路徑,對應該詞的 “概率計算路徑”。
具體步驟
- 構建一棵哈夫曼樹(Huffman Tree):高頻詞的路徑更短,低頻詞的路徑更長,減少整體計算量。
- 計算詞 w 的概率時,無需遍歷所有葉子節點,只需沿根節點到 w 的路徑,計算每個非葉子節點的二分類概率(用 Sigmoid 函數),最終概率為路徑上所有概率的乘積。
優勢
- 計算量從 O (V) 降至 O (logV)(哈夫曼樹的深度為 log2V),適合高頻詞占比高的場景。
- 無需采樣負樣本,避免負樣本選擇帶來的誤差。
四、訓練過程與超參數
五、優缺點與應用場景
六、與其他詞嵌入技術的對比
七、實踐工具與代碼示例
2. Gensim 實現 Word2Vec 示例
from gensim.models import Word2Vec
from gensim.utils import simple_preprocess# 1. 準備語料(需先分詞,此處用simple_preprocess簡單分詞)
corpus = ["自然語言處理是人工智能的重要分支","Word2Vec是常用的詞嵌入技術","深度學習在NLP領域有廣泛應用","詞向量可以捕捉詞匯的語義關聯"
]
# 分詞:將每個句子拆分為詞列表
sentences = [simple_preprocess(text, deacc=True) for text in corpus]
# 結果:[['自然語言處理', '是', '人工智能', '的', '重要', '分支'], ...]# 2. 訓練Word2Vec模型
model = Word2Vec(sentences=sentences, # 分詞后的句子列表vector_size=100, # 詞向量維度window=5, # 窗口大小min_count=1, # 最小詞頻(此處語料小,設為1)workers=4, # 并行訓練的線程數sg=1, # 1=Skip-gram,0=CBOWnegative=5 # 負采樣數量
)# 3. 模型應用
# 獲取詞向量
vec_nlp = model.wv["自然語言處理"] # 輸出:(100,)的numpy數組# 計算詞相似度
sim = model.wv.similarity("自然語言處理", "NLP") # 輸出相似度值# 查找最相似的詞
similar_words = model.wv.most_similar("人工智能", topn=3) # 輸出Top3相似詞# 保存/加載模型
model.save("word2vec.model")
loaded_model = Word2Vec.load("word2vec.model")
總結
Word2Vec 通過 “局部共現 + 低維向量” 的核心思路,首次實現了 “語義可計算”,為現代 NLP 奠定了基礎。盡管其靜態詞向量的缺陷被 ELMo、BERT 等動態模型彌補,但由于其速度快、輕量、易理解的特點,至今仍在中小規模數據集、低資源場景中廣泛應用。理解 Word2Vec 的原理(CBOW/Skip-gram、負采樣),是掌握更復雜預訓練模型(如 BERT)的關鍵前提。