前言
在Top-K推荐,或者说召回中,似乎并没有统一的标准,例如K的选择、评价指标(HR、NDCG、MRR、MAP等)的选择,甚至是将其看作一个什么样的问题都有两种思考的角度,这对我的理解造成了不小的困扰(因为并没有接触过工业上真正的流程)。本文是我对上述问题的自己的讨论与理解,肯定有很多有错的地方,请多多指教。
本文约2k字,预计阅读10分钟。
正文
看过不少关于Top-K推荐(召回)的文章,最终目标都是得到Top-K个推荐物品,但是模型训练的过程中,看待问题却又两种方式:
模型的输入样本包含正样本、负样本,输出是用户与候选物品交互的概率(与CTR预测一样,看作一个「二分类问题」),一般采用二元交叉熵(Binary CrossEntropy)作为代价函数;
「模型的输入并没有候选物品」,只有描述用户的信息特征。以序列推荐为例,最简单的话输入只包含了用户历史发生交互的物品。经过若干层,最终通过softmax函数,输出得到用户与整个物品池的交互概率。可以把这个过程看作一个 「 分类问题」( 代表物品集的总数),只是与图像分类问题不同,这里 「 」 特别大,因此代价函数并不是简单的分类交叉熵(Categorical Crossentropy);
接下来详细的描述在论文中两种方式的模型训练、测试。
二分类问题
将整个推荐问题看作二分类问题其实与CTR预估一模一样,不同的是在召回中的候选物品池比CTR预估要大得多。我以NCF、SASRec、attRec模型为例进行讨论。
模型训练
以下三个模型的最终输出都是对当前候选物品,用户是否交互的概率。NCF为经典的神经网络模型,SASRec、attRec为序列推荐模型。
「NCF」
NCF模型的结构如下:
模型输入:
用户(id);
目标物品(id),正样本或负样本;
经过用户embedding和物品embedding的交互(神经网络层),最终得到用户对当前物品 交互的概率。由于物品 可能是正样本,也可能是负样本,所以最终整个模型的损失函数(二元交叉熵)为:
其中 是正样本的集合, 是负样本的集合。对于负样本的采样,一般会随机选取用户未交互的物品,正负样本的比例为1:1。
「SASRec」
SASRec是一个序列推荐模型,模型结构为:
模型输入:
用户的历史交互物品;
目标物品(id);
与NCF唯一不同的是,SASRec通过用户的历史交互物品信息来抽象表示为用户的信息。抽象得到的用户信息与物品embedding进过交互(内积),得到对目标物品是否交互的概率,损失函数与上述相同:
正负样本的比例一般为1:1。
「attRec」
attRec也是一个序列推荐模型,模型结构如下:
模型输入:
用户的历史交互物品;
用户(id);
目标物品(id);
序列embedding信息通过自注意力模块,得到用户短期兴趣的抽象表示,用户embedding信息作为用户的长期偏好表示,分别与物品embedding信息进行交互(内积),加权得到最终用户对目标物品是否交互的概率。
与SASRec模型不同的是,attRec采用对排序方法来学习模型参数,因此损失函数为:
模型测试
对于将推荐问题看作是二分类的模型,测试方法如出一辙,都是对于一个测试的正样本,然后随机选择100个负样本,通过模型预测,得到每个样本的交互概率进行排序,最终获得Top-K物品列表,选择HR、NDCG等指标衡量模型的性能。以下是SASRec论文的阐述:
❝To avoid heavy computation on all user-item pairs, we followed the strategy in [14], [48]. For each user u, we randomly sample 100 negative items, and rank these items with the ground-truth item.
❞
对于选择100个负样本给出了解释---计算所有的用户-物品对,计算量太大。举例来说,对于