推荐算法丨排序

推荐系统需要经过召回、粗排、精排、重排等过程才能将物品推荐给用户。其中粗排和精排使用类似的模型,粗排使用更小的模型对召回的结果进行打分,筛选出更少的笔记后交给更大更准确的精排模型打分,以此提高效率。

以小红书为例,排序中常用的指标有:点击率(点击次数/曝光次数)、点赞率(点赞次数/点击次数)、收藏率(收藏次数/点击次数)、转发率(转发次数/点击次数)等。

排序模型预估以上多种分数,并融合这些分数,根据融合的分数做排序、截断。

多目标模型

多目标模型在工业界被广泛运用。

多目标模型

如图,各类特征向量concatenation后一起输入神经网络,神经网络输出的向量再分别输入四个神经网络,即得到点击率、点赞率、收藏率、转发率的预测。由于使用了sigmoid激活函数,四个预估值都介于0,1之间。使用用户的真实行为作为标签,例如一个用户点击并转发了物品,但未点赞、收藏,则四个标签为(1,0,0,1)。可以把四种行为分别作为一个二元分类任务,使用交叉熵作为损失函数,则总损失函数可表示为: 其中为人为设置的权重。

训练中往往存在类别不平衡的问题,例如每100次曝光,可能只有10次点击,而有90次未点击。因此需要对负样本做降采样,只保留一小部分负样本,让正负样本数量平衡。

但是,经过降采样后,负样本变少,又会导致预估点击率大于真实点击率:

  • 正样本、负样本数量为,负样本采样率为α,则实际使用个负样本。

  • 真实点击率:(期望)

  • 预估点击率:(期望)

因此需要预估值校准

MMoE

MMoE全称Multi-gate Mixture-of-Experts,是对多目标模型的改进。

MMoE
  • 将特征向量输入n个神经网络(称为“专家”,通常为4或8个,图中为3个),生成n个向量。
  • 使用神经网络生成一个n维向量,作为n个“专家”生成向量的权重。
  • 对n个向量做加权平均,再经过一个神经网络生产点击率的预估值。
  • 同理,如果需要预估点赞率等其他指标,则添加更多生成权重的神经网络。

在实践中,MMoE常常会产生极化现象

  • softmax输出值一个接近1,其余接近0,导致只有一个“专家”起作用,退化成简单的多目标模型。
  • 在训练时,可以对softmax的输出使用dropout。
    • softmax输出的n个数值以10%的概率被mask,即每个专家都有10%的概率被丢弃。
    • 这使得模型不会过分依赖某个“专家”,否则当其权重被mask时,将导致严重偏差。

MMoE的使用未必会带来提升,具体应根据实践结果选择。

融合预估分数

前面讲到多目标模型可以对点击率、点赞率等指标做出预估,而要对物品进行排序,需要将这些指标进行融合得到最终的预估分数。以下是几种融分公式。

  • 简单加权和:将预估的点击率、点赞率、收藏率等指标直接做加权平均。

  • 点击率乘以其他项的加权和: 该公式有其实际意义,例如点击率×点赞率=点赞次数/曝光次数。

  • 海外某短视频APP融分公式: 其中w和α都是超参数。

  • 国内某短视频APP融分公式:

    • 根据预估时长,对n篇候选视频做排序

    • 如果某视频排名第,则它得分

    • 对点击、点赞、转发、评论等预估分数做类似处理。

    • 最终融合分数:

  • 国内某电商的融分公式:

    • 电视转化流程:曝光→点击→加购→付款
    • 最终融合分数:

视频播放建模

除了点击、点赞、收藏、转发、评论等指标外,视频排序还需考虑播放时长完播

播放时长建模:

  • 将多目标模型最后一个全连接层的输出记作z。设p=sigmoid(z)。

  • 实际观测的播放时长记作t。

  • 做训练:用p拟合y=t/(1+t),最小化交叉熵损失

  • 做推理:把exp(z)作为播放时长的预估。

视频完播建模:

  • 回归方法

    • 例:视频长度10分钟,实际播放4分钟,则实际播放率为y=0.4。

    • 让预估播放率p拟合y:

  • 二元分类方法

    • 定义完播指标,比如完播80%,则10分钟的视频播放>8分值作为正样本,播放<8分钟作为负样本。
    • 做二元分类训练模型。
  • 不能直接把预估的完播率用到融分公式,否则对长视频不公平。可以用函数f(视频时长)拟合完播率关于视频时长的函数。线上预估完播率,然后做调整: 再把调整后的结果作为融分公式的一项。

排序模型的特征

前面谈及排序模型时,使用到了用户特征、物品特征、统计特征、场景特征作为模型的输入。下面介绍这些特征。

用户画像

  • 用户ID(在召回、排序中做embedding)
  • 人口统计学属性:性别、年龄等。
  • 账号信息:新老、活跃度······
  • 感兴趣的类目、关键词、品牌。

物品画像

  • 物品ID(在召回、排序中做embedding)
  • 发布时间
  • GeoHash(经纬度编码)、所在城市。
  • 标题、类目、关键词、品牌······
  • 字数、图片数、视频清晰度、标签数······

用户统计特征

  • 用户最近30天(7天、1天、1小时)的曝光数、点击数、点赞数、收藏数······
  • 按物品类目分桶

物品统计特征

  • 笔记最近的曝光数、点击数、点赞数、收藏数······
  • 按照用户性别、用户年龄、用户地域等分桶
  • 作者特征(作品数、粉丝数、消费指标等)

场景特征

  • 用户定位GeoHash(经纬度编码)、城市。
  • 当前时刻(分段,做embedding)。
  • 是否周末、节假日。
  • 手机品牌、手机型号、操作系统等。

要将以上特征转化为特征向量,需要经过特征处理

  • 离散特征:做embedding。
    • 用户ID、物品ID、作者ID
    • 类目、关键词、城市、手机品牌等
  • 连续特征:做分桶,变成离散特征。
    • 年龄、笔记字数、视频长度
  • 连续特征:其他变换。
    • 曝光数、点击数、点赞数等数值做log(1+x)(减小极端值带来的影响)
    • 转化为点击率、点赞率等值,并做平滑

很多特征无法覆盖100%的样本,例如很多用户未填写年龄、未开启GPS权限。因此做特征工程时,需要想办法提高特征覆盖率,以使模型更准确。

粗排模型

推荐需要经过粗排、精排两个过程,如果粗排对几千个物品打分,那精排可能只对几百个物品打分。因此,粗排单次推理代价必须小,而可以适当牺牲预估的准确度。

前面讲到的排序模型采用的时前期融合的方式,即先对所有特征做concatenation,再输入神经网络。这样的方式线上推理代价大,如果有n个候选物品则要做n次推理。这样的模型往往用于精排。

而用来做召回的双塔模型使用的是后期融合的方式,先用用户特征和物品特征分别计算出特征向量,再求余弦相似度。这种方式线上对于每个用户只需要做一次用户特征的推理,代价很小,但预估准确性也更低。

小红书在粗排阶段使用了介于二者之间的三塔模型。

三塔模型
  • 用户塔很大,因为对于每个用户用户塔只需要做一次推理。
  • 物品塔需要对新物品做推理,但物品塔的输出向量会被缓存,因此可以避免绝大多数推理。
  • 对每个物品交叉塔都需要做推理,而且因为统计特征会随时变化,交叉塔的输出向量不能缓存。因此交叉塔会做得足够小(往往只有一层)。
  • 模型上层同样对每个物品都要做一次推理,因此该模型的推理大部分计算量在模型上层。