打了比赛。 为了更好地构建其中的负样本,需要计算不同句子之间的相似性。 句子约有100w,句子向量为300维,中途踩了很多洞,进行记录。
暴力计算最简单的idea是预先分配100w x 100w的矩阵,逐个计算即可
当然,实际上不能直接计算。 理由如下。
importnumpyasnpnp.zeros ([ 1000000,100000 ],dtype=np.float16 ) )。
由于numpy中的每个float32类型数据占用4个字节,因此预分配这些数组所需的总内存如下
1000000 * 100000 *4/1024/1024/1024/1024=3.6379 TB
因此,我发现对个人和小团队来说这是非常不现实的。 那么,如何优化这个过程呢?
需要记录所有数据吗? 只计算topk的数据【笨蛋方案】如果只是需要记录topk的数据,正好可以分配较小的数组进行相似度的计算【暴力计算】“-我后来使用的方法”
降维算法【一般方案】word2vec在每个word上生成300维向量,直接计算300维向量之间相似度的运算量很大,可以使用降维的方法
推荐:推荐阅读一些相关搜索算法/库【实际有用方法】:
topk相似性性能比较(kd-tree、kd-ball、faiss、annoy、线性搜索) ) ) ) ) ) ) ) ) ) )。
详细求解KD树
kNN中的两种优化数据结构: kd-tree和ball-tree在算法实现原理上有什么区别?
KD树沿卡迪尔轴或坐标轴分割数据,而ball树沿一系列hyper-spheres分割数据
paper : whatisagoodnearestneighborsalgorithmforfindingsimilarpatchesinimages?论文的最终结论:
Faiss的githubfaiss-alibraryforefficientsimilaritysearchandclusteringofdensevectors。
Faiss是针对Facebook开源稠密向量提供高效的相似度检索和聚类的框架
我在网上找了没有特别详细的Faiss原理性文章,Faiss的论文billion-scalesimilaritysearchwithgpus,或者这篇文章也相当详细的facebookaisimilaritysearch (facebokaisimilaritysearch )
请参阅文章:
你知道应该怎么把40w*40w的矩阵初始化到内存中吗?
8 .关于8. CSDN 【Python】numpy数组占用内存空间的问题