跳轉到

2013 - Mikolov 詞向量(word2vec:語義的算術)#

案件摘要#

2013 年,Tomas Mikolov(1980–) 在 Google 發表 word2vec(Efficient Estimation of Word Representations in Vector Space):

\[ \boxed{\text{每個詞 = 一個向量;語義關係 = 向量運算}} \]

最著名的語義算術:

\[ \text{國王} - \text{男人} + \text{女人} \approx \text{女王} \]

「男性 − 女性」的方向在向量空間中是一條一致的直線—— 語義第一次變成幾何。word2vec 有兩個模型: - CBOW:用上下文預測中心詞(快); - Skip-gram:用中心詞預測上下文(準,小資料更好)。 再加上負採樣的加速絕招,數十億詞的語料一天內訓練完—— 詞向量從此成為 NLP 的標準零件。

前因 -- 為什麼會有這個案子#

  • 分散式語義的舊直覺(1950s–): Firth(1957) 的名言:「You shall know a word by the company it keeps」 (觀其伴則知其義)——一個詞的意思由它周圍的詞決定。 Harris(1954) 的分散式假說:
\[ \text{兩詞的上下文分佈相似} \Longleftrightarrow \text{兩詞語義相似}. \]
  • 向量空間模型的困境(1980s–2012): 傳統的 one-hot 表示:詞表 10 萬個詞,每個詞是 10 萬維、只有一格是 1:
\[ \text{「女王」} = (0, 0, \dots, 0, \underbrace{1}_{\text{第 } i \text{ 格}}, 0, \dots, 0) \]

任意兩詞的向量都正交——「女王」與「國王」的相似度是 0! LSA(1990)用奇異值分解壓縮共現矩陣,但 SVD 對 10 萬×10 萬的矩陣太慢。 - 1997 LSTM 的線索與限制: Hochreiter 與 Schmidhuber 的 LSTM(見 1997-長短期記憶LSTM.md) 讓神經語言模型可行——Mikolov 在 2010–2012 年用 RNN 語言模型 打破語音辨識與困惑度的紀錄,但 RNN 訓練慢(序列式,無法並行):

\[ \text{RNN:逐詞序列計算} \quad\text{vs}\quad \text{word2vec:全語料並行線性模型} \]
  • 2012 深度學習熱潮的推力: AlexNet(見 2012-亞歷克斯AlexNet.md)證明表示學習的威力—— 卷積核自己學出「邊、角、紋理」。詞也需要自己學出的表示:
\[ \text{像素} \xrightarrow{\text{CNN}} \text{特徵};\qquad \text{詞} \xrightarrow{\text{word2vec}} \text{向量}. \]
  • Mikolov 的工程直覺: 與其用深層網路,不如用極簡的線性模型加上海量資料—— 簡單 + 大資料 > 複雜 + 小資料。

線索與推理 -- 數學式、程式、理論#

第一條線索:Skip-gram 的目標函數#

給定詞序列 \(w_1, w_2, \dots, w_T\) ,skip-gram 用中心詞 \(w_t\) 預測窗口 \(c\) 內的每個上下文詞 \(w_{t+j}\) 。每個詞有兩個向量: - \(u_w\) :該詞作為中心詞的向量; - \(v_w\) :該詞作為上下文詞的向量。 目標:最大化平均對數機率:

\[ \boxed{\;\mathcal{L} = \frac{1}{T}\sum_{t=1}^{T} \sum_{-c \le j \le c,\, j \ne 0} \log p(w_{t+j} \mid w_t)\;} \]

其中機率用 softmax 定義:

\[ p(w_o \mid w_c) = \frac{\exp(v_{w_o}^{\top} u_{w_c})}{\sum_{w \in V} \exp(v_w^{\top} u_{w_c})} \]

直覺:分母要對整個詞表 \(V\) (10 萬詞)求和—— 每個訓練樣本都要算 10 萬次內積,這是速度的瓶頸。

第二條線索:負採樣(Negative Sampling)的加速絕招#

Mikolov 的絕招:與其對整個詞表做 softmax, 不如把問題改成二元分類——「這個搭配是真實的嗎?」

\[ \log \sigma(v_{w_o}^{\top} u_{w_c}) + \sum_{i=1}^{K} \mathbb{E}_{w_i \sim P_n(w)} \big[\log \sigma(-v_{w_i}^{\top} u_{w_c})\big] \]
  • 一個正樣本(真實上下文對 \((w_c, w_o)\) );
  • \(K\) 個(約 5–20 個)負樣本(隨機抽的假搭配);
  • \(P_n(w) \propto \text{count}(w)^{0.75}\) :抽詞的機率(詞頻的 0.75 次方—— 壓低高頻詞如「的、是」,讓低頻詞有機會被抽中)。
\[ \boxed{\text{softmax(10 萬項)} \xrightarrow{\text{負採樣}} \text{二元分類(} K+1 \text{ 項)}:\text{快千倍}} \]

直覺:真搭配的內積被推大、假搭配的內積被推小—— 向量空間自動長出語義結構。

第三條線索:語義算術——國王 − 男人 + 女人 ≈ 女王#

訓練完成後,向量空間中出現一致的方向:

\[ \vec{v}(\text{國王}) - \vec{v}(\text{男人}) + \vec{v}(\text{女人}) \approx \vec{v}(\text{女王}) \]
  • 「男性 − 女性」方向在性別詞對上是一條直線;
  • 同理:巴黎 − 法國 + 義大利 ≈ 羅馬(首都關係)、 走 − 走過去 = 游 − 游過去(時態關係)。 找最近鄰用餘弦相似度(只看方向、不管長度):
\[ \boxed{\;\text{sim}(a, b) = \cos\theta = \frac{a \cdot b}{\|a\|\,\|b\|} \in [-1, 1]\;} \]

偵探的破案關鍵:語義不是被定義出來的, 而是被共現統計 + 梯度下降逼出來的—— 意義從資料中湧現。

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–):
\[ \boxed{\text{one-hot(正交、無語義)} \xrightarrow{\text{word2vec}} \text{稠密向量(語義幾何)}} \]

兩年內,幾乎所有 NLP 系統(翻譯、問答、搜尋、推薦) 都把詞換成 word2vec 向量——詞向量是 NLP 的「積木」。 - GloVe(2014): Stanford 的 Pennington 等人提出 GloVe—— 直接對共現機率的對數做矩陣分解:

\[ u_i^{\top} v_j + b_i + c_j \approx \log X_{ij} \quad\text{(} X_{ij} \text{ = 共現次數)} \]

word2vec(預測式)與 GloVe(計數式)殊途同歸—— 證明共現統計就是語義的根源。 - 伏筆:預訓練語言模型的前夜(2017): word2vec 證明「用海量無標註文字學表示」可行—— 這條路一直走到 ELMo(2018)、BERT、GPT:

\[ \text{word2vec(2013,靜態向量)} \xrightarrow{\text{Transformer(2017)}} \text{脈絡化表示(BERT/GPT)} \]

Transformer(見 2017-瓦茲瓦尼Transformer.md)把 word2vec 的 「自監督學表示」升級成整句的脈絡化表示——一切大模型的遠祖。 - 類比推理的標準測試: 「國王 − 男人 + 女人 ≈ 女王」成為詞向量的標準考題(Google 類比集), 但後續研究發現偏見也會被學進向量(性別、種族刻板印象)—— 資料中的偏見成為 AI 倫理的起點(2016 年後的 debias 研究)。 - Mikolov 的後續: Mikolov 之後離開 Google(轉 Meta/FAIR 布拉格), 致力於位元組對編碼與簡單模型——他一生的信念:

\[ \text{簡單 + 大資料} > \text{複雜 + 小資料}. \]
  • 與計算理論的呼應: 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。