比较向量余弦相似度的简易方法

发布时间 2023-07-28 00:31:35作者: 云野Winfield

最近基于知识嵌入的LLM应用非常热门,此类应用中的一个重要环节是计算Embeddings间的相似度:通过召回与Query Embedding相似的数据块嵌入向量,得到与用户Query相关的知识片段,从而为LLM问答提供引文支撑。向量相似度有多种度量方式,而余弦相似度是其中比较常用的一种。

余弦相似度的定义为:

\[cos(\theta) = \frac{A \cdot B}{|A| |B|} \]

其中:

  • \(\theta\):向量A和B之间的角度
  • \(A \cdot B\):向量A和B的内积(Dot Product)
  • \(|A|\)\(|B|\):向量A和B的欧几里德长度(L2 Norm)

根据定义式可知,当\(|A|\)\(|B|\)固定时,余弦相似度\(cos(\theta)\)仅与内积\(A \cdot B\)成正比。

也就是说,如果我们只关心两个向量余弦相似度的大小关系,而不需要计算出精确的余弦相似度值,那么可以仅通过比较两个向量的内积大小来进行定性判断。

具体而言,对于向量A和B:

  • 如果\(A \cdot B\)较大,则\(A\)\(B\)较为相似,余弦相似度较高
  • 如果\(A \cdot B\)较小,则\(A\)\(B\)较为不相似,余弦相似度较低

这为一些机器学习算法的设计提供了可能,例如用内积替代余弦相似度来判定最相似样本,从而简化计算过程。

在Transformer模型中,Attention机制用来计算query和key的相关性分数,该机制的核心公式为:

\[Attention(Q,K,V) = Softmax(\frac{QK^T}{\sqrt{d_k}})V \]

其中:

  • \(Q\):Query向量
  • \(K\):Key向量
  • \(V\):Value向量
  • \(d_k\):Key向量的维度

核心相关性分数计算过程为\(\frac{QK^T}{\sqrt{d_k}}\),这里的\(\frac{QK^T}{\sqrt{d_k}}\)实际上计算的是query和key的内积,再进行缩放。

根据上述结论,我们知道内积的大小反映了两个向量的余弦相似度。即\(\frac{QK^T}{\sqrt{d_k}}\)反映了query和key向量之间的相似程度。

因此,Transformer的Attention机制也利用了两个向量内积的大小关系来比较余弦相似度,从而实现查询与键的相关性计算。