海量Embedding进行相似度查询和比较的方法

这个是在科研中的现实需求。例如每一个源代码文件,我们可以生成一个embedding,如果有超过5000万个embedding(例如用BERT生成5000万个embedding),怎么样有效地计算相似性呢(例如有5000个positive的embedding,想在5000万个中找到类似的)。

简单介绍一下我尝试的结果:如果直接用torch.cosine_similarity,我手里的数据估计至少要处理两个月。这时候就想到了用LSH -- Locality Sensitive Hashing,但是我之前并没怎么用过,在GitHub上找了一下别人的实现,例如:https://github.com/kayzhu/LSHash

试了一下,发现并不好用,因为它并不给出按照index之类的排序,而是直接输出和查询的vector最相似的vector,呵呵,不知道这里的逻辑是什么。

再尝试其他办法,无意中看到有人说sklearn有LSH的实现,所以搜索了一下“sklearn LSH”,发现了这个页面:https://scikit-learn.org/0.16/modules/generated/sklearn.neighbors.LSHForest.html

发现似乎很简单,尝试了一下,结果运行的时候python报没有这个class,仔细看了一下上面的网页,发现是老的sklearn版本里才有的,并且,例如这里也讨论了,其performance并不是很好:https://github.com/scikit-learn/scikit-learn/issues/8996

所以看了看Sklearn这个包:https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors

发现里面还是有很多可以用的类的,这个package里的类如下:

sklearn.neighbors: Nearest Neighbors

User guide: See the Nearest Neighbors section for further details.

neighbors.NearestNeighbors 
neighbors.KNeighborsClassifier 
neighbors.RadiusNeighborsClassifier 
neighbors.KNeighborsRegressor 
neighbors.RadiusNeighborsRegressor 
neighbors.NearestCentroid 
neighbors.BallTree 
neighbors.KDTree 
neighbors.LSHForest 
neighbors.DistanceMetric 
neighbors.KernelDensity 
neighbors.kneighbors_graph 
neighbors.radius_neighbors_graph 

我试了一下最简单的NearestNeighors,其示例在这里:https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.NearestNeighbors.html

按照里面的示例代码,我尝试了一下,发现之前需要处理两个月的数据,现在只要三天左右就可以处理好了。相信KDTree这些类会功能更强大一些,我这里就不深入探讨了。

这个简单的思路就和大家分享到这里。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值