跳转至

P2-3.4 内积(dot product)、长度(norm)、距离(distance)、相似度(similarity)

Section ID: P2-3.4 Version: v2026.07.23

读完向量(vector)、矩阵(matrix)、矩阵乘法(matrix multiplication)之后,下一道问题自然会留下来:两个向量到底有多像它们相隔多远怎样区分一个很大的向量和一个只是方向相似的向量?这正是点积(dot product)、长度(norm)、距离(distance)、相似度(similarity)要回答的问题。

如果说矩阵乘法是 把向量组合起来生成新值的计算,那么点积、距离、相似度就是 拿向量彼此比较的计算。因此,在做出向量之后,还要一起抓住“该用什么标准去读这些向量”。需要快速回看术语时,也可以一起查看概念词汇表

核心判断标准:点积(dot product)、长度(norm)、距离(distance)、相似度(similarity)

  • 能把点积(dot product)解释成“把两个向量对应成分相乘后再相加得到的值”。
  • 能把长度(norm)读成向量大小或强度的摘要值。
  • 能区分距离(distance)是在量分离,相似度(similarity)是在量相像。
  • 能说明比较标准会随着“是不是只关心方向”与“大小也是否重要”而改变。
  • 能为阅读 k-NN、embedding、similarity search 建立起最小的比较语言。

先抓住的一个场景

这一节最先要抓住的,是在同一套标准下比较几组向量。

比较对象 第一眼会看到什么 现在要抓住的问题
q = [1, 1], a = [2, 2] 方向相同,但大小更大 重要的是方向,还是大小也重要?
q = [1, 1], b = [1, 0] 少了一根轴,所以没那么像 它们是坐标上接近,还是只在用途上部分相似?
q = [1, 1], c = [10, 10] 很远,但方向几乎一样 距离和余弦相似度会不会给出不同答案?

所以,这一节的核心不是简单地 算一个向量,而是先决定 什么才算一样

三个基准

基准 为什么重要 本节所需的理解水平
点积是读 两个向量一起运动了多少 的摘要值 因为它把矩阵乘法和相似度计算连了起来。 读懂为什么要把对应位置相乘再相加。
长度和方向不是同一份信息 因为这样才能区分“很大的向量”和“只是方向相似的向量”。 大小方向 看成不同概念。
距离和相似度回答的是不同问题 因为这样不会把 k-NN 和 embedding 检索混成同一种问题。 相隔多远有多像 分开阅读。

点积是把两个向量折成一个数字的计算

点积(dot product)会把相同位置上的值相乘,然后把所有结果加起来,把两个向量之间的关系折叠成一个数字。

\[ a \cdot b = a_1b_1 + a_2b_2 + \cdots + a_nb_n \]

这种计算在我们想快速概括 两个向量在同方向成分上重合了多少 时很有用。也正因为这样,它会自然连回矩阵乘法的说明,因为矩阵乘法里的一个格子,最终也可以看成某一行和某一列的点积。

先看最小的例子:

\[ [1,\ 2] \cdot [3,\ 4] = 1 \times 3 + 2 \times 4 = 11 \]

点积值大,并不自动表示 。更安全的读法是:它是一个 把两个向量关系压成一个数字的摘要值。如果同方向成分重合得多,点积可能会变大;如果反方向成分很强,值就可能变小,甚至变成负数。

再更短地整理一次:

问题 点积看得比较好的是什么
同方向成分重合了多少? 它看得比较好
绝对距离差到底有多大? 它并不直接回答
更长的向量会不会得更高的分数? 有可能会

长度(norm)是在读向量的大小

向量长度(norm)是一个摘要值,用来表示这个向量离原点有多远,或者整体强度有多大。

对初学者来说,先抓住最常见的 2-范数就够了。

\[ ||x|| = \sqrt{x_1^2 + x_2^2 + \cdots + x_n^2} \]

当长度大时,表示这些值整体伸得更远;当长度小时,表示向量离原点更近。

例如:

\[ ||[3,\ 4]|| = 5 \]

这可以立刻读成 3-4-5 三角形。相对地,[30, 40] 和它方向几乎一样,但长度是它的 10 倍。正因为有这种差别,我们才必须把 方向相似但大小不同的向量 单独分开看。

放成比较表会更清楚。

向量 方向 长度
[3, 4] 参考方向 5
[30, 40] 几乎相同的方向 50
[4, -3] 不同方向 5

距离和相似度回答的是不同的问题

距离(distance)和相似度(similarity)虽然都是比较标准,但它们回答的并不是同一个问题。

标准 它先问的是什么
距离(distance) 它们相隔多远?
相似度(similarity) 它们到底有多像?

在基于距离的思路里,我们经常先想 越近,就越可能相似。相对地,相似度更直接追问 它们方向是否一致它们用法是否相近

所以到了后面:

  • k-NN 会先在距离标准下找附近的例子。
  • embedding retrieval 会先在相似度标准下把相似候选提上来。

看一个小例子。

\[ q = [1,\ 1],\quad a = [2,\ 2],\quad b = [1,\ 0] \]
  • aq 几乎同方向,而且更长。
  • b 的长度差不多,但少了一根轴。

如果问题是 哪一个向量方向最相似,那么 a 会更自然。可如果问题是 哪个点在坐标上最近,计算结果就可能不一样。所以读比较问题时,第一步是先决定 什么才算一样

把读者可以立刻拿来用的“问题 -> 标准”表留在这里:

问题场景 先想到的标准
选择最近的样本 距离(distance)
找方向或意义最相似的向量 相似度(similarity)、余弦相似度
理解为什么矩阵乘法中的一个格子是那样算的 点积(dot product)
观察向量的强度或大小 长度(norm)

为什么还需要把余弦相似度单独拿出来

余弦相似度(cosine similarity)是一种更强调“方向是否相似”而不是“绝对大小是否接近”的比较标准。即使两个向量方向相同,它们的绝对长度也可能差很多,因此 到底更该看哪一个 会随着问题而变化。

例如:

  • 像购买金额这样的问题,大小本身可能很重要。
  • 像句子 embedding 这样的问题,方向相似往往比大小更重要。

所以,余弦相似度会在向量检索和 embedding 语境里反复出现。

例如,[1, 1][10, 10] 大小差很多,但方向相同。距离会把它们读成相隔很远,而余弦相似度会判断它们方向几乎一致。相反,[1, 1][1, -1] 的长度可能看起来相近,但方向差异非常大。这就是为什么我们必须把 距离方向相似 分开来读。

如果只留下一个非常简短的比较结果:

比较 距离视角 方向相似视角
[1, 1] vs [10, 10] 很远 非常相似
[1, 1] vs [1, -1] 只看长度可能像 方向非常不同

一个很短的判断标准

遇到向量比较问题时,先问下面三个问题就够了。

  1. 大小也重要,还是只关心方向?
  2. 我们是在找最近邻,还是在找最相似的表示?
  3. 被比较的向量是不是放在同一个空间、同一个维度里?

这三个问题一旦先整理清楚,distancedot productcosine similarity 到底哪个该先出现,就会少很多混乱。

检查清单

  • 能把点积解释成 相同位置相乘再相加 吗?
  • 能说明长度和方向是不同的信息吗?
  • 能用一句话区分距离和相似度吗?
  • 能说明为什么 [1, 1][10, 10] 会在距离和余弦相似度里被读成不同结果吗?
  • 能说明为什么 k-NN 和 embedding 检索不是同一种比较问题吗?
  • 遇到向量比较问题时,能先问 大小也重要吗,还是方向更重要? 吗?

这些比较标准之后还会在哪些场景出现

后面再次遇到的场景 这里先留下的直觉
Part 4 的 k-NN 说“找附近的例子”,其实就是在先选一个距离标准。
Part 6 的 embedding 说“把意义放进向量”,其实也意味着需要一套向量比较标准。
Part 6 的向量检索 说“先把相关候选排前面”,其实就是在建立一个相似度顺序。

所以这里真正重要的,不是停在 做出了向量,而是继续读到 这些向量将如何被比较

来源与参考资料