深入理解推荐系统:召回

深入理解 YouTube 推荐系统算法

深入理解推荐系统:排序

作为【推荐系统】系列文章的第三篇,将以“排序”作为今天的主角,会从四个方面来介绍推荐系统中的排序模块,即建模目标、样本与特征、常见模型和粗排与精排的方法。

最近正好在做 KDD Cup:Debiasing 赛道,不同于其它类型的比赛,推荐系统中的排序建模需要大家自己构建正负样本。本文也将作为方法梳理,希望能帮助到大家。

一、背景介绍

推荐系统整体架构

排序是推荐系统的第二阶段,从召回阶段获得少量的商品交给排序阶段,排序阶段可以融入较多特征,使用复杂模型,来精准地做个性化推荐。排序所强调的是快和准,快指的是高效的反馈结果,准指的是推荐结果准确性高。

具体地,在生成候选对象之后,另一个模型会对生成的候选对象进行打分和排序,得到最后要推送的 item 列表。 推荐系统可能具有使用不同来源的多个召回队列,例如:

  • 矩阵分解模型的相关 item。
  • 根据各类标签下的用户 item。
  • “本地”与“非本地”项目; 也就是说,要考虑地理信息。
  • 热门或流行 item。
  • 社交网络; 也就是朋友喜欢或推荐的 item。

系统将这些不同的来源组合成一个通用的候选库,然后由单个模型对其进行打分并根据该分数进行排名。 例如,系统可以根据以下特征训练模型以预测用户观看视频的概率:

  • 查询特征(例如,用户观看记录,语言,国家/地区,时间)
  • 视频特征(例如标题,标签,视频 Embedding)

然后,系统可以根据模型的预测对候选库中的视频进行排序。

二、建模目标

排序的目标是根据业务目标来不断变化的,最早期,业务目标简单,需要聚焦的时候,往往会选取 ⼀个指标来重点优化,当做到中期的时候,就会发现单 ⼀指标对整体的提升已经非常有限了,或者说会出现很多问题,这个时候,往往就会引入多目标排序来解决这些问题。另一个方面,pointwise、pairwise 和 listwise 本身它们都属于排序目标的一部分,但通常会认为它们也属于不同模型,我们放到后面再讲。我们以小视频自身的排序目标发展来说明排序目标的意义和如何根据业务需求,改进排序目标。

2.1 pointwise、pairwise 和 listwise

常用的排序算法框架有 pointwise、pairwise、listwise 三类,上图中 x1,x2,… 代表的是训练样本 1,2,… 的特征,y1,y2,s1,… 等是训练集的 label(目标函数值)。pointwise 学习单个样本,如果最终预测目标是一个实数值,就是回归问题,如果目标是概率预测,就是一个分类问题,例如 CTR 预估。pairwise 和 listwise 分别学习一对有序对和一个有序序列的样本特征,考虑得更加精细。在推荐系统中常用 pointwise 方法来做排序,它更直观,易于理解,也更简单。

2.2 回归方式预估完成率

这里以小视频业务为例,小视频的业务形态与短视频有很大的不同,由于全屏滑动这一形态的引入从而会面临传统点击率预估之外的建模问题,也就是完成率建模。不一样的完成率代表着用户不一样的满意程度,那自然而然的想法就是把完成率这个连续值作为目标来预估,那么,我们的问题就变成了 ⼀个回归问题了,看似完美解决了我们的问题。而实际实验的效果却和预期的大相径庭,其原因还得做进一步讨论。

2.3 多目标排序

我们上述说的都是单目标排序的各种建模方式,随着业务的发展,我们会发现单目标排序迭代对系统的提升越来越有限了。一般多目标是学点击,时长,消费,点赞,评论,分享等,模型能确实学到的输出是有切实含义的,比如点击的概率,观看的时长,用户到底会花多少钱等。比如我们以完成率建模,短视频的完成率天生就要比长视频要高;作者会想办法发各种骗完成率的视频,类似列表页产品形态中的标题党,比如,猜谜类视频等。这些问题反映了单指标建模的脆弱性,所以,多目标建模的鲁棒性就由此凸显出来了。而多目标建模中难点在于如何平衡多个建模目标之间的关系,目前的通用做法是将多个 q 加权或连乘,比如 Prob(click) * watch_time,也就是人工的去制定规则,这种方式可以快速见效、简单、快捷,而且便于理解。但 ⼀个很致命的问题是,人工规则没办法挑选出最优的解。其次,当其中的 ⼀个因 ⼦发生变化时,比如值域发生变化,就会导致整体的公式失效。如何系统的去解决这两个问题,是多目标建模中的重点和难点。

值得注意的是,Google 在 RecSys 2019 上的最新论文《Recommending What Videoto Watch Next: A Multitask Ranking System》。该论文是 YouTube 上实践的一篇文章,并且内容应该比较实用。论文本身虽然没有提出特别新颖的结构,但内容很实在,也 work,算是推荐系统中排序模块很通俗易懂的文章了,论文主要聚焦于大规模视频推荐中的排序阶段,介绍一些比较实在的经验和教训。提出了一套大规模多目标排序框架应用于 YouTube 视频推荐,引入 MMoE 解决多目标学习,以及解决用户隐式反馈中的 selection Bias 问题。

三、样本与特征

我们先来说说样本,样本与模型有什么关系呢,形象化的理解样本是模型的养料,一个模型能够得到很好的结果,很大一部分成程度上是由样本的质量决定的。当然,不同的业务数据量,样本的质量通常存在很大的差异,所以,在样本上我们的问题就变成了如何根据业务目标,构造合适的样本并加以使用。我们再来看看特征,特征是用来刻画样本的维度,没有特征,样本就只有一个 label,只有看到了特征,我们才能理解样本长得什么样。这也是为什么要办样本和特征放在一起讨论的原因。

理论上,模型学习的空间是样本空间,而我们理想建模的空间是真实空间。如果样本是真实空间的无偏采样,那么,在样本足够充足的情况且模型足够强大的情况下,我们是能学习到真实分布的。但很遗憾,我们很难去评估样本的采样是否是无偏的,模型也并不是那么强大。所以,当我们模型训练完之后,测试集的 error 实际就是样本能力和模型学习能力的两部分 error 的加和。模型的学习能力通常根据模型的差异,是相对固定的。比如,svm 就是比 lr 误差要小。所以,在模型选型的大方向上,大家都是差不多的。真正比拼的实际就是算法工程师做 样本和做特征的能力。

那么,什么是合适的样本呢?合适的样本是符合业务产出逻辑,同优化目标 ⼀致的单元。举个例子,我要训练一个点击率模型,那么一条样本就是一个展现或者点击的记录。如果我要训练一个留存模型,那么,样本就是这个用户前一天看了哪些记录,他们合并作为一个样本。也就是说,样本的定义不是一成不变的,而是根据业务目标,人为构造的,但是这个构造方式是要在逻辑上和业务目标融洽的。如果你要训练一个留存模型,把用户前一天搜索的关键词作为样本,那么,可能就不是那么融洽了。样本的构造是一个看起来很容易,但是缺很难做的工作,它需要对业务很深刻的理解,才能发掘出有效的样本构造方式。

说完样本,我们再来看看特征。大部分做模型的同学实际都是做特征,特征的收益还是蛮高的。特征工作的基本思路是,人工预判有效特征-> 离线评估重要度和覆盖率-> 训练模型离线评估-> 在线实验。总的来说在比较低的层面,充斥着大量的数据清洗工作和 ETL(Extraction-Transformation-Loading)工作,但从长远看,特征工程的优劣决定了模型的上限,早期的 lr,模型并没有多复杂,但是却被业内使 ⽤多年,就是因为其中汇聚了特征工程的大量经验和高效性。特征工程发展到现在,想要带来比较大的提升的特征往往是根据业务场景的 session 行为精心设计的特征,比如常见的退场特征,搜索特征等。这些特征同样需要 ⼯程师对业务的深刻理解以及对用户行为的细致研究。深度学习带来的 ⼀波红利就是特征提取的自动化,但是在推荐系统中,业务场景的复杂程度要远远高于 cv 等常见特征自动提取场景。所以,特征工程的存在还是有其必要性的,特别是一些高级特征。

3.1 常见基础特征

用户侧的特征,如用户的性别、年龄、地域、购买力、家庭结构等。

商品侧的特征,如商品描述信息、价格、标签等。

上下文及场景特征,如位置、页面、是否是周末节假日等。

交叉特征,如用户侧特征与商品侧特征的交叉等。

用户的行为特征,如用户点击、收藏、购买、观看等。

四、常见模型

推荐系统排序早期都是 lr,后续演变成 gbdt + lr 的方式,再到后来的 dnn、fm、wide & deep 等。排序目标上,目前业内主要还是 pointwise。pairwise 据我了解,在部分场景也有应用。listwise 大部分都属于调研性质的了。另外,前段时间大火的强化学习,看起来在实际的业务 场景中,并不能很好的落地,所以,目前还没见到比较成功的应用。阿里的 DIN 是不错的尝试,可以找来读读。RNN 系列的 LSTM,seq2seq 目前没看到很成功的范例。总的来说,以我 所 ⻅,在模型结构上想要作出出色的 ⼯作,是有 ⼀定难度的,所以,结合业务情况,可以在项目优先级上作出 ⼀定取舍。

4.1 LR

lr 是比较简单的线性模型,通过学习用户点击行为来构建 CTR 预估。利用 logistic 回归构建推荐算法模型,具体模型如下面公式。

其中, 是用户喜欢某个标的物的概率; 是权重,是需要学习的模型参数; 是特征 的值。我们可以通过上述公式计算待推荐标的物的 值。最终我们可以按照 值的大小降序排列来对召回的标的物列表做排序。

在工业界,为了更好地将该模型应用到真实业务场景中,很多公司对 lr 模型做了推广。比如用到在线实时推荐场景中做排序,有 Google 在 2013 年推广的 FTRL,以及阿里推广的分片线性模型。

4.2 GBDT+LR

GBDT(Gradient Boosting Decision Tree)是一种基于迭代思路构造的决策树算法,该算法在实际问题中将生成多棵决策树,并将所有树的结果进行汇总来得到最终答案,该算法将决策树与集成思想进行了有效的结合,通过将弱学习器提升为强学习器的集成方法来提高预测精度。GBDT 是一类泛化能力较强的学习算法。

2014 年 Facebook 发表了一篇介绍将 GBDT+LR(Logistic Regression)模型用于其广告 CTR 预估的论文,开启了利用 GBDT 模型应用于搜索、推荐、广告业务的先河。GBDT 作为一种常用的树模型,可天然地对原始特征进行特征划分、特征组合和特征选择,并得到高阶特征属性和非线性映射。从而可将 GBDT 模型抽象为一个特征处理器,通过 GBDT 分析原始特征获取到更利于 LR 分析的新特征,这也正是 GBDT+LR 模型的核心思想——利用 GBDT 构造的新特征来训练 LR 模型。

4.3 Wide&deep

Wide&deep 模型最早被 Google 提出来,并用于 Android 手机应用商店上 APP 的推荐排序。目前该算法在国内很多互联网企业得到大规模的采用,有比较好的效果。该模型将传统模型和深度学习模型相结合。wide 部分(传统模型,如 logistic 回归)起记忆(memorization)的作用,即从历史数据中发现 item 或者特征之间的相关性,deep 部分(深度学习模型)起泛化(generalization)的作用,即相关性的传递,发现在历史数据中很少或者没有出现的新的特征组合,寻找用户的新偏好。通过将这两个模型结合起来可以更好地在用户的历史兴趣和探索新的兴趣点之间做到平衡。

4.4 DeepFM

DeepFM 的结构其实很简单: 采取 Wide & Deep 的框架,差异在于将 Wide 部分的 LR 替换为了 FM,从而自动构造二阶特征叉乘,而非手工设计叉乘。其中,DeepFM 的输入可由连续型变量和类别型变量共同组成,且类别型变量需要进行 One-Hot 编码。而正由于 One-Hot 编码,导致了输入特征变得高维且稀疏。应对的措施是:针对高维稀疏的输入特征,采用 word2vec 的词嵌入方式,把高维稀疏的向量映射到相对低维且向量元素都不为零的空间向量中。由上面网络结构图可以看到,DeepFM 包括 FM 和 DNN 两部分,所以模型最终的输出也由这两部分组成:

五、排序模型效果评估

排序结果的评估主要是两个步骤:

第一步:离线评估

在离线准备好的验证集上进行数据验证,如果效果优于先前的模型数据,则进行第二步,这里的效果包含多个指标,比如准确率、覆盖率、多样性等,在不同阶段侧重的指标也许是不一样的,这个就是产品经理要去把控确定的,当前这一产品阶段侧重点在哪里或者是怎么去取舍,平衡。

第二步:线上实验

直接对于线上用户进行 AB 分桶实验,先小流量实验一段时间,一般在 10 天到半个月左右,对比实验组和对照组数据;如果实验数据为正向,则推到更多的用户;如数据持续稳定,则推全到所有用户。AB 实验在实验设置还有不少细节,这方面也会在后面单独在拿出来给大家介绍。

作者介绍:

作者: 微信公众号:Coggle 数据科学, 微信:wanghebat

数据挖掘竞赛爱好者,国内竞赛方案最佳分享者,一年内获得三冠五亚一季的成绩,有机器学习和竞赛相关的问题都可以私信我。

奖项:

2019,TIANCHI-全球数据智能大赛【赛场二】,亚军

2019,TIANCHI-安泰杯–跨境电商智能算法大赛,冠军

2019,腾讯广告算法大赛,冠军

2019,KDD Cup: Context-Aware Multi-Modal Transportation Recommendation,亚军

2018,科大讯飞营销算法大赛,冠军

2019,TIANCHI-OGe