HelloAI
📄 论文精读 🏆 必读经典 · 2013 · Google 2013

Word2Vec: Efficient Estimation of Word Representations in Vector Space

Tomas Mikolov, Kai Chen, Greg Corrado, Jeffrey Dean
📖 如果你只读一段,读这段
Google 2013 年的 Word2Vec 让"词 → 向量"实用化。king - man + woman = queen 这种向量算术成为可能。是 NLP 一切现代工作的奠基性一步。
#Word2Vec#Embedding#NLP#必读

为什么这篇论文重要

2013 年之前,NLP 模型大多用稀疏 one-hot 表示词(每个词一个独立维度,没有相似性概念)。 2013 年 Mikolov 等人提出 Word2Vec——

把每个词压缩到一个几百维稠密向量,让向量的几何反映语义关系。

这是深度学习 NLP 时代的起点。BERT、GPT、Llama 等所有现代模型,本质上都是”更复杂的词嵌入学习”。

核心思想

一个词的意义由它的上下文定义。

具体来说,Word2Vec 训练两种小型神经网络:

CBOW(Continuous Bag of Words)

给定上下文词,预测中心词:

[the, cat, on, the, mat] → 中心词: "sat"

Skip-gram

反过来——给定中心词,预测上下文词:

"sat" → [the, cat, on, the, mat]

训练完成后,每个词的”输入向量”就是它的 embedding。

关键设计

  • 极简架构:一层隐藏层(不是 RNN / LSTM)
  • 大词表:10万-100万词
  • 大语料:Google News(60 亿词)
  • 高效:用 hierarchical softmax 或 negative sampling 加速

那个著名的”king - man + woman = queen”

训练完后,向量加减能反映语义关系:

v(king)v(man)+v(woman)v(queen)v(\text{king}) - v(\text{man}) + v(\text{woman}) \approx v(\text{queen})

更多例子:

  • v(Paris) - v(France) + v(Italy) ≈ v(Rome)
  • v(walking) - v(walk) + v(swim) ≈ v(swimming)
  • v(bigger) - v(big) + v(small) ≈ v(smaller)

模型从未被显式教过这些关系——是从纯文本中自发学到的。

为什么 work

Skip-gram 训练时最大化:

wtccontext(wt)logP(cwt)\sum_{w_t} \sum_{c \in \text{context}(w_t)} \log P(c | w_t)

其中 P(cwt)=exp(vcvwt)cexp(vcvwt)P(c|w_t) = \frac{\exp(v_c \cdot v_{w_t})}{\sum_{c'} \exp(v_{c'} \cdot v_{w_t})}

意思是”出现在相似上下文的词,向量距离接近”。

由于英语中”king/queen”经常出现在类似上下文(”… the king ruled …”, ”… the queen ruled …”),它们的向量也接近。 “king” 和 “man” 都涉及男性语境,“queen” 和 “woman” 都涉及女性语境—— 所以性别这个维度变成 v(man) - v(woman) 的方向。

影响

直接产品

  • Google Search: 使用类似嵌入做语义匹配
  • 推荐系统:从用户/物品 ID 学嵌入(Item2Vec、Node2Vec 等推广)
  • 语音识别 / 翻译:用作输入表示

后续工作

模型改进点
GloVe(2014)用共现矩阵,效果类似
FastText(2016)字符级 n-gram,处理罕见词
ELMo(2018)上下文相关嵌入(用 LSTM)
BERT(2018)Transformer + 双向,革命
GPT 系列Decoder-only,主导今天

概念遗产

现代 LLM 内部仍然有”词嵌入层”——本质上就是 Word2Vec 思想的延续。 任何”X → 向量”的工作(图像 embed、用户 embed、商品 embed)都是 Word2Vec 思想的应用。

工程细节:Negative Sampling

如果直接用 softmax over 词表,每次梯度更新都要计算 10 万词的 softmax —— 慢得不行。

Negative sampling:

  • 对每个正例(中心-上下文对)
  • 随机采 5-20 个”负例”(非上下文词)
  • 让模型区分正例和负例(二分类)

把多分类(10 万类)变成多个二分类(2 类)。

这个 trick 让 Word2Vec 可以训上亿词的语料——是其工业化的关键。

偏见问题

Word2Vec 也暴露了训练数据中的偏见

v(doctor) - v(man) + v(woman) ≈ v(nurse)
v(programmer) - v(man) + v(woman) ≈ v(homemaker)

向量空间忠实记录了人类社会的性别/种族偏见。这后来引发了一整支研究——“如何去偏见嵌入”。

在 PyTorch 里训一个

import torch.nn as nn

class SkipGram(nn.Module):
    def __init__(self, vocab_size, dim=128):
        super().__init__()
        self.in_embed = nn.Embedding(vocab_size, dim)
        self.out_embed = nn.Embedding(vocab_size, dim)

    def forward(self, center, context, neg_samples):
        center_v = self.in_embed(center)
        context_v = self.out_embed(context)
        neg_v = self.out_embed(neg_samples)

        # 正例 loss
        pos_score = torch.sigmoid((center_v * context_v).sum(dim=-1))
        pos_loss = -torch.log(pos_score + 1e-8)

        # 负例 loss
        neg_score = torch.sigmoid(-(center_v.unsqueeze(1) * neg_v).sum(dim=-1))
        neg_loss = -torch.log(neg_score + 1e-8).sum(dim=-1)

        return (pos_loss + neg_loss).mean()

30 行代码 + 一小时训练 = 玩具版 Word2Vec。

推荐配套阅读

  • HelloAI: L1-02 线性代数 + L3-09 BERT vs GPT
  • Word2Vec 原论文(arXiv:1301.3781)
  • GloVe 论文(2014)—— 共现矩阵方法
  • Levy & Goldberg 2014 —— Word2Vec 的数学解释
💡 历史地位

2013 年这篇论文只有 8 页,但改变了 NLP

在 Word2Vec 之前:NLP = 规则 + 稀疏特征 在 Word2Vec 之后:NLP = 嵌入 + 神经网络

这是”深度学习吞噬 NLP” 的真正起点——比 Transformer 早 4 年。

📬

想要更多论文精读

订阅每周精选 —— 下一篇论文笔记直接送邮箱。

💬

讨论区

· 用 GitHub 账号登录评论
⚠️ Giscus 评论未配置 —— 在 src/components/Comments.astro 顶部填入 仓库 ID 和分类 ID(见组件注释里的配置步骤)。