词向量:语言的算术
Mikolov, Chen, Corrado, Dean · Google · 2013 · arXiv:1301.3781
国王 − 男人 + 女人 ≈ 女王。这不是修辞,是一道真正被算出来的减法和加法——2013 年,谷歌的几位工程师把词变成了数字,语言第一次可以做算术。这篇论文里的名字——CBOW、Skip-gram、分布假说——你一个都不用记。你只需要会两件事:小学算术,和看地图。
先别问原理,先算一笔账
下面有一台奇怪的计算器:它算的不是数,是词。词可以相减、相加,最后等于另一个词。听起来不太合法?先照着做一遍——依次点击「巴黎」「法国」「日本」三个词,把式子填满。没什么大不了的,就三下。
词是符号,符号怎么能做算术?答案是:在这台计算器内部,每个词都不再是符号,而是一串数字——一个词向量(word vector,也叫词嵌入 word embedding)。这篇论文最出圈的发现就是:词一旦变成向量,语义关系就变成了可以加减的量。然而在 2013 年之前,词在机器里也是数字——为什么那时候的数字不能这么算?
在这之前,每个词都是孤岛
之前的主流表示法叫独热编码(one-hot encoding)。规则简单粗暴:词表里有多少个词,向量就有多少位;每个词只把属于自己的那一位设成 1,其余全是 0。像酒店房卡——每张卡只能开自己那一间房,卡和卡之间不存在任何「像不像」。
这种编码有个致命的病,最好亲手量一次才有体感。点击左边任意两个词,量一量它们的距离:
注意结果那一行:东京和北京,距离 √2;东京和苹果,还是 √2;换哪一对都是 √2。因为任何两个词的向量都只在各自的那两位上差 1——在独热编码里,所有词彼此等距,「相似」这个概念根本无处安放。更糟的是,真实词表有上百万个词,也就是上百万维,几乎全是零——一片浩瀚而无意义的稀疏。
然而我们凭直觉就知道东京和北京像、和苹果不像。这个「像」,我们是从哪里知道的?
词的意思,住在它的朋友圈里
想象班上来了个转学生,你一句话没跟他说过,但看了一周他跟谁吃饭、去哪个社团、借什么书——你对他已经了解得八九不离十。语言学家弗斯(J. R. Firth)在 1957 年说过一句名言:观其伴,知其义(You shall know a word by the company it keeps)。这就是分布假说(distributional hypothesis):出现在相似上下文里的词,意思相似。
空口无凭。逐条点亮下面的句子,看东京和北京的距离发生什么:
看那个距离数字:每点亮一条两个词都能填的句子,东京和北京就相互靠近一步——而苹果一条也填不进,孤零零地原地不动(最后一条只有它能填,也救不了它)。共享的上下文越多,向量就该靠得越近——「意思像不像」第一次变成了可测量的东西。
然而真要照这个思路去统计,表格大得吓人:上百万个词 × 上百万种上下文。word2vec 的聪明之处在于:它根本不数这张表,而是改玩一个填空游戏。
一对双胞胎:CBOW 与 Skip-gram
word2vec 不是一个模型,是一对双胞胎,玩的是同一个游戏的两个方向——你中学做过的完形填空,和它的镜像。拖动滑块,移动句子上的窗口,看两兄弟各自在猜什么:
看箭头的方向:上面的 CBOW(连续词袋,continuous bag-of-words)把中间的词挖掉,用周围的词猜它是谁;下面的 Skip-gram(跳字模型)反过来,用中间的词猜周围站着谁。除了方向相反,两兄弟一模一样。
游戏本身没人在乎——真正的产出藏在别处。想在「飞往__去看樱花」这个空里拿高分,东京和北京必须交出几乎相同的答卷;答卷是由向量算出来的,所以它们的向量被迫变得几乎相同。这正是上一节你亲手做的事——只不过现在由十亿个填空题自动完成。词向量是这场游戏的副产品:游戏结束,考卷扔掉,只留下每个词被迫搬到的位置。
想看一次真实的答题打分?(可跳过,不影响后面)
Skip-gram 给「东京出现在『飞往』旁边」打分的方式,就是把两个向量做点积——对应位相乘再相加,两个向量越像,分越高。假设向量只有 2 维:
| 候选词 | 它的向量 | 与「飞往」的语境向量 [1.0, 0.1] 点积 |
|---|---|---|
| 东京 | [0.9, 0.2] | 0.9×1.0 + 0.2×0.1 = 0.92 |
| 北京 | [0.8, 0.3] | 0.8×1.0 + 0.3×0.1 = 0.83 |
| 苹果 | [−0.5, 0.7] | −0.5×1.0 + 0.7×0.1 = −0.43 |
一排分数经过 softmax 变成一排加起来等于 1 的概率——东京、北京都拿高分,苹果垫底。如果模型猜错了(真实语料里这个位置是东京,它却押了苹果),就把相关向量往「下次能答对」的方向微调一小步。一步很小,但语料里有十亿个这样的位置;十亿步之后,向量各就各位。顺带一提:训练时每个词其实持有「作为中心词」和「作为语境词」两套向量,训练完通常只保留前一套——工程细节,忘掉也不影响理解。
论文标题里的 Efficient(高效)说的就是这里:它把前人神经网络语言模型里最昂贵的隐藏层砍掉了,让这个游戏便宜到可以吞下十亿词级的语料。第三节那张「数不完的大表」,被一个便宜的游戏隐式地数完了。游戏玩完,几百万个词各就各位——这个空间长什么样?
训练完的空间,是一张地图
真实的 word2vec 空间常常是 300 维的,人眼看不了。下面这张是手工压到 2 维的教学投影——坐标是我们设计的,但它呈现的结构(谁挨着谁、什么方向平行)忠实于真实模型学到的东西。点击任何一个词,看它的近邻是谁;然后点「国 → 都」按钮,看四支箭头长什么样:
先看成群结队的:国家挤成一簇,首都挤成一簇,王室成员自己扎堆——这是第三节的机制批量运行的结果,朋友圈重合的词住在了一起。苹果谁也不挨着,最近的词也在一百多步外:孤词有孤词的诚实。
再看那四支橙色箭头:法国→巴黎、意大利→罗马、日本→东京、中国→北京,几乎是复制粘贴——同样的方向,同样的长度。没有人教过模型「首都」这个概念,但因为千万个填空题里「国家—首都」总是以同样的模式成对出现,这种关系被熨成了空间里一支平行的箭。相似是距离,关系是方向:同一种关系,就是同一支箭头。
而箭头这种东西,有一个我们从小学几何就知道的性质——它可以搬家。
组装时刻:算术只是平行四边形
现在可以拆开第一节那台计算器了——你按下「巴黎 − 法国 + 日本」的那三下,内部发生的就是下面三步。拖动步骤滑块,一步一步看:
三步分别是:减法,是把两个词之间的关系箭头量出来(巴黎 − 法国 = 「首都化」这支箭);加法,是把这支箭平移到新的起点(安到日本脚下);最后看箭尖落在谁身边——落点离东京不到 3 步,而这张图上词与词的平均距离有几十步。四边形合拢的那一下,就是「≈」号的全部含义。
零件到这里全部咬合了:分布假说把朋友圈相似的词拉近(你在第三节点亮句子时做过);千万对「国家—首都」共享同一种填空模式,把这种关系熨平成平行的方向(你在上一节的四支箭里见过);而平行的箭头可以搬家——所以词的类比,不过是向量空间里的一个平行四边形。论文里那句著名的 vector("King") − vector("Man") + vector("Woman") ≈ vector("Queen"),你现在可以在图上亲手走完(点上面的标签切换)。
然而——是不是随便什么账都能这么算?
考考你:哪些账算得成?
最后这个游乐场留给你。四道算术题,先押注,再揭牌——如果你能提前判断出哪道题算不成,说明你已经真正摸到了这个空间的脾气。第四道,小心。
第四题的落点悬在一片空地上——「女人 → 女王」确实是一支真实的箭(它就是第二题里用过的那支的亲戚),但把它安到「法国」头上,语料里没有任何成对出现的模式支撑这种组合,空间里自然没有为它准备答案。词的算术不是魔法:只有在语料中大量、一致地成对出现的关系,才会凝结成一支可以搬运的箭。随手拼凑的减法,落点只能是空地。
还有几笔账,玩具地图上看不出来,但在真实模型里同样算不利索,值得摊开说:反义词离得很近——「好」和「坏」的朋友圈几乎相同(好消息/坏消息、天气真好/天气真坏),分布假说把它们拉到了一起,这是这套方法论的原生缺陷;一词多义只有一个向量——「苹果」既是水果又是公司,它的向量只能是两种身份的模糊平均;语料里的偏见会凝进方向——后来的研究发现,这类向量空间里「医生 − 男人 + 女人」可能指向「护士」,因为语料就是这样写的。空间忠实地记住了语言,包括语言里不该被记住的部分。
真实的 word2vec 和这张玩具地图差多少?
真实模型:向量通常是几百维(论文里试了 50 到 1000 维不等),词表几十万到上百万,训练语料是十亿词级的新闻文本。本文地图上的坐标是手工设计的二维教学投影,只保真两件事:语义邻居成簇、同种关系的箭头平行——这两件事在真实的高维空间里是可测量的真现象。论文用一个数千条的「词类比测试集」(首都—国家、货币—国家、男—女、比较级—最高级……)来给空间打分,真实模型的类比准确率远非百分之百——空地和错箭,在 300 维里同样存在。另外,让这个游戏在十亿词上跑得动,还需要层次 softmax、负采样等加速手段,负采样出自同年的续作(arXiv:1310.4546),此处从简。
之后的一切
2013 年这篇论文之后,词向量以野火之势烧遍了整个自然语言处理领域:斯坦福的 GloVe 换了一种统计口径,Facebook 的 fastText 把向量拆到词根碎片——但它们做的都是同一件事:把符号安放进一个几何空间,让「意思」变成坐标。
更重要的是今天。你对任何一个大语言模型说的每一个字,进门的第一件事,仍然是查一张嵌入表——把符号换成向量,一如你在第二节里看到的那些孤岛被第三节的朋友圈拉到一起。后来的注意力机制(我们另有一篇导读)所搬运、加权、混合的,正是这些向量;模型的全部「理解」,都发生在这个由分布假说奠基的几何空间里。区别只是:word2vec 给每个词一个固定的座位,而今天的模型让座位随句子流动——但「词即坐标」这个地基,十几年没有换过。
回想你这一路亲手做过的事:你按了三下计算器算出东京,量过两座孤岛之间永远相等的 √2,点亮句子把东京和北京一步步拉近,拖着窗口看双胞胎互相出题,然后在地图上发现四支复制粘贴的箭头,把其中一支搬到日本脚下,看平行四边形合拢——最后你还学会了预判哪些账算不成。词变成数,意义变成几何,理解变成计算——这条今天所有语言 AI 都还走在上面的路,起点就是你刚才亲手算的那笔账。