这篇文章介绍矩阵补充(matrix completion),它是一种向量召回通道。矩阵补充的本质是对用户 ID 和物品 ID 做 embedding,并用两个 embedding 向量的內积预估用户对物品的兴趣。值得注意的是,矩阵补充存在诸多缺点,在实践中效果远不及双塔模型。
上篇文章介绍了embedding,它可以把用户ID和物品ID 映射成向量,这张图就是基于embedding做推荐的。模型的输入是用户ID和物品ID,模型的输出是一个实数,是用户对于物品兴趣的预估值,这个数越大表示用户对物品越感兴趣。这张图的左边有一个embedding层,把一个用户ID映射到一个向量,记作a,这个向量是对用户的表征。上篇文章讲了,embedding层的参数是一个矩阵,矩阵中列的数量是用户数量,每一列都是图中a这么大的向量。embedding层的参数数量=用户数量*向量a的大小。右边结构也是一个embedding层,把一个物品ID映射到一个向量,记作b,这个向量是对物品的表征。因为embedding层的参数是一个矩阵,矩阵中列的数量是物品数量,每一列都是图中b这么大的向量。embedding层的参数数量=物品数量*向量b的大小。对向量a和向量b求内积得到一个实数作为模型的输出,这个模型就是矩阵补充模型。
问题来了,这么训练这个模型呢?
数据集:使用一个(用户ID,物品ID,兴趣分数) 三元组集合
详细解释一下这个公式,这里的是训练集中的一条数据,意思是用户u对物品i的真实兴趣分数y,是向量a和b的内积,它是模型对兴趣分数的预估,反映的是第u号用户有多喜欢第i号物品,是真实兴趣分数y与预估值之间的差,我们希望这个差越小越好,干脆取差的平方,差的平方越小,证明预估值越接近真实值y。对每一条记录的差的平方求和,作为优化的目标函数,对目标函数求最小化。
刚才拿绿色位置的数据作为数据集训练出了模型,这个模型又返回来预测出所有灰色位置的分数,即把矩阵中空的位置补全。这就是模型叫矩阵补充的原因。
那么补全到底有什么意义呢?把矩阵补全后就可以做推荐。选出一行中分数最高的几个物品推荐给这一行的这个用户。是不是看起来很高级?其实这个方法是有很大缺点的,它仅仅用了2个embedding层,把用户ID和物品ID 映射成2个向量,仅此而已。以小红书为例,小红书会记录物品属性(类目,关键词,地理位置,作者信息)和用户属性 (性别,年龄,地理位置,感兴趣的类目),这个方法根本没用到这些信息,如果我们能把这些信息应用到召回中,召回会做的更加精准。其次,这个方法做训练的效果很不好,因为用内积不如用余弦相似度,用平方损失(做回归)不如用交叉熵损失(做分类)。
总结一下矩阵补充:
最后来思考一个比较深入的问题:矩阵分解和矩阵补充有什么区别呢?
矩阵填充是一个task,矩阵分解是一类operation。(填充是目的,分解是手段!)
已知一个部分可观察的矩阵M,用M其他行的已知值(每一行包含一个用户对所有商品的已知评分),来估计并填充某一行的缺失值。若要对所有用户进行预测,便是填充整个矩阵,这是所谓“协同过滤本质是矩阵填充”。
矩阵补全(Matrix Completion)目的是为了估计矩阵中缺失的部分(不可观察的部分),可以看做是用矩阵X近似矩阵M,然后用X中的元素作为矩阵M中不可观察部分的元素的估计。
矩阵分解(Matrix Factorization)是指用 A*B 来近似矩阵M,那么 A*B 的元素就可以用于估计M中对应不可见位置的元素值,而A*B可以看做是M的分解,所以称作Matrix Factorization。
上面有一个词叫『近似』,这个近似的方式是有多种的,有各种不同的loss和不同的表达『近似』的建模方法。
总的来说,通过以上描述可知,矩阵分解可以用于矩阵补全任务。此外,做矩阵分解也可以用于分解一个完全观察的矩阵,比如通过分解来对一个完全观察的矩阵做有损压缩和低维表示等等。而且,矩阵补全也并不总是采用分解的方法