余弦距离#
术语解释#
余弦距离(Cosine Distance) 是一种衡量两个向量在方向上差异的度量方式,广泛应用于自然语言处理(如词向量相似度计算)和检索增强生成(RAG)等领域。
余弦距离是基于余弦相似度(Cosine Similarity)人为构建出来的一种距离,如图所示。
余弦相似度计算的是两个向量夹角的余弦值,取值范围在 $-1$ 到 $1$ 之间。
$$ \cos(\theta)=\frac{a\cdot b}{\|a\|\|b\|} $$从直观上看,两个向量越相似,距离应该越近。因此,余弦距离通常表示为 $1$ 减去余弦相似度,即
$$ \text{loss}(a, b) = 1 - \cos(a, b) $$$\text{loss}(a, b)$ 取值含义:
-
$0$:表示两个向量方向完全一致(夹角为 $0$ 度),距离最近。
-
$1$:表示两个向量正交(夹角为 $90$ 度),没有方向上的相似性。
-
$2$:表示两个向量方向完全相反(夹角为 $180$ 度),距离最远。
出现动机#
-
语义相似度匹配需求:在 文本聚类、Word2Vec 或 RAG 场景中,我们需要衡量文本之间的语义相关性。余弦距离提供了一种衡量向量空间中方向对齐程度的标准,能够有效解决“表达不同但含义相近”的检索问题。
-
捕捉向量方向的相似性:在诸如模型蒸馏(如 DistilBERT)的场景中,即使学生模型和教师模型输出的向量数值不完全一致,如果能约束它们在方向上保持一致,也能使学生模型更好地模仿教师模型的表示能力。相关内容可参见「DistilBERT 蒸馏原理与 PyTorch 实现:从 BERT-base 到轻量模型」。
优点缺点#
-
优点:
-
不受向量长度影响:两个向量即使大小相差很大,只要方向一致,就认为完全相似。这对于文本长度不同、词频不同等场景非常有用。
-
关注语义对齐:它促使模型学习向量的表示能力,而不仅仅是输出结果的数值。通过最小化余弦嵌入损失(Cosine Embedding Loss),可以使不同模型生成的隐含状态向量在方向上尽可能相似。
-
适合高维数据:在高维空间中,欧氏距离容易出现"距离趋同"问题,而余弦距离通常仍能较好地区分向量方向,因此广泛应用于高维 Embedding。
-
易于归一化:许多 Embedding 模型(如Qwen3)都会先进行 L2 归一化,此时余弦相似度就等价于点积,计算更快。相关文章可参见「Qwen3 Embedding 模型介绍」。
-
RAG 场景的首选:它是 RAG 场景中最常见的相似度度量选择,能有效处理向量数据库(如 Milvus 或带有 pgvector 插件的 Postgres)中的语义召回任务。
-
-
缺点:
-
忽略模长信息:余弦距离只考量向量间的角度差异,而不考虑向量的绝对大小(模长)。如果向量的长度本身具有业务意义(例如销量、访问量、购买金额等),余弦距离会丢失这部分信息。
-
不能反映真实空间距离:两个位置相距很远但方向相同的点,余弦距离仍然为 0,因此不适用于需要衡量物理距离或数值误差的场景。
-
相关术语#
- 欧式距离