推荐系统——排序

5 min
NOTE

这是 b 站王树森推荐系统课程的笔记,记录到了重排,之后的物品冷启动和提分部分我没有学,所以也没有笔记。索引如下:


https://www.bilibili.com/video/BV19t4y1p7UM

排序主要依据:用户——物品交互,点击率、点赞率、收藏率、转发率……将这些分数进行融合

预估分数

多目标模型

使用神经网络预估多个分数(0 - 1 之间),通过这些分数进行排序。训练时需要让这些预估值尽可能接近真实值,可以用交叉熵。

训练中会遇到类别不平衡的问题,即正样本少但负样本多。解决方法是

  • 使用负样本降采样,抛弃一部分负样本,让正负样本数量平衡。
  • 预估值校准,因为降采样后,(期望)预估点击率 Epred=n+/(n++αn)E_{\text{pred}}=n_{+} / (n_{+}+\alpha \cdot n_{-}) 会高于(期望)真实点击率 Etrue=n+/(n++n)E_{\text{true}} = n_{+} / (n_{+}+n_{-}),校准公式为:Etrue=αEpred/((1Epred)+αEpred)E_{\text{true}}= \alpha \cdot E_{\text{pred}} / ((1-E_{\text{pred}})+\alpha \cdot E_{\text{pred}})

Multi-gate MoE (MMoE)

很典型的 MoE 结构

实际使用时,存在极化问题,即权重过于集中在某一个 expert 上。可以在训练时对 softmax 的输出使用 dropout

融合预估分数

简单加权和:

pclick+w1plike+w2pcollect+p_{\text{click}} + w_{1}\cdot p_{\text{like}} + w_{2}\cdot p_{\text{collect}} + \cdots

点击率乘其他项的加权和:

pclick(1+w1plike+w2pcollect+)p_{\text{click}}\cdot(1+w_{1}\cdot p_{\text{like}} + w_{2}\cdot p_{\text{collect}} + \cdots)

等等

视频播放建模

除了一般物品的特征,还有播放时长、完播率等特征。

播放时长

对一个用户,训练时,实际播放时长记为 tt,神经网络输出为 zz,不是直接期望 ttzz 相近,而是进行一个变换

p=sigmoid(z)=exp(z)1+exp(z),y=t1+tp = \text{sigmoid}(z) = \frac{\exp(z)}{1+\exp(z)}, y=\frac{t}{1+t}

再对 ppyy 做交叉熵损失:

(ylogp+(1y)log(1p))-\left( y\log p+(1-y)\log(1-p) \right)

去掉分母 1+t1+t 也是可以的。训练好之后将 exp(z)\exp(z) 用于融合预估分数

视频完播率

有多种建模方法,如:

  1. 视频长度为 1010,实际播放 44,则记为 410=0.4\frac{4}{10}=0.4
  2. 视频长度为 1010,只要超过 88,就为正样本,然后计算正样本占比

不能将预估的完播率用于融分,因为不利于长视频,需要进行调整。

排序模型的特征

  • 用户画像:ID,性别、年龄,账号信息,感兴趣的东西等等
  • 物品画像:ID,发布时间,GeoHash,类目、关键词,字数,信息量……
  • 用户统计特征:近 30 天的活动(曝光、点击、点赞、收藏),物品种类分桶统计
  • 物品统计特征:近 30 天(曝光、点击、点赞、收藏)、用户性别/年龄分桶、作者特征
  • 场景特征:用户定位、当前时刻、周末节假日、手机品牌型号操作系统

特征处理:

  • 离散特征:做 embedding
  • 连续特征:分桶,变成离散特征;或其他变换,如 log\log 处理等

特征缺失:很多特征无法覆盖所有的样本(如用户没有提供信息等)

粗排

上面的内容主要用于精排,下面是粗排相关的

粗排一次需要处理几千篇笔记,必须要推理速度快;而精排不需要

回忆:精排可以使用前期融合(特征拼接),精度较高但是推理速度较慢;召回可以使用后期融合(双塔模型后期计算余弦相似度),计算量小但不够精确

粗排可以使用三塔模型:用户塔、物品塔、交叉塔

将静态特征(用户特征、场景特征、物品特征)和动态特征(统计特征、交叉特征)分离,并缓存计算量大的物品塔输出向量,可以极大提升计算速度

此时模型的计算量集中在上层。