推荐系统公开课——8小时完整版,讲解工业界真实的推荐系统
newlifelmq
编辑于 2024年11月25日 00:02

召回

1. 地理位置召回:

  • GeoHash召回,同城召回。

2. 作者召回:

  • 关注的作者,有交互的作者,相似的作者。

3. 缓存召回:

想法:复用前n次推荐精排的结果。

  • 背景:

精排输出几百篇笔记,输入重排。

重排做出多样性抽样,选出几十篇。

精排结果一大半没有曝光,被浪费。

  • 精排前50,但是没有曝光的,缓存起来,作为一条召回通道。

问题:

缓存大小固定,需要退场机制。

  • 一旦笔记成功曝光,就从缓存退场。

  • 如果超出缓存大小,就移除最先进入缓存的笔记。

  • 笔记最多被召回10次,达到10次就退场。

  • 每篇笔记最多保存3天,达到3天就退场。

  • 如果想扶持低曝光的笔记,那可以缓存里面设置更长的保存时间。

曝光过滤 & Bloom filter

曝光过滤在召回的阶段做,使用的方法是bloom filter

曝光过滤问题:

  • 如果用户看过某个物品,则不再把该物品曝光给该用户。

os:小红书、抖音通过ab实验得出曝光过滤会损害用户体验。京东就没有曝光过滤。--对于购后推这件事,需不需要做需要实验。

  • 对于每个用户,记录已经曝光给他的物品。(小红书只召回1个月以内的笔记,因此只需要记录每个用户最近1个月的曝光历史。)

  • 对于每个召回的物品,判断它是否已经给该用户曝光过,排除掉曾经曝光过的物品。

  • 一位用户看过n个物品,本次召回r个物品,如果暴力对比,需要O(nr)的时间。

时间复杂度高,所以不适用暴力枚举,而使用bloom filter。

Bloom filter:what

  • Bloom filter 判断一个物品ID是否在已经曝光的物品集合中。

  • 如果判断为no,那么该物品一定不在集合中。

  • 如果判断为yes,那么该物品很可能在集合中。(可能误伤,错误判断未曝光物品为已曝光将其过滤掉)--哈希冲突导致假阳性

Bloom filter:how

  • Bloom filter把物品集合表征为一个m维二进制向量。

  • 每个用户有一个曝光物品的集合,表征为一个向量,需要m bit的存储。

  • Bloom filter有k个哈希函数,每个哈希函数把物品ID映射成介于0和m-1之间的整数。

Bloom Filte:误判率

推导过程:

最后一步:k次hash后的位置都已经为1了,所以根据乘法法则置为1。

曝光过滤的链路

需要实时流处理

Bloom Filter的缺点:不方便删除

  • bloom filter把物品的集合表示成一个二进制向量。

  • 每往集合中添加一个物品,只需要把向量k个位置的元素置为1。(如果原本就是1,则不变)

  • bloom filter只支持添加物品,不支持删除物品。从集合中移除物品,无法消除它对向量的影响。

  • 每天都需要从物品集合中移除年龄大于1个月的物品。

(超龄物品不可能被召回,没必要把他们记录在Bloom filter,降低n可以降低误伤率)

排序

多目标排序

粗排 vs 精排

粗排模型小,特征少,效果差一些。目的是快速的初步筛选。

用户-笔记的交互

  • 对于每篇笔记,系统记录。

    • 曝光次数

    • 点击次数

    • 点赞次数

    • 收藏次数

    • 转发次数

    • 点击率=点击次数/曝光次数 10%~20%

    • 点赞率=点赞次数/点击次数

    • 收藏率=收藏次数/点击次数

    • 转发率=转发次数/点击次数--可以引流

排序的依据

  • 机器学习-排序模型预估点击率,点赞率,收藏率,转发率等多种分数。

  • 融合这些预估分数。(比如加权和,权重是做ab test调出来的)

  • 根据融合的分数做排序、截断。

多目标模型

输入:各种各样特征

用户特征

物品特征

统计特征

场景特征:时间、地点

把这些特征输入神经网络

模型:分类问题

目标:交叉熵损失函数

求解:梯度下降

训练:

  • 困难:类别不平衡。

    • 每100次曝光,约有10次点击,90次无点击。

    • 每100次点击,约有10次收藏,90次无收藏。

  • 解决方案:负样本降采样(down-sampling)

    • 保留一小部分负样本。

    • 让正负样本数量平衡,节约计算。

预估值校准:

  • 正样本、负样本数量为n+,n-。

  • 对负样本做降采样,抛弃一部分负样本。

  • 使用a*n-个负样本,a是采样率。

  • 由于负样本变少,预估点击率大于真实点击率。

Multi-gate Mixture-of-Experts(MMoE)

https://dl.acm.org/doi/pdf/10.1145/3219819.3220007

极化现象 Polarization:softmax输出值一个接近1,其余接近0。

解决极化问题

  • 如果有n个专家,那么每个softmax的输入和输出都是n维向量。

  • 在训练时,对softmax的输出使用dropout。

    • softmax输出的n个数值被mask的概率都是10%。

    • 每个专家被随机丢弃的概率都是10%。

注:不是所有用了mmoe都会提升,可能不适合场景。

预估分数的融合

融合预估分数

  • 简单的加权和

  • 点击率乘以其他项的加权和

eg:

eg:用排名而不是率

eg:某电商的融分公式

  • 电商的转化流程:

    • 曝光->点击->加购物车->付款

  • 模型预估:p_click,p_cart,p_pay

视频播放建模

视频播放时长和完播率:

图文 vs 视频

略。。。。因为工作中不涉及短视频我就跳了哈

排序模型用的特征

用户画像(user profile)

  • 用户ID(在召回、排序中做embedding)

  • 人口统计学属性:性别、年龄。

  • 账号信息:新老,活跃度

  • 感兴趣的类目、关键词、品牌...

物品画像(item profile)

  • 物品id(在召回、排序中做embedding)

  • 发布时间(或者年龄)

  • GeoHash (经纬度编码)、所在城市

  • 标题、类目、关键词、品牌...

  • 字数、图片数、视频清晰度、标签数...

  • 内容信息量、图片美学...

用户统计特征

  • 用户最近30天(7天、1天、1小时)的曝光数、点击数、点赞数、收藏数...

  • 按照笔记图文/视频分桶。(比如最近7天,该用户对图文笔记的点击率、对视频笔记的点击率。)

  • 按照笔记类目分桶。(比如最近30天,用户对美妆笔记的点击率等。)

笔记统计特征

  • 笔记最近30天(7天、1天、1小时)的曝光数、点击数、点赞数、收藏数...

  • 按照用户性别分桶,按照用户年龄分桶...

  • 作者特征:

    • 发布笔记数

    • 粉丝数

    • 消费指标(曝光数、点击数、点赞数、收藏数)

场景特征(context)

  • 用户定位GeoHash(经纬度编码)、城市。

  • 当前时刻(分段、做embedding)。

  • 是否是周末、是否是节假日。

  • 手机品牌、手机型号、操作系统。

特征处理

  • 离散特征:做embedding。

    • 用户id,笔记id,作者id。

    • 类目、关键词、城市、手机品牌。

  • 连续特征:做分桶,变成离散特征。

    • 年龄,笔记字数、视频长度。

  • 连续特征:其他变换。

    • 曝光数、点击数、点赞数等数值做log(1+x)。--避免梯度很离谱

    • 转化为点击率、点赞率等值,并做平滑。长尾发布指标,去掉偶然性造成的波动。

特征覆盖率

数据缺失时,什么作为默认值

数据服务

  • 用户画像

  • 物品画像

  • 统计数据

粗排

粗排vs精排

精排模型 & 双塔模型

前期融合:先对所有特征做concatenation,再输入神经网络。

线上推理代价大:如果有n篇候选笔记,整个大模型要做n次推理。

双塔模型:用户塔 & 物品塔

计算代价很小,适合做召回

后期融合:把用户、物品特征分别输入不同的神经网络,不对用户、物品特征做融合。

线上计算量小:

  • 用户塔只需要做一次线上推理,计算用户表征a。

  • 物品表征b事先储存在向量数据库中,物品塔在线不做推理。

预估准确性不如精排模型。

前期融合模型适合做精排,后期融合模型适合做召回。

粗排的三塔模型:

vs 精排模型:前期和后期的综合

底层:

上层:

三塔模型的推理:

04:11:37 先看到这啦

第四部分-特征交叉结构

factorized machine(FM)

  • FM是线性模型的替代品,能用线性回归、逻辑回归的场景,都可以用FM。

  • FM使用二阶交叉特征,表达能力比线性模型更强。

注:fm已经过时了

深度交叉网络(DCN)

可以用召回和排序

双塔模型是一种框架,

交叉层(cross layer)

第六部分 多样性

相似性的度量

  • 基于物品属性标签:

    • 类目、品牌、关键词...

eg:根据一级类目、二级类目、品牌计算相似度。

物品i:美妆、彩妆、香奈儿

物品j:美妆、彩妆、香奈儿

  • 基于物品向量表征:

    • 用召回的双塔模型学到的物品向量(不好)。

只需要物品塔的输出

效果一般:推荐中头部效应严重,曝光和点击集中在少数物品,新物品和长尾物品的曝光和点击次数都很少。双塔模型学不好他们的表征。处理不好新物品和长尾物品,效果很差。

  • 基于图文内容的物品表征(好)

cv和nlp的预训练,最好使用clip

提升多样性的方法

粗排的后处理称为:打散(多样性算法)

  • 给定n个候选物品,排序模型打分,reward1,...,rewardn。

  • 从n个候选物品中选出k个,既要它们的总分高,也需要它们有多样性。

精排的后处理称为:重排

Maximal Marginal Relevance(MMR)

最大边际相关性。

先用于搜索排序后用于推荐排序。

MMR多样性算法:优化两目标的问题。

滑动窗口

基于两个离得远的物品相似也不会影响用户体验。MMR 通常用于精排后的处理阶段。

重排的规则:为了用户体验而制定的业务规则

boost策略,为了防止boost影响体验,限制每k篇笔记最多出现1篇笔记。

前n篇笔记最多出现k篇某种笔记。

MMR+重排规则

DPP:行列式点过程。

超平行体:

2维空间的超平行体:

3维空间的超平行体:

平行四边形的面积

平行六面体的体积

衡量物品多样性 :体积

DPP:多样性算法

多样性问题:价值大+多样性好

hulu的快速算法--滑动窗口

规则约束

第7部分-物品冷启动

物品冷启动:评价指标

研究UGC的物品冷启,相对于PGC,UGC冷启更难。用户上传的内容良莠不齐且量大,很难让运营人员做流量调控。

为什么要特殊对待新笔记?

  • 新笔记缺少与用户的交互,导致推荐的难度大、效果差。

  • 扶持新发布、低曝光的笔记,可以增加作者发布意愿。(大量实验表明)

优化冷启的目标

1. 精准推荐:克服冷启的困难,把新笔记推荐给合适的用户,部引起用户反感。

2.激励发布:流量向低曝光新笔记倾斜,激励作者发布。

3. 挖掘高潜:通过初期小流量的试探,找到高质量的笔记,给与流量倾斜。

评价指标

作者侧指标:发布渗透率、人均发布量;

发布渗透率=当日发布人数/日活人数

发布一篇或以上,就算一个发布人数。

例:当日发布人数=100w

日活人数=2000w

发布渗透率=100/2000=5%

人均发布量=当日发布笔记数/日活人数

例:

每日发布笔记数=200w

日活人数=2000w

人均发布量=200/2000=0.1

  • 发布渗透率、人均发布量反映出作者的发布积极性。

  • 冷启的重要优化目标是促进发布、增大内容池。

  • 新笔记获得曝光越多,首次曝光和交互出现得越早,作者发布积极性越高。

用户侧指标:

1.新笔记指标:新笔记的点击率、交互率;

  • 问题:曝光的基尼系数很大。

  • 少数头部新笔记占据了大部分的曝光。

  • 分别考察高曝光、低曝光新笔记。

    • 高曝光:比如>1000次曝光。

    • 低曝光:比如<1000次曝光。

2.大盘指标:消费时长、日活、月活。

大力扶持低曝光新笔记会发生什么?

  • 作者侧发布指标变好。

  • 用户侧大盘消费指标变差。

内容侧指标:高热笔记占比。

  • 高热笔记:前30天获得1000+次点击。

  • 高热笔记占比越高,说明冷启阶段挖掘优质笔记的能力越强。

冷启动的优化点

  • 优化全链路(包括召回和排序)

  • 流量调控(流量怎么在新物品、老物品中分配)

物品冷启动:简单的召回通道

召回的难点:

召回的依据

  • 自带图片、文字、地点。

  • 算法或人工标注的标签。

  • 没有用户点击、点赞等信息。

  • 没有笔记ID embedding。(没有用户和笔记的交互)---召回和排序最终的特征。

冷启召回的困难

  • 缺少用户交互,还没学好笔记ID embedding,导致双塔模型效果不好。

  • 缺少用户交互,导致ItemCF不适用。

ItemCF(根据重合的用户来计算物品的重合度)不适用于物品冷启动。

召回通道

ItemCF召回(不适用)

双塔模型(改造后适用)需要用到id embedding

类目、关键词召回(适用)

聚类召回(适用)专门针对新物品

Look-Alike召回(适用)专门针对新物品

双塔模型-改造

把笔记id映射成

ID Embedding

改进方案1:新笔记使用default embedding

  • 物品塔做id embedding时,让所有新笔记共享一个id,而不是用自己真正的id。

  • default embedding(学出来后)共享的id对应的embedding 向量。

  • 到下次模型训练的时候,新笔记才有自己的id embedding向量。

改进方案2: 利用相似笔记embedding向量。

  • 查找top k内容最相似(多模态神经网络)的高曝光笔记。

  • 把k个高曝光笔记的embedding向量取平均,作为新笔记的embedding。

多个召回池,让新笔记有更多曝光机会。

  • 1小时新笔记

  • 6小时新笔记

  • 24小时新笔记

  • 30天笔记

共享同一个双塔模型,那么多个召回池不增加训练的代价。

类目召回:

用户画像

基于类目的召回

  • 系统维护类目索引:类目->笔记列表(按时间倒排)

  • 用类目索引做笔记:用户画像->类目->笔记列表。

  • 取回笔记列表上前k篇笔记(即最新的k篇)。

基于关键词的召回

  • 系统维护关键词索引:

关键词->笔记列表(按时间倒排)

  • 根据用户画像上的关键词做召回。

缺点:

  • 缺点1:只对刚刚发布的新笔记有效。

    • 取回某类目/关键词下最新的k篇笔记。

    • 发布几小时之后,就再也没有机会被召回。

  • 缺点2:弱个性化,不够精准。

物品冷启动:聚类召回

基于图文内容做召回

基本思想:

  • 如果用户喜欢一篇笔记,那么他会喜欢内容相似的笔记。

  • 事先训练一个神经网络,基于笔记的类目和图文内容,把笔记映射到向量。(判断相似度)(内容相似度模型)

  • 对笔记向量做聚类,划分为1000cluster,记录每个cluster的中心方向。(k-means聚类,用余弦相似度

聚类索引

  • 一篇新笔记发布之后,用神经网络把它映射到一个特征向量。

  • 从1000个向量中找到最相似的向量,作为新笔记的cluster。

  • 索引:

cluster->笔记id列表(按时间倒排)

线上召回

  • 给定用户id,找到他的last-n 交互的笔记列表,把这些笔记作为中走笔记。

  • 把每篇种子笔记映射到向量,寻找最相似的cluster。(知道了用户对哪些cluster感兴趣)

  • 从每个cluster的笔记列表中,取回最新的m篇笔记。

  • 最多取回mn篇新笔记。

内容相似度模型

两篇笔记内容相似度

两边模型的参数是一样的,cnn和bert都是预训练好的。

模型的训练

  • 正样本笔记

  • 种子笔记

  • 负样本笔记

<种子笔记,正样本>

<种子笔记,负样本>

总结:

物品冷启动:look-alike人群扩散

起源于互联网广告

满足所有条件的用户全部圈选称为种子用户。

  • 如何计算两个用户的相似度?

  • usercf:两个用户有共同的兴趣点

  • embedding:两个用户向量的consin比较大

look-alike用于新笔记召回

  • 点击、点赞、收藏、转发----用户对笔记感兴趣。

  • 把有交互的用户作为新笔记的种子用户。

  • 用look-alike在相似用户中扩散。

近线更新:几分钟更新

物品冷启动:流量调控

冷启动的优化点:

  • 优化全链路

  • 流量调控(流量怎么在新笔记、老笔记中分配)

为什么给新笔记流量倾斜?

扶持新笔记的目的

  • 目的1:促进发布,增大内容池。

    • 新笔记获得的曝光越多,作者创作积极性越高。

    • 反映在发布渗透率、人均发布量。

  • 目的2:挖掘优质笔记

    • 做探索,让每篇新笔记都能获得足够曝光。

    • 挖掘的能力反映在高热笔记占比。

流量调控技术的发展

1.在推荐结果中强插新笔记。

2.对新笔记的排序分数做题权(boost)。

3.通过提权,对新笔记做保量

4.差异化保量。

新笔记提权(boost)

推荐系统的链路

召回->粗排->精排->重排

在精排和粗排阶段给新笔记提权

新笔记提权

  • 目标:让新笔记有更多机会曝光。

  • 如果做自然分发,24小时新笔记占比为1/30;

  • 做人为干涉,让新笔记占比大幅提升。

  • 干涉粗排、重排环节,给新笔记提权。

优点:容易实现,投入产出比好

缺点:

  • 曝光量对提权系数很敏感。

  • 很难精确控制曝光量,容易过度曝光和不充分曝光。

新笔记保量

  • 保量:不论笔记质量高低,都保证24小时获得100次曝光。

  • 在原有提权系数的基础上,乘以额外的提权的系数,比如:

动态提权保量

用下面四个值计算提权系数

  • 目标时间:比如24小时

  • 目标曝光:比如100次。

  • 发布时间:比如笔记已经发布12小时。

  • 已有曝光:比如笔记已经获得20次曝光。

提权系数=f(发布时间/目标时间,已有曝光/目标曝光)=f(0.5,0.2)

第一个数越大,第二个数越小,提权系数就应该越大。

保量的难点

保量成功率远低于100%

  • 很多笔记在24小时达不到100次曝光。

  • 召回、排序存在不足。

  • 提权系数调的不好。

线上环境变化会导致保量失败

  • 线上环境变化:新增召回通道、升级排序模型、改变重排打散规则...

  • 线上环境变化后,需要调整提权系数。

给新笔记分数boost越多,对新笔记越有利?

  • 好处:分数提升越多,曝光次数越多。

  • 坏处:把笔记推荐给不太合适的受众。

    • 点击率、点赞率等指标会偏低。

    • 点击率、点赞率比较低,长期会受推荐系统打压,难以成长为热门笔记。

差异化保量

  • 保量:不论新笔记质量高低,都做扶持,在前24小时给100次曝光。

  • 差异化保量:不同笔记有不同保量目标,普通笔记保100次曝光,内容优质的笔记保100~500次曝光。

差异化保量:

  • 基础保量:24小时100次曝光;

  • 内容质量:用模型评价内容质量高低,给予额外保量目标,上限是加200次曝光。

  • 作者质量:根据作者历史上的笔记质量,给予额外保量目标,上限是加200次曝光。

  • 一篇笔记最少有100次曝光,最多有200次曝光。

物品冷启动:ab测试

新笔记冷启动的ab测试

  • 作者侧指标:

    • 发布渗透率、人均发布量

  • 用户侧指标:

    • 对新笔记的点击率、交互率。

    • 大盘指标:消费时长、日活、月活。--标准的ab测试

推荐系统标准的ab测试

用户侧实验

缺点:

  • 限定:保量100次曝光。

  • 假设:新笔记曝光越多,用户使用app时长越低。

  • 新策略:把新笔记排序时的权重增大两倍。

  • 结果(只看用户消费指标):

    • ab测试的diff是负数(实验组不如对照组)。

    • 如果推全,diff会缩小

(比如-2%->-1%)

作者侧实验

缺点:新笔记之间会抢流量

  • 设定:

    • 新老笔记走个字队列,没有竞争。

    • 重排分给新笔记1/3流量,分给老笔记2/3流量。

  • 新策略:把新笔记的权重增大两倍。

  • 结果(只看作者发布指标):

    • ab测试的diff是正数(实验组优于对照组)

    • 如果推全,diff会消失(比如2%->0%)

缺点:新笔记和老笔记抢流量

  • 设定:新老笔记自由竞争。

  • 新策略:把新笔记排序的权重增大两倍。

  • ab测试时,50%新笔记跟100%老笔记抢流量。

  • 推全后,100%新笔记(带策略)跟100%老笔记抢流量。

  • ab测试结果与推全结果有差异。