先记住这个答案
向量检索中,若模型输出未归一化且模长反映信息量或置信度,应选欧氏距离,因为它同时考虑方向和模长。余弦相似度忽略模长,只比较方向,适合语义方向主导、模长无意义的场景,如使用归一化嵌入。实际判断可比较同一查询下检索结果的分布,若模长方差大且有区分性,欧氏更优。
- 模长携带语义时用欧氏距离
- 向量已归一化时两者排序一致
- 需先分析向量分布再定度量
从几何直观理解两者差异
余弦相似度度量的是两个向量在多维空间中的夹角,数学上等于内积除以模长乘积。它把每个向量的模长缩放为单位长度后再比较,因此纯模长差异不会影响相似度。例如向量(1,0)和(10,0)余弦相似度为1,但欧氏距离高达9。
欧氏距离直接计算坐标差的平方和根,既包含方向差异也包含长度差异。当嵌入模型未强制归一化时,模长可能携带文档重要度或信息密度。如某些模型对常见短句输出小模长,长详细内容输出大模长,模长差异就不可忽略。
未归一化的文本嵌入检索
假设某嵌入模型未做L2归一化。语料中短句“猫睡觉”模长0.8,长句“猫在窗台上安静地睡觉并发出咕噜声”模长2.1。现在查询是一个与两向量方向接近的长句描述,模长约为2.0。余弦相似度因仅看方向,认为短句与长句几乎相同;但欧氏距离会因查询与长句模长接近而判定长句更近,从而优先返回内容更丰富的文档。
在假设场景中,模长编码了语义深度,欧氏距离利用了这一信息,理论上可能更匹配用户意图,但实际效果需通过标注数据验证。若确认采用欧氏距离,可直接对非归一化嵌入库建立欧氏索引,无需额外归一化。
不适用与失效条件
如果嵌入模型在训练或推理时已执行了L2归一化(例如某些API默认返回归一化向量),那么所有向量模长均为1,此时欧氏距离与余弦相似度产生完全相同排序,选哪个都行;通常用余弦以便解释相似度分数。强行用欧氏仅引入常数缩放。
另一种失效情形是当模长主要受文档长度而非语义影响(例如某些模型对长文本输出更大模长,但内容冗余),欧氏距离会偏向长文档,导致检索结果失衡。因此应先统计分析模长与语义相关性的关联;若相关性弱,则应改用余弦相似度。
容易答错的地方
- 认为余弦总是最好
- 余弦相似度适用于文本分类等方向性任务,但嵌入检索中若模长有信息量,丢弃它会损失召回。例如未归一化模型下,短查询与长相关文档可能方向接近但长度差异大,余弦会漏掉。应根据实际评估选择。
- 误以为欧氏距离更严格
- 有观点认为欧氏距离计算精确所以更好,但未注意归一化后两者等价。另一个误区是认为欧氏距离易受维度影响,但高维下所有距离都趋同,关键是模长方差。需要从语义角度理解。
面试官还会怎么问?
归一化后欧氏距离和余弦相似度排序完全一致吗?
是的。当所有向量模长都为1时,内积等于余弦相似度,而欧氏距离平方=2-2内积,因此单调递减。排序一致,可用余弦便于分数解释。
如何快速判断模型输出是否已归一化?
计算一批向量的L2范数,若所有值近似1则已归一化。若范数分布有明显离散且与文本长度相关,则未归一化,需进一步验证模长与语义关联。
如果同时使用欧氏和余弦得到不同结果,哪个更可靠?
取决于任务语义。若标注数据表明模长能区分信息粒度,欧氏更优;否则余弦对噪声更鲁棒。可用小规模标注集比较两者NDCG。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。