matrix completion
上述矩阵补充模型:
基于embadding做推荐,输入用户和物品id,输出一个实数,即用户对物品兴趣的预估值。把id映射到一个向量a,是对用户的表征,embadding层是一个矩阵,a是矩阵的一列;b是物品的表征,a与b长度相同,两个embadding层不共享参数。
模型训练的思路:
求最小化,可以使用随机梯度下降等算法,随机更新矩阵a和b的一列,从而学出矩阵A和B。
为什么称为矩阵补充?
矩阵中大多是灰色没有曝光,使用绿色位置数据训练模型,从而预估灰色部分的分数,进而进行推荐。每一行选取分数高的推荐给用户。
但工业中不使用矩阵补充。原因:
基于矩阵补充的线上服务:
训练好模型之后,可以用于推荐系统中的召回通道。
用户和笔记的数量很多,从而矩阵A 和B的列数很多,需要特殊的存储方法保证可以快速找到。
最近邻查找nearest neighbor search,但逐一对比所有物品是不现实的,达不到线上的实时查找。接下来通过一些算法,加速最近邻查找,避免暴力枚举。
近似最近邻查找:
推荐系统最常用的是余弦相似度,其最近邻就是向量夹角最小的,但有的系统不支持余弦相似度,将所有向量做归一化,其二范数等于1,其内积就是余弦相似度。
每一个点的embadding向量都是模型训练的时候计算出来的,想要召回某个用户感兴趣的物品。
介绍一种加速最近邻查找的算法:
近似最近邻查找:
step1: 线上服务之前,先做数据预处理,数据划分很多区域,划分方法取决于最近邻衡量的标准,余弦相似度是下图的扇形;欧式距离划分结果是多边形。
step2: 划分区域之后建立索引,每个区域用一个单位向量表示,将这个向量作为区域的key,将区域中所有点的列表作为value,即给定某一区域的key,就可以快速取回该区域的所有点。
有了这样的索引就可以在线上快速做召回。
step3: 线上给用户做推荐,用户的embadding向量记作a,将a与索引中的key向量做对比,计算相似度,索引数量远低于全部物品的数量,找到相似度最高的索引。
step4: 通过索引找到该区域的全部物品,找a最相似的三个点,即夹角最小的点,这三个物品就是找到的结果。
总结:
工业界使用更先进的双塔模型。query查询