基本概念
小红书的推荐系统
发现页:
- 展示推荐系统分发给你的内容,由用户创作,推荐系统展示给其他用户
- 推荐系统根据用户历史数据(点赞评论收藏)把用户可能感兴趣的笔记推荐给用户
曝光 impression:
- 系统把一篇笔记展示给用户叫曝光
- 如果用户点击并停留几秒,则说明用户感兴趣,这称之为有效点击
推荐系统的依据:有效点击、滑动到底、 点赞、评论、收藏、转发
转化流程:
- 曝光和点击:绝大多数产品都有(youtube,b站,小红书......),但抖音没有(一次只展示一个视频)
短期消费指标
指标反应用户对推荐是否满意
- 点击率 :点击率越高说明推荐越精准,向用户展示了感兴趣的内容
点击率 = 点击次数 / 曝光次数 点击率 = 点击次数 / 曝光次数 点击率=点击次数/曝光次数 - 点赞率 :
点赞率 = 点赞次数 / 点击次数 点赞率 = 点赞次数 / 点击次数 点赞率=点赞次数/点击次数 - 收藏率 :
收藏率 = 收藏次数 / 点击次数 收藏率 = 收藏次数 / 点击次数 收藏率=收藏次数/点击次数 - 转发率 :
转发率 = 转发次数 / 点击次数 转发率 = 转发次数 / 点击次数 转发率=转发次数/点击次数 - 阅读完成率 :
其中 f (笔记长度)是一个与笔记长度有关的归一化函数
阅读完成率 = 滑动到底次数 / 点击次数 x f ( 笔记长度 ) 阅读完成率 = 滑动到底次数 / 点击次数 x f (笔记长度) 阅读完成率=滑动到底次数/点击次数xf(笔记长度)
注意:
但是不能只追求短期消费指标(竭泽而渔),也要发一些新鲜的东西(多样性)。
多样性有助于提高用户粘性
北极星指标
最重要的指标,是衡量推荐系统好坏的根本标准
- 用户规模 :和推荐系统的好坏强相关。推荐系统越好,用户越活跃,DAU和MAU越高
- 日活用户数(DAU):每天登录小红书的用户数(一个人在一天内登录一次及以上,DAU+1)
- 月活用户数(MAU):每月登录小红书的用户数(一个人在一个月内登录一次及以上,MAU+1)
- 消费 :推荐系统越好,用户越上瘾,使用小红书的时长和阅读数量越高
- 人均使用推荐的时长
- 人均阅读笔记的数量
- 发布 :希望推荐系统激励更多人发布作品,扩大内容池
- 发布渗透率
- 人均发布量
注意:
当北极星指标和短期消费指标冲突时,以北极星指标为主
实验流程
算法工程师改进模型特征策略系统,提升指标
离线实验:
- 不占用线上流量,不对用户和系统产生负面影响
- 结果有参考价值,但没有线上实验可靠
线上实验:
- 北极星指标只能通过线上实验获得
- 小流量AB测试:把用户随机分为实验组和对照组,用评价指标衡量新策略是否有效,如果有效则全流量上线
链路
推荐系统目标:从物品数据库中选出几十个物品展示给用户
召回
召回从笔记数据库中快速取回一些笔记。每条召回通道取回几十到几百篇笔记,共几千篇。然后进行融合,做去重和过滤
过滤排除用户不喜欢的作者、话题和笔记
推荐系统有很多条召回通道,例如:协同过滤、双塔模型、关注的作者等。
排序
用机器学习模型预估用户对笔记的兴趣,保留分数最高的笔记。
**不能直接用大规模神经网络,因为代价很大。**因此分步骤进行。
-
粗排
- 用简单的小规模神经网络给几千篇笔记快速打分,选出分数最高的几百篇,做排序和截断
- 保证进入精排的笔记具有多样性
-
精排
- 用大规模神经网络给几百篇笔记逐一打分
- 精排模型更大,特征更多,分数更可靠,但计算量较大
- 打完分后不需要排序和截断,笔记和分数进入重排(因为精排后的结果可能存在不足)
模型
-
粗排和精排的模型非常相似,唯一区别是精排模型更大
-
模型输入包括用户特征、物品特征和统计特征
-
输出各种评价指标的预估值,然后融合成最终的排序分数
- 重排
- 随机抽样(DPP、MMR)
- 抽样依据:精排分数大小和多样性
- 用规则打散相似笔记
- 插入广告和运营内容,根据生态调整排序
- 重排的结果是最终向用户展示的
- 随机抽样(DPP、MMR)
A/B测试
目的:
- 考察新的策略对线上指标的影响
- 为新策略选择最优参数
随机分桶
做AB测试需要对用户进行随机分桶。如果用户数量足够大,则评价指标应该相等
如何分桶 :用哈希函数把用户ID映射成某个区间内的整数,然后把这些整数均匀随机分成b个桶。
实验组用了新策略,对照组用的是旧策略
实验组每个桶设置的实验参数不一样,用来选取最优参数
计算每个桶的业务指标(DAU、人均使用推荐的时长、点击率)
如果某个实验组指标显著优于对照组,则说明对应的策略有效,值得推全。推全是把流量扩大到100%,即所有用户都使用这个策略。
分层实验
目的:解决流量不够用的问题
- 公司中有很多部门和团队,每个团队要做不同的AB测试。不分层的话无法解决需求
解决方法 :
分层实验:平行分成多个层:召回、粗排、精排、重排、用户界面、广告...(例如 GNN 召回通道属于召回层。)每个层分成n个桶。
- 同层互斥:避免一个用户同时被两个实验影响
- GNN 实验占了召回层的4个桶,其他召回实验只能用剩余的6个桶。
- GNN 实验占了召回层的4个桶,其他召回实验只能用剩余的6个桶。
- 不同层正交:
- 每一层独立随机对用户做分桶,每一层都可以独立用100%的用户做实验。
- 用户界面层的策略和召回层的策略可能作用在同一个用户身上,因为不同层实验之间效果不易增强或抵消
每一层之间的用户是随机独立划分的,即召回的2号桶和粗排的2号桶交集很小
为什么不全用正交?
- 同类的策略天然互斥,对于一个用户,只能用其中一种。(如精排模型的两种结构)
- 两条不互斥的同类策略效果会相互增强(1+1>2)或相互抵消(1+1<2)。互斥可以避免同类策略相互干扰。
- 而不同类型的策略(例如添加召回通道、优化粗排模型)通常不会相互干扰(1+1=2),可以作为正交的两层
Holdout机制
目的:计算整个推荐系统业务指标的收益
每个实验(召回、粗排、精排、重排)独立汇报对业务指标的提升,但公司需要考察一个部门(比如推荐系统)在一段时间内对业务指标总体的提升。
于是取10%的用户作为holdout桶,推荐系统使用剩余90%的用户做实验,两者互斥。10% holdout 桶 vs 90% 实验桶的 diff(需要归一化)为整个部门的业务指标收益。
每个考核周期结束之后,清除holdout桶,让推全实验从90%用户扩大到100%用户。重新随机划分用户,得到holdout桶和实验桶,开始下一轮考核周期。
新的 holdout 桶与实验桶各种业务指标的 diff接近0。随着召回、粗排、精排、重排实验上线和推全,diff会再次逐渐扩大。
实验推全
如果业务指标显著正向,则可以推全实验
推全的时候把之前的桶关掉,新开一层
反转实验
目的:新的策略既要尽快推全,又要长期观测实验指标
- 有的指标(点击、交互)立刻收到新策略影响,有的指标(留存)有滞后性,需要长期观测
- 实验观测到显著收益后尽快推全新策略。目的是腾出桶供其他实验使用,或需要基于新策略做后续的开发
解决方法 :
用反转实验解决上述矛盾,既可以尽快推全,也可以长期观测实验指标
在推全的新层中开一个旧策略的桶,长期观测实验指标。