关于推荐系统中召回模块建模采样方式的讨论

关于信息流推荐系统中召回模块建模采样方式的讨论
大家好,我是CNU小学生,国内top10-20互联网公司小兵一枚,在此抛砖引玉,真诚希望各位读者不吝赐教。

1.信息流推荐系统中的召回业务
2019年知名互联网公司的信息流推荐系统项目可大致分为4个模块:用户画像,物品画像,召回,排序。

召回模块的功能是在为排序模块提供候选集。比如我们一共有1000万个item,召回业务要在1000万个item中选出用户可能感兴趣的1万个项目,然后排序模块经过自己的模型为item打分,选定top n来展示给用户并确定展示的顺序。

召回模块的特点有两点,第一快速,第二全面。如果现在有一个超准确超高效的排序模型可以瞬间对每个item精准打分,那么我们完全不需要召回模块,可惜算力不够,这个真没有。推荐流程在3000ms内没有给出推荐结果,对于绝绝绝大多数产品而言是不可接受的。这就决定了一个在线召回模型不会是一个比排序还复杂的模型。此外离线召回也要考虑耗时,因为信息流场景需要一定实时性。

场景1.美女图片类新闻

早上8点为用户展示美女图片类新闻效果比晚上8点差很多。因为早上8点用户在公交车上,晚上8点用户躺在沙发上。排序模型必须把“当前时间”这个维度考虑进去,进行特征工程,才能达到预期效果。

类似于场景1现象还有很多,有些是我们能理解的,有些是我们不能理解的,这类问题需要通过复杂的模型(含特征工程)才能给出用户满意的结果,解决这类问题是排序模型的价值体现。召回则要剔除细节因素,全面广泛且高效快速地选拔出用户可能喜欢的东西,把相对耗时的细节处理任务交给排序。

在工程上,top10大厂有不少做到了实时召回,即用户发出请求才开始召回。更常见的召回工程是离线召回,即把所有用户的召回结果算好然后缓存到数据库中(redis,kv等),等待线上用户请求查库调用。

2.排序模型的采样方式应用在召回模块效果会好吗?
用户经过n次刷新产生了k个item的展现,那么用户点击过的item会被当做正样本,用户没点击(但展现给用户了)的item会被当做负样本。这就是排序模型的通用采样方式,当然会有其他细节的调整,在这里我们不做过多讨论。

这种采样方式对召回来说有一大缺陷,就是样本的局限性。

场景2.为蔡徐坤推荐视频

蔡徐坤是一个活跃用户,他兴趣为“唱歌,跳舞,rap,篮球”。只要你的排序系统有作用,那么理论上推荐给用户的文章90%以上是和唱歌,跳舞,rap,篮球有关的item。所以在这个场景下,你采样的正负样本有90%和唱歌,跳舞,rap,篮球有关。所以这种样本训练出来的模型对唱歌,跳舞,rap,篮球的预测相对准确,但其他的模型没见过的topic就不一定了。因为候选集已经经过了召回模块的筛选,候选集中的item大都是唱歌,跳舞,rap,篮球有关的item,所以这种采样方式(经过一些细微调整)对排序模型来说正合适。

在召回模块,这种采样方式会导致过拟合,因为item库中有关唱歌,跳舞,rap,篮球的item占比并不多,有大量的item特征在训练集中没有体现。(排序采样时会加入随机负样本来缓解这个问题,但在召回模块这样做是远远不够的)

当然,只要你的召回模型够简约,你可能根本不会碰到过拟合问题,因为你的模型就无法拟合。在不考虑时序的模型中,我们的模型无法理解为什么A和B明明相似度99%,但是用户点了A没有点B(其实是看过A就不想看B了), 在不考虑当前时间的模型中,我们的模型不明白为什么A和B明明相似度99%,但是用户点了A没有点B(其实是场景1的情况)。在不考虑xxx的模型中,我们的模型无法理解为什么A和B明明相似度99%,但是用户点了A没有点B(其实是因为xxx,解决xxx导致的问题是排序模型的价值体现)。于是正负样本开始“打架”,一个用户对特征相同的item在模型中有相反的lable。当然,你的计算资源十分充足,你使用了更复杂的模型,哈哈哈,看,我的模型收敛了!........那么你将大概率面临上一段提到的过拟合问题。

3.随机负采样能否扳回一城?
用户点击过的item为正样本,随机采负样本。

为什么不带排序的负样本玩儿?从业务角度讲。因为召回对精确度的要求远远没有排序这么高,排序的工作是10000选10(打个比方),都进入top10了,即使是没点击的文章也是用户潜在喜欢的文章。用户一刷刷出10个item,10个都有点击,这是不可能的(除非是爬虫),即便是10个相当精彩的item,用户也只会挑一部分看,这是人的天性。换句话说,只要你的排序模型不差,那么进入top10的item对于召回业务而言都是成功的召回。从技术角度讲,虽然随机采负样本可以一定程度上解决过拟合问题,但简约的模型对这种正负样本构成的数据集还是无法收敛。

随机采负样本效果如何?头部效应非常重。热文被大量分发,个性化能力大幅减弱。站在一个用户的角度看,用户的样本可以通过一些手段做到均衡化。站在一篇文章的角度看,就不是这么回事了,被频繁点击的文章有大量正样本,因为负样本是随机采样,冷文章和热文章被采到的几率相等,那么被频繁点击的文章正样本相对负样本就会多很多,多到均衡化都带不动。

场景3.随机负采样失效原因

库中有1000个item,我需要随机负采样5000次,那么理论上对于每篇文章会出现5个负样本,假设有5000次点击形成的正样本,5000个正样本里点击频率top10的item瓜分了500个点击,那么top10中的每个item就有了50个正样本。50个正样本+5个负样本带入模型训练,模型会认为这篇文章适合推荐给绝绝绝大多数人,但这篇文章很肯能是“杨幂离婚”类,“杜兰特感染冠状病毒”类,“王者荣耀新英雄”类文章(在某个大领域人人都关注,点击,但出了这个圈子有大量人其实并不care)。

4.基于其他用户点击的负采样
用户产生点击的item作为正样本,在为该用户采样时,随机几个其他用户,将其他用户的点击作为该用户的负样本。这种采样方式经过作者实践证明有效。

频繁被点击的文章会被频繁负采样,可做到文章侧的样本均衡,有效减轻了头部效应。并且相对于排序的负采样,数据的广度更宽,模型可处理多种类型的文章。

原文链接:https://blog.csdn.net/u011233351/article/details/104951598/

posted @ 2022-01-21 16:46  今夜无风  阅读(100)  评论(0编辑  收藏  举报