一、核心思想:从"上下文"猜词义
语言学家有个发现:"看一个词的朋友,就知道它的意思"。
| 语境 | 推断 |
|---|---|
| "猫坐在垫子上" | "垫子"≈ 某种平面物体 |
| "咖啡洒在垫子上" | "垫子"≈ 可吸水的东西 |
Word2Vec 把这个直觉变成数学:让模型通过"猜词游戏"学习词语的向量表示。
二、两种玩法:CBOW vs Skip-gram
就像做填空题和造句题,Word2Vec 提供两种训练模式:
模式 A:CBOW(完形填空)
任务:用周围的词,猜中间的词
上下文:[the, cat, on, the] → 预测中心词:sits
模式 B:Skip-gram(一词造多句)
任务:用中间的词,猜周围的词(更常用,效果更好)
中心词:sits → 预测上下文:the, cat, on, the
三、神经网络长什么样?
结构出奇地简单------只有三层:
输入层(One-hot) 隐藏层(投影) 输出层(Softmax)
50000 维 ──→ 300 维 ──→ 50000 维
(词表大小) (嵌入维度) (预测概率分布)
↑___________________________|
这两个权重矩阵
就是我们要的词向量
关键设计 :隐藏层没有激活函数 ,纯线性变换。输入→隐藏的权重矩阵 WWW 的第 iii 行,就是第 iii 个词的向量。
四、训练技巧:如何让大词表跑得动?
原始 Softmax 要遍历整个词表(比如 5 万个词),计算量爆炸。Word2Vec 用两招解决:
1. 负采样(Negative Sampling)⭐
思路:把多分类变成二分类
- 正样本:真实的上下文词对(sits, cat)→ 标签 1
- 负样本:随机采样几个词组成假样本(sits, apple)→ 标签 0
效果:每次只更新 1 个正样本 + 5-20 个负样本,速度提升 1000 倍。
2. 高频词降采样
"the"、"a" 这类词出现太频繁,信息量少还干扰训练。按概率丢弃:
P(wi)=1−tf(wi)P(w_i) = 1 - \sqrt{\frac{t}{f(w_i)}}P(wi)=1−f(wi)t
频率越高,被丢弃概率越大。
五、训练完成后,发生了什么?
神奇现象:向量空间里的"语义几何"
python
# 经典例子
vector("国王") - vector("男人") + vector("女人") ≈ vector("女王")
# 其他例子
巴黎 - 法国 + 意大利 ≈ 罗马
跑步 - 跑 + 跳 ≈ 跳跃
原理 :Word2Vec 把语义关系编码成了向量的方向。"性别"对应某个固定方向的偏移,"首都-国家"对应另一个方向。
相似度计算
用余弦相似度找近义词:
cos(向量A, 向量B) = 1 → 语义完全相同
cos(向量A, 向量B) = 0 → 完全无关
cos(向量A, 向量B) = -1 → 语义相反
六、Word2Vec 的局限与进化
| 问题 | 原因 | 后继方案 |
|---|---|---|
| 一词一义 | "bank"(银行/河岸)共享同一个向量 | ELMo:上下文相关向量 |
| 局部窗口 | 只能看到附近 5-10 个词 | BERT:Transformer 全局注意力 |
| 无句法结构 | 不懂"猫追狗"和"狗追猫"的区别 | GPT/BERT:深层语义理解 |
七、一句话总结
Word2Vec 用浅层神经网络 玩"猜词游戏",把词语共现统计 压缩成低维向量 ,让语义关系变成可计算的空间几何------这是现代 NLP 的奠基之作。