Word2Vec 学习计划 三
Word2Vec 完整学习方案:从数学原理到模型推理
第一阶段:数学基础(约 1~2 周)
在正式进入 Word2Vec 之前,需要夯实以下数学工具:
| 主题 | 需要掌握的内容 | 为什么需要 |
|---|---|---|
| 线性代数 | 向量点积、矩阵乘法、转置、Embedding 矩阵的本质 | 词向量本质上就是矩阵的行/列 |
| 概率论 | 条件概率、最大似然估计(MLE)、Softmax 函数 | 模型的目标函数就是最大化条件概率 |
| 微积分/优化 | 偏导数、链式法则、梯度下降(SGD) | 训练过程就是不断求梯度更新参数 |
| 信息论(可选) | 交叉熵、KL 散度 | 理解损失函数的设计动机 |
📚 推荐资源
- 3Blue1Brown《线性代数的本质》(B站有搬运)—— 直觉式理解矩阵运算
- 斯坦福 CS229 讲义 中关于梯度下降和 MLE 的章节
- 苏剑林(科学空间)博客:《词向量与Embedding究竟是怎么回事?》
第二阶段:Word2Vec 理论原理(约 2~3 周)
2.1 核心概念
按以下顺序逐步攻克:
One-hot 编码的缺陷
↓
分布式假设(Distributional Hypothesis)
↓
两种模型架构:CBOW / Skip-gram
↓
Softmax 输出层的计算瓶颈
↓
两种加速方案:
├── Hierarchical Softmax(Huffman 树)
└── Negative Sampling(负采样)
↓
高频词降采样(Subsampling)
2.2 必须推导的公式
- Skip-gram 目标函数:
\[\frac{1}{T}\sum_{t=1}^{T}\sum_{-m \leq j \leq m, j \neq 0} \log P(w_{t+j} \mid w_t)
\]
- Softmax 概率:
\[P(w_O \mid w_I) = \frac{\exp(\mathbf{u}_O^\top \mathbf{v}_I)}{\sum_{w=1}^{W}\exp(\mathbf{u}_w^\top \mathbf{v}_I)}
\]
- 负采样后的目标函数:
\[\log \sigma(\mathbf{u}_o^\top \mathbf{v}_c) + \sum_{k=1}^{K} \mathbb{E}_{w_k \sim P_n(w)}\left[\log \sigma(-\mathbf{u}_k^\top \mathbf{v}_c)\right]
\]
📚 推荐资源
- ⭐ 首选(中文最经典):peghoty 系列博客 《word2vec 中的数学原理详解》(共五篇,从背景到四种模型组合全部覆盖)
- 论文原文(必读):
- Mikolov et al., 2013a: Efficient Estimation of Word Representations in Vector Space
- Mikolov et al., 2013b: Distributed Representations of Words and Phrases and their Compositionality
- 视频:斯坦福 CS224N(Christopher Manning)Lecture 1 & 2(YouTube/B站均有)
- 书籍:《动手学深度学习》(d2l.ai)第 14 章「词嵌入」部分,有中文且配套代码
第三阶段:从零手写实现(约 2~3 周)
3.1 纯 NumPy 实现(推荐先做)
目标:不依赖任何深度学习框架,手写一个 Skip-gram + Negative Sampling 模型。
# 伪代码框架
import numpy as np
# 1. 构建词表 & 词频
# 2. 初始化 W_in (V×d), W_out (d×V)
# 3. 生成训练样本 (center, context, negatives)
# 4. 前向传播:计算点积 → sigmoid
# 5. 计算梯度
# 6. SGD 更新
# 7. 训练结束后,W_in 即为词向量
3.2 用 PyTorch 重写
将上面的逻辑迁移到 PyTorch,使用 nn.Embedding 层,体会框架自动求导的便利。
📚 推荐资源
- GitHub 项目:word2vec-from-scratch(纯 Python 实现,代码清晰)
- d2l.ai 第 14.4 节:用 PyTorch 从零实现 Skip-gram,带完整可运行代码
- Chris McCormick 博客:Word2Vec Tutorial - The Skip-Gram Model(英文,图解极其清晰)
第四阶段:使用 Gensim 训练真实模型(约 1 周)
当你理解了原理后,用工业级工具训练一个真正可用的词向量模型:
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
# 准备语料(已分词的文本,每行一个句子)
sentences = LineSentence("your_corpus.txt")
# 训练
model = Word2Vec(
sentences,
vector_size=300, # 词向量维度
window=5, # 上下文窗口
min_count=5, # 最小词频阈值
sg=1, # 1=Skip-gram, 0=CBOW
negative=5, # 负采样数量
workers=4, # 多线程
epochs=10 # 训练轮数
)
# 保存
model.save("my_word2vec.model")
📚 推荐资源
- Gensim 官方文档:gensim.models.word2vec
- 中文语料:可用维基百科中文语料 + jieba 分词进行练习
第五阶段:模型推理与应用(约 1~2 周)
训练完成后,词向量可以支持多种下游任务:
5.1 基础推理操作
# 词相似度
model.wv.similarity("国王", "皇帝")
# 最相似的词
model.wv.most_similar("人工智能", topn=10)
# 经典类比推理:king - man + woman ≈ queen
model.wv.most_similar(positive=["女人", "国王"], negative=["男人"])
# 获取词向量
vec = model.wv["深度学习"]
5.2 下游应用
| 应用场景 | 做法 |
|---|---|
| 文本分类 | 句内所有词向量取平均 → 接全连接/分类器 |
| 语义检索 | 计算文档向量与 query 向量的余弦相似度 |
| 命名实体识别 | 词向量作为特征输入 BiLSTM-CRF |
| 推荐系统 | 用户/物品 Embedding 类比词向量 |
5.3 可视化
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
vectors = model.wv[model.wv.key_to_index] # 所有词向量
tsne = TSNE(n_components=2, perplexity=30)
result = tsne.fit_transform(vectors[:500]) # 取前500个词可视化
plt.scatter(result[:, 0], result[:, 1], s=2)
plt.show()
第六阶段:拓展与进阶(持续学习)
学完 Word2Vec 后,自然过渡到以下方向:
Word2Vec(静态、一词一向量)
↓
FastText(子词级别,解决 OOV)
↓
GloVe(全局共现矩阵 + 局部窗口)
↓
ELMo(上下文相关,一词多义)
↓
BERT / Transformer(预训练范式)
📚 推荐资源
- 论文:Pennington et al., 2014 GloVe: Global Vectors for Word Representation
- 论文:Peters et al., 2018 Deep Contextualized Word Representations(ELMo)
- 李宏毅 2023/2024 机器学习课程(B站),涵盖从 Word2Vec 到 Self-Attention 的完整脉络
📅 总时间线概览
| 阶段 | 时长 | 核心产出 |
|---|---|---|
| 数学基础 | 1~2 周 | 能手推 Softmax 梯度 |
| 理论原理 | 2~3 周 | 能画出四种模型结构图并写出目标函数 |
| 从零实现 | 2~3 周 | 一份可运行的 NumPy/PyTorch 代码 |
| Gensim 训练 | 1 周 | 一个自己语料训练出的 .model 文件 |
| 推理应用 | 1~2 周 | 完成相似度/类比/分类等实验 |
| 拓展进阶 | 持续 | 过渡到 GloVe → ELMo → BERT |
💡 学习建议:Word2Vec 的精髓不在于模型多复杂,而在于它用一个极简的浅层网络,揭示了"分布式表示"这一深刻思想。建议你在每个阶段都先手写公式推导,再写代码验证,这样对后续学习 Transformer 等复杂模型会打下极其坚实的基础。

浙公网安备 33010602011771号