余弦相似度是一种数值指标,用于衡量实向量空间中两个非零向量的方向一致程度。它等于两向量夹角的余弦值,计算方法是将两者的内积除以各自长度的乘积。与未经归一化的点积不同,它比较的是方向,而非大小。余弦相似度广泛用于信息检索和机器学习,以比较文档及其他对象的数值表示。(nlp.stanford.edu)
定义与几何解释
对于向量 ,其中 且 ,余弦相似度定义为
这里, 是欧几里得范数。在欧几里得空间中,根据内积恒等式可得 ,其中 为两向量之间的夹角。等价地,将两个向量都归一化为单位长度后,它们的点积就等于其余弦相似度。(nlp.stanford.edu)
由柯西—施瓦茨不等式可知,相似度得分介于 与 之间。得分为 表示方向相同, 表示方向垂直, 表示方向相反。如果所有坐标分量均非负,由于分子不可能为负,取值范围便缩小为 。这些性质都可以直接由定义推出。(nlp.stanford.edu)
例如, 与 的相似度为 ,约为 。将 替换为 ,结果不变。更一般地,对于正标量 ,有
因此,两个向量即使不完全相同,也可以获得最高得分:在这一指标下,互为正标量倍数的向量无法区分。(nlp.stanford.edu)
与距离和相关性的关系
一种常用的相异性指标称为余弦距离,其定义为
对于不受额外限制的实向量,其取值范围为 到 。尽管名称中有“距离”,它通常并不满足度量空间对度量的要求:不同的向量如果互为正标量倍数,距离就为零,而且三角不等式也可能不成立。对于方向角分别为 、 和 的单位向量,首尾两个向量之间的距离为 ,而经由中间向量的两段距离之和为 。代入相应的余弦值即可得到这一反例。(docs.scipy.org)
对于归一化向量 和 ,展开欧几里得距离的平方可得
因此,按余弦相似度从高到低排序,与按归一化为单位长度后的向量之间的欧几里得距离从小到大排序,结果相同。角距离 在单位向量集合上构成一个度量;不过,将它用于未归一化的向量时,仍会把互为正标量倍数的向量视为同一点。(nlp.stanford.edu)
余弦相似度也与皮尔逊相关关系有关。在计算余弦相似度之前,先从每个向量的各坐标分量中减去该向量坐标分量的均值,只要两个中心化后的向量范数均不为零,所得结果就是皮尔逊相关系数。普通的余弦相似度不进行这种中心化处理,因此通常会受到加性偏移的影响。(docs.scipy.org)
文本与学习得到的表示
在传统文档检索中,词袋模型使用与词汇表中各词项对应的坐标来表示文档。坐标值可以是词项出现次数,也可以是词频—逆文档频率权重。长度归一化可以抵消向量整体大小差异的影响,使相对词项分布相近的文档即使词项的绝对出现次数不同,也能获得相近的得分。查询可以在同一空间中表示,并根据文档与查询的相似度对文档排序。(nlp.stanford.edu)
在自然语言处理中,余弦相似度也用于比较词嵌入以及通过表征学习得到的句子表示。例如,Sentence-BERT 的设计目标就是生成适合用余弦相似度进行比较的句子嵌入。这类表示能够支持语义搜索,而不局限于词汇的精确重合。(arxiv.org)
不过,相似度得分反映的是表示本身的性质,而不是对含义的直接测量。有关学习所得嵌入的研究表明,其余弦相似度可能取决于训练目标和正则化,未必能忠实反映语义相似性。因此,数值得分需要结合具体的模型和任务来解释。(arxiv.org)
计算与实际局限
对于每一行都已归一化为单位向量的矩阵 ,两两相似度矩阵为 ,其中上标表示矩阵转置。这一结果可通过对每一对行向量应用归一化点积的定义得到。对于含有大量零坐标分量的输入,采用稀疏矩阵表示可以减少存储量和运算量,不过最终得到的相似度矩阵仍可能是稠密的。(scikit-learn.org)
零向量需要特殊处理,因为数学公式在这种情况下会出现除以零。具体实现可以采用约定值,而不是返回未定义的结果;scikit-learn 文档中的示例将零输入行与其他向量的相似度均设为零。但这种约定并不能赋予零向量一个几何方向。(scikit-learn.org)
归一化也不能消除特征缩放的所有影响。将整个向量乘以一个正标量不会改变其方向,但分别缩放各坐标分量通常会改变夹角。这可以从公式看出:不同的坐标权重会同时改变内积和范数。由于这一指标有意舍弃大小信息,仅在整体大小上存在差异的对象会得到相同的方向比较结果。(nlp.stanford.edu)
参考来源
- Dot productsnlp.stanford.edu
- Introduction to Information Retrievalnlp.stanford.edu
- Introduction to Information Retrievalnlp.stanford.edu
- Queries as vectorsnlp.stanford.edu
- cosine — SciPy Manualdocs.scipy.org
- scipy.spatial.distance.correlation — SciPy Manualdocs.scipy.org
- cosine_similarity — scikit-learn documentationscikit-learn.org
- Sentence-BERT: Sentence Embeddings using Siamese BERT-Networksarxiv.org
- Semantic Search — Sentence Transformers documentationsbert.net
- Is Cosine-Similarity of Embeddings Really About Similarity?arxiv.org