返回首页

Roadmap
更新于 2026年11月5日 全文 2464 字未阅读

词嵌入:嵌入空间与静态嵌入#

背景介绍#

嵌入(embedding)是数据在嵌入空间(embedding space)里的一个向量表示。一般来讲,模型是靠“把初始数据向量所在的高维空间投影到一个更低维的空间”来找到候选嵌入的。关于高维数据与低维数据的差别,可以回头看处理类别型数据那一讲。

MLWM: 例如下图是通过 TSN 算法对 300 维的词向量降维后的可视化结果。

300 维的词向量降维后的可视化结果
300 维的词向量降维后的可视化结果

从图中可以明显看到,语义相似的词在平面上的相对位置也更近,相关内容可以参见 Word2Vec训练与使用:CBOW、Skip-gram 与词向量应用 中的内容。

有了嵌入表示,它使得针对大型特征向量(例如上一节中提到的用于表示餐品项的稀疏向量)进行机器学习时变得更加容易。有时候,嵌入空间中各特征之间的相对位置蕴含着某种潜在的语义关系(语义相似的特征向量往往离得也更近);但通常情况下,寻找低维空间及其内部相对位置的过程对于人类而言是不可解释的,所生成的嵌入人类也难以理解。

不过,为了帮我们建立「嵌入向量究竟是怎么表示信息」的直觉,还是先来看一个一维的表示方法:把热狗、披萨、沙拉、沙威玛和罗宋汤这几道菜,放在一条「最不像三明治 → 最像三明治」的刻度上。此时我们可以发现,这里唯一的一维,是一个想象出来的度量——「三明治程度」。

图 3. 一条标着「三明治程度」的横轴,从左到右依次是罗宋汤、沙拉、披萨、热狗、沙威玛,越靠右越像三明治。
图 3. 食物在一个想象出来的「三明治程度」维度上的分布

如果接下来问你,那苹果酥应该放在哪儿?大概可以放在 热狗 和 沙威玛 之间。但 苹果酥 看起来还有一个额外的维度——甜度(sweetness),或者说甜点属性(dessertness),让它和其他选项很不一样。接下来的这张图就加上一条「甜度」轴,把它画出来:

图 4. 与图 3 同一张图,但多了一条竖直的「甜度」轴。苹果酥夹在热狗与沙威玛之间,横向位置居中偏右,竖向位置则明显更高。
图 4. 同时按「三明治程度」与「甜度」两个维度摆放的食物

一个嵌入表示,就是用 $n$ 个浮点数(取值通常在 −1 到 1 或 0 到 1 之间)把每个特征放进 $n$ 维空间。在图 3 里,每个食物只用一个坐标,落在一维空间上;在图 4 里,则变成了用两个坐标,落在二维空间上。在图 4 里, 苹果酥 位于图的右上象限,可以给它一个坐标 (0.5, 0.3);而 热狗 位于右下象限,可以给它 (0.2, −0.5)。

可以看出,在嵌入空间里,任意两个特征向量之间的距离可以用数学方式算出来,并且可以解释为这两个特征向量之间相对相似程度的一个度量。在图 4 里,沙威玛 和 热狗 挨得近,它们在模型对数据的表示里,就比离得远的 苹果酥 和 罗宋汤 关系更紧密。

想了解计算嵌入向量之间距离的不同方法,可以看看 词嵌入中的常见相似度衡量方法。

此时还要留意一点,在图 4 中的二维空间里,苹果酥 到 沙威玛 和 热狗 的距离,比它在一维空间里(把苹果酥 放在 热狗 和 沙威玛 中间)远得多。当然,这也很符合直觉,因为 苹果酥 跟 热狗 或 沙威玛,本来就没有 热狗 和 沙威玛 之间那么像。

接着再看 罗宋汤,它比别的食物都更「汤汤水水」,这提示我们可以再加第三个维度——汤汁程度(liquidness),也就是一种食物有多稀。加上的话,这些条目在 3D 空间里就能这样画出来:

图 5. 与前面同一张图,但多了一条与另外两轴正交的「汤汁程度」轴,罗宋汤被沿着这条轴挪到了很靠外的位置。
图 5. 按「三明治程度」「甜度」「汤汁程度」三个维度摆放的食物

那在这个 3D 空间里,汤圆(tangyuan) 该放哪儿?它既像 罗宋汤 一样汤汤水水,又像 苹果酥 一样是甜点,而且肯定不是 三明治。下面是一种可能的放法:

图 6. 与图 5 同一张图,但汤圆被放在「甜度」和「汤汁程度」都很高、「三明治程度」很低的位置。
图 6. 把汤圆加进上一张图:甜度与汤汁程度都高,三明治程度低

注意看,这三个维度已经表达了多少信息。你完全可以想象再往上加维度,比如一种食物有多「肉」、有多「烤」——不过 4 维、5 维以及更高维的空间,就很难可视化了,但道理是一样的。

现实中的嵌入空间#

现实里,嵌入空间是 $d$ 维的,$d$ 比 3 要大得多(对于词嵌入来说,$d$ 常见是 256、512 或 1024),但仍然低于数据本身的维度(例如原始 one-hot 向量的维度);而且数据点之间的关系,也不一定像上面那个刻意构造的例子那样直观。

因此,在实际构建嵌入空间的时候,通常是先定下具体任务和嵌入维度数,然后模型会设法让训练样本在指定维数的嵌入空间里彼此靠近。同时,在高维的嵌入空间中,单个维度的含义通常远没有「甜度」「汤汁程度」那么好理解,它往往是一种抽象的含义。例如在文章开始时所展示的词向量降维可视化结果中,横纵坐标的含义我们都是不知道的。

这里需要注意的是,嵌入通常是为某个特定任务而生成的,任务不同得到的嵌入标识也就不同。比如,一个「素食 vs 非素食」分类模型生成的嵌入,与一个「按时段或季节推荐菜品」的模型生成的嵌入,就不会是一回事。举例来说,在按时段推荐的模型里,麦片 和 早餐香肠 大概会靠得很近;而在素食分类模型的嵌入空间里,它们就离得很远。

MLWM: 上面这句话的意思是说,嵌入表示通常是不同建模任务下所得到的结果,A、B 两个实体在任务 $\alpha$ 下构建得到的嵌入表示离得很近,但是换成任务 $\beta$ 下构建得到的嵌入表示就可能离得较远。 例如对于 麦片 和 早餐香肠 来说,如果是按「素食 vs 非素食」场景构建得到嵌入表示,那么两者就会离得很远;而如果是按「早中晚时段」场景构建得到嵌入表示,那么两者就会离得较近。 在深度学习中, CBOW 和 Skip-gram 就是两种常见的用于训练得到词向量的方法,相关内容可以参见 Word2Vec原理:词向量训练与语义表示方法 中的内容。

静态嵌入#

嵌入表示虽然会随任务而变化,但有一个任务用途相当广泛:预测一个词的上下文。在训练「预测词的上下文」的模型中,此时假定出现在相似上下文里的词,语义上也相关。举个例子,训练数据里有这么两句——「他们骑着一头驴子进了大峡谷」和「他们骑着一匹马进了峡谷」——这就说明“马”出现的上下文,和“驴”很相似。事实证明,基于语义相似度的嵌入(word2vec),在很多通用语言任务上都表现不错。

虽然 word2vec 是个老例子,如今也基本被别的模型所取代,但拿它来做讲解仍然很方便。word2vec 在一个文档语料上训练,为每个词学出一个全局的嵌入表示。当每个词都只有一个固定的嵌入向量时,这就叫静态嵌入(static embedding)。

在得到这些词嵌入表示以后,我们还可以通过计算 “king” - “man” + “woman”,得到一个 “queen” 的向量表示,相关内容可参见Word2Vec训练与使用 第9.3.3节中的介绍。

研究显示,这类静态词嵌入表示一旦训练完成,就会编码出一定程度的语义信息,尤其是词与词之间的关系——也就是说,出现在相似上下文里的词,在嵌入空间里就会离得更近。相关原理可以参见 Word2Vec原理:词向量训练与语义表示方法 中的讲解。

提示: word2vec 这个词有两种含义,它既指「获得静态词嵌入的那套算法」,也指「用这套算法预训练出来的词向量」。


关键术语:

  • 嵌入向量(Embedding vector)
  • 嵌入空间(Embedding space)

关于词嵌入的直观理解,也可以通过观看如下视频了解:


阅读 --