句子嵌入之间的余弦相似度总是正的

数据挖掘 Python nlp 余弦距离
2022-03-03 09:43:48

我有一份文件清单,我正在寻找 a) 副本;b) 非常相似的文件。为此,我进行如下操作:

  1. 使用paraphrase-xlm-r-multilingual-v1嵌入文档
  2. 计算向量嵌入之间的余弦相似度(下面的代码)。

我得到的所有余弦相似度值都在 0 和 1 之间。这是为什么呢?我不应该也有负的 cos 相似度值吗?句子嵌入有正面和负面的元素。

num_docs = np.array(sentence_embedding).shape[0]

cos_sim = np.zeros([num_docs, num_docs])
for ii in range(num_docs):
    for jj in range(num_docs):
        if ii != jj:
            cos_sim[ii, jj] = np.dot(sentence_embedding[ii], sentence_embedding[jj].T)/(norm(sentence_embedding[ii])*norm(sentence_embedding[jj]))
1个回答

免责声明:这实际上是一个试探性的解释,它提供了一个可能的答案,但它不包含证据。

首先,与添加的评论相反,余弦相似度并不总是在范围内。如果向量包含正值,则此范围有效,但如果允许负值,则负余弦相似度是可能的。之类的两个向量为例,它们应该给出的余弦相似度,因为这两个向量在同一条线上但方向相反。[0,1](1,1)(1,1)1

回到这个问题,我们应该问是否有可能在向量中有正值和负值,但仍然只有正余弦相似度值。答案是正确的,如果嵌入向量包含在原点固定的锥形表面的推波中,这是可能的。(参见维基百科:圆锥面)。基本上,如果你旋转正空间部分,你仍然会得到正余弦相似度。

为什么paraphrase-xlm-r-multilingual-v1会发生这种情况如果您阅读了描述Sentence-BERT 模型的论文:Sentence Embeddings using Siamese BERT-Networks - Reimers,Gurevych在训练细节部分,他们解释说他们在类似 BERT 的预训练模型之上使用池化层来获得固定编码。池化层默认模型是平均的。假设在卷积层的输出向量中,您得到范围[a,a]. 通过平均化这些输出向量值基本上使输出向量更靠近在一起,产生更小的角度,从而朝着正余弦相似度方向发展。即使按模式最大令牌进行池化也有类似的效果。这大大增加了导致嵌入仅具有正相似性的概率,即使它们在结果嵌入中允许正值和负值。正如我所说,我没有证据,但考虑到池化的工作原理以及如果池化了许多卷积,这是一个合乎逻辑的结果。这并不意味着不可能有负面的相似性。

如果您有大量随机句子,则验证此实验的一种方法是绘制它们的余弦相似度的直方图,并直观地检查您几乎没有接近零的值,并且随着我们向增长,频率单调增加。这又只是一个提示。1

[稍后编辑]

我自己进行了一些实验来解决@albus_c 提供的见解(谢谢)。

首先,我没有句子,而且无论如何我不使用 Python,所以我在矩阵中生成了人工数据(具有来自标准法线的随机值的向量),其中行是要通过余弦相似度进行比较的实例向量。我注意到一个有趣的现象:平均而言,随机向量之间的余弦相似度随着向量长度的增加而具有更短的绝对值范围。

采样余弦相似度与随机向量大小

在上图中,我们可以看到对于较小的向量大小,经验分布覆盖了整个范围,并且该范围随着向量大小的增长而缩小。这很重要,因为池化层的作用是减少输入向量的大小,同时保留重要信息。因此,如果池化是激进的,则余弦相似度的范围将平均增加。这就是@albus_c 注意到的,我想。[1,1]

我还使用平均池和最大池在随机样本上实现了 2D 池层函数。我注意到,与我的直觉相反,平均并不会减少余弦的范围,而是将其保持在相同的范围内。然而,由于之前的效果(池化缩小了向量大小并因此增加了余弦的范围),最终的效果是增加了余弦范围。然而,在最大池化的情况下,余弦范围缩小并急剧移动到正值,如下图所示。

池化前后的余弦

在上图中,我们可以在左上角看到大小为的随机向量的余弦相似度直方图。在右上角的直方图中,我们仅对大小的向量具有余弦相似度以进行比较。我应用了大小为和幻灯片的 2d 池化层。在左下图中,我们在最大池化后有相似之处。我们清楚地观察到在正范围移动的值。在右下角,我们在均值池化后有相似之处。我们注意到范围与原始(左上)相比有所增加,但与相同大小的向量(右上)的范围相似。768384221

我没有对此做出分析解释,那些只是模拟。出现的正常形状是由于我生成数据的方式,在现实生活中它可能看起来不同,但我希望趋势保持不变。我还尝试了不同大小的池化。如果池化补丁的大小增加,则对最大池化的影响会显着增加,而对于平均化则保持不变。如果池的滑动小于补丁的大小(补丁重叠),则结果向量之间会出现相关性,并且由于最大池和平均池的相关性,余弦范围会缩小更多。

我认为也可以给出适当的分析解释,如果我有结果和时间,我会再次更新答案,但我不希望改变我们在模拟中已经看到的内容。