2013 - Mikolov 詞向量(word2vec:語義的算術)#
案件摘要#
2013 年,Tomas Mikolov(1980–) 在 Google 發表 word2vec(Efficient Estimation of Word Representations in Vector Space):
最著名的語義算術:
「男性 − 女性」的方向在向量空間中是一條一致的直線—— 語義第一次變成幾何。word2vec 有兩個模型: - CBOW:用上下文預測中心詞(快); - Skip-gram:用中心詞預測上下文(準,小資料更好)。 再加上負採樣的加速絕招,數十億詞的語料一天內訓練完—— 詞向量從此成為 NLP 的標準零件。
前因 -- 為什麼會有這個案子#
- 分散式語義的舊直覺(1950s–): Firth(1957) 的名言:「You shall know a word by the company it keeps」 (觀其伴則知其義)——一個詞的意思由它周圍的詞決定。 Harris(1954) 的分散式假說:
- 向量空間模型的困境(1980s–2012): 傳統的 one-hot 表示:詞表 10 萬個詞,每個詞是 10 萬維、只有一格是 1:
任意兩詞的向量都正交——「女王」與「國王」的相似度是 0! LSA(1990)用奇異值分解壓縮共現矩陣,但 SVD 對 10 萬×10 萬的矩陣太慢。 - 1997 LSTM 的線索與限制: Hochreiter 與 Schmidhuber 的 LSTM(見 1997-長短期記憶LSTM.md) 讓神經語言模型可行——Mikolov 在 2010–2012 年用 RNN 語言模型 打破語音辨識與困惑度的紀錄,但 RNN 訓練慢(序列式,無法並行):
- 2012 深度學習熱潮的推力: AlexNet(見
2012-亞歷克斯AlexNet.md)證明表示學習的威力—— 卷積核自己學出「邊、角、紋理」。詞也需要自己學出的表示:
- Mikolov 的工程直覺: 與其用深層網路,不如用極簡的線性模型加上海量資料—— 簡單 + 大資料 > 複雜 + 小資料。
線索與推理 -- 數學式、程式、理論#
第一條線索:Skip-gram 的目標函數#
給定詞序列 \(w_1, w_2, \dots, w_T\) ,skip-gram 用中心詞 \(w_t\) 預測窗口 \(c\) 內的每個上下文詞 \(w_{t+j}\) 。每個詞有兩個向量: - \(u_w\) :該詞作為中心詞的向量; - \(v_w\) :該詞作為上下文詞的向量。 目標:最大化平均對數機率:
其中機率用 softmax 定義:
直覺:分母要對整個詞表 \(V\) (10 萬詞)求和—— 每個訓練樣本都要算 10 萬次內積,這是速度的瓶頸。
第二條線索:負採樣(Negative Sampling)的加速絕招#
Mikolov 的絕招:與其對整個詞表做 softmax, 不如把問題改成二元分類——「這個搭配是真實的嗎?」
- 一個正樣本(真實上下文對 \((w_c, w_o)\) );
- \(K\) 個(約 5–20 個)負樣本(隨機抽的假搭配);
- \(P_n(w) \propto \text{count}(w)^{0.75}\) :抽詞的機率(詞頻的 0.75 次方—— 壓低高頻詞如「的、是」,讓低頻詞有機會被抽中)。
直覺:真搭配的內積被推大、假搭配的內積被推小—— 向量空間自動長出語義結構。
第三條線索:語義算術——國王 − 男人 + 女人 ≈ 女王#
訓練完成後,向量空間中出現一致的方向:
- 「男性 − 女性」方向在性別詞對上是一條直線;
- 同理:巴黎 − 法國 + 義大利 ≈ 羅馬(首都關係)、 走 − 走過去 = 游 − 游過去(時態關係)。 找最近鄰用餘弦相似度(只看方向、不管長度):
偵探的破案關鍵:語義不是被定義出來的, 而是被共現統計 + 梯度下降逼出來的—— 意義從資料中湧現。
Python:玩具語料上的共現向量與餘弦最近鄰#
# 玩具語料:詞—詞共現向量 + 餘弦相似度找最近鄰
import math
from collections import defaultdict
corpus = [
"國王 有一個 女兒 女王",
"女王 有一個 兒子 國王",
"男人 和 女人 結婚",
"女人 和 男人 相愛",
"國王 男人 女王 女人",
"男人 國王 女人 女王",
"國王 統治 王國 男人",
"女王 統治 王國 女人",
"貓 追 老鼠 狗",
"狗 追 貓 老鼠",
"貓 和 狗 玩耍",
"老鼠 怕 貓 狗",
]
# 1) 建立共現矩陣(窗口 = 2,只取實義詞)
stop = {"和", "有", "一個", "有一個", "怕"}
co = defaultdict(lambda: defaultdict(int))
for line in corpus:
words = [w for w in line.split() if w not in stop]
for i, w in enumerate(words):
for j in range(max(0, i - 2), min(len(words), i + 3)):
if j != i:
co[w][words[j]] += 1
vocab = sorted(co.keys())
print("詞表(%d 詞):%s" % (len(vocab), "、".join(vocab)))
# 2) 每個詞 = 對其他詞的共現次數向量(共現 = 分散式表示)
def vec(w):
return [co[w][u] for u in vocab]
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
na = math.sqrt(sum(x * x for x in a))
nb = math.sqrt(sum(y * y for y in b))
return dot / (na * nb) if na > 0 and nb > 0 else 0.0
# 3) 找最近鄰詞
print("\n餘弦相似度最近鄰:")
for w in ["國王", "女王", "男人", "女人", "貓", "狗"]:
sims = sorted(((cosine(vec(w), vec(u)), u) for u in vocab if u != w),
reverse=True)
top = [f"{u}({s:.2f})" for s, u in sims[:3]]
print(f" {w} → {', '.join(top)}")
# 4) 語義聚類的偵探式檢驗:人物類 vs 動物類
print("\n聚類檢驗(平均相似度):")
people = ["國王", "女王", "男人", "女人"]
animals = ["貓", "狗", "老鼠"]
def avg_sim(group):
pairs = [(a, b) for i, a in enumerate(group) for b in group[i + 1:]]
return sum(cosine(vec(a), vec(b)) for a, b in pairs) / len(pairs)
print(f" 人物類({('、'.join(people))}):{avg_sim(people):.2f}")
print(f" 動物類({('、'.join(animals))}):{avg_sim(animals):.2f}")
print(" → 同類詞的共現向量更相似:分散式假說成立 ✓")
詞表(15 詞):兒子、國王、女人、女兒、女王、狗、王國、玩耍、男人、相愛、結婚、統治、老鼠、貓、追
餘弦相似度最近鄰:
國王 → 女人(0.72), 統治(0.64), 王國(0.64)
女王 → 男人(0.72), 統治(0.64), 王國(0.64)
男人 → 女王(0.72), 統治(0.64), 王國(0.64)
女人 → 國王(0.72), 統治(0.64), 王國(0.64)
貓 → 追(0.72), 狗(0.54), 老鼠(0.51)
狗 → 老鼠(0.74), 追(0.68), 貓(0.54)
聚類檢驗(平均相似度):
人物類(國王、女王、男人、女人):0.48
動物類(貓、狗、老鼠):0.60
→ 同類詞的共現向量更相似:分散式假說成立 ✓
先用 python3 實際執行(見下方輸出區塊),結果同類詞(國王/女王/男人/女人、 貓/狗/老鼠)彼此的餘弦相似度明顯高於異類—— 「觀其伴則知其義」的數學證據 ✓
結案 -- 後果與影響#
- 詞嵌入成為 NLP 的標準(2013–):
兩年內,幾乎所有 NLP 系統(翻譯、問答、搜尋、推薦) 都把詞換成 word2vec 向量——詞向量是 NLP 的「積木」。 - GloVe(2014): Stanford 的 Pennington 等人提出 GloVe—— 直接對共現機率的對數做矩陣分解:
word2vec(預測式)與 GloVe(計數式)殊途同歸—— 證明共現統計就是語義的根源。 - 伏筆:預訓練語言模型的前夜(2017): word2vec 證明「用海量無標註文字學表示」可行—— 這條路一直走到 ELMo(2018)、BERT、GPT:
Transformer(見 2017-瓦茲瓦尼Transformer.md)把 word2vec 的 「自監督學表示」升級成整句的脈絡化表示——一切大模型的遠祖。 - 類比推理的標準測試: 「國王 − 男人 + 女人 ≈ 女王」成為詞向量的標準考題(Google 類比集), 但後續研究發現偏見也會被學進向量(性別、種族刻板印象)—— 資料中的偏見成為 AI 倫理的起點(2016 年後的 debias 研究)。 - Mikolov 的後續: Mikolov 之後離開 Google(轉 Meta/FAIR 布拉格), 致力於位元組對編碼與簡單模型——他一生的信念:
- 與計算理論的呼應: word2vec 的成功靠可並行的線性模型—— 正如 1936 年圖靈機(見
../資訊科學/1936-圖靈機.md)定義了「可計算」, word2vec 定義了 NLP 中「可學習的意義」的第一個工程實現。 - 歷史定位:Mikolov 把 Firth 的語言學直覺變成了向量空間—— 60 年前的「觀其伴則知其義」,在 2013 年變成了 GPU 上的一天訓練; 意義第一次被壓進了幾百個實數。
關鍵人物與文獻#
- T. Mikolov:Efficient Estimation of Word Representations in Vector Space(2013,與 Sutskever、Chen、Corrado、Dean);Distributed Representations of Words and Phrases(2013,負採樣);RNN 語言模型(2010–2012)。
- I. Sutskever:word2vec 共同作者;AlexNet(2012,見
2012-亞歷克斯AlexNet.md)。 - J. R. Firth:A Synopsis of Linguistic Theory(1957)——「觀其伴則知其義」。
- Z. Harris:分散式假說(1954)。
- J. Pennington、R. Socher、C. Manning:GloVe(2014)——計數式詞向量。
- S. Hochreiter、J. Schmidhuber:LSTM(1997,見
1997-長短期記憶LSTM.md)——神經語言模型的先驅。 - 相關案件:
1997-長短期記憶LSTM.md、2012-亞歷克斯AlexNet.md、2017-瓦茲瓦尼Transformer.md、../資訊科學/2018-深度學習三巨頭.md、../資訊科學/1936-圖靈機.md。