Embedding在推荐系统中的应用:
在推荐系统中,可以通过
Embedding
向量进行快速召回
向量化召回,通过模型来学习用户和物品的兴趣向量,并通过内积来计算用户和物品之间的相似性,从而得到最终的候选集(经典的Youtube召回模型)
收集数据:神经网络需要大量的训练样本;
数据处理:根据具体问题将数据按照embedding的场景标准进行处理训练
weights:建立embedding模型训练weights;
使用weights:使用Embedding weight进行recommendation和visualizations
推荐:通过内积计算用户与物品之间的相似度可视化,可以通过PCA进行可视化
向量化召回:
使用近似最近邻查找加速:
对于在线服务,有严格的性能要求(几十毫秒)。通过保存用户兴趣
embedding和视频兴趣embedding,通过最近邻搜索的方法得到
top N的结果代表算法是LSH,局部敏感Hash
在召回阶段,将所有的物品兴趣向量映射到不同的桶内,然后将用户兴趣向量映射到桶内,这样只需要将用户向量和这个桶内的物品向量求内积即可=>大大减小计算量
如果将视频库中的每一个视频当作一个类别,那么在时刻t,对于用户U和上下文C,用户会观看视频i的概率为u
是用户的embedding(网络最后一个Relu激活函数的输出)vi是视频i的embedding
输入层的embedding分别是用户空间和Video空间的向量,最终的输出层,通过
user embedding和全部video embedding矩阵进行点积(全联接层的线性变化),将两者转换到了同一空间,所以对于用户和视频来说,输出层的embedding
是同一空间(可以理解是兴趣空间,二者的内积代表相似性)
Faiss工具
FAIR(Facebook AI Research)团队开发的AI相似性搜索工具,处理大规模d维向量近邻检索的问题 使用Faiss,Facebook 在十亿级数据集上创建的最邻近搜索(nearest neighbor search),速度提升了 8.5 倍 Faiss 只支持在 RAM 上搜索 Faiss 用 C++ 实现,支持 Python pip install faiss-cpu pip install faiss-gpu
IndexIVFFlat:
IndexFlatL2为暴力搜索,速度慢 IndexIVFFlat的目的是提供更快的搜索,首先将数据库向量通过聚类方法分割成若干子类,每个子类用类中心表示 IndexIVFFlat需要一个训练的阶段,与另外一个索引quantizer有关,通过quantizer来判断属于哪个cell 当进行查询向量计算时,选择距离最近的类中心,然后在子类中应用精确查询方法,通过增加相邻的子类个数提高索引的精确度
nlist,将数据库向量分割为多少了维诺空间
quantizer = faiss.IndexFlatL2(d) # 量化器
index.nprobe,选择n个维诺空间进行索引
通过改变nprobe的值,调节速度与精度 nprobe较小时,查询可能会出错,但时间开销很小 nprobe较大时,精度逐渐增大,但时间开销也增加 nprobe=nlist时,等效于IndexFlatL2索引类型。