Embedding 最重要的用法之一是作为推荐系统的召回层,解决相似物品的召回问题。在实际工程中, 能否应用 Embedding 的关键就在于能否使用 Embedding 技术 “快速” 处理几十万甚至上百万候选集, 避免增大整个推荐系统的响应延迟。
传统的 Embedding 相似度的计算方法是 Embedding 向量间的内积运算,这就意味着为了筛选某个用户的候选物品,需要对候选集合中的所有物品进行遍历。在 k 维的 Embedding 空间中,物品总数为 n ,那么遍历计算用户和物品向量相似度的时间复杂度是 O(kn)。在物品总数 n动辄达到几百万量级的推荐系统中,这样的时间复杂度是承受不了的,会导致线上模型服务过程的巨大延迟。
换一个角度思考这个问题。由于用户和物品的 Embedding 同处于一个向量空间内,所以召回与用户向量最相似的物品 Embedding 向量的过程其实是一个在向量空间内搜索最近邻的过程。如果能够找到高维空间快速搜索最近邻点的方法,那么相似 Embedding 的快速搜索问题就迎刃而解了。
一、局部敏感哈希的基本原理
局部敏感哈希的基本思想是让相邻的点落入同一个 “桶”,这样在进行最近邻搜索时,仅需要在一个桶内,或相邻的几个桶内的元素中进行搜索即可。如果保持每个桶中的元素个数在一个常数附近,就可以把最近邻搜索的时间复杂度降低到常数级别。
在欧式空间中,将高维空间的点映射到低维空间,原本相近的点在低维空间中肯定依然相近,但原本远离的点则有一定概率变成相近的点:
映射操作损失了部分距离信息,如果仅采用一个哈希函数进行分桶,则必然存在相近点误判的情况。有效的解决方法是采用 m 个哈希函数同时进行分桶。同时掉进 m 个哈希函数的同一个桶的两点,是相似点的概率将大大增加。通过分桶找到相邻点的候选集合后,就可以在有限的候选集合中通过遍历找到目标点真正的 K 近邻。
参考资料
- 深度学习推荐系统 王喆编著 中国工信出版集团
- 推荐系统 (四): Embedding 技术在推荐系统中的应用