Word2Vec
约 700 个字 预计阅读时间 7 分钟
它解决什么问题?
计算机无法直接理解文字,需要把词转换成数字。最朴素的方法是 One-Hot 编码,但有两个致命缺陷:
- 维度爆炸:词表有多少词,向量就有多少维
- 语义丢失:" 猫 " 和 " 狗 " 的向量完全正交,看不出语义关系
Word2Vec 的目标是生成低维、有语义的词向量,让语义相近的词在向量空间里距离也相近。
核心思想
来自语言学家 Firth 的观点:
一个词的含义由它的邻居决定。
经常出现在相似上下文里的词,语义就相似。Word2Vec 用上下文关系来训练词向量。
两种训练方式
| CBOW | Skip-gram | |
|---|---|---|
| 方向 | 上下文 → 预测中心词 | 中心词 → 预测上下文词 |
| 训练速度 | 快 | 慢 |
| 低频词处理 | 较差 | 更好 |
| 实际使用 | 较少 | 更主流 |
模型架构
以 Skip-gram 为例,模型本质上是一个只有一层隐藏层的浅层神经网络:
三个组成部分
- 输入层:中心词的 One-Hot 向量,维度 = 词表大小 V
- 隐藏层:权重矩阵 W(大小 V×d
) ,One-Hot 向量乘以 W 等价于直接查表取出对应行,这一行就是词向量 - 输出层:权重矩阵 W'(大小 d×V
) ,经过 Softmax 得到每个词作为上下文词的概率
训练过程
Step 1:构造训练样本
滑动窗口扫描语料,自动生成(中心词 , 上下文词)对:
Step 2:前向传播
Step 3:计算损失
用交叉熵损失,目标是让正确上下文词的概率最大:
Step 4:反向传播
梯度更新 W 和 W',反复迭代后 W 的每一行变成有语义意义的词向量。
为什么词向量会有语义?
W 矩阵初始时随机初始化,训练后之所以有语义,原因在于训练目标: - 出现在相似上下文里的词(如"苹果"、"香蕉"、"西瓜"),模型要让它们都能预测相同的上下文词(如"甜"、"吃") - 为了让他们能预测相同的上下文词,最简单的方式就是让他们尽可能接近,梯度下降自然地把具有相似上下文的词推向了向量空间的相同区域 - 可见语义是从数据的统计规律里自然涌现出来的,不是人为设计进去的