浅析Faiss在推荐系统中的应用及原理

以前在业务中应用了许多Faiss,也看了几篇关于Faiss的论文,简单记录下Faiss的一些属性和应用。Faiss是Facebook的AI团队开源的一套用于作聚类或者类似性搜索的软件库,底层是用C++实现。Faiss由于超级优越的性能,被普遍应用于推荐相关的业务当中。接下来分Faiss在推荐业务应用和Faiss的基本原理两部分进行介绍。git

1 Faiss在推荐业务中的应用

在个人认知里,基本上50%以上的手机APP的推荐业务会应用到Faiss服务,可见应用之广。那Faiss到底是在哪一个模块使用呢,经过下方这个图给你们介绍:github

屏幕快照 2020-05-05 下午5.36.50.png

你们都知道推荐业务包含排序和召回两个模块,Faiss比较多的应用在召回模块。召回业务中有不少是向量生成类的算法,好比Graph Embedding、ALS Embedding、FM Embedding等。ALS就是经典的矩阵分解算法,它能够将User和Item的行为数据利用矩阵分解的方式生成User向量和Item向量,这些向量分别表明User和Item的属性(工科研究生矩阵论课程学过矩阵分解,不懂的同窗要补课了)。算法

当咱们拿到了User和Item的向量,只要计算出哪些Item和User的向量距离较短(最简单的解法是算欧式距离),就能够得出User偏心的Item。可是当User和Item的数量巨大的时候,设想下某短视频平台,天天有上百万User登陆,有存量的上千万的Item短视频,怎么能快速的计算出向量距离,就成了一个亟待解决的技术难点,由于推荐业务的召回模块须要在50ms之内拿到结果。这也就是Faiss的价值所在,Faiss几乎能够在10ms内完成百万*百万以上的向量距离计算,它是怎么实现的呢?性能

2 Faiss原理

向量计算是一个最经典的时空优化问题,在查询过程当中创建更多地索引当然能够提高查询速度,可是却有占据了存储空间,咱们但愿系统能够即减小索引又能提高查询性能。优化

为了获得时间和空间的最优,Faiss使用了PCA和PQ两个手段进行向量压缩和编码,固然还有其它的一些优化手段,可是PCA和PQ是最为核心的。编码

PCA降维

PCA是一种降维手段,简单理解就是将高维向量变为低围,这样就能够有效的节省存储空间,PCA我以前介绍过,今天就很少说了。有兴趣能够看下个人博客:spa

个人博客-PCA.net

你们看下图绿色的点,它实际上是二维的,既有纵向坐标的属性也有横向坐标的属性,能够用PCA方式让它变为一维,这样就成了红色这样的点簇、视频

PQ编码

Product quantization(乘积量化PQ),PQ是一种创建索引的方式。这里参考这篇文章为你们说明:http://www.fabwrite.com/productquantizationblog

假设原始向量是1024维,能够把它拆解成8个子向量,每一个子向量128维。

 

而后对每一个字向量的所有50k数据分别做Kmeans计算,假设设置Kmeans的K为256。就获得了8组,每组256个中心点这样的码本,这个码本能够对50k个向量进行编码。

image.png

 

也就是说把编码从原始的1024个向量须要32bit,压缩成了只须要log(256),8位来表示。这样每一个向量的索引就减小了许多。

image.png

 

参考文档(衷心感谢如下老师们的贡献):

(1)http://www.fabwrite.com/productquantization

(2)https://github.com/facebookresearch/faiss

相关文章
相关标签/搜索