推荐系统公开课——8小时完整版,讲解工业界真实的推荐系统
帅帅绮雯拍了拍
编辑于 2024年04月18日 18:37

【概要02】

召回 -> [千]

粗排 -> [百]

精排 -> [百]

重排 -> [十]

排序依据:模型打分

用户特征+物品特征+统计特征

点击率、点赞率、收藏率、转发率

【概要03】

AB测试需要随机分桶

如果某个实验组指标显著优于对照组,则说明对应策略有效。

分层实验:同层互斥,不同层正交

每个用户不可以同时受召回桶&召回桶 / 精排桶&精排桶影响(互斥),但是可以同时受召回桶&精排桶影响(正交)

由houdout桶和实验桶计算diff衡量业务指标

如果diff显著正向则可以推全实验

推全新策略作用在10%用户 -> 推全实验 -> 推全新策略作用在90%用户

尽可能早推全有好处,推迟推全也有好处 -> 矛盾 -> 反转实验

反转实验:在新层中开启小的反转桶,当holdout桶去掉后,在反转桶继续观察新旧策略的diff

【召回01】

ItemCF

背景:如果用户喜欢A,那么可能喜欢和A相似的B

做法:Σ用户兴趣*物品相似度

物品不相似:A和B的受众交集为空集

离线建立索引

“用户 -> 物品”:用户 ->(物品ID,兴趣分数),存储最近交互过的n个

“物品 -> 物品”:物品 ->(物品ID,相似度),存储相似度最高的k个

意义:离线建立索引时间长,但线上召回索引很快

【召回02】

Swing

背景:小圈子用户有重合,比如两个链接在同一个群聊中被实际上爱好不同的人打开,误判两个链接相似

做法:ItemCF重合度过高的用户可能来自小圈子,因此减少他们对物品相似度计算的贡献

【召回03】

UserCF

背景:很多兴趣相似的网友,笔记\作者重合越多说明兴趣越相似,如果A喜欢item,和A兴趣相似的B也可能喜欢item

降低热门物品的权重,因为热门物品很多人都知道;越冷门的物品对用户相似度的权重应该更高

离线建立索引

“用户 -> 物品”:用户 ->(物品ID,兴趣分数),存储最近交互过的n个

“用户 -> 用户”:用户 ->(用户ID,相似度),存储相似度最高的k个

线上召回索引

用户 -> (用户ID,相似度)* top_k -> 用户ID * top_k -> (物品ID,兴趣分数)* top_k -> 物品ID * top_k * top_n

【召回04】

离散特征,如性别、国籍、物品ID

处理:建立字典(类别->序号),向量化(序号->向量)(One-hot编码,Embedding)

One-hot编码

至多有一个位置是1,未知是零向量,类别数量较少时使用

Embedding层

形式:矩阵,大小为(向量维度*类别数量)

输入:序号

输出:向量

Embedding = 参数矩阵 * One-hot向量

【召回05】

用户ID & 物品ID -> Embedding -> 兴趣预估值<用户向量,物品向量>

数据集:(用户ID,物品ID,真实兴趣分数)

Embedding层训练

把ID映射成向量,求解优化问题

矩阵补充

只有曝光给用户的物品才有分数

注:实践效果不好,仅了解

原因:仅用ID映射;负样本选取曝光但无交互的物品,这样的选取方式是不对的;训练方法不好

模型存储

存储用户和物品的Embedding矩阵

线上服务

逐个计算兴趣预估值并查找最近邻,但枚举的复杂度过高,主要是要加速最近邻的查找

近似最近邻查找

最近邻的标准:余弦相似度最常用于推荐系统,扇形

划分区域 -> 通过区域向量确定目标物品的所属区域 -> 在该区域中查找相似度最近邻

【召回06】

双塔模型

背景:矩阵补充的升级版,用户塔+物品塔

  1. 用户特征 -> 特征处理 -> 神经网络 -> 用户表征(向量a)

  2. 物品特征 -> 特征处理 -> 神经网络 -> 物品表征(向量b)

训练:Pointwise;Pairwise;Listwise

正负样本的选择

正样本:用户点击的物品

负样本:下一节说明

Pointwise训练

思路:把召回看作二元分类任务,(a,b)

正样本 - 鼓励cos(a,b)接近+1

负样本 - 鼓励cos(a,b)接近-1

控制正:负 = 1:2 or 2:3

Pairwise训练

思路:鼓励对正样本的兴趣大于对负样本的兴趣,(a,b+,b-)

如果cos(a,b+) > cos(a,b-)+m则没有损失,否则有损失

训练:最小化损失函数L(a,b+,b-)(Triplet hinge loss, Triplet logistic loss)

Listwise训练

思路:鼓励对一个正样本的兴趣尽量大,对多个负样本的兴趣尽量小,(a,b+,b1-,b2-,...,bn-)

激活函数:softmax

损失函数:交叉熵

不适用于召回的模型:双塔模型 -> 神经网络 -> 实数

这种前期融合模型需要一对对计算,太复杂了,这种模型通常用于排序,召回只能用双塔那种后期融合模型

【召回07】

简单负样本:全体物体内负样本

未被召回的物品≈全体物品,大概率是用户不感兴趣

做法:直接全体物体随机抽样

简单负样本:Batch内负样本

热门物品成为负样本的概率过大

一个batch有n个样本,一个用户点击一个样本,剩下n-1个样本和该用户组成n-1个负样本,总共是n*(n-1)个负样本

困难负样本

被粗排淘汰的物品,容易被错误地分类为正样本

精排分数靠后的物品,更容易被错误地分类为正样本

所以说“困难”

常见错误

内容:把曝光但没有点击的物品作为负样本

说明:这种样本会用到排序模型,但不可以用到召回模型

原因:召回的目标是快速找到用户可能感兴趣的物品

  1. 全体物品 - 绝大多数是用户不感兴趣的 - “简单”

  2. 被排序淘汰 - 用户可能感兴趣但不够感兴趣 - “困难”

  3. 有曝光没点击 - 既然到了曝光这一步,说明是匹配用户兴趣的,用户感兴趣但碰巧没有点击 - 错误

区分:召回的目标是找到可能感兴趣的物品,排序的目标是分出感兴趣和非常感兴趣的物品。

【召回08】

双塔模型的召回

离线存储(物品向量,离线存储) -> 线上召回(用户向量,最近邻查找)

说明:物品特征相对稳定,用户特征动态变化

全量更新 v.s. 增量更新

全量更新:今天凌晨用昨天全天的数据训练模型,准确,更新全连接层参数

增量更新:做online learning更新模型参数,实时,用户兴趣随时变化,更新embedding层参数

【召回09】

自监督学习改进双塔模型,把物品塔训练得更好

背景:少部分物品占据大部分点击,大部分物品的点击次数不高

自监督学习:更好地学习长尾物品的向量表征

纠偏

避免热门物品被过度打压,cos(ai,bj) - logpj

自监督学习

目的:一个物品对应两个向量特征,鼓励同一物品的向量特征有较高的余弦相似度,不同物品的向量特征有较低的余弦相似度

特征变换:Random Mask

随机选择一些离散特征做掩码

整个特征类目丢掉

特征变换:Dropout

仅对多值离散特征生效

把特征类目其中几个丢掉

特征变换:互补特征

随机分成几组,它们的交集为空集且并集为全集,鼓励他们的余弦相似度尽量大

特征变换:Mask一组关联的特征

互信息计算两组特征两两之间的关联

效果好,性价比低

训练模型

余弦相似度 -> softmax激活函数 -> 向量表征(越接近真实的0-1标签越好) -> 交叉熵损失函数

【召回10】

地理位置召回:GeoHash召回

背景:用户可能对附近的事感兴趣

GeoHash:对经纬度的编码,长方形区域

索引:GeoHash -> 优质笔记列表

说明:没有个性化,所以召回优质的笔记

地理位置召回:同城召回

背景:用户可能对同城的事感兴趣

作者召回:关注作者召回

背景:用户对关注的作者的新作品感兴趣

作者召回:有交互的作者召回

背景:不关注,但是用户对该作者新作品感兴趣

作者召回:相似作者召回

背景:用户喜欢作者A,那么用户可能喜欢和A相似的作者B的新作品

缓存召回

思路:复用前n次推荐精排的结果

做法:精排前50的还没曝光的笔记缓存,曝光后退场,或者多次召回后退场

【排序01】

点击率、点赞率、收藏率、转发率

二元分类则使用交叉熵损失函数

权重:用AB测试调出来的

负样本降采样:只保留一小部分负样本

预估值校准

【排序02】

MMoE(Multi-gate Mixture-of-Experts)

输入向量:包括用户、物品、统计、场景特征

输出数值:业务指标,如点击率

极化现象

现象:MMoE中Softmax输出值一个接近1而其余接近0,就相当于在加权时有神经网络“专家”死掉了

解决:使用dropout,比如设置每个“专家”被丢弃的概率是10%

【排序03】

融合预估分数

简单的加权和

点击率乘以其他指标(如点赞率等)的加权和

其他工业界融分公式

【排序04】

视频播放时长的预估

经验:直接用回归拟合播放时长效果不好

训练:最小化交叉熵损失

把预估的播放时长用到融分公式

视频完播的预估

  • 回归方法

  • 二元分类方法:设置阈值,大于阈值完播否则不完播

不能把预估的完播率直接用到融分公式

【排序05】

排序模型的特征

  1. 用户画像:用户ID,性别年龄,账号信息,感兴趣类目等

  2. 物品画像:物品ID,发布时间,GeoHash,标题类目关键词字数,图片美学分数等

  3. 用户统计特征:用户近期曝光数等,按照笔记的类别分桶

  4. 笔记统计特征:笔记近期曝光数等,按照笔记受众的性别年龄分桶,作者特征

  5. 场景特征:用户定位,当前时刻,是否周末节假日,设备信息

特征处理

离散特征:做embedding

连续特征:做分桶把连续变成离散;曝光数、点击数等数值做数值变换log(1+x),或者做平滑

特征覆盖率

背景:不填年龄啥的,而提高特征覆盖率可以让精排准确度更高,所以要考虑缺失数据要用什么替代

数据服务

用户画像 - 较为静态

物品画像 - 静态

统计数据 - 动态 - 不能存本地,需要实时

【排序06】

粗排:给几千篇笔记打分,做初筛

精排:对粗排后获取的几百篇笔记重新打分

精排模型(精排):MMoE,n篇笔记n次推理,线上计算量大

双塔模型(召回):物品塔离线计算,用户塔计算一次,线上计算量小,预估准确性不如精排模型

三塔模型(粗排):用户塔+物品塔+交叉塔 -> 精排模型,介于前期融合和后期融合之间

用户塔 - 只做一次推理

物品塔 - 未命中缓存时需要做推理,一般不需要

交叉塔 - 1个用户n个物品就必须做n次推理

上层网络 - 做n次推理给n个物品打分,粗排模型的主要计算量集中在上层网络

【特征交叉01】04:12:19 FM

线性模型

没有特征交叉,但是特征交叉在推荐系统中是必要的,可以让预测结果更准确

二阶交叉特征

线性模型加入交叉项 -> O(d^2)参数量太大 -> 过拟合 -> 减少参数量:正交分解U = V·V^T -> FM参数量O(kd)

【特征交叉02】04:18:22 DCN

回顾召回、排序模型

  • 双塔模型

  • 多目标排序模型

  • MMoE

交叉层

x_i+1 = x0 ◦ [ Wi • xi + b ] + xi

交叉网络

x0 -> cross layer -> x1 -> cross layer -> x2 ...

深度交叉网络

特征向量 -> [ 全连接网络 & 交叉网络 ] -> 全连接层 -> 输出向量

【特征交叉03】04:25:47 LHUC

LHUC用于精排,起源于语音识别

语音识别中的LHUC

语音信号+说话者特征 -> 输出向量

【特征交叉04】04:29:54

SENet

不同离散特征的Embedding向量维度可以不同

Field间特征交叉

Field:m个离散特征 -> m个Embedding向量 -> m组向量元素 -> m个Field

把不同的Field做交叉得到新的特征

方法:内积,哈达玛乘积,Bilinear Cross - 内积,Bilinear Cross - 哈达玛乘积

【特征交叉05】04:36:51 FiBiNet

FiBiNet

【用户行为序列01】04:38:30

lastN特征

lastN:用户最近n次交互的物品ID

lastN物品交互记录 -> Embedding得到N个向量 -> 取平均得到lastN特征向量

【用户行为序列02】04:41:39 DIN

DIN模型

目的:对lastN序列建模的一种方法

DIN:用加权平均代替获得lastN的取平均

lastN物品向量&候选物品向量 -> 计算相似度作为权重 -> 加权平均得到lastN特征向量

DIN的本质是注意力机制

key和value:N个特征向量

query:候选物品向量

【用户行为序列03】04:46:19 SIM

SIM模型

背景:DIN关注短期兴趣而遗忘长期兴趣

目的:保留用户长期行为序列

分析:DIN中lastN物品与候选物品差异大时权重接近0

做法:快速排除与物品无关的lastN物品从而扩大N的同时降低计算量,即把"LastN"变成"TopK"

步骤1 - 查找:Hard Search(保留LastN候选物品中类目相同的),Soft Search(保留LastN候选物品中最相似的TopK个),

步骤2 - 注意力机制:使用时间信息,因为SIM序列长,记录用户长期行为,时间越久远,重要性越低

讨论:

  1. 长序列优于短序列

  2. 注意力机制优于简单平均

  3. Soft Search效果比Hard Search更好但是也更耗费计算资源

【多样性01】04:55:19 物品相似性的度量

相似性的度量

  1. 基于物品属性标签:分级分类目计算相似度

  2. 基于图文内容的物品向量表征:图 - CNN;文 - BERT;图文 - CLIP

提升多样性

位置:粗排和精排的后处理

【多样性02】05:03:00 MMR

MMR多样性算法

集合分为已选中的物品S和未选中的物品R

每次把R中分数最高的物品移动到S,再重新计算分数

滑动窗口

背景:集合S越大,越难从R中找到与S相似的物品

解决:用滑动窗口W代替MMR公式中的S,即从R中找出的物品与W的∈S最相似即可,而不需要与S最相似

【多样性03】05:10:58 重排规则

【多样性04】05:15:40 DDP:数学基础

DDP:最好的多样性算法

行列式跟向量体积的关系

【多样性05】05:25:22 DPP:多样性算法

变量:1. n*物品打分;2. n*物品向量表征;-> 3. k*物品选出(reword&volume衡量多样性)

基本思想:用行列式衡量物品多样性。

本质:是一个组合优化问题,从1~n的集合中选出一个大小为k的子集。

计算:不可能直接算,是NPhard问题,通常使用贪心算法求解。

贪心算法:每轮选择一个物品i,要求有较高价值且不能与已有物品相似。

贪心算法 - 暴力算法求解05:31:30

O(n^2*d+n*k^4) - 太慢了不可行

贪心算法 - Hulu的快速算法求解05:33:17

O(n^2*d)

关键:Cholesky分解矩阵,变成三角阵相乘

优势:给矩阵添加一列和一行(每轮选择物品i),可以在之前的基础上快速算出Cholesky分解,而不需要重新计算。

DDP的扩展

  1. 滑动窗口的劣势:随着集合S增大,其中相似物品越来越多,物品向量会趋近线性相关。所得到的贪心算法中的行列式会坍缩到零,对数趋于负无穷。

  2. 规则约束:比如最多出现5篇视频,下一篇就必须是图文笔记,那么要记得结合规则约束。

【物品冷启动01】05:39:14 评价指标

什么是冷启动

UGC的物品冷启:用户新上传新分布的。

PGC的物品冷启:比如腾讯视频这种内容由平台采购的。

新笔记冷启动

原因:新笔记缺少交互,导致推荐难度大;扶持新发布低曝光的笔记有利于增强作者意愿。

优化冷启的目标

  1. 精准推荐:推给合适用户,不引起反感。

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

  3. 挖掘高潜:通过初期小流量挖掘,发现高潜力笔记,予以流量倾斜。

评价指标

  1. 作者侧指标:

    1. 发布渗透率、人均发布量。

  2. 用户侧指标:

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

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

  3. 内容侧指标:

    1. 高热笔记占比。

作者侧指标

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

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

  • 作用:反映作者的发布积极性

  • 目标:促进发布,增大内容池

用户侧指标

  • 新笔记指标:分别考察高曝光和低曝光笔记的点击率、交互率,重点扶持低曝光笔记。

  • 大盘消费指标:虽然低曝光笔记缺少交互,但是大量扶持低曝光笔记可能导致用户体验不好,导致日活下降,所以还要关注大盘。

内容侧指标

挖掘高热笔记占比,让高热笔记短时间内活跃起来。

冷启动的优化点

  1. 优化全链路(召回和排序)

  2. 流量调控(流量如何在新物品和老物品中分配)

【物品冷启动02】05:51:18 简单的召回通道

召回的依据

  1. 自带图片、文字、地点

  2. 算法或人工标注的标签。

  3. 新笔记没有用户点击点赞等信息。

  4. 新笔记没有ID embedding(向量刚初始化)。

召回的困难

  1. 缺少交互 -> 没学好ID embedding -> 双塔模型效果不好 -> 改造后适用

  2. 缺少交互 -> 无法根据交互计算笔记间相似度 -> ItemCF不适用

适用的:类目、关键词召回;聚类召回;Look-Alike召回

双塔模型 - ID Embedding - 改进方案

  1. default embedding:物品塔做ID Embedding时让所有新笔记共享一个ID

  2. 相似笔记embedding:寻找topK内容最相似的高曝光笔记的平均向量

  3. 多个向量召回池

类目召回

  1. 用户画像:感兴趣的类目和关键词

  2. 建立类目/关键词到笔记列表的索引

  3. 召回流程:用户画像 -> 类目/关键词 -> 笔记列表 -> 取出最新的

  4. 缺点:

    1. 只对新发布笔记有效,笔记列表最新的放前面

    2. 弱个性化,不够精准,比如喜欢鱼,标签是动物,但是被推荐了猫猫狗狗不感兴趣。

【物品冷启动03】06:02:05 聚类召回

基本思想

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

  2. 基于类目和内容得到笔记向量,向量相似即笔记相似。

聚类索引

  1. 新笔记图文内容 -> 神经网络 -> 特征向量

  2. 索引:cluster -> 笔记ID列表(按时间倒序

聚类召回

  1. 把用户last_n交互的笔记列表作为种子笔记

  2. 种子笔记映射到向量,寻找最相似的cluster(知道用户兴趣

  3. 从每个cluster中取回最新的m篇笔记

  4. 最多取回n*m篇笔记

缺点:只对新发布的笔记有效

提取图文特征

CNN(图片特征)+BERT(文本特征)-> 全连接层 -> 特征向量 -> 通过两个特征向量计算两篇笔记的相似度

训练模型

a.正样本笔记、b.种子笔记、c.负样本笔记

鼓励(a,b)相似度尽量大,(c,b)相似度尽量小

  1. <种子笔记,正样本笔记>

    1. 人工标注

    2. 基于筛选条件,用算法自动选正样本

  2. <种子笔记,负样本笔记>

    1. 从全体笔记中选出字数较多、质量较高的笔记

【物品冷启动04】06:10:32 look-like人群扩散召

起源:互联网广告

种子用户(基本信息满足用户画像的用户) -> 人群扩散 -> look-alike用户

新笔记召回

  • 把有点击点赞等行为的用户作为新笔记的种子用户

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

用户双塔模型计算特征向量作为query -> 从向量数据库(存储新笔记特征向量)召回

【物品冷启动05】06:16:21 流量调控

扶持新笔记的目的

  1. 促进发布,增大内容池

  2. 挖掘优质笔记

如何扶持

  1. 在推荐结果中强插新笔记(落后)

  2. 对新笔记排序分数做提权(boost)(性价比高)

  3. 通过提权对新笔记保量(如保证前期至少多少曝光)(略复杂)

  4. 差异化保量(质量越好的保量更高)(更复杂)

新笔记提权

  1. 干涉粗排和重排,给新笔记提权

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

  3. 缺点:曝光量对提权系数敏感,过高导致劣质笔记过度曝光,过低导致优质笔记得不到充分曝光

新笔记保量

  1. 无论质量高低,都保证24小时内至少100次曝光

  2. 如果一定时间后曝光次数未达到阶段性目标,则提权,否则保持权重1

动态提权保量

输入变量:目标时间、目标曝光、发布时间、已有曝光

由此四个值计算提权系数

发布时间/目标时间越大,已有曝光/目标曝光越小,则对应的提权系数要更大。

保量的难点

  1. 保量成功率远低于100%

  2. 给新笔记的分数boost的平衡

差异化保量

  1. 基础保量

  2. 内容质量

  3. 作者质量

  4. 有保量的上限,比如达到500的曝光了即不再曝光

【物品冷启动06】06:31:16 AB测试

AB测试需要考察作者侧指标和用户侧指标

用户侧实验

  1. 新笔记CTR的diff

  2. 用户消费时长的diff

  • 思考:推全后的指标跌落没有AB实验的明显

  • 解答:推全后

作者侧实验

  1. 新旧策略在作者发布指标上的diff

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

  • 思考:推全后的作者发布指标却无变化

  • 解答:如果新笔记都提权,那么diff就没有变化

  • 但是又会出现新老笔记抢流量的问题

方案二缺点:新老笔记之间抢流量,而且内容池减少了,因此含有部分更低级的笔记,略微损害大盘。

  • 思考:推全后的指标增长没有AB实验的明显

方案三缺点:把xhs切成了两个app,严重损害大盘。

设计方案

  1. 实验组、对照组新笔记会不会抢流量?

  2. 新笔记、老笔记怎么抢流量?

  3. 同时隔离笔记、用户,会不会让内容池变小?

  4. 如果对新笔记做保量,会发生什么?

【涨指标01】06:46:28 涨指标的方法

推荐系统评价指标

日活用户数(GAU)和留存是最核心的指标

留存的衡量:LT7(今天登录后未来7天登陆天数∈1~7),LT30

LT的增长意味着用户体验的提升

涨指标的方法

  1. 改进召回模型,添加新的召回模型。

  2. 改进粗排和精排模型。

  3. 提升召回、粗排、精排中的多样性。

  4. 特殊对待新用户、低活用户等特殊人群。

  5. 利用关注、转发、评论这三种交互行为。

【涨指标02】06:51:44 召回

召回模型 & 召回通道

  1. 双塔模型

  2. item-to-item

  3. 其他小众召回模型

改进双塔模型

  • 优化正样本、负样本

  1. 简单正样本,简单负样本,困难负样本

  • 改进神经网络结构

  1. Baseline:用户塔和物品塔分别是全连接网络

  2. 改进:用户塔和物品塔分别用DCN代替全连接网络

  3. 改进:用户塔中使用用户行为序列

  4. 改进:多向量模型代替单向量模型

  • 改进模型的训练方法

  1. Baseline:做二分类,让模型学会区分正负样本

  2. 改进:结合二分类、batch内负采样

  3. 改进:自监督学习,让冷门物品的embedding更好

改进Item-to-Item

是一大类基于相似物品做召回的模型

很成熟了,可以改进的空间比较小

常见用法是U2I2I

  • 计算物品相似度

  1. ItemCF及其变体

  2. 基于物品向量表征计算向量相似度

改进其他小众召回模型

  1. U2U2I(user -> user -> item)

  2. U2A2I(user -> author -> item)

  3. U2A2A2I(user -> author -> author -> item):已知用户u喜欢作者a,且a与az相似,a2发布物品i,那么给用户u推荐物品i。

【涨指标03】07:05:11 排序模型

Loading...