【思考与讨论】Top-K推荐中两种考虑问题的方式

前言

在Top-K推荐,或者说召回中,似乎并没有统一的标准,例如K的选择、评价指标(HR、NDCG、MRR、MAP等)的选择,甚至是将其看作一个什么样的问题都有两种思考的角度,这对我的理解造成了不小的困扰(因为并没有接触过工业上真正的流程)。本文是我对上述问题的自己的讨论与理解,肯定有很多有错的地方,请多多指教。
本文约2k字,预计阅读10分钟。

正文

看过不少关于Top-K推荐(召回)的文章,最终目标都是得到Top-K个推荐物品,但是模型训练的过程中,看待问题却又两种方式:

  1. 模型的输入样本包含正样本、负样本,输出是用户与候选物品交互的概率(与CTR预测一样,看作一个「二分类问题」),一般采用二元交叉熵(Binary CrossEntropy)作为代价函数;

  2. 「模型的输入并没有候选物品」,只有描述用户的信息特征。以序列推荐为例,最简单的话输入只包含了用户历史发生交互的物品。经过若干层,最终通过softmax函数,输出得到用户与整个物品池的交互概率。可以把这个过程看作一个 分类问题」代表物品集的总数),只是与图像分类问题不同,这里 特别大,因此代价函数并不是简单的分类交叉熵(Categorical Crossentropy);

接下来详细的描述在论文中两种方式的模型训练、测试。

二分类问题

将整个推荐问题看作二分类问题其实与CTR预估一模一样,不同的是在召回中的候选物品池比CTR预估要大得多。我以NCF、SASRec、attRec模型为例进行讨论。

模型训练

以下三个模型的最终输出都是对当前候选物品,用户是否交互的概率。NCF为经典的神经网络模型,SASRec、attRec为序列推荐模型。

「NCF」

NCF模型的结构如下:

【思考与讨论】Top-K推荐中两种考虑问题的方式

模型输入:

  • 用户(id);

  • 目标物品(id),正样本或负样本;

经过用户embedding和物品embedding的交互(神经网络层),最终得到用户对当前物品 交互的概率。由于物品 可能是正样本,也可能是负样本,所以最终整个模型的损失函数(二元交叉熵)为:

其中 是正样本的集合, 是负样本的集合。对于负样本的采样,一般会随机选取用户未交互的物品,正负样本的比例为1:1。

「SASRec」

SASRec是一个序列推荐模型,模型结构为:

【思考与讨论】Top-K推荐中两种考虑问题的方式

模型输入:

  • 用户的历史交互物品;

  • 目标物品(id);

与NCF唯一不同的是,SASRec通过用户的历史交互物品信息来抽象表示为用户的信息。抽象得到的用户信息与物品embedding进过交互(内积),得到对目标物品是否交互的概率,损失函数与上述相同:

正负样本的比例一般为1:1。

「attRec」

attRec也是一个序列推荐模型,模型结构如下:

【思考与讨论】Top-K推荐中两种考虑问题的方式

模型输入:

  • 用户的历史交互物品;

  • 用户(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个负样本给出了解释---计算所有的用户-物品对,计算量太大。举例来说,对于 个用户和 个物品,模型的预测需要计算 次,而 都会特别大。

【注】但工业服务,或者说是Top-K的比赛上,肯定得计算所有的用户-物品交互得分,才能得到Top-K推荐。这也是之前我对Top-K推荐中,选择作为一个二分类问题的模型,困惑最大的地方。

N分类

N分类就是将最终的结果映射到每个物品的概率,以STAMP、MIND模型为例。

模型训练

「STAMP」

模型结构如下:

【思考与讨论】Top-K推荐中两种考虑问题的方式

模型输入:

  • 用户的历史交互物品;

最后一个交互物品作为短期兴趣,序列物品信息经过注意力机制作为长期兴趣,与物品的embedding集合作一个三元组交互,得到:

其中

表示为「两个兴趣和候选物品信息之间未归一化的余弦相似度」。通过softmax函数得到每个候选物品的概率分布表示:

对于每一个元素 ,表示用户在当前session中下一次点击物品 的概率。最终的损失函数为:

我们发现,损失函数好像依旧是一个二元交叉熵,但是与上述不同的是,「损失函数采用了所有的负样本的损失」

「MIND」

模型结构如下:

【思考与讨论】Top-K推荐中两种考虑问题的方式

模型输入:

  • 用户的历史物品;

  • Label【下一个时刻点击物品的id】;

与STAMP不同的是,文章采用了一个Sampled Softmax Loss,对负样本进行采样,并不是完全使用所有的负样本的损失。

在Tensorflow文档中,对于Sampled Softmax Loss有这样的解释:

This is a faster way to train a softmax classifier over a huge number of classes.

This operation is for training only. It is generally an underestimate of the full softmax loss.

A common use case is to use this method for training, and calculate the full sigmoid loss for evaluation

这会比有大量分类的softmax分类器更快。

测试

在模型测试过程中,并不需要像NCF等模型一样,去随机选择100个负样本,而是选择所有的物品池的物品与模型得到的用户表示进行交互,得到每个物品的评分,进行排序获得Top-K推荐。因此,相比于第一种方式,MIND等模型的评价指标的得分要更低。【当然这还是与负样本的选择有关】

总结

两种方式的讨论不知道有没有参考文献或资料,个人认为主要的区别是:

  • 模型的输入与输出(输出二分类是对目标物品是否交互(0/1),而 分类则是目标物品的id);

  • 负样本的数量;

  • 运行的效率;

在工业上似乎更偏向于 分类(MIND模型),学术上两种方式都存在。

以上要是有不对的地方,希望大佬可以加我微信指进行指点,并且我有一个自己的微信交流群可以一起交流讨论。

【思考与讨论】Top-K推荐中两种考虑问题的方式

往期精彩回顾

【序列推荐】WSDM2018|Caser---非常有趣的采用卷积提取短期偏好的序列推荐模型

【序列推荐】AAAI2019|AttRec---采用度量学习来建模用户的长期偏好

序列化推荐系统的挑战,进展和展望!

扫码关注更多精彩

【思考与讨论】Top-K推荐中两种考虑问题的方式

【思考与讨论】Top-K推荐中两种考虑问题的方式

【思考与讨论】Top-K推荐中两种考虑问题的方式

【思考与讨论】Top-K推荐中两种考虑问题的方式

点分享

【思考与讨论】Top-K推荐中两种考虑问题的方式

点点赞

【思考与讨论】Top-K推荐中两种考虑问题的方式

点在看