相似度度量:余弦、内积与欧氏距离
本文基于模型知识整理(生成时未联网核对),关键结论建议对照经典文献复核。
一句话定义
向量检索用三种基本度量比较嵌入:余弦相似度(比方向)、内积(比方向加长度,常被推荐系统用于注入流行度)、欧氏/L2 距离(比绝对位置);向量归一化后三者排序等价——选错度量或漏归一化是检索"莫名变差"的经典原因。
为什么重要
度量与训练方式、索引类型必须配套:训练时用内积优化的模型拿余弦查询可能排序错乱,索引(如 IVF-PQ)按特定度量构建后不可混用。这类配置错误不会报错,只会让结果悄悄变差,是最阴险的一类 bug。
前置知识
kp-007、基础向量代数。
核心概念
- 余弦相似度 cos(θ) = (a·b)/(‖a‖‖b‖):只比方向,消除向量长度(文本长度、词频规模)影响;信息检索默认选项。
- 内积(dot product) a·b = ‖a‖‖b‖cos(θ):长度参与排序;训练目标若为内积(很多对比学习模型如此),则推理也必须用内积。
- 欧氏距离(L2) ‖a−b‖:比绝对位置;归一化后与余弦单调等价(d² = 2−2cosθ)。
- 归一化(L2 normalization):把向量缩放到单位长度;此后内积 = 余弦、L2 排序与余弦一致——这是让三种度量统一的最常用手段。
原理与机制
度量与训练目标的一致性:对比学习训练时的打分函数定义了向量空间的几何结构。若训练用 cosine,查询时用内积,未被归一化的向量长度差异会污染排序;反之亦然。工程铁律:先读模型卡确认训练度量与是否已归一化,再选索引度量;拿不准就全部归一化后统一用内积/余弦。
三种度量的适用差异:
- 检索(RAG):余弦或归一化内积——关注语义方向,长度信息是噪音。
- 推荐/广告:内积——长度常编码"流行度/热度",是有用信号。
- 聚类/去重:欧氏——关注绝对距离的簇结构。
与索引的绑定:HNSW/IVF 等索引在构建时指定度量(distance metric),不同度量的近邻图/量化器不同,建好后的索引不能换度量查询(部分库支持同库多度量,需显式选择)。PQ 量化误差也与度量相关(内积量化有非负性处理差异)。
公式或模型
- 余弦:
cos(a,b) = a·b / (‖a‖·‖b‖) ∈ [−1, 1] - 归一化后:
a·b = cos(a,b),且‖a−b‖² = 2 − 2·cos(a,b)(排序等价的数学根据)
直观类比
比较两个人兴趣是否相投:余弦只看兴趣方向(都爱科技与音乐即相似,不管热情强度);内积还看投入程度(更狂热的人排名靠前);欧氏则连"兴趣清单的具体位置"都比。图书馆找相似书要排除"书写得多长"的影响——所以先归一化再比方向。
实例或案例
- 事故样本:从模型 A(输出已归一化)换到模型 B(未归一化),检索代码沿用内积,长文档块向量范数大、系统性霸榜 top-k——症状是"长块全命中、短答案查不到"。归一化后恢复。
- 推荐场景反例:刻意用未归一化内积让爆款内容获得曝光加权——度量选择是业务决策而非纯技术决策。
常见误区
- 误区一:"余弦永远是对的"。训练目标为内积的模型按余弦查询同样错配;跟模型走,不跟习惯走。
- 误区二:"阈值可以跨模型复用"。不同模型相似度分布完全不同,0.8 在 A 模型是高相关在 B 模型可能稀松平常;阈值必须基于自有分布重新标定(kp-016 的评测数据)。
- 误区三:"度量只影响排序不影响召回结构"。IVF 的聚类、HNSW 的图都按度量构建,混用度量等于在错误的几何里找近邻。
与其他知识点的关系
自测题
- 为什么归一化后内积、余弦、L2 排序等价?
答:归一化后 ‖a‖=‖b‖=1,内积即余弦;而 ‖a−b‖² = 2−2cos(a,b) 是余弦的单调递减函数,故三者给出相同排序。
- 什么场景应故意不归一化用内积?
答:向量范数携带业务信号时(如推荐中的流行度/热度加权),长度参与排序是特性而非缺陷。
- 换度量时为什么必须重建索引?
答:HNSW 近邻图与 IVF 聚类都按指定度量的几何构建,换度量即在错误的邻域结构上检索,结果不可信。
延伸阅读
- Malkov & Yashunin, HNSW 论文(§ 度量与实现)。
- 各向量库文档:distance metrics 章节(Pinecone/Qdrant/Milvus/faiss)。
- Robertson & Zaragoza, BM25(对照:词频权重思想与向量长度的取舍异同)。