LSH(局部敏感哈希)算法(一):SimHash算法

在许多场景中,都会遇到海量数据相似度计算的问题,如:电商场景中根据商品embedding计算相似度,取出相似的topk个商品。然而,这种计算相似度需要笛卡尔积的时间复杂度,在数据量较小时,时间还可以接受,但是当数据量达到几十万甚至几百几千万时,是没有办法接受的,这个时候就需要想其他办法。本文主要介绍海量item之间相似度计算问题——局部敏感哈希(Locality-Sensitive Hashing, LSH)之SimHash算法原理。

假设有3个商品,即:item1、item2和item3,每个商品用二维的embedding来表示,同时随机初始化6个超平面,即:s1、s2、s3、s4、s5和s6,每个超平面也是一个二维的embedding,这时可以在二维平面直角坐标系下表示,如下图:

LSH(局部敏感哈希)算法(一):SimHash算法_第1张图片

接下来,我们让每个item分别与6个超平面进行向量点积(相似度计算的一种方式),如果结果大于0,则结果为1,否则结果为0。因此会有如下结果表格:

s1 s2 s3 s4 s5 s6 SimHash
item1 1 1 1 0 0 0 111000
item2 1 1 1 0 0 0 111000
item3 0 0 0 1 1 1 000111

通过上面的表格,item1、item2和超平面s1、s2、s3的相似度(向量点积)大于0,对应表格中的值1;与s4、s5、s6的相似度小于0,对应表格中的值0。同理,item3和超平面s1、s2、s3的相似度小于0,对应表格中的值0;与s4、s5、s6的相似度大于0,对应表格中的值1。这时,把每个超平面叫做哈希函数,SimHash值是每个item与各个超平面向量点积后的二进制结果。

通过上面的介绍,我们发现item1与item2的SimHash值是一样的,而与item3的SimHash值不同。这时把SimHash值相同的放在一个桶里面,不同的放在其他桶中,如下图:

LSH(局部敏感哈希)算法(一):SimHash算法_第2张图片

如果有几十万这样的item,经过LSH之SimHash算法计算后,每个桶都会有一定数量的item。这时计算item的topk个相似item时,只需要将此item与对应桶中其他item进行相似度计算,然后找到其topk个相似的item。下面是LSH之SimHash算法伪代码:

LSH(局部敏感哈希)算法(一):SimHash算法_第3张图片

对于该算法的具体代码,可以参考:https://github.com/LinkedInAttic/scanns

5分钟搞懂LSH之SimHash算法原理 - 知乎

你可能感兴趣的:(#,RS/召回层,算法,哈希算法,人工智能)