深入理解Word2Vec:从N-gram到词向量
本文档汇总了关于Word2Vec算法的完整讨论,涵盖其历史背景、核心原理、模型架构、训练优化技术及本质理解。
一、为什么需要Word2Vec?
1.1 N-gram模型的局限
在Word2Vec之前,N-gram模型是统计语言模型的主流方法。它的核心思想是:一个词出现的概率只依赖于它前面出现的 N-1 个词 。
1 P(w₁, w₂, ..., wn) ≈ Π P(wᵢ | wᵢ₋ₙ₊₁, ..., wᵢ₋₁)
N-gram的痛点 :
问题
说明
数据稀疏
长尾N-gram在语料中几乎必然出现0次
无法捕捉语义
词被当作原子符号,"猫"和"狗"之间没有任何数学关系
上下文窗口固定
无法捕捉长距离依赖
维度灾难
随着N增大,参数数量指数级增长
1.2 从马尔可夫到香农:N-gram的思想源头
马尔科夫的实验(1913年) :取普希金小说前20,000个字母,统计元音/辅音转移概率,证明语言遵循可建模的统计规律 。
香农的实验(1948年) :通过"猜字母"实验和N-gram模型,计算英文的冗余度约为50% ,开创了用统计模型理解语言的全新范式。
1.3 平滑技术:解决零概率问题
当某个N-gram从未出现时,MLE会给出0概率。平滑技术从已观察的N-gram中"匀"出一部分概率给未观察的N-gram:
平滑技术
核心思想
公式
加一平滑
所有N-gram计数+1
P = c o u n t + 1 c o u n t ( h ) + V P = \frac{count+1}{count(h)+V} P = co u n t ( h ) + V co u n t + 1
Good-Turing
用N r + 1 N_{r+1} N r + 1 调整N r N_r N r
r ∗ = ( r + 1 ) × N r + 1 N r r^* = (r+1) \times \frac{N_{r+1}}{N_r} r ∗ = ( r + 1 ) × N r N r + 1
Kneser-Ney
用"延续概率"替代频率
最复杂,性能最优
二、NNLM:神经网络的第一次尝试
2.1 核心思想
Bengio等人在2003年提出了神经概率语言模型(NNLM) ,首次将神经网络引入语言建模:
每个词对应一个连续的特征向量 (词向量)
假设一个平滑的概率模型 ,输入词向量序列,输出联合概率
同时学习 词向量和概率模型的参数
2.2 Embedding层:词向量从何而来?
Embedding层本质上是一个 V × D V \times D V × D 的查找表(矩阵 C C C ) :
V V V :词汇表大小
D D D :词向量维度
每一行对应一个词的稠密向量表示
前向传播过程 :
1 one-hot向量 (维度V) × 矩阵C (V×D) = 词向量 (维度D)
实际上是查表操作 :找到 one-hot 中"1"的位置,取出矩阵 C C C 的对应行。
2.3 NNLM的局限
包含非线性隐藏层 (tanh激活),计算量大
只能利用前文信息 ,不能利用后文
无法在大规模语料上高效训练
三、Word2Vec的突破
3.1 CBoW(连续词袋模型)
改造思路 :
去掉隐藏层 :移除 tanh 非线性层,直接连接嵌入层和输出层
忽略词序 :上下文词向量直接相加(或平均)
引入双向上下文 :同时利用前后 c c c 个词预测中心词
类比 :像"完形填空"——用上下文的所有词"揉在一起"预测中间缺失的词。
前向计算 :
context = 1 2 c ∑ i v w i
\text{context} = \frac{1}{2c} \sum_{i} \mathbf{v}_{w_i}
context = 2 c 1 i ∑ v w i p ( w t ∣ context ) = softmax ( W ⋅ context )
p(w_t | \text{context}) = \text{softmax}(\mathbf{W} \cdot \text{context})
p ( w t ∣ context ) = softmax ( W ⋅ context ) 3.2 Skip-gram(跳字模型)
核心思路 :用中心词预测上下文词 ,与CBoW方向相反。
数学本质 :
p ( w o ∣ w i ) = e U o ⋅ V i ∑ j = 1 V e U j ⋅ V i
p(w_o | w_i) = \frac{e^{\mathbf{U}_o \cdot \mathbf{V}_i}}{\sum_{j=1}^{V} e^{\mathbf{U}_j \cdot \mathbf{V}_i}}
p ( w o ∣ w i ) = ∑ j = 1 V e U j ⋅ V i e U o ⋅ V i
V i \mathbf{V}_i V i :输入向量(中心词)
U o \mathbf{U}_o U o :输出向量(上下文词)
优势 :
对低频词 效果更好
能捕捉更精细的语义关系
每个上下文词独立提供学习信号
四、训练加速的三大技术
4.1 层次Softmax(Hierarchical Softmax)
核心思想 :把 O ( V ) O(V) O ( V ) 的多分类问题,拆解成 O ( log V ) O(\log V) O ( log V ) 个二分类问题。
具体实现 :
构造一棵哈夫曼树 (高频词路径短)
从根到叶子节点,每个内部节点是一个二分类器(Sigmoid)
目标词的概率 = 路径上所有Sigmoid概率的乘积
示例 :假设词表 V = 100 , 000 V=100,000 V = 100 , 000 :
普通Softmax:计算 100 , 000 100,000 100 , 000 个得分后归一化 → O ( 100 , 000 ) O(100,000) O ( 100 , 000 )
层次Softmax:只需做 log 2 ( 100 , 000 ) ≈ 17 \log_2(100,000) \approx 17 log 2 ( 100 , 000 ) ≈ 17 次判断 → O ( 17 ) O(17) O ( 17 )
速度提升约 6,000 倍!
4.2 负采样(Negative Sampling)
核心思想 :把"多分类"问题变成"二分类"问题。
正样本 :真实存在的(中心词,上下文)对
负样本 :随机采样的错误(中心词,随机词)对
损失函数 :
J = log σ ( U o ⋅ V i ) + ∑ j = 1 k E w j ∼ P n [ log σ ( − U j ⋅ V i ) ]
J = \log \sigma(\mathbf{U}_o \cdot \mathbf{V}_i) + \sum_{j=1}^{k} \mathbb{E}_{w_j \sim P_n} \left[ \log \sigma(-\mathbf{U}_j \cdot \mathbf{V}_i) \right]
J = log σ ( U o ⋅ V i ) + j = 1 ∑ k E w j ∼ P n [ log σ ( − U j ⋅ V i ) ] 只更新 1 + k 1+k 1 + k 个词 (1个正样本 + k个负样本),而非整个词表。
4.3 下采样(Subsampling)
问题 :高频词(“的”、“是”)出现频繁但信息量少。
解决方案 :训练时以概率 P P P 丢弃高频词:
P ( d i s c a r d ) = 1 − t f ( w )
P(discard) = 1 - \sqrt{\frac{t}{f(w)}}
P ( d i sc a r d ) = 1 − f ( w ) t
f ( w ) f(w) f ( w ) :词频
t t t :超参数(通常 t ≈ 10 − 5 t \approx 10^{-5} t ≈ 1 0 − 5 )
效果 :显著提高低频词 的向量质量。
五、词向量是如何变成数字的?(完整演示)
5.1 初始化(随机数字)
假设4个词,3维向量(初始完全随机):
词
向量
猫
[0.10, 0.20, 0.30]
宠物
[0.40, 0.50, 0.60]
狗
[0.70, 0.80, 0.90]
车
[0.15, 0.25, 0.35]
此时这些数字没有任何意义 ,只是随机数。
5.2 第一次训练
训练样本 (Skip-gram):
中心词:“猫” → [0.10, 0.20, 0.30]
上下文词(正样本):“宠物” → [0.40, 0.50, 0.60]
Step 1:计算相似度(点积)
猫 ⋅ 宠物 = 0.10 × 0.40 + 0.20 × 0.50 + 0.30 × 0.60 = 0.32
\text{猫} \cdot \text{宠物} = 0.10 \times 0.40 + 0.20 \times 0.50 + 0.30 \times 0.60 = 0.32
猫 ⋅ 宠物 = 0.10 × 0.40 + 0.20 × 0.50 + 0.30 × 0.60 = 0.32 Step 2:修改数字(反向传播)
让"猫"的向量向"宠物"靠近:
位置
猫(旧)
变化量
猫(新)
第1维
0.10
+0.04
0.14
第2维
0.20
+0.05
0.25
第3维
0.30
+0.06
0.36
同时"车"作为负样本被拉远,其数字向反方向移动。
5.3 训练后的结果
经过上亿次迭代:
词
训练后向量
猫
[0.85, 0.72, 0.11]
宠物
[0.88, 0.70, 0.09]
狗
[0.82, 0.75, 0.10]
车
[-0.55, -0.30, 0.98]
观察 :
猫、宠物、狗 的数字非常接近 (语义相似)
车 的数字和它们离得很远 (语义不同)
5.4 核心结论
词向量不是人类手动编码的,而是计算机在"猜词游戏"中被迫调整出的最优数字 。这组数字的特点是:语义相近的词,其数字排列也相近 。
六、Word2Vec的延伸应用
6.1 跨语言机器翻译
发现 :不同语言的词向量空间具有几何同构性 。
方法 :用少量双语词典学习线性映射矩阵 W W W :
J ( W ) = ∑ i = 1 n ∣ ∣ W x i − z i ∣ ∣ 2
J(W) = \sum_{i=1}^{n} ||W \mathbf{x}_i - \mathbf{z}_i||^2
J ( W ) = i = 1 ∑ n ∣∣ W x i − z i ∣ ∣ 2 翻译过程 :
源语言词向量 x \mathbf{x} x → 通过 W W W 映射到目标语言空间
在目标语言空间中找最近的词向量
6.2 Item2Vec(推荐系统)
核心思路 :万物皆可Embedding。
把用户视为"文档"
把商品视为"词"
购物车/购买序列视为"句子"
运行CBoW或Skip-gram计算商品的向量表示
6.3 语义类比推理
Word2Vec最著名的性质:
vec("国王") − vec("男人") + vec("女人") ≈ vec("女王")
\text{vec("国王")} - \text{vec("男人")} + \text{vec("女人")} \approx \text{vec("女王")}
vec(" 国王 ") − vec(" 男人 ") + vec(" 女人 ") ≈ vec(" 女王 ") 这表明向量空间中的算术运算 能够反映语义关系。
七、关于Word Embedding的深度思考
7.1 两种训练范式
范式
代表
优点
缺点
无监督预训练
Word2Vec, Autoencoder
无需标注数据,海量文本即可训练
与具体任务无关
端到端有监督
情感分类CNN
任务驱动,向量表征更精准
需要大量标注数据
7.2 Sentence Embedding(更高层次的抽象)
方法
思路
优缺点
词向量平均
直接相加求平均
简单但丢失词序信息
Doc2Vec / Paragraph Vector
额外训练段落ID向量
新文章需重新训练
RNN/CNN编码
用神经网络编码词向量序列
当前主流,性能最佳
参考文献
[1] Bengio, Y., Ducharme, R., Vincent, P., & Jauvin, C. (2003). A Neural Probabilistic Language Model. Journal of Machine Learning Research .
[2] Mikolov, T., Chen, K., Corrado, G., & Dean, J. (2013). Efficient Estimation of Word Representations in Vector Space. arXiv:1301.3781 .
[3] Mikolov, T., Sutskever, I., Chen, K., Corrado, G. S., & Dean, J. (2013). Distributed Representations of Words and Phrases and their Compositionality. arXiv:1310.4546 .
[4] Rong, X. (2014). word2vec Parameter Learning Explained. arXiv:1411.2738 .
AI参与声明 :本文档汇总了关于Word2Vec的多轮讨论内容,使用AI辅助工具进行内容整理、结构优化与格式排版。所有核心概念与技术细节均基于原始学术论文,并经人工校验与补充。