推荐算法丨排序
推荐系统需要经过召回、粗排、精排、重排等过程才能将物品推荐给用户。其中粗排和精排使用类似的模型,粗排使用更小的模型对召回的结果进行打分,筛选出更少的笔记后交给更大更准确的精排模型打分,以此提高效率。
以小红书为例,排序中常用的指标有:点击率(点击次数/曝光次数)、点赞率(点赞次数/点击次数)、收藏率(收藏次数/点击次数)、转发率(转发次数/点击次数)等。
排序模型预估以上多种分数,并融合这些分数,根据融合的分数做排序、截断。
多目标模型
多目标模型在工业界被广泛运用。
如图,各类特征向量concatenation后一起输入神经网络,神经网络输出的向量再分别输入四个神经网络,即得到点击率、点赞率、收藏率、转发率的预测。由于使用了sigmoid激活函数,四个预估值都介于0,1之间。使用用户的真实行为作为标签,例如一个用户点击并转发了物品,但未点赞、收藏,则四个标签为(1,0,0,1)。可以把四种行为分别作为一个二元分类任务,使用交叉熵作为损失函数,则总损失函数可表示为:
训练中往往存在类别不平衡的问题,例如每100次曝光,可能只有10次点击,而有90次未点击。因此需要对负样本做降采样,只保留一小部分负样本,让正负样本数量平衡。
但是,经过降采样后,负样本变少,又会导致预估点击率大于真实点击率:
正样本、负样本数量为
,负样本采样率为α,则实际使用 个负样本。 真实点击率:
(期望) 预估点击率:
(期望)
因此需要预估值校准:
MMoE
MMoE全称Multi-gate Mixture-of-Experts,是对多目标模型的改进。
- 将特征向量输入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次推理。这样的模型往往用于精排。
而用来做召回的双塔模型使用的是后期融合的方式,先用用户特征和物品特征分别计算出特征向量,再求余弦相似度。这种方式线上对于每个用户只需要做一次用户特征的推理,代价很小,但预估准确性也更低。
小红书在粗排阶段使用了介于二者之间的三塔模型。
- 用户塔很大,因为对于每个用户用户塔只需要做一次推理。
- 物品塔需要对新物品做推理,但物品塔的输出向量会被缓存,因此可以避免绝大多数推理。
- 对每个物品交叉塔都需要做推理,而且因为统计特征会随时变化,交叉塔的输出向量不能缓存。因此交叉塔会做得足够小(往往只有一层)。
- 模型上层同样对每个物品都要做一次推理,因此该模型的推理大部分计算量在模型上层。