03 · 嵌入 · 10 min

意义的空间

几何空间中的词语。国王 − 男人 + 女人 = 女王,以及其他向量奇迹。

一个不该成立的等式

看看这个运算:

国王 − 男人 + 女人 ≈ 女王

这是一个算术等式,就像 5 − 2 + 4 = 7。只不过它运算的对象是词语

而且它真的成立。不是因为有人专门编程让"国王"和"女王"相互关联,而是因为每个词都被转换成了一组数字——一个向量——于是意义的代数运算变成了普通的代数运算。

这是大语言模型中最违反直觉、也最强大的思想。

Token 到位置

在上一章,我们看到文本变成了一个 Token ID 序列——像 523491 这样的整数。但一个裸整数没有结构。Token 5234 既不"靠近"也不"远离" Token 5235。它们只是被编了个号。

为了让模型能够对词语进行计算,它需要一种更丰富的表示方式。解决方案是:将每个 Token 与一个大约 768、1024 或 4096 个实数组成的向量相关联。这就是我们所说的词嵌入(Embedding)

训练开始时,这些向量是随机的。随着对数百万个下一词的预测,模型逐渐学会将它们排列成使意义相似的词拥有相似向量的样子。

没有人写下这条规则。它从预测任务中涌现出来。

为什么这行得通

想想准确预测"国王告诉他的……"之后的词意味着什么。好的答案是女儿妻子母亲王后——而不是"引擎"或"算法"。一个能很好地预测这些延续的模型必须知道这些词在这个语境下是可互换的。

当你拥有数十亿个参数和数十亿个句子时,记住这种等价关系最经济的方式,就是将"女儿"、"妻子"、"母亲"、"王后"分组在向量空间的同一区域。每次迭代,梯度下降都会朝这个方向推进,无需任何人进行人工标注。

词嵌入不是被设计出来的。它们是预测任务留下的几何印记。

探索这个空间

下面的空间是一个二维的简化示意图——真实的词嵌入有数百维。但本质属性都在:语义聚类、近邻关系、向量运算。

每个点是被投影到语义空间中的一个词。相邻的点共享一个主题——而不是一种拼写。箭头展示了让 国王 − 男人 + 女人 = 女王 成立的向量算术。

三件值得注意的事:

  • 聚类自发出现,无需命名。 将鼠标悬停在 cat 上,你会看到 dogmouselion。悬停在 joy 上,你会看到 lovefearsadness。类别不存在于数据中——它们存在于几何形状中。
  • 某些方向具有意义。manwoman 的向量,与从 kingqueen、或从 fathermother 的向量大致相同。正是这种规律性使得运算得以成立。
  • 距离是相对的,不是绝对的。 catdog 的距离为 0.32,这本身没有意义。重要的是它比它到 breadanger 的距离更近

二维的幻觉

在真实模型中,词嵌入通常有 768 到 4096 个维度。为什么需要这么多?

因为在二维空间中,你被迫做出妥协。cat 必须靠近 dog(家养动物),靠近 mouse(哺乳动物),靠近 tiger(猫科动物),靠近 bird(动物)。所有这些"相近性"都在不同方向上拉扯——在二维中,它们会相互冲突。

在 768 个维度里,意义的每个层面都可以有自己的方向。词 cat 可以在"宠物"轴上靠近 dog,在"猫科"轴上靠近 tiger,在"小型哺乳动物"轴上靠近 mouse。这个空间足够广阔,所有这些关系都可以共存而不冲突。

人类以为自己无法可视化 768 个维度。词嵌入不需要这么多:它们只是用这些维度来存储各种类别,避免冲突。

衡量"接近":余弦相似度

当我们说两个词在嵌入空间中"接近"时,具体是怎么衡量的?不是用经典的欧氏距离,而是用余弦相似度(cosine similarity)

核心思路:看两个向量之间的夹角,而不是它们的长度。两个指向相同方向的向量,无论模长大小,余弦相似度都是 1。两个正交的向量,结果是 0。两个方向相反的向量,则是 −1。

cos(u, v) = (u · v) / (||u|| × ||v||)

为什么用这个度量,而不是别的?因为一个嵌入的模长(向量长度)会因与意义无关的原因而变化——词频、所在层的深度等等。而方向才编码了意义。余弦相似度恰好分离出了真正重要的那部分。

也正是这个度量驱动着今天所有的语义搜索:向量数据库(Pinecone、pgvector、Chroma……)索引数百万个向量,能在一瞬间找到与查询最接近的那些。我们会在第 10 章(RAG)回到这个话题。

影响

这种几何表示法有一些令人惊讶的效果:

  • 拼写错误具有鲁棒性。 hellohelo 的嵌入非常接近,所以模型"理解"它们的方式几乎相同——即便在 Token 层面,它们完全不同。
  • 偏见被嵌入其中。 如果在训练语料中,"护士"更多出现在女性语境,"医生"更多出现在男性语境,词嵌入的代数运算就会反映这一点。医生 − 男人 + 女人的结果可能是护士。大量工作致力于纠正这些偏见——我们会在第 8 章重新讨论这个问题。
  • 一切都变得可计算。 一旦意义成为向量,就可以进行加法、投影、测量角度。下一个机制做的正是这件事。

接下来

你的词已经变成了一个向量。它旁边的词也是。它前面的词也是。那么,从这个向量序列出发,模型如何判断在"医生解雇了护士,因为……"中,代词"她"指的是护士而非医生?

答案在下一章:注意力机制,这种机制让每个 Token 在决定自己是谁之前,先看看所有其他 Token

更新于

Embeddings:意义的几何空间 · Step by Token