Word2Vec: Efficient Estimation of Word Representations in Vector Space
为什么这篇论文重要
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(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 训练时最大化:
其中
意思是”出现在相似上下文的词,向量距离接近”。
由于英语中”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 账号登录评论src/components/Comments.astro 顶部填入
仓库 ID 和分类 ID(见组件注释里的配置步骤)。