一句话定义
距离度量决定"两个向量有多相似"的算法——欧氏距离(L2)量直线远近,内积(IP)量方向共振,余弦相似度(cosine)量纯方向夹角;度量选择与归一化状态共同决定排序结果。
为什么重要
度量是建库时最容易被轻视、又最难事后补救的参数:库建好后再换度量,意味着索引、ground truth、业务阈值全部重做。度量选错的表现很隐蔽——"能返回结果但相关性莫名很差",且调任何索引参数都无济于事。
前置知识
kp-001;向量、内积、平方和的中学代数即可。
核心概念
- 欧氏距离 L2:两点直线距离,受模长影响。
- 内积 IP:对应维相乘求和,同时编码方向与模长,可承载"强度"信息(如分数、权重)。
- 余弦相似度:夹角余弦,仅看方向;值域 [-1,1],越接近 1 越相似。
- L2 归一化:除以模长变为单位向量。归一化后三者关系大幅简化(见下)。
- 度量一致性:查询与建库必须同度量;嵌入模型的训练度量是权威依据。
原理与机制
三个度量的定义与单调性:
L2²(a,b) = Σ(a_i - b_i)² 距离, 越小越相似
IP(a,b) = Σ a_i·b_i 分数, 越大越相似
cos(a,b) = (a·b)/(‖a‖·‖b‖) 分数, 越大越相似关键推导——归一化后三者等价。设 a、b 均为单位向量(‖a‖=‖b‖=1):
‖a-b‖² = ‖a‖² - 2a·b + ‖b‖² = 2 - 2·cos(a,b)即 L2 与余弦严格单调等价(一个增另一个必减),而归一化后 IP = cos。所以对归一化嵌入,用哪种都得到同一排序;工程上选 IP/cosine 是因为可跳过开方、且 SIMD 实现更高效。若不做归一化,L2 会惩罚长向量、IP 会偏爱长向量,排序不再一致。
公式或模型
分数换算(便于业务阈值跨度量迁移):
cos ∈ [-1, 1] → 相似度
IP ∈ 无界 → 归一化后等于 cos
L2² = 2 - 2cos → 归一化域内与 cos 双射图示
三维坐标夹角直觉(HTML 原生分数排版演示):
<div class="frac"><span class="num">a·b</span><span class="den">‖a‖·‖b‖</span></div>余弦即"方向一致性占比":分子是共振量,分母把模长归一掉。
实例或案例
同一对向量 (3,4) 与 (4,3):IP = 24 看似很高,但两者夹角余弦仅 0.96 且都与 (10,10) 的余弦 0.99 接近——不归一化时 IP 排序会被模长主导。OpenAI、BGE 等主流嵌入均建议归一化后使用 cosine/IP;而推荐系统里"用户×物品"打分场景故意不归一化,让 IP 同时表达"匹配度"与"热度"。
直观类比
评价两支球队的相似:L2 是"综合实力差多少",余弦是"打法像不像",IP 是"打法像不像 × 强度乘积"。归一化相当于约定"只看打法"。
常见误区
- "余弦和内积永远等价"——仅当双方都归一化时成立,否则 IP 被模长污染。
- "库里用 L2、业务里拿 cos 阈值判断"——两个量纲,阈值必然错位;换算用 L2² = 2 - 2cos(归一化域)。
- "度量随便选,反正 top-k 大差不差"——度量错了排序系统性错位,调索引参数无法纠正;且改度量需重建索引与 ground truth。
自测题
- 已知两单位向量余弦 0.8,求 L2 距离。
- 场景:物品向量模长编码"热度",希望热门且相关的物品靠前,选哪个度量?
- 建库时如何确定度量?
答:L2² = 2 - 2×0.8 = 0.4,L2 = √0.4 ≈ 0.632。
答:内积 IP——它同时奖励方向匹配与模长(热度);此时不应归一化。
答:以嵌入模型文档标注的度量与归一化要求为准;拿不准时对样本对做三种度量排序对比,并与人工相关性判断对齐。
与其他知识点的关系
kp-004 的 ANN 问题以本篇度量为基础;kp-012 的 PQ 压缩按"查表近似 L2"实现;kp-028 提醒选模型时必须连带确认度量。
延伸阅读
Jégou, Douze, Schmid, "Product Quantization for Nearest Neighbor Search"(IEEE TPAMI 2011)——第 3 节对各度量下量化误差与排序一致性的经典分析。