【Notes】王树森-推荐系统 ---【涨指标的方法】

概述

推荐系统的评价指标

日活用户数DAU)和 留存最核心的指标。(电商不同,电商最重要的是营收)


留存

目前工业界最常用 LT7LT30 衡量留存

LT7 : 假设某个用户今天登录了app,LT7指包括今天在内的未来 <math xmlns="http://www.w3.org/1998/Math/MathML"> 7 7 </math>7 天有多少天登录了app

  • 如果今天是 <math xmlns="http://www.w3.org/1998/Math/MathML"> t 0 t_0 </math>t0,未来 <math xmlns="http://www.w3.org/1998/Math/MathML"> 7 7 </math>7 天指的是 <math xmlns="http://www.w3.org/1998/Math/MathML"> t 0 ∼ t 6 t_0 \sim t_6 </math>t0∼t6

  • 某用户今天 ( <math xmlns="http://www.w3.org/1998/Math/MathML"> t 0 t_0 </math>t0) 登录 APP,未来 7 天 ( <math xmlns="http://www.w3.org/1998/Math/MathML"> t 0 ∼ t 6 t_0 \sim t_6 </math>t0∼t6) 中有 <math xmlns="http://www.w3.org/1998/Math/MathML"> 4 4 </math>4 天登录 APP,那么该用户今天 ( <math xmlns="http://www.w3.org/1998/Math/MathML"> t 0 t_0 </math>t0) 的 LT7 等于 <math xmlns="http://www.w3.org/1998/Math/MathML"> 4 4 </math>4。

显然有 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 ≤ LT7 ≤ 7 1 \leq \text{LT7} \leq 7 </math>1≤LT7≤7 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 ≤ LT30 ≤ 30 1 \leq \text{LT30} \leq 30 </math>1≤LT30≤30。

  • LT 增长通常意味着用户体验提升

  • 但是LT 增长同时DAU下降 ,则说明用户体验没有提升,而是策略赶走了不活跃的用户。一个极端的例子:假设 app禁止低活用户登录,则 DAU 下降,LT 增长。

    因此如果模型或者策略长了LT 我们还要看一下DAU,要确保DAU不下降


其他核心指标

用户使用时长总阅读数 (即总点击数)、总曝光数 。这些指标的重要性低于DAU和留存。

  • 用户使用的时长 通常跟留存正相关 的,时长增长,LT通常会增长。

  • 但是时长阅读数曝光数此消彼长,时长增长,阅读数、曝光数可能会下降。

    例:抖音推荐的长视频变多,短视频变少,那么用户使用app的总时长会增加,但是曝光数会减少。因为用户看一个长视频要很久,看完之前不刷更多的视频,导致曝光数减小

时长 关系到 DAU留存曝光束关系到广告收入,所以需要对两者做一些平衡。


非核心指标

点击率、交互率等等。


对于UGC平台,发布量和发布渗透率也是核心指标。

涨指标的方法

  1. 改进召回模型,添加新的召回模型
  2. 改进粗排和精排模型
  3. 提升召回、粗排、精排中的多样性
  4. 特殊对待新用户、低活用户等特殊人群
  5. 利用关注、转发、评论这三种交互行为

召回

召回模型&召回通道

推荐系统有几十条召回通道,它们的召回总量固定的。总量越大,指标越好,粗排计算量越大。

如果召回总量固定(如5000),那么这5000物品的总量要给几十条召回通道分配。

  • 双塔模型(two-toweritem-to-item(I2I 是最重要的两类召回模型,这两类模型各自有很多条召回通道,加起来可以占据召回总量的一大半。

  • 有很多小众的模型,占据的配额很少。在召回总量不变的前提下,添加某些召回模型可以提升核心指标。由于召回总量不变,添加这些模型会挤占掉其他模型的配额,不会增加粗排的计算量。

添加内容池也可以涨指标:有很多内容池,比如30天物品、1天物品、6小时物品、新用户优质内容池、分人群内容池。

同一个模型可以用于多个内容池,得到多条召回通道。只需要训练一个双塔模型,就可以同时用于30天、1天、6小时这三个内容池。只训练一个双塔模型用在三个内容池上会得到三条召回通道。每条召回通道都有一定的配额。

不论只有1个内容池,还是有20个内容池,都只训练一个双塔模型,不会增加训练的计算量,但是每个内容池都需要一个ANN索引,还需要在线上做ANN检索,需要增加少量的计算成本

双塔模型

方向1

优化正样本、负样本。

  • 简单正样本:有点击的(用户,物品)二元组。
  • 简单负样本:随机组合的(用户,物品)二元组。
  • 困难负样本:被召回但排序靠后的(用户,物品)二元组。

方向2

改进神经网络结构。

  • Baseline:用户塔、物品塔分别是全连接网络,各输出一个向量,分别作为用户、物品的表征
  • 改进:用户塔、物品塔分别用深度交叉网络DCN代替全连接网络·
  • 改进:在用户塔中使用用户行为序列(last-n) ,把用户最近交互过的 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 个物品表征为向量,把这 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 个向量的平均作为用户的一种特征输入用户塔。
  • 改进:使用多向量模型代替单向量模型。(标准的双塔模型也叫单向量模型,两个塔各输出一个向量,两个向量的形状相同,根据向量相似度做分类,让模型能够区分正负样本)

多向量模型
![转存失败,建议直接上传图片文件](转存失败,建议直接上传图片文件 pic/image-20250312114942504.png)

  • 右边是物品塔跟单向量模型没有区别,物品塔只输出一个向量,作为物品的表征

  • 左边的是用户塔跟单向量模型有区别,用户塔输出很多向量,所以叫多向量模型,用户塔输出的每个向量都跟物品向量的形状相同。

    用用户塔输出的每个向量和物品塔输出的向量计算内积或者cos相似度,作为对一个目标的预估,比如预估点击率、点赞率等。

  • 如果一共要预估10个目标,那么用户塔会输出10个向量,但是物品塔只输出1个向量。

    用户塔的10个向量分别去跟物品向量计算相似度,作为对10个目标的预估

单向量模型 只是做简单的二分类,区分正样本和负样本,而多向量模型有点类似排序中的多目标模型,会同时预估点击率、点赞率等很多目标。

为什么让用户塔输出多个向量,而物品塔只输出一个向量?

物品塔的输出是物品向量表征,要事先算出来存入向量数据库,如果每个物品有10个向量表征那么就需要建10个向量数据库做10 套ANN索引,代价很大。让物品打只输出一个向量不需要那么大代价,只需要一个向量数据库就够了。

方向3

改进模型的训练方法。

  • Baseline:做二分类,让模型学会区分正样本和负样本。
  • 改进:结合二分类、batch 内负采样。(对于batch 内负采样,需要做纠偏。)
  • 改进:使用自监督学习方法,让冷门物品的embedding 学得更好。

Item to item

I2I是一大类模型,基于相似物品做召回。

最常见的用法是**U2I2I**( <math xmlns="http://www.w3.org/1998/Math/MathML"> user → item → item \text{user} \rightarrow \text{item} \rightarrow \text{item} </math>user→item→item)

  • 用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 喜欢物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i 1 i_1 </math>i1(用户历史上交互过的物品)
  • 寻找 <math xmlns="http://www.w3.org/1998/Math/MathML"> i 1 i_1 </math>i1 的相似物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i 2 i_2 </math>i2(即I2I)
  • 将 <math xmlns="http://www.w3.org/1998/Math/MathML"> i 2 i_2 </math>i2 推荐给 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u

如何计算物品相似度?

方法1:ItemCF及其变体。

  • 一些用户同时喜欢物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i 1 i_1 </math>i1 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> i 2 i_2 </math>i2,则认为 <math xmlns="http://www.w3.org/1998/Math/MathML"> i 1 i_1 </math>i1 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> i 2 i_2 </math>i2 相似。(靠用户的行为来判断两个物品有多相似)
  • ItemCFOnline ItemCFSwingOnline Swing 都是基于相同的思想。
  • 4 种模型召回的结果存在足够大的差异,线上同时使用上述4种I2I模型,各分配一定配额,各自的配额需要仔细调整。

方法2:基于物品向量表征,计算向量相似度。(双塔模型、图神经网络均可计算物品向量表征。)

小众的召回模型

类似 I2I 的模型

  • U2U2I ( <math xmlns="http://www.w3.org/1998/Math/MathML"> user → user → item \text{user} \rightarrow \text{user} \rightarrow \text{item} </math>user→user→item ): 基于相似用户做推荐 :已知用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 1 u_1 </math>u1 与 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 2 u_2 </math>u2 相似,且 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 2 u_2 </math>u2 喜欢物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i,那么给用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 1 u_1 </math>u1 推荐物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i。

  • U2A2I ( <math xmlns="http://www.w3.org/1998/Math/MathML"> user → author → item \text{user} \rightarrow \text{author} \rightarrow \text{item} </math>user→author→item ): 基于关注关系或者影视关注关系做推荐 :已知用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 喜欢作者 <math xmlns="http://www.w3.org/1998/Math/MathML"> a a </math>a,且 <math xmlns="http://www.w3.org/1998/Math/MathML"> a a </math>a 发布物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i,那么给用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 推荐物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i。

  • U2A2A2I ( <math xmlns="http://www.w3.org/1998/Math/MathML"> user → author → author → item \text{user} \rightarrow \text{author} \rightarrow \text{author}\rightarrow \text{item} </math>user→author→author→item ): 基于作者的相似性做推荐: 已知用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 喜欢作者 <math xmlns="http://www.w3.org/1998/Math/MathML"> a 1 a_1 </math>a1,且 <math xmlns="http://www.w3.org/1998/Math/MathML"> a 1 a_1 </math>a1 与 <math xmlns="http://www.w3.org/1998/Math/MathML"> a 2 a_2 </math>a2 相似,作者 <math xmlns="http://www.w3.org/1998/Math/MathML"> a 2 a_2 </math>a2 发布物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i,那么给用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 推荐物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i。

更复杂的模型

这些模型构造的召回通道所占的配额都很小,但确实有效果。在召回总量不变的情况下添加这样的召回通道,可以提升大盘指标。

总结

改进召回模型

  • 双塔模型:优化正负样本、改进神经网络结构、改进训练的方法。
  • I2I模型:同时使用ItemCF及其变体、使用物品向量表征计算物品相似度。
  • 添加小众的召回模型,比如PDNDeepRetrievalSINEM2GRL 等模型
  • 增加召回总量显然可以提升推荐性的核心指标,但是召回的物品越多,粗排的计算量会越大,召回总量大到一定程度的时候继续增加召回总量的边际效益会很小,投入产出比不划算
  • 在召回总量不变的前提下,调整各召回通道的配额。(可以让各用户群体用不同的配额。比如新用户和普通用户这两个群体)

排序模型

精排模型的改进

推荐系统的精排模型
![转存失败,建议直接上传图片文件](转存失败,建议直接上传图片文件 pic/image-20250312155243970.png)

最下面是模型的输入,可以分为离散特征连续特征

  • 把离散特征输入到左边神经网络,神经网络用embedding层把离散特征映射到数值向量,把得到的数值向量全都拼接起来得到一个几千维的向量。再经过几个全连接层,得到上面绿色的向量,大小是几百维。

  • 把连续特征输入到另一个全连接网络,全连接网络的输出是上面蓝色的向量。蓝色神经网络的输入是个几百维的向量,输出也是个几百维的向量。

由于算力的限制,下面这两个全连接网络不会很大,用CPU推理通常只有 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 1 </math>1 ~ <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 2 </math>2 层,用GPU推理可以有 <math xmlns="http://www.w3.org/1998/Math/MathML"> 3 3 </math>3 ~ <math xmlns="http://www.w3.org/1998/Math/MathML"> 6 6 </math>6层。

把绿色和蓝色的向量做concatenation,作为更上层网络的输入。

下面这两个神经网络叫做基座,把原始特征映射到数值向量。

绿色和蓝色向量做combination之后,同时输入到多个全连接网络,这些全连接网络通常只有两层。这些神经网络的输出都是介于 <math xmlns="http://www.w3.org/1998/Math/MathML"> 0 0 </math>0 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 1 </math>1 之间的数值,作为各种目标的预估。比如预估点击率、点赞率、转发率、评论率。

精排模型下面的基座 和上面的多目标预估都有很多可以改进的点。

基座

基座的输入包括离散特征和连续特征,输出一个向量,作为多目标预估的输入。

改进1

基座加宽加深,计算量更大,预测更准确。

精排模型的全连接网络不够大,通常会 under-fit,推荐系统的参数量很大,有几千亿甚至万亿,但99%以上的参数都在embedding层,实际上全连接网络的参数量都很小。数据量太大,但是全连接网络不够大,所以全连接网络加宽加深可以让预测变得更准。

但是加宽加深会让计算量加大,要投入产出比。工业解实际常用的模型基座也就是 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 1 </math>1~ <math xmlns="http://www.w3.org/1998/Math/MathML"> 6 6 </math>6层,取决于模型的训练和推理的工程架构水平。

改进2

做自动的特征交叉'比如bilinearLHUC

改进3

特征工程,比如添加统计特征、多模态内容特征。

这需要算法工程师根据自己的经验设计特征,判断哪些特征对预估有用,哪些特征可以做交叉。

多目标预估

基于基座输出的向量,同时预估点击率等多个目标。

改进1

增加新的预估目标,并把预估结果加入融合公式。

预估的目标数量最初只有几个,之后会增加到十几个二十几个甚至更多。

  • 最标准的目标包括点击率、点赞率、收藏率、转发率、评论率、关注率、完播率···
  • 寻找更多目标,比如进入评论区、给他人写的评论点赞....
  • 把新的预估目标加入融合公式。即排序的时候会用到这些新的目标。
改进2

MMoEPLE等结构可能有效,但往往无效。

改进3

纠正position bias (DEBIAS)可能有效,也可能无效

粗排模型的改进

粗排的打分量比精排大10倍,因此粗排模型必须够快。


粗精排一致性建模

原理:蒸馏精排训练粗排,让粗排与精排更一致。


方法1:

pointwise 蒸馏。

  • 设 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y 是用户真实行为,设 <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p 是精排的预估。

  • 用 <math xmlns="http://www.w3.org/1998/Math/MathML"> y + p 2 \frac{y+p}{2} </math>2y+p 作为粗排拟合的目标。

    如果不做蒸馏,训练的时候会直接用 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y 作为目标。用 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p 的均值实际的效果会比只用 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y 更好

  • 例:

    • 对于点击率目标,用户有点击 ( <math xmlns="http://www.w3.org/1998/Math/MathML"> y = 1 y = 1 </math>y=1),精排预估 <math xmlns="http://www.w3.org/1998/Math/MathML"> p = 0.6 p = 0.6 </math>p=0.6。

    • 用 <math xmlns="http://www.w3.org/1998/Math/MathML"> y + p 2 = 0.8 \frac{y+p}{2} = 0.8 </math>2y+p=0.8 作为粗排拟合的点击率目标。

方法2:

pairwise listwise 蒸馏。

  • 给定 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 个候选物品,按照精排预估做排序。

  • 做 learning to rank (LTR),让粗排拟合物品的(而非值)。

  • 例:

    • 对于物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j,精排预估点击率为 <math xmlns="http://www.w3.org/1998/Math/MathML"> p i > p j p_i > p_j </math>pi>pj,即精排模型认为用户更有可能点击物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 而不是点击物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j。
    • LTR 鼓励粗排预估点击率满足 <math xmlns="http://www.w3.org/1998/Math/MathML"> q i > q j q_i > q_j </math>qi>qj,否则有惩罚。
    • LTR 通常使用 pairwise logistic loss 作为损失函数。

优点:粗精排一致性建模可以提升核心指标

缺点 :如果精排出bug,精排预估值 <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p 有偏,会污染粗排训练数据。

推荐系统的数据流,特征服务模型推理,很多地方都可能出bug甚至挂掉。一旦出了问题,精排做的预估就不准了。有时候只是一些小问题,比如精排的某个特征服务出错了,指标会缓慢下降,不那么容易被察觉到。在找到bug之前,精排的预估有问题,做蒸馏的话会污染粗排的训练数据,让粗排也逐渐变差。

用户行为序列建模

在排序模型优化到一定程度之后,涨指标会越来越难,这时候涨指标最主要的途径就是用户行为序列建模。
![转存失败,建议直接上传图片文件](转存失败,建议直接上传图片文件 pic/image-20250312170425086.png)

这些是用户最近交互过的 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 个物品,叫做 last-n,对物品的id做embedding,把 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 个物品 id 映射成 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 个向量,最后对向量取平均得到一个向量。这个向量可以作为用户的一种特征,表示用户曾经对什么样的物品感兴趣。

改进1

增加序列长度,让预测更准确;但是会增加计算成本和推理时间。

增加序列长度最大难点是工程架构,工程架构弱的话做不到长序列。

改进2

筛选的方法,比如用类目、物品向量表征聚类。

物品向量的聚类

  • 离线用多模态神经网络(BERT或者CLIP)提取物品内容特征,将物品表征为向量。
  • 离线将物品向量聚为1000类,每个物品有一个聚类序号,聚类通常是用层次聚类
  • 线上排序时,用户行为序列中有 <math xmlns="http://www.w3.org/1998/Math/MathML"> n = 1 , 000 , 000 n=1,000,000 </math>n=1,000,000 个物品。某候选物品的聚类序号是 <math xmlns="http://www.w3.org/1998/Math/MathML"> 70 70 </math>70,对 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个物品做筛选,只保留聚类序号为 <math xmlns="http://www.w3.org/1998/Math/MathML"> 70 70 </math>70 的物品。 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n个物品中只有数千个被保留下来。
  • 同时有好几种筛选方法,取筛选结果的并集,会得到几千或者1万多个物品。可能还需要做进一步筛选让物品数量再降低一个数量级,然后再输入到注意力层

改进3

对用户行为序列中的物品,使用ID以外的一些特征。

最简单的方法就是对物品的id做embedding,作为物品的向量表征。这里还可以再加一些别的物品特征,效果会更好,但是不能加太多。不然线上推理的时候,通信和计算都会出问题。

概括 :沿着SIM的方向发展,让原始的序列尽量长,然后做筛选降低序列长度,最后将筛选结果输入DIN,对物品向量作加权平均。

在线学习

模型训练的方式分为全量更新和增量更新,增量更新就是在线学习Online learning,用前天积累的数据训练模型,模型不是随机初始化,而是基于前天凌晨训练好的checkpoint继续训练,要把前天的数据做random shuffle打乱,然后做随机梯度下降。只训练one epoch(每条数据只过一遍)。

昨天凌晨做好全量训练之后,就要基于这个模型做分钟级别的增量更新 (Online learning),从昨天凌晨到今天凌晨不间断做 Online learning,隔一段时间发布一次模型,拿最新发布的模型在线上做推理。

昨天又积累了一天的数据,到了今天凌晨又该做一次全量更新,今天凌晨的全量更新是基于昨天凌晨全量训练出的模型,而不是用下面增量训练出的模型。

在完成这次全量训练之后,下面增量训练出的模型就可以扔掉了。

然后基于今天凌晨全量训练出的模型,再做分钟级别的增量更新。从今天凌晨到明天凌晨不停做Online learning,每隔一段时间发布一次模型。
![转存失败,建议直接上传图片文件](转存失败,建议直接上传图片文件 pic/image-20250312172855658.png) ![转存失败,建议直接上传图片文件](转存失败,建议直接上传图片文件 pic/image-20250312172919863.png)

在线学习对推荐系统指标的提升非常大,但是它会消耗更多的算力

在线学习的资源消耗

原本每天只需要在凌晨的时候做一次全量更新,现在既需要在凌晨做全量更新,也需要全天不间断做增量更新。

设在线学习需要10,000 CPUcore 的算力增量更新一个精排模型。

推荐系统一共需要多少额外的算力给在线学习?

  • 如果不做ab测试,整个推荐系统多花费10000 CPUcore

  • 为了做AB测试,线上同时运行多个不同的模型

    如果线上有 <math xmlns="http://www.w3.org/1998/Math/MathML"> m m </math>m 个模型,则需要 <math xmlns="http://www.w3.org/1998/Math/MathML"> m m </math>m 套在线学习的机器。线上的 <math xmlns="http://www.w3.org/1998/Math/MathML"> m m </math>m 个模型,其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 1 </math>1 个是holdout, <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 1 </math>1个是推全的模型, <math xmlns="http://www.w3.org/1998/Math/MathML"> m − 2 m-2 </math>m−2 个测试的新模型
    ![转存失败,建议直接上传图片文件](转存失败,建议直接上传图片文件 pic/image-20250313100633608.png)

    • 用10%的用户作为hold out,90%的用户用于ab测试
    • 以精排为例,假设线上有两组实验,分别测试新模型1和模型2,与推全的模型做对比,推全的模型可能与holdout 组的模型相同但也有可能不同。在多数的情况下,推全的模型会比 holdout 的模型要新几个版本。
    • 例子中线上一共有4个精排模型, 分别是hold out、推全模型、新模型1和新模型2。那么就需要 <math xmlns="http://www.w3.org/1998/Math/MathML"> 4 4 </math>4 套在线学习的资源。换句话说,如果公司一共给了 <math xmlns="http://www.w3.org/1998/Math/MathML"> 4 4 </math>4 套在线学习的资源,那么线上只能同时测试 <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 2 </math>2 个新模型。
    • 想看 <math xmlns="http://www.w3.org/1998/Math/MathML"> 7 7 </math>7 日留存,模型必须在线上跑至少 <math xmlns="http://www.w3.org/1998/Math/MathML"> 7 7 </math>7 天,想看 <math xmlns="http://www.w3.org/1998/Math/MathML"> 30 30 </math>30 日留存,模型必须在线上跑至少 <math xmlns="http://www.w3.org/1998/Math/MathML"> 30 30 </math>30 天。

在线学习的资源消耗

  • 线上有 <math xmlns="http://www.w3.org/1998/Math/MathML"> m m </math>m 个模型,其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 1 </math>1 个是holdout, <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 1 </math>1 个是推全的模型, <math xmlns="http://www.w3.org/1998/Math/MathML"> m − 2 m-2 </math>m−2 个测试的新模型。

  • 每套在线学习的机器成本都很大,因此 <math xmlns="http://www.w3.org/1998/Math/MathML"> m m </math>m 数量很小,制约模型开发迭代的效率。

    以某家公司为例, <math xmlns="http://www.w3.org/1998/Math/MathML"> m m </math>m 的数量是 <math xmlns="http://www.w3.org/1998/Math/MathML"> 6 6 </math>6,每套机器成本折合 <math xmlns="http://www.w3.org/1998/Math/MathML"> 10000 10000 </math>10000 CPUcore,一共有 <math xmlns="http://www.w3.org/1998/Math/MathML"> 6 6 </math>6 套机器,那么线上就只能同时测试 <math xmlns="http://www.w3.org/1998/Math/MathML"> 4 4 </math>4 个模型,开发迭代的效率很低。

  • 在线学习对指标的提升巨大,但是会制约模型开发迭代的效率。

老汤模型

用每天新产生的数据对模型做 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 1 </math>1 epoch的训练。久而久之,老模型训练得非常好,很难被超过。

对模型做改进,重新训练,很难追上老模型。

问题1

如何快速判断新模型结构是否优于老模型? 不需要追上线上的老模型,只需要判断新老模型谁的结构更优。

  • 对于新、老模型结构,都随机初始化模型全连接层
  • Embedding层可以是随机初始化,也可以是复用老模型训练好的参数。这样处理全连接层和embedding层,新老模型的区别只是模型结构而已,老模型并没有训练更久的优势
  • 用 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 天( <math xmlns="http://www.w3.org/1998/Math/MathML"> 10 10 </math>10 天左右)的数据训练新老模型。(从旧到新,训练1epoch)
  • 如果新模型显著优于老模型,新模型很可能更优。
  • 只是比较新老模型结构谁更好,而非真正追平老模型。

问题 2:如何更快追平线上的老模型?(只有几十天的数据,新模型就能追上训练上百天的老模型。)

  • 已经得出初步结论,认为新模型很可能优于老模型。用几十天的数据训练新模型,早日追平老模型。

  • 方法 1 :尽可能多地复用老模型训练好的 embedding 层,避免随机初始化 embedding 层。(Embedding 层是对用户、物品特点的"记忆",比全连接层学得慢。)

  • 方法 2 :用老模型做 teacher,蒸馏新模型。(用户真实行为是 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y,老模型的预测是 <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p,用 <math xmlns="http://www.w3.org/1998/Math/MathML"> y + p 2 \frac{y+p}{2} </math>2y+p 作为训练新模型的目标。)在训练新模型的初期做蒸馏,可以大幅加速收敛让新模型追得更快。

总结

  • 精排模型:
    • 改进模型基座(加宽加深、特征交叉、特征工程)
    • 改进多目标预估(增加新目标、MMoE、去除position bias)
  • 粗排模型:
    • 三塔模型(取代多向量双塔模型)
    • 粗精排一致性建模。
  • 用户行为序列建模 (对指标的提升非常大):
    • 沿着SIM的方向迭代升级,加长序列长度,改进筛选物品的方法。
  • 在线学习:对指标提升大,但是会降低模型迭代升级效率。
  • 老汤模型制约模型迭代升级效率,需要特殊技巧。

提升多样性

排序的多样性

精排多样性

精排阶段,结合兴趣分数多样性分数 对物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 排序。

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> s i s_i </math>si:兴趣分数,即融合点击率等多个预估目标。d
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> d i d_i </math>di:多样性分数 ,即物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 与已经选中的物品的差异。
  • 用 <math xmlns="http://www.w3.org/1998/Math/MathML"> s i + d i s_i + d_i </math>si+di 对物品做排序。

常用MMRDPP等方法计算多样性分数

  • 精排使用滑动窗口。

    精排决定了最终的曝光,曝光页面上临近的物品相似度应该小,比方说一个物品跟前五个物品要有很大的差异,不然的话两个相似的物品离得太近,会影响用户体验。所以计算精排多样性的时候要使用滑动窗口,保证同一个滑动窗口内的物品要有足够大的差异。

  • 粗排不使用滑动窗口。

    粗排不决定最终的曝光,只是给精排提供候选,粗排要考虑整体的多样性,而非一个滑动窗口内的多样性。

除了多样性分数,精排还使用打散策略增加多样性。

  • 类目:当前选中物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i,之后 <math xmlns="http://www.w3.org/1998/Math/MathML"> 5 5 </math>5 个位置不允许跟 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 的二级类目相同
  • 多模态:事先计算物品多模态内容向量表征,将全库物品聚为1000类;在精排阶段,如果当前选中物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i,之后 <math xmlns="http://www.w3.org/1998/Math/MathML"> 10 10 </math>10 个位置不允许跟 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 同属一个聚类。因为同一个聚类中的物品的图片和文字相似,应该被打散。

粗排多样性

粗排给5000个物品打分,选出500个物品送入精排。提升粗排和精排多样性都可以提升推荐系统核心指标。

  • 根据 <math xmlns="http://www.w3.org/1998/Math/MathML"> s i s_i </math>si 对5000个物品排序,分数最高的200个物品送入精排。(这里暂且不考虑多样性分数,优先考虑兴趣分数,保证用户最感兴趣的物品能够进入精排)

  • 对于剩余的4800个物品,对每个物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 计算兴趣分数 <math xmlns="http://www.w3.org/1998/Math/MathML"> s i s_i </math>si和多样性分数 <math xmlns="http://www.w3.org/1998/Math/MathML"> d i d_i </math>di。多样性分数 <math xmlns="http://www.w3.org/1998/Math/MathML"> d i d_i </math>di 表示物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 跟已经选中的200 物品的差异,差异越大,多样性分数 <math xmlns="http://www.w3.org/1998/Math/MathML"> d i d_i </math>di 就越大

  • 根据 <math xmlns="http://www.w3.org/1998/Math/MathML"> S i + d i S_i+d_i </math>Si+di对剩余4800个物品排序,分数最高的300个物品送入精排

粗排有5000个候选物品,先后选择了200和300个物品,一共有500个物品会被送入精排

召回的多样性

双塔模型

双塔模型是最重要的召回模型,占的召回配额最多

添加噪声

用户塔将用户特征作为输入,输出用户的向量表征;然后做ANN检索,召回向量相似度高的物品。

线上做召回时(在计算出用户向量之后,在做ANN检索之前),往用户向量中添加随机噪声有利于推荐系统的核心指标。

在计算出用户向量之后,ANN检索之前,往用户向量中添加随机噪声,比如随机高斯噪声

  • 噪声具体多强,取决于用户的特征。

    用户的兴趣越窄(比如用户最近交互的 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个物品只覆盖少数几个类目),就越需要提升多样性,则添加的噪声越强。

  • 添加噪声使得召回的物品更多样,可以提升推荐系统核心指标。

抽样用户行为序列

用户最近交互的 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个物品(用户行为序列)是用户塔的输入。

对用户行为序列做随机抽样可以提升召回的多样性。

  • 保留最近的r个物品 ( <math xmlns="http://www.w3.org/1998/Math/MathML"> r ≪ n r \ll n </math>r≪n)

  • 从剩余的 <math xmlns="http://www.w3.org/1998/Math/MathML"> n − r n-r </math>n−r 个物品中随机抽样 <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t 个物品( <math xmlns="http://www.w3.org/1998/Math/MathML"> t ≪ n t \ll n </math>t≪n)。(可以是均匀抽样,也可以用非均匀抽样让类目平衡。)

  • 将得到的 <math xmlns="http://www.w3.org/1998/Math/MathML"> r + t r+t </math>r+t 个物品作为用户行为序列,而不是用全部 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个物品。

    每次做召回的时候,都会对用户行为序列做随机抽样,这样会让双塔召回的结果有随机性,哪怕同时做两次召回,召回的结果也会有较大的差异,也就是说多样性会提升。

抽样用户行为序列为什么能涨指标?

  • 注入随机性,召回结果更多样化。

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n​ 可以非常大,可以利用到用户很久之前的兴趣。

    之前出于计算通信的考虑,用户行为序列不能超过100个物品,因此只能覆盖住用户最近很短一段时间内的兴趣点。

    现在我们可以让N等于1000,然后做随机抽样选出100个物品,这样用户行为序列就能覆盖住用户更久之前的兴趣点,但是召回的计算代价不变。

U2I2I:抽样用户行为序列

U2I2I( <math xmlns="http://www.w3.org/1998/Math/MathML"> user → item → item \text{user} \rightarrow \text{item} \rightarrow \text{item} </math>user→item→item)中的第一个 item 是指用户最近交互的 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个物品之一(用户行为序列中的物品),在 U2I2I 中叫作种子物品

用户行为序列中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个物品覆盖的类目数较少 ,且类目不平衡

  • 用户的兴趣不是很宽泛: 系统共有 200 个类目,某用户的 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个物品只覆盖 15 个类目。
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个物品的类目非常不平衡:足球类目的物品有 <math xmlns="http://www.w3.org/1998/Math/MathML"> 0.4 n 0.4n </math>0.4n 个,电视剧类目的物品有 <math xmlns="http://www.w3.org/1998/Math/MathML"> 0.2 n 0.2n </math>0.2n 个,其余类目的物品数均少于 <math xmlns="http://www.w3.org/1998/Math/MathML"> 0.05 n 0.05n </math>0.05n 个。那么召回的物品肯定会集中在足球、电视剧,召回的多样性很差。

做非均匀随机抽样,从 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n个物品中选出 <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t 个,让类目平衡。(想法和效果与双塔中的用户行为序列抽样相似。)

用抽样得到的 <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t 个物品(代替原本的 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个物品)作为U2I2I的种子物品。

  • 类目更平衡,多样性更好。
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 可以更大,覆盖的类目更多

流量探索

通常来说曝光给用户的物品应该是个性化召回模型和个性化排序模型选出来的,但不妨保留 <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 % 2\% </math>2% 的探索流量,即每个用户曝光的物品中有 <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 % 2\% </math>2% 是非个性化的,用作兴趣探索。

  • 维护一个精选内容池,其中物品均为交互率指标高的优质物品。(内容池可以统一,也可以分人群,比如30~40岁男性内容池。)

    需要精选内容池:因为没有了个性化之后需要提高物品质量来吸引用户,用高质量来弥补缺少个性化造成的损失。

  • 从精选内容池中随机抽样几个物品,跳过排序,直接插入最终排序结果

    没办法对这样的物品做公平的排序,这样的物品不匹配用户过去的兴趣点,大概率会被排序模型给淘汰掉,所以只能做提权或者强插

兴趣探索在短期内负向影响核心指标,但长期会产生正向影响

短期内做非个性化的推荐用户大概率不感兴趣,点击率会偏低。用户不看的 <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 % 2\% </math>2% 的流量大部分会被浪费掉.

兴趣探索在长期是有利的,可以发掘用户更多的兴趣点更好地吸引用户留存。

总结

精排:结合兴趣分数和多样性分数做排序;做规则打散·

粗排:只用兴趣分数选出部分物品;结合兴趣分数和多样性分数选出部分物品。

召回 :往双塔模型的用户向量添加噪声;对用户行为序列做非均匀随机抽样 (对双塔和U2I2I都适用)

兴趣探索:保留少部分的流量给非个性化推荐。

特殊对待特殊人群

特殊用户人群: 新用户和低活用户

为什么要特殊对待特殊人群?

  1. 个性化的召回和个性化的排序都要基于用户历史行为。新用户、低活用户的行为很少,个性化推荐不准确。

  2. 新用户、低活用户容易流失,要想办法促使他们留存。

    对于全体用户推荐系统要努力提升很多指标,包括留存、时长、阅读、消费。

    对于新用户和低活用户只需要考虑留存。

  3. 特殊用户的行为(比如点击率、交互率)不同于主流用户,基于全体用户行为训练出的模型在特殊用户人群上有偏。


涨指标的方法

  1. 构造特殊内容池,用于特殊用户人群的召回。
  2. 使用特殊排序策略,保护特殊用户。
  3. 使用特殊的排序模型,消除模型预估的偏差。

构造特殊的内容池

为什么需要特殊内容池?

  • 新用户、低活用户的行为很少,个性化召回不准确。

    既然个性化不好,那么就保证内容质量好。用优质内容来弥补个性化的缺失。

  • 针对特定人群的特点构造特殊内容池,提升用户满意度。

    例如,对于喜欢留评论的用户,构造促评论内容池,满足这些用户的互动需求。


如何构造特殊内容池

方法1:

根据物品获得的交互次数、交互率选择优质物品

  • 圈定人群:只考虑特定人群,例如18~25岁一二线城市男性。
  • 构造内容池:用该人群对物品的交互次数、交互率给物品打分,选出分数最高的物品进入内容池。
  • 内容池有弱个性化的效果。
  • 内容池定期更新,加入新物品,排除交互率低和失去时效性的老物品。
  • 该内容池只对该人群生效。

构造特殊内容池主要是根据交互指标给物品打分,选出优质的物品

方法2:

做因果推断,判断物品对人群留存率的贡献'根据贡献值选物品。


特殊内容池的召回

通常使用双塔模型从特殊内容池中做召回

  • 双塔模型是个性化的
  • 对于新用户,双塔模型的个性化做不准。
  • 靠高质量内容、弱个性化做弥补。

额外的训练代价?

使用更多的内容尺不会增加训练的代价

  • 对于正常用户,不论有多少内容池,只训练一个双塔模型。
  • 对于新用户,由于历史交互记录很少,需要单独训练模型。新用户有一个特殊的双塔模型,用户塔会少一些特征,但不论用在多少内容池上,新用户只需要一个自己的双塔模型就够了。

额外的推理代价?

需要。

  • 离线更新ANN索引 和 线上做ANN检索都需要额外的算力,每多增加一个内容池都需要多一份额外算力。增加的计算量跟内容池大小正相关,内容池越大计算量越大。

    • 内容池定期更新,然后要更新ANN索引。

    • 线上做召回时,需要做ANN检索。

  • 特殊内容池都很小(比全量内容池小 <math xmlns="http://www.w3.org/1998/Math/MathML"> 10 10 </math>10~ <math xmlns="http://www.w3.org/1998/Math/MathML"> 100 100 </math>100倍),所以需要的额外算力不大。

特殊的排序策略

排除低质量物品

  • 对于新用户、低活用户这样的特殊人群,业务上只关注留存,不在乎消费(总曝光量、广告收入、电商收入)
  • 对于新用户、低活用户,少出广告、甚至不出广告。
  • 新物品冷启动要避免在新用户和低活用户上做探索。
    • 物品新发布时,推荐做得不准,会损害用户体验。
    • 只在活跃的老用户上做探索,对新物品提权(boost)
    • 不在新用户、低活用户上做探索,避免伤害用户体验。

差异化的融分公式

新用户、低活用户的点击、交互行为不同于正常用户。低活用户的人均点击量很小,没有点击就不会有进一步的交互。

  • 低活用户的融分公式中,提高预估点击率的权重(相较于普通用户),降低交互率的权重。这样的话更容易促使低活用户点击物品,点进去看了用户才有可能留存。

  • 保留几个曝光坑位给预估点击率最高的几个物品。

    • 例:精排从500个物品中选50个作为推荐结果,其中3个坑位给点击率最高的物品,剩余47个坑位由融分公式决定。
    • 甚至可以把点击率最高的物品排在第一,确保用户一定能看到。

注意这些策略只对激活用户这样的特殊人群生效,而不能对全体用户生效。如果用在活跃用户身上,那么这些策略会损害核心指标

特殊的排序模型

特殊用户人群的行为不同于普通用户。新用户、低活用户的点击率、交互率偏高或偏低。

排序模型被主流用户主导,对特殊用户做不准预估。

  • 用全体用户数据训练出的模型,给新用户做的预估有严重偏差。
  • 如果一个APP的用90%是女性,用全体用户数据训练出的模型,对男性用户做的预估有偏差

问题:对于特殊用户,如何让排序模型预估做得准?

方法1

大模型+小模型

  • 用全体用户行为训练大模型 (比如全连接 6 层),大模型的预估 <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p 拟合用户行为 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y,以点击率预.估为例, <math xmlns="http://www.w3.org/1998/Math/MathML"> y = 1 y=1 </math>y=1 表示用户实际有点击推荐的物品, <math xmlns="http://www.w3.org/1998/Math/MathML"> y = 0 y=0 </math>y=0 表示用户实际上没有点击

  • 用特殊用户的行为训练小模型 (比如全连接 2 层),小模型的预估 <math xmlns="http://www.w3.org/1998/Math/MathML"> q q </math>q 拟合大模型的残差 <math xmlns="http://www.w3.org/1998/Math/MathML"> y − p y-p </math>y−p

    • <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y : 用户真实行为
    • <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p :大模型对用户的行为的预估
    • <math xmlns="http://www.w3.org/1998/Math/MathML"> y − p y-p </math>y−p:大模型犯的错误

    我们希望小模型能够纠正大模型犯的错误

  • 对主流用户只用大模型做预估 <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p。

  • 对特殊用户,结合大模型和小模型的预估 <math xmlns="http://www.w3.org/1998/Math/MathML"> p + q p+q </math>p+q,小模型在这里起到纠偏的作用,让预估更接近 <math xmlns="http://www.w3.org/1998/Math/MathML"> y y </math>y

方法2

融合多个experts,类似MMoE

  • 只用一个模型,模型有多个experts,各输出一个向量。

  • 对experts 的输出做加权平均

  • MMoE的区别在于如何计算experts的权重.

    • MMoE有一个小神经网络,把全部特征作为输入,输出是experts的权重
    • 这里只使用用户特征计算权重

    以新用户为例,模型将用户的新老、活跃度等特征作为输入,输出权重,用于对experts做加权平均。

    例:有两个experts分别对应新用户和老用户,如果用户刚刚注册,那么新用户expert的权重是1,老用户expert的权重是0。如果用户介于新老之间,那么两个experts都有一定的权重。

方法3

大模型预估之后,用小模型做校准。

  • 用大模型预估点击率、交互率。

  • 大模型做完预估之后,再用一个小模型对大模型的预估做校准,校准的时候还要考虑用户特征,比如是不是新用户,有多活跃。

    用户特征大模型预估点击率交互率作为小模型(例如GBDT)的输入。

  • 在特殊用户人群的数据上训练小模型,小模型的输出拟合用户真实行为。

大模型要预估点击率和交互率,小模型再预估一次点击率和交互率。

大模型是在全体用户的数据上训练出来的,小模型只在特殊用户人群的数据上做训练,小模型的输出拟合用户真实的行为。


错误的做法 每个用户人群使用一个排序模型,推荐系统同时维护多个大模型。

  • 系统有一个主模型;每个用户人群有自己的一个模型。
  • 每天凌晨,用全体用户数据更新主模型·
  • 基于训练好的主模型,在某特殊用户人群的数据上再训练1epoch,作为该用户人群的模型。

短期可以提升指标;维护代价大,长期有害。

  • 起初,低活男性用户模型比主模型的AUC高0.2%。
  • 主模型迭代几个版本后,AUC累计提升0.5%。
  • 特殊人群模型太多,长期没有人维护和更新。
  • 如果把低活男性用户模型下线,换成主模型,在低活男性用户上的AUC反倒提升0.3%

总结:

特殊对待特殊用户人群

召回:针对特殊用户人群,构造特殊的内容池,增加相应的召回通道。

排序策略:排除低质量物品,保护新用户和低活用户;特殊用户人群使用特殊的融分公式。

排序模型:结合大模型和小模型,小模型拟合大模型的残差;只用一个模型,模型有多个experts;大模型预估之后,用小模型做校准。

交互行为

用户的交互行为:点赞、收藏、转发、关注、评论

推荐系统如何利用交互行为?

最简单的方法:将模型预估的交互率用于排序。

  • 模型将交互行为当做预估的目标。
  • 将预估的点击率、交互率做融合,作为排序的依据。

关注

关注量对留存的价值

  • 对于一位用户,他关注的作者越多,则平台对他的吸引力越强

  • 用户留存率(retention rate <math xmlns="http://www.w3.org/1998/Math/MathML"> r r </math>r)与他关注的作者数量(follow <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f)正相关 (但非线性)。

  • 对于某个用户,如果他的 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 比较小,它留存率 <math xmlns="http://www.w3.org/1998/Math/MathML"> r r </math>r 对 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 会比较敏感,此时增加 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 对留存率提升比较大。则推荐系统要促使该用户关注更多作者。

![转存失败,建议直接上传图片文件](转存失败,建议直接上传图片文件 pic/image-20250313202411505.png)

方法1:

用排序策略提升关注量。

  • 对于用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u,模型预估候选物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 的关注率为 <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi。

  • 设用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 已经关注了 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 个作者。

  • 我们定义单调递减函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) w(f) </math>w(f),用户已经关注的作者越多,则 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) w(f) </math>w(f) 越小。

  • 在排序融分公式中添加 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) ⋅ p i w(f) \cdot p_i </math>w(f)⋅pi, <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) w(f) </math>w(f) 是权重 , <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi 是预估的关注率。

    用户关注作者数量 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 比较小的时候, <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) w(f) </math>w(f) 这一项起到了促关注的作用。

    • 如果 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 小则 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) w(f) </math>w(f) 大,如果 <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi 同时也大,则 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) ⋅ p i w(f) \cdot p_i </math>w(f)⋅pi 给物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 带来很大加分。

    • 如果 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 很大则 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) w(f) </math>w(f) 就会接近 <math xmlns="http://www.w3.org/1998/Math/MathML"> 0 0 </math>0,添加 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) ⋅ p i w(f) \cdot p_i </math>w(f)⋅pi 这一项乘积就不起作用了。

只有在用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 已经关注的作者 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 很小的时候排序策略才会起到促关注的作用

方法2:

构造促关注内容池和召回通道。

  • 这个内容池中物品的关注率高,可以促关注。
  • 如果用户关注的作者数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 较小,则对该用户使用该内容池。
  • 召回配额可以固定,也可以与 <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 负相关。用户关注作者越少,就从这个内容池召回越多的物品。

粉丝数对促发布的价值

UGC平台将作者发布量、发布率作为核心指标,希望作者多发布。作者发布的物品被平台推送给用户,会产生点赞、评论、关注等交互。交互(尤其是关注、评论)可以提升作者发布积极性。

作者的粉丝数越少,则每增加一个粉丝对发布积极性的提升越大。

用排序策略帮助低粉新作者涨粉。

  • 某作者 <math xmlns="http://www.w3.org/1998/Math/MathML"> a a </math>a 的粉丝数(被关注数)为 <math xmlns="http://www.w3.org/1998/Math/MathML"> f a f_a </math>fa。

  • 作者 <math xmlns="http://www.w3.org/1998/Math/MathML"> a a </math>a 发布的物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 可能被推荐给用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u,模型预估关注率为 <math xmlns="http://www.w3.org/1998/Math/MathML"> p u i p_{ui} </math>pui。即当用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 看到物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 之后关注作者 <math xmlns="http://www.w3.org/1998/Math/MathML"> a a </math>a 的概率为 <math xmlns="http://www.w3.org/1998/Math/MathML"> p u i p_{ui} </math>pui。

  • 我们定义单调递减函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f a ) w(f_a) </math>w(fa) 作为权重 ;作者 <math xmlns="http://www.w3.org/1998/Math/MathML"> a a </math>a 的粉丝越多,则 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f a ) w(f_a) </math>w(fa) 越小。

    如果作者粉丝数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f a f_a </math>fa 很小,而且预估关注率 <math xmlns="http://www.w3.org/1998/Math/MathML"> p u i p_{ui} </math>pui 较高,那么 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) ⋅ p u i w(f) \cdot p_{ui} </math>w(f)⋅pui 就会很大,让物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 的排序很靠前,当用户看到物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 之后有较高的概率会关注作者。

  • 在排序融分公式中添加 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ( f ) ⋅ p u i w(f) \cdot p_{ui} </math>w(f)⋅pui 帮助低粉作者涨粉。


隐式关注关系

召回通道U2A2I: <math xmlns="http://www.w3.org/1998/Math/MathML"> user → author → item \text{user} \rightarrow \text{author} \rightarrow \text{item} </math>user→author→item

  • 显式关注关系 :用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 关注了作者 <math xmlns="http://www.w3.org/1998/Math/MathML"> a a </math>a,将 <math xmlns="http://www.w3.org/1998/Math/MathML"> a a </math>a 发布的物品推荐给 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u。(点击率、交互率指标通常高于其他召回通道。)

  • 隐式关注关系 :用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 喜欢看作者 <math xmlns="http://www.w3.org/1998/Math/MathML"> a a </math>a 发布的物品,但是 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 没有关注 <math xmlns="http://www.w3.org/1998/Math/MathML"> a a </math>a

  • 隐式关注的作者数量远大于显式关注 。挖掘隐式关注关系,构造U2A2I召回通道,可以提升推荐系统核心指标。

转发 (分享)

转发最重要的价值是吸引站外流量

促转发(分享回流)

A 平台用户将物品转发到 B 平台,可以为 A 吸引站外流量。

推荐系统做促转发 (也叫分享回流 )可以提升 DAU 和消费指标。


简单提升转发次数是否有效呢?

  • 模型预估转发率为 <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p,融分公式中有一项 <math xmlns="http://www.w3.org/1998/Math/MathML"> w ⋅ p w \cdot p </math>w⋅p,让转发率大的物品更容易获得曝光机会。
  • 增大权重 <math xmlns="http://www.w3.org/1998/Math/MathML"> w w </math>w 可以促转发,吸引站外流量,但各种指标是此消彼长的,会负面影响点击率和其他交互率。

不能简单粗暴增大转发的权重,这样会损害点击和其他交互。


KOL建模

目标:在不损害点击和其他交互的前提下,尽量多吸引站外流量。

什么样的用户的转发可以吸引大量站外流量?

答案:其他平台 的 Key Opinion Leader(KOL

  • 用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 是我们站内的KOL,但他不是其他平台的KOL,他的转发价值大吗?

    它不是其他平台的KOL,他把物品转发到其他平台,大概率吸引不到其他平台的流量,所以他的转发价值不大。

  • 用户在我们站内没有粉丝,但他是其他平台的KOL,他的转发价值大吗?

    它是其他平台的KOL,可以吸引到其他平台的流量,所以他的转发价值大。

如何判断本平台的用户是不是其他平台的KOL?

看一个用户历史上的转发平均能带来多少站外的流量从而判断这个用户是不是站外的KOL。如果某个用户历史上的转发平均能带来很多流量,就认为他是站外的KOL

如何将用户的KOL身份用于排序和召回?

方法1

排序融分公式中添加额外的一项 <math xmlns="http://www.w3.org/1998/Math/MathML"> k u ⋅ p u i k_u \cdot p_{ui} </math>ku⋅pui。

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> k u k_u </math>ku:如果用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 是站外 KOL,则 <math xmlns="http://www.w3.org/1998/Math/MathML"> k u k_u </math>ku 大。

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> p u i p_{ui} </math>pui:为用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 推荐物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i,模型预估的转发率。

    • 如果 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 是站外 KOL,则多给他曝光他可能转发的物品。

    • 如果 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 不是其他平台的KOL,那么权重 <math xmlns="http://www.w3.org/1998/Math/MathML"> k u k_u </math>ku​ 接近零,添加这一项总是接近零,不会干扰排序中分公式

    这种促转发的策略只影响少数用户,对绝大多数用户没有影响

方法2:构造促转发内容池和召回通道,对站外KOL生效 ,召回的配额可以固定,也可以与KOL分数 <math xmlns="http://www.w3.org/1998/Math/MathML"> k u k_u </math>ku 挂钩

总之只要识别出某个用户是站外KOL,推荐系统就会给他用特殊的排序策略和召回通道。让他在不知不觉中就转发了更多的物品到站外。

评论

UGC 平台将作者发布量、发布率作为核心指标,希望作者多发布。

关注、评论等交互可以提升作者发布积极性。如果新发布物品尚未获得很多评论,则给预估评论率提权,让物品尽快获得评论。

做法:

排序融分公式中添加额外一项 <math xmlns="http://www.w3.org/1998/Math/MathML"> w i ⋅ p i w_i \cdot p_i </math>wi⋅pi 。

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> w i w_i </math>wi : 权重,与物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 已有的评论数量负相关 。物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 已经获得的评论越少,就越应该做评论,要把权重 <math xmlns="http://www.w3.org/1998/Math/MathML"> w i w_i </math>wi 设置的越大
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi : 为用户推荐物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i,模型预估的评论率。

添加 <math xmlns="http://www.w3.org/1998/Math/MathML"> w i ⋅ p i w_i \cdot p_i </math>wi⋅pi 到融分公式可以在评论数很少的时候促评论,而在评论数较多的时候这一项几乎等于 <math xmlns="http://www.w3.org/1998/Math/MathML"> 0 0 </math>0,不起作用

评论的其他价值

有的用户喜欢留评论,喜欢跟作者、评论区用户互动

  • 给这样的用户添加促评论的内容池,让他们更多机会参与讨论。
  • 有利于提升这些用户的留存。

有的用户常留高质量评论 (评论的点赞量高)

  • 高质量评论对作者、其他用户的留存有贡献。(作者、其他用户觉得这样的评论有趣或有帮助。)
  • 用排序和召回策略鼓励这些用户多留评论。

总结

利用交互行为

  • 关注:留存价值(让新用户关注更多作者,提升新用户留存);发布价值(帮助新作者获得更多粉丝,提升作者发布积极性);利用隐式关注关系做召回。
  • 转发:判断哪些用户是站外的KOL,利用他们转发的价值吸引站外的流量
  • 评论:发布价值 (促使新物品获得评论,提升作者发布积极性);留存价值(给喜欢讨论的用户创造更多留评机会);鼓励高质量评论的用户多留评论
相关推荐
程序媛小盐11 分钟前
贪心算法:最小生成树
算法·贪心算法·图论
Panesle13 分钟前
分布式异步强化学习框架训练32B大模型:INTELLECT-2
人工智能·分布式·深度学习·算法·大模型
多多*29 分钟前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
逐光沧海30 分钟前
数据结构基础--蓝桥杯备考
数据结构·c++·算法·蓝桥杯
Kidddddult31 分钟前
力扣刷题Day 48:盛最多水的容器(283)
算法·leetcode·力扣
AndrewHZ42 分钟前
【Python生活】如何构建一个跌倒检测的算法?
python·算法·生活·可视化分析·陀螺仪·加速度计·跌倒检测
写个博客1 小时前
代码随想录算法训练营第三十九天
算法
源码方舟2 小时前
【基于ALS模型的教育视频推荐系统(Java实现)】
java·python·算法·音视频
fancy1661663 小时前
力扣top100 矩阵置零
人工智能·算法·矩阵
元亓亓亓3 小时前
LeetCode热题100--240.搜索二维矩阵--中等
算法·leetcode·矩阵