Huggingface库有一个非常棒的特性:它可以在嵌入数据集上创建FAISS索引,从而允许搜索最近的邻居。
train_ds['train'].add_faiss_index("embedding")
scores, sample = train_ds.get_nearest_examples("embedding", query_embedding, k=10)我试图理解scores的意义和它背后的直觉。例如,如果我们将余弦相似性与faiss搜索分数联系起来,这就是我们得到的结果:
from scipy.spatial.distance import cosine
print("cosine sim", "faiss score")
for i in range(10):
distance = cosine(query_embedding, sample["embedding"][i])
print(np.round(1-distance, 3), scores[i])我们得到了这个:
cosine sim faiss score
0.9983 75.67109
0.9961 149.42262
0.9969 169.43077
0.9939 243.45598
0.9914 284.8134
0.9963 309.41052
0.9934 327.74158
0.9898 330.72858
0.9897 337.12408
0.99 337.60126 正如你所看到的,余弦的相似性是相当一致的,并且非常接近1。然而,faiss搜索的分数差别很大。我试图了解这些数字代表了什么,以及它们是如何计算出来的。它们能用于返回搜索结果吗?不幸的是,文档没有涵盖这一点。
发布于 2022-08-26 15:26:44
FAISS使用binning和PQ (产品量化)快速获得近似答案,并且需要的内存大大减少。因此,分数可能会反弹,因为这个近似。它甚至不保证找到所有的KNN,因为它的近似(由于取样的一些桶,我认为)。
所以是的,如果你想要的话,你可以使用一个截止线,意识到FAISS正在采取的聪明的捷径永远不会产生与余弦相似的东西。但是余弦相似性不能完成FAISS所能完成的任务。
https://stackoverflow.com/questions/73283413
复制相似问题