word2vec:词向量的起点
一个改变了 NLP 的想法:把每个词表示成一个从邻居中学来的稠密向量,让相似的词彼此靠近,让含义变成算术。
词袋模型有一个缺陷,再聪明的加权也补不上:每个词都是一个孤立的符号。cat 和 kitten 的关系,跟 cat 和 parliament 一样远。2013 年,word2vec 推倒了这堵墙,它引入的那个想法——稠密词向量——至今垫在每一个模型底下。
洞见:看一个词,就看它的同伴
语言学家 J.R. Firth 在 1957 年就说过:「你可以通过一个词结交的同伴来认识它。」出现在相似语境里的词,意思往往也相似。cat 和 dog 都会出现在 pet、vet、feed、fur 附近。Monday 和 Tuesday 的邻居几乎完全一样。
word2vec 把这个观察变成了一套训练流程。它不再给每个词在一个巨大的稀疏向量里分配一个独热位,而是给每个词一个短短的稠密向量——比如 300 个数字——然后调整这些数字,让出现在相似语境里的词得到相似的向量。
得到的就是一个学出来的表示。没有人手工标注过 cat 像动物;模型纯粹是从几十亿个句子里「哪些词挨着哪些词」中自己发现的。
怎么学的:预测邻居
word2vec 是一个小小的神经网络,训练它用的任务本身是假的,真正的目的是它顺手产出的那些向量。有两个变体。
Skip-gram。 给定中心词,预测它周围的词。输入 fox,训练模型去抬高语料里实际出现在它附近的那些词的概率——quick、brown、jumps。
CBOW(continuous bag of words)。反过来:给定周围的词,预测中心词。给定 quick brown ___ jumps,预测 fox。
两种方式都是:网络只有一层隐藏层,而这一层的权重就是词向量。用类似「预测下一个词」的目标去训练,会逼着语境相似的词长出相似的权重,因为它们需要做出相似的预测。预测任务本身是消耗品,权重才是奖品。
有一个实用技巧让它快到能在几十亿词上训练:负采样。模型不再每一步都在整个词表上算概率,而只需要学会把真实的邻居对和少量随机凑出来的假配对区分开。正是这个近似,让 word2vec 便宜到真正能派上用场。
含义变成了几何
因为相似的词最终会得到相似的向量,它们所在的那个空间就有了可以测量的结构。距离是有意义的。
Paris最近的邻居是London、Berlin、Madrid——其他首都running最近的邻居是ran、runs、jogging
更惊人的是,空间里的方向也携带含义。那个著名的例子:
vector(king) − vector(man) + vector(woman) ≈ vector(queen)
从 man 到 woman 的方向,和从 king 到 queen 的方向大致相同。从来没有人告诉过模型什么是性别、什么是王权;这些关系的几何形状是从训练数据里自己掉出来的。这个性质在 embedding 空间的几何里有深入探讨——而 word2vec 是它第一次被观察到的地方。
一条直通现代 embedding 的直线
word2vec 的向量,正是我们今天所说的 embedding:一个位置编码含义的稠密向量。这门课里后面的一切——向量数据库、相似度检索、RAG 检索——都建立在 word2vec 证明可以学出来的这种表示之上。
传承关系是直接的。word2vec 给每个词学一个向量。现代 transformer 的 embedding 则是给每个 token 学一个在语境中的向量,所以 bank 在河边和在金库里得到的是不同的向量。但核心的赌注完全一样:含义可以打包进几百个数字,而这些数字可以从原始文本中学出来。
催生下一步的那个局限
word2vec 给每个词分配的向量有且只有一个,训练完之后就永久固定。这就是它的天花板。bank 只能拿到一个向量,必须把金融的含义和河岸的含义平均在一起,而且永远分不开,因为它看不到这个词所在的句子。
这就是静态 embedding 的问题。一个词的含义会随语境变化,而一张查找表表示不了这一点。要补上这个缺口,就需要能读整个序列、并产出依赖语境的表示的模型——先是 RNN,最终是自注意力(self-attention)机制,它根据每个词实际的邻居,为它算出一个全新的向量。
要点回顾
- word2vec 通过训练一个网络去预测一个词的邻居,为每个词学出一个稠密向量。
- 语境相似的词得到相似的向量,所以空间中的距离编码了相似度。
- 关系表现为一致的方向:
king − man + woman ≈ queen。 - 这些向量是现代 embedding 的直系祖先,而后者支撑着搜索与检索。
- 天花板在于:每个词只有一个固定向量,所以分不开河岸的
bank和银行的bank。能感知语境的模型解决了这个问题。
下一篇: 循环神经网络——第一套为按顺序读序列、并把含义往前携带而设计的架构。