本文约3100字 ,建议阅读10分钟
本文介绍快手的生成式推荐方案,应用到重排阶段。
本文介绍我们团队在快手生成式推荐上的方案,应用到重排阶段,在多个场景推全,取得了比较显著的收益,文章已经录用到KDD 2024。
Non-autoregressive Generative Models for Reranking Recommendation https://arxiv.org/pdf/2402.06871
本文也会针对KDD 2024现场的问题进行解答,有疑问也欢迎大家一起讨论。
重排是推荐链路中的最后一环,直接决定给用户呈现的视频推荐列表。用户对于某个视频的反馈取决于其对应的上下文,比如用户喜欢网球类的运动视频,但是连续给用户推多个和网球比较接近的视频,用户会不再点击后续的视频。所以相比精排、粗排的单点打分,重排会着重考虑视频相互之间的影响和整体收益的最大化。
图1 重排存在的挑战 重排给定精排的 n 个候选,从中选择 m 个视频并给出 m 个视频的展示顺序。重排的候选序列个数为 个,穷举所有候选序列复杂度过高。同时在给定候选下,只有一条序列会曝光给用户,存在样本稀疏问题。相比在推荐系统中常提及的用户针对某个item反馈稀疏的问题,用户对于某个序列的反馈将会更加稀疏。另外,考虑到线上推荐系统海量的实时要求,重排的关键问题则为如何在有限的资源约束和稀疏的训练样本下最大化推荐列表的用户收益 。
现有重排的方法可以大致分为一阶段和两阶段的方法:
一阶段方法将重排作为检索任务,根据精排模型的分数选择其中top k个视频。这类方法根据每个视频的单点预估分进行微调,再根据微调之后的预估分进行排序。但是这类方法存在逻辑悖论,排序过程后的序列顺序和排序之前的顺序不一致,这使得模型的预估分不再具有参考意义。 两阶段方法将重排拆解为generator-evaluator框架。Generator负责生成多个合理的序列,evaluator再从其中选择最优的序列。其中的generator可以分为启发式方法和生成式模型。生成式模型通常选择自回归的方式。
在线上部署自回归生成模型存在着诸多挑战:
训练过程是teacher forcing的形式,但是在推理过程中模型根据前一个timestep生成的视频再进行后续的生成,会存在误差累积的现象。 自回归生成模型只考虑了前序视频的影响,没有考虑后续视频的影响。
因此我们提出了非自回归生成模型,该模型可以在一次推理过程中生成整个推荐视频序列,大大减小了线上模型的推理时间。
图2 自回归生成模型 vs 非自回归生成模型 匹配模型
首先,我们需要解决的问题是如何使得生成模型在推荐场景的训练可以收敛。
相比文本序列而言,推荐的序列更为稀疏。以n-gram为单位,文本序列存在较多co-occurence,但是在推荐场景,相同序列很少出现在不同的用户推荐结果中。 在训练过程中每条样本的候选结果并不一致,存在可变词表的问题。
之前的方法Seq2Slate更多通过判别式模型来生成候选,第一次挑选ctr概率最高的item,之后再选择和现有item放在一起ctr概率最高的item,该方法并不直接预估每个item出现的概率。此外,由于在训练数据中大量的排列组合并不存在,所以该模型也会面临比较大的泛化问题。
针对以上问题,借鉴NLP中weight tying的思想,我们设计了匹配模型来解决可变词表问题。具体而言,该匹配模型分为候选编码器和位置编码器两个部分,候选编码器用于有效编码候选表示,位置编码器用于捕获位置特定的信息。我们将不同样本的位置embedding共享,从而提升模型在稀疏样本下的训练效率。
候选视频i经过候选视频编码器之后得到对应的表示 ,每个位置j的embedding随机初始化,之后经过位置编码器之后得到对应的表示 。候选视频 i 和位置 j 两两之间计算内积,最后得到一个 的分布矩阵,其中 具体为位置 j 为第 i 个候选视频的概率。
对比解码方法
自回归生成模型将序列的概率分解为一系列条件概率的连乘:
非自回归生成模型则去掉了生成序列之间的依赖关系,这引入了不同位置的选择之间条件独立的假设:
图3 条件独立假设示例
该假设会导致多峰分布问题。具体而言,图3左图为实际分布,其中有两个合理序列"no problem"和"of course"。在条件独立假设下,右图和左图的边缘分布完全一致,在第一个位置"no"和"of"的概率都是50%,在第二个位置"problem"和"course"的概率也是50%。但是右图出现了"no course"和"of problem"这样不合理的序列。这是条件独立假设所带来的多峰分布问题,会将不同合理序列的部分拼接在一起,从而导致生成的序列不合理。
在每个位置选择候选时,我们考虑每个候选视频在位置 的出现概率 ,同时考虑其与此前已经选择的视频之间的embedding相似度最大值作为正则项 ,该指标用于近似每个候选视频在已经选择的视频条件下的转移概率:
其中 。
不似然损失函数
重排的目标是最大化序列整体的用户收益:
而序列生成的目标是最大似然序列:
线上的曝光序列同时存在用户反馈较好的样本,同时也存在用户反馈不佳的样本,所以最大似然曝光序列与重排的目标之间存在一定差异。相比NLP来说,NLP中用于训练的语料往往符合常见的用语习惯,所以NLP生成的目标是最大化序列的似然函数。然而在推荐中没有最优组合的ground truth,所以该优化目标不适用。因此我们提出了序列不似然损失函数,在最大化似然函数效率高的序列同时最小似然效率低的序列。
给定候选 X 和负向曝光序列 Y ,序列不似然损失函数为:
当 越小时, 将会更小。
实验
首先是在数据集上的离线实验,由于现有推荐场景并没有针对序列生成定义的指标(类似nlp的ppl之类的),ndcg也更多是单点排序的label,更适用于搜索场景而不是推荐场景。另外,Avito的候选数量和生成数量都是5,所以我们在avito指标上采用了现有paper常用的auc和ndcg作为评估。同时,我们也给出了不同方法中generator对应的训练速度和推理速度,对比其他baseline方法,我们的方法在多个指标上都实现了SOTA。且由于我们的非自回归特性,我们的训练和推理速度相比自回归生成模型快很多,和单点排序模型相当。
图4 在Avito数据集上NAR4Rec与现有方法的比较 图5 在快手离线数据集上NAR4Rec与现有方法的比较 在快手离线数据集上,每条样本由60个候选和6个最终展示的item构成,所以我们针对该场景构造了label,如果出现在最后的item中,label为1,否则为0。最后根据二分类的概率预估值排序,计算recall@6和recall@10。
此外,我们在论文中也给出了对比解码方法和序列不似然损失函数的消融实验。
最后是我们在线上ab实验的效果,我们的方法在线上取得了显著了收益。
图6 线上a/b test实验结果 以下是在会场上碰到的问题:
Q: NAR4Rec如何处理序列长度不一致的情况?
由于我们线上设定是固定的长度,所以我们并没有考虑到序列变长的问题。postion embedding设置为固定的长度,在不同的样本之间是共享的,这部分参数也是可以训练的。如果想处理变长的情况,可以设置预测序列生成长度的任务,这方面在nlp上有比较多的相关工作。
Q: NAR4Rec中交换序列label两个item的位置,对于最后的预估会有变化吗?
由于每个位置的item是不一样的,交换两个item的位置,最后的概率矩阵会有所不同,这时候计算得到的loss也就不一样了。值得一提的是,我们并没有在候选编码器(position encoder)中加入候选的顺序信息(position embedding),如果只是交换item的输入顺序,那对最后的预估是没有影响的。
Q: Contrastive decoding仅仅生成一条序列,而不是生成多条序列吗? 是的,在我们的公式里面,contrastive decoding每次都是贪心选取最大值,当然这也可以兼容beam search的框架生成多条可能的候选序列。也可以是top-k sampling的方式加入一些采样的随机性。在线上的generator-evaluator框架中,我们的模型作为其中一路序列生成来源。 我们通过后验的互动label(整个序列的label是序列中每个item的单点label加和)来定义正负序列,大于某个阈值则为正向序列,小于某个阈值则为负向序列。