国王 − 男人 + 女人 ≈ 王后。
word2vec 之前,词怎么喂给模型?one-hot:词表多大,向量就多长,只有自己那一位是 1,其余全 0。
猫 = [0,0,1,0,0,…,0]
狗 = [0,1,0,0,0,…,0]
桌子= [0,0,0,0,1,…,0]
| two 宗罪 | 后果 |
|---|---|
| ① 维度爆炸 + 稀疏 | 词表几万到几十万,向量就几万到几十万维,全是 0。又大又浪费。 |
| ② 任意两词都「正交、等距」 | 「猫」到「狗」的距离 = 「猫」到「桌子」的距离。向量里没有任何语义——模型看不出猫狗相近。 |
论文要的:给每个词一个低维(如 300 维)的稠密向量,让意思相近的词、向量也相近。
靠什么学出这种向量?一个朴素到深刻的假设——分布假说: 「一个词的意思,由它常和哪些词一起出现决定。」(You shall know a word by the company it keeps.) 「咖啡」和「茶」总出现在相似的上下文里(喝、杯、热),所以它们意思相近。
word2vec 把这个假设变成一个预测任务,两种方向(二选一):
| 架构 | 干什么 |
|---|---|
| CBOW | 用上下文猜中心词:「the cat ___ on」→ 猜「sat」。 |
| Skip-gram | 反过来,用中心词猜上下文:「sat」→ 猜「the / cat / on」。罕见词上更准,更常用。 |
你要的不是「预测得准」,而是预测时被顺手学出来的那组向量。 为了把上下文预测对,模型被逼着把「出现在相似语境里的词」的向量调得相似——词向量是这个预测任务的副产品。 训练完,预测任务丢掉,留下的那张「词 → 向量」查找表,就是 embedding。
论文标题里的 Efficient 才是它当年的卖点:砍掉隐藏层非线性、用 negative sampling,使它能在十亿词级语料上飞快训练——这才让「词向量」从论文走进工业界。
分布假说翻成大白话,就是「近朱者赤」——一个词的人设,由它的「朋友圈」定义。
| 生活里 | 对应 word2vec |
|---|---|
| 你不认识一个人,但发现他天天和健身教练、营养师、马拉松群混 | 一个生词,总出现在「跑、训练、配速」这些词周围 |
| 你立刻猜:他大概也是个健身的——圈子相似 → 人设相似 | 语境相似 → 向量相似 → 意思相近 |
| 把所有人按「圈子」摆进一个大厅,健身的自然聚一堆、搞艺术的聚另一堆 | 把所有词摆进向量空间,近义词自然聚成簇 |
word2vec 最炸的发现:向量空间里,同一种语义关系 = 同一个方向。点不同的类比,看那条「平行四边形」——从一个词出发、沿某个方向平移,就落到了答案附近。
| 维度 | one-hot | word2vec(静态 embedding) 本篇 P04 | 语境化 embedding (self-attention / BERT) |
|---|---|---|---|
| 维度 | 几万~几十万,稀疏 | 几百,稠密 | 几百~几千,稠密 |
| 有没有语义 | 无(全等距) | 有:近义聚堆、关系成方向 | 有,且随语境变 |
| 一个词几个向量 | 一个 | 一个(固定) | 随上下文变 |
| 「bank」(银行/河岸) | 一个向量 | 只能给一个,混在一起 ✗ | 两句话里两个不同表示 ✓ |
看最后两行——word2vec 给每个词一个固定向量,分不清「bank」的两个意思。 你刚学的 self-attention 正是来破这个的:同一个词,按上下文吸收邻居信息,生成不同的新表示(那个「它」的例子)。word2vec 是静态地基,attention 让它活了起来。
| 你工作里的东西 | 其实就是这篇论文的什么 |
|---|---|
RAG 里的 bge-small-zh 把一段话编码成向量 | word2vec 思想的现代后代(升到句子级、且语境化),但内核没变:语义 = 几何。 |
| 向量检索 / 余弦相似度 / 向量库召回 | 整套「把意思相近的东西在空间里找出来」的范式,就是这篇确立的。 |
「king−man+woman」那种方向可加减 | 做风格迁移 / 属性编辑(图像、语音生成里「往某个方向调一点」)的直觉来源——属性是空间里的方向。 |
| 为什么 RAG 要切块、不能一个向量装一篇长文 | 静态/单向量的表达力上限:一个点压不下太多语义——做 RAG 时纠结切块策略的老问题,根在这。 |
把这一课和你刚拿下的 attention 接起来的关键一问。点开看答。
一句话:word2vec 给「起点」,attention 给「语境」。
word2vec(及现代它的后代)产出的是静态 embedding——每个词一个固定向量,是 token 刚进模型时的初始表示(就是你默写时说的「它原来有一个 token 值」)。但「bank」只有一个向量,分不清银行还是河岸。
self-attention 接着上场:让每个词的这个初始向量,按当前句子吸收邻居的信息,生成一个语境化的新表示——同一个「它」「bank」在不同句子里变成不同向量。
所以流水线是:word2vec 类的 embedding(静态起点) → 叠 N 层 self-attention(按语境加工) → 语境化表示。你这两课,正好接成了一条链。🔮
一句话:「关系」不存在于某个词里,存在于「词与词之间的那个方向」。
每个词是空间里一个点,向量能加减,于是算式每一步都是一个几何动作:
| 步骤 | 几何上在干嘛 |
|---|---|
king − man | 从 man 指向 king 的位移向量——把「男性」约掉,提纯出「王权」这个方向(从平民到君主要加的那一坨)。 |
+ woman | 把这个「王权方向」搬到 woman 头上:保留女性身份,叠加王权。 |
≈ queen | 落点正好在 queen 附近。 |
假设空间只有两根轴——横轴=王权,纵轴=性别(上男下女),真实是几百维但道理一样:
man = [0, 1] (无王权, 男)
woman = [0, -1] (无王权, 女)
king = [1, 1] (有王权, 男)
queen = [1, -1] (有王权, 女)
king − man + woman
= [1,1] − [0,1] + [0,-1]
= [1, −1]
= queen ✓
成立的原因:「王权」和「性别」成了两根大致独立、稳定的方向。man→king 和 woman→queen 是同一个王权方向、近似平行等长,四点连起来就是上面那个平行四边形。没人教它,是训练时为了预测对上下文,被逼着用同一个方向编码同一种语义,从语料里自己长出来的。
诚实的 caveat:是 ≈(约等于 + 最近邻),不是精确相等;实操要排除输入的三个词本身、做归一化才漂亮,且这现象有被夸大的成分。但「方向编码语义」这个核心直觉是真的——做风格迁移/属性编辑时「往某个方向调一点」的直觉,根就在这。🔮
读原典:Mikolov et al. — Efficient Estimation of Word Representations in Vector Space (arXiv:1301.3781)。 (想看类比实验,配读姊妹篇 Distributed Representations…, arXiv:1310.4546。)
建立直觉首选:Jay Alammar — The Illustrated Word2vec(图解 skip-gram 和 negative sampling)。
阶段一(地基)到此读完。下一篇起进阶段二·预训练范式(P05 BERT)——把这些零件拼成真正能预训练的语言模型。
参考:
Mikolov et al., Efficient Estimation of Word Representations in Vector Space, 2013;Alammar, The Illustrated Word2vec.