跳转至

Word2Vec

700 个字 预计阅读时间 7 分钟

它解决什么问题?

计算机无法直接理解文字,需要把词转换成数字。最朴素的方法是 One-Hot 编码,但有两个致命缺陷:

  • 维度爆炸:词表有多少词,向量就有多少维
  • 语义丢失" " " " 的向量完全正交,看不出语义关系

Word2Vec 的目标是生成低维、有语义的词向量,让语义相近的词在向量空间里距离也相近。


核心思想

来自语言学家 Firth 的观点:

一个词的含义由它的邻居决定。

经常出现在相似上下文里的词,语义就相似。Word2Vec 用上下文关系来训练词向量。


两种训练方式

CBOW Skip-gram
方向 上下文 → 预测中心词 中心词 → 预测上下文词
训练速度
低频词处理 较差 更好
实际使用 较少 更主流

模型架构

Skip-gram 为例,模型本质上是一个只有一层隐藏层的浅层神经网络:

输入层(One-Hot) → 隐藏层(词向量) → 输出层(Softmax)
     V维               d维               V维

三个组成部分

  • 输入层:中心词的 One-Hot 向量,维度 = 词表大小 V
  • 隐藏层:权重矩阵 W(大小 V×dOne-Hot 向量乘以 W 等价于直接查表取出对应行,这一行就是词向量
  • 输出层:权重矩阵 W'(大小 d×V,经过 Softmax 得到每个词作为上下文词的概率

训练过程

Step 1:构造训练样本

滑动窗口扫描语料,自动生成(中心词 , 上下文词)对:

句子:"我 喜欢 吃 苹果 和 香蕉"(窗口大小=2)
中心词="吃" → ("吃","我"), ("吃","喜欢"), ("吃","苹果"), ("吃","和")

Step 2:前向传播

1. 输入"吃"的 One-Hot 向量
2. 乘以 W → 得到"吃"的词向量 h
3. h 乘以 W' → 得到 logits
4. Softmax → 得到概率分布

Step 3:计算损失

用交叉熵损失,目标是让正确上下文词的概率最大:

Loss = -log P("苹果" | "吃")

Step 4:反向传播

梯度更新 W W',反复迭代后 W 的每一行变成有语义意义的词向量。

为什么词向量会有语义?

W 矩阵初始时随机初始化,训练后之所以有语义,原因在于训练目标: - 出现在相似上下文里的词(如"苹果"、"香蕉"、"西瓜"),模型要让它们都能预测相同的上下文词(如"甜"、"吃") - 为了让他们能预测相同的上下文词,最简单的方式就是让他们尽可能接近,梯度下降自然地把具有相似上下文的词推向了向量空间的相同区域 - 可见语义是从数据的统计规律里自然涌现出来的,不是人为设计进去的