传统推荐系统
一、概述
系统架构
- 离线层:不用实时数据,不提供实时响应;
- 数据处理、数据存储;
- 特征工程、离线特征计算;
- 离线模型的训练;
- 近线层:使用实时数据,不保证实时响应;
- 特征的事实更新计算
- 实时训练数据的获取
- 模型实时训练
- 在线层:使用实时数据,保证实时在线服务;
- 模型在线服务
- 在线特征快速处理拼接
- AB实验或者分流
- 运筹优化和业务干预
算法架构
- 召回:从推荐池中选取几千上万的
item
,送给后续的排序模块。由于召回面对的候选集十分大,且一般需要在线输出,故召回模块必须轻量快速低延迟。由于后续还有排序模块作为保障,召回不需要十分准确,但不可遗漏(特别是搜索系统中的召回模块)。目前基本上采用多路召回解决范式,分为非个性化召回和个性化召回。个性化召回又有content-based
、behavior-based
、feature-based
等多种方式。 - 粗排:粗拍的原因是有时候召回的结果还是太多,精排层速度还是跟不上,所以加入粗排。粗排可以理解为精排前的一轮过滤机制,减轻精排模块的压力。粗排介于召回和精排之间,要同时兼顾精准性和低延迟。一般模型也不能过于复杂。
- 精排:获取粗排模块的结果,对候选集进行打分和排序。精排需要在最大时延允许的情况下,保证打分的精准性,是整个系统中至关重要的一个模块,也是最复杂,研究最多的一个模块。精排系统构建一般需要涉及样本、特征、模型三部分。
- 重排:获取精排的排序结果,基于运营策略、多样性、context上下文等,重新进行一个微调。比如三八节对美妆类目商品提权,类目打散、同图打散、同卖家打散等保证用户体验措施。重排中规则比较多,但目前也有不少基于模型来提升重排效果的方案。
- 混排:多个业务线都想在Feeds流中获取曝光,则需要对它们的结果进行混排。比如推荐流中插入广告、视频流中插入图文和banner等。可以基于规则策略(如广告定坑)和强化学习来实现。
技术栈
-
画像层
这里面涉及的任务主要是CV的目标检测、语义分割等任务,NLP中的情感分析、摘要抽取、自然语言理解等任务。但是这部分算法一般团队都会有专门负责的组,不需要推荐算法工程师来负责,他们会有多模态的语意标签输出,主要形式是各种粒度的Embedding。我们只需要在我们的推荐模型中引入这些预训练的Embedding。
-
召回/粗排
多路召回的架构:- 考虑用户层面:用户兴趣的多元化,用户需求与场景的多元化:例如:新闻需求,重大要闻,相关内容沉浸阅读等等
- 考虑系统层面:增强系统的鲁棒性;部分召回失效,其余召回队列兜底不会导致整个召回层失效;排序层失效,召回队列兜底不会导致整个推荐系统失效
- 系统多样性内容分发:图文、视频、小视频;精准、试探、时效一定比例;召回目标的多元化,例如:相关性,沉浸时长,时效性,特色内容等等
- 可解释性推荐一部分召回是有明确推荐理由的:很好的解决产品性数据的引入;
-
精排
王喆老师《深度学习推荐算法》书中的精排层模型演化线路
- 特征交叉模型
- 序列模型
- 多模态信息融合
- 多任务学习
- 强化学习
- 跨域推荐
- 工程技术
- 编程语言:Python、Java(scala)、C++、sql、shell;
- 机器学习:Tensorflow/Pytorch、GraphLab/GraphCHI、LGB/Xgboost、SKLearn;
- 数据分析:Pandas、Numpy、Seaborn、Spark;
- 数据存储:mysql、redis、mangodb、hive、kafka、es、hbase;
- 相似计算:annoy、faiss、kgraph
- 流计算:Spark Streaming、Flink
- 分布式:Hadoop、Spark
二、经典召回模型
(一) 基于协同过滤
协同过滤(Collaborative Filtering)推荐算法是最经典、最常用的推荐算法。基本思想是:根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品。
- 基于用户的协同过滤算法(UserCF):给用户推荐和他兴趣相似的其他用户喜欢的产品。
- 基于物品的协同过滤算法(ItemCF):给用户推荐和他之前喜欢的物品相似的物品。
不管是 UserCF 还是 ItemCF 算法, 重点是计算用户之间(或物品之间)的相似度。
-
相似性度量方法
- 杰卡德(Jaccard)相似系数
- 余弦相似度
- 皮尔逊相关系数
-
算法评估
- 召回率:在模型召回预测的物品中,预测准确的物品占用户实际喜欢的物品的比例。
- 精确率:推荐的物品中,对用户准确推荐的物品占总物品的比例。
- 覆盖率:推荐系统能够推荐出来的物品占总物品集合的比例。覆盖率反映了推荐算法发掘长尾的能力,覆盖率越高,说明推荐算法越能将长尾中的物品推荐给用户。
- 新颖度:用推荐列表中物品的平均流行度度量推荐结果的新颖度。
参考论文:Music Recommendation and Discovery in the Long Tail
-
基于用户的协同过滤UserCF
- 计算用户之间的相似度
- 计算用户对新物品的评分预测
- 对用户进行物品推荐
-
基于物品的协同过滤ItemCF
- 计算物品之间的相似度
- 由当前对相似物品的评分,来计算对待选物品的评分
权重改进:
- 对热门物品进行惩罚
- 控制惩罚力度
- 对活跃用户进行惩罚
协同过滤算法存在的问题之一就是泛化能力弱:
- 即协同过滤无法将两个物品相似的信息推广到其他物品的相似性上。
- 导致的问题是热门物品具有很强的头部效应,容易跟大量物品产生相似,而尾部物品由于特征向量稀疏,导致很少被推荐。
协同过滤的天然缺陷:推荐系统头部效应明显, 处理稀疏向量的能力弱。为了解决这个问题, 同时增加模型的泛化能力。2006年,矩阵分解技术(Matrix Factorization, MF)。
- Swing(Graph-based)
通过利用User-Item-User
路径中所包含的信息,考虑User-Item
二部图中的鲁棒内部子结构计算相似性。
什么是内部子结构? 以经典的啤酒尿布故事为例,张三同时购买了啤酒和尿布,这可能是一种巧合。但两个甚至多个顾客都同时购买了啤酒尿布,这就证明啤酒和尿布具有相关关系。这样共同购买啤酒和尿布的用户越多,啤酒和尿布的相关度就会越高。
1 | from itertools import combinations |
- Surprise算法
首先在行为相关性中引入连续时间衰减因子,然后引入基于交互数据的聚类方法解决数据稀疏的问题,旨在帮助用户找到互补商品。互补相关性主要从三个层面考虑,类别层面,商品层面和聚类层面。- 类别 i,j 的相关性:
采用最大相对落点来作为划分阈值。
2. 商品的互补相关性:- 聚类层面:标签传播算法
Surprise算法通过利用类别信息和标签传播技术解决了用户共同购买图上的稀疏性问题:
其中,原作者设定超参数权重
w=0.8
。
协同过滤算法的特点:
- 协同过滤算法的特点就是完全没有利用到物品本身或者是用户自身的属性,仅仅利用了用户与物品的交互信息就可以实现推荐,是一个可解释性很强, 非常直观的模型。
- 但是也存在一些问题,处理稀疏矩阵的能力比较弱。
为了使得协同过滤更好处理稀疏矩阵问题,增强泛化能力。从协同过滤中衍生出矩阵分解模型(Matrix Factorization, MF)或者叫隐语义模型:
- 在协同过滤共现矩阵的基础上,使用更稠密的隐向量表示用户和物品。
- 通过挖掘用户和物品的隐含兴趣和隐含特征,在一定程度上弥补协同过滤模型处理稀疏矩阵能力不足的问题。
- 核心思想是通过隐含特征(latent factor)联系用户兴趣和物品(item),基于用户的行为找出潜在的主题和分类,然后对物品进行自动聚类,划分到不同类别/主题(用户的兴趣)。
矩阵分解模型:
-
基于评分矩阵,将其分解成Q和P两个矩阵乘积的形式(常用的矩阵分解方法有特征值分解EVD或者奇异值分解SVD),获取用户兴趣和物品的隐向量表达。
-
然后,基于两个分解矩阵去预测某个用户对某个物品的评分了。
-
最后,基于预测评分去进行物品推荐。
-
矩阵分解算法将
m×n
维的共享矩阵R
,分解成m×k
维的用户矩阵U
和k×n
维的物品矩阵V
相乘的形式。 -
其中,
m
是用户数量,n
是物品数量,k
是隐向量维度,也就是隐含特征个数。 -
这里的隐含特征没有太好的可解释性,需要模型自己去学习。
-
一般而言,
k
越大隐向量能承载的信息内容越多,表达能力也会更强,但相应的学习难度也会增加。所以,我们需要根据训练集样本的数量去选择合适的数值,在保证信息学习相对完整的前提下,降低模型的学习难度。
之后进行评分预测:
FunkSVD
- 把求解上面两个矩阵的参数问题转换成一个最优化问题, 可以通过训练集里面的观察值利用最小化来学习用户矩阵和物品矩阵。
BiasSVD
1 | import random |
(二) 基于向量
待学习…
(三) 基于图
待学习…
(四) 基于序列
待学习…
(五) 基于树模型
待学习…
三、经典排序模型
(一) GBDT+LR
待学习…
(二) 特征交叉
待学习…
(三) Wide&Deep系列
待学习…
(四) 序列模型
待学习…
(五) 多任务学习
待学习…
四、推荐系统实战
待学习…
五、推荐系统面经
待学习…
最新调研
一、看着落地的
论文 | 来源 | 公司 | 关键词 | 做法 | ab 收益 | tune方式 |
---|---|---|---|---|---|---|
KAR | RecSys’24 CCF-A |
华为 | item llm+user llm | - 让 LLM 总结item得到item emb - 让 LLM 总结user历史得到user emb - 两个emb 过一个 mmoe 做融合得到新的两个 emb,给推荐模型用 |
音乐推荐 涨了播放量 | frozen |
LEARN | AAAI’25 CCF-A |
快手 | ItemLLM+user decoder | - item LLM 固定,输入item特征得到item emb - 输入 item emb 过 user 的 12 层trans 算dense all-action loss - 线上推荐模型里加 user emb 和 item emb |
广告 cvr+收入 | frozen |
BAHE | SIGIR’24 CCF-A |
蚂蚁 | 预先计算原子用户行为 | - LLMs 的预训练浅层提取来原子用户行为的 emb,并存进离线 db - 从 db 里查出来,和 item 一起过 LLMs 的更深层可训练层 |
广告ctr+cpm | FFT上层 LLM |
BEQUE | WWW’24 CCF-A |
阿里 | SFT+离线模拟+PRO | query 重写任务,SFT 得到一个 LLM,将其预测的若干个候选 rewrites 通过 offline system的feedback 得到排序,再通过 PRO 算法再 tune LLM | 电商搜索gmv + 单量 | FFT |
二、看着没落地的
论文 | 来源 | 公司 | 关键词 | 做法 | tune方式 |
---|---|---|---|---|---|
SLIM | WWW’24 CCF-A |
蚂蚁 | 蒸馏推荐理由 | - 输入用户行为历史,大 LLM(gpt)产出的推荐利用 - 小llm(llama2)去蒸馏这个理由拿小llm去全量user的推荐理由 - 通过 BERT 得到emb,给推荐模型用 |
FFT |
LLM-CF | CIKM’24 CCF-B |
快手 | 基于 CoT数据集做 RAG | - 拿推荐数据对 llama2 做 sft,再用 CoT 的prompt 让llama2 对user+item+label 产出一个推理过程,并通过bge得到emb,构建一个 CoT 数据集 - 在线拿当前用户 + item 的特征从这个数据集里ann出k个cot example 的 emb,和其他特征一起输入一个 decoder,输出给推荐模型的 sharebottom,额外加了一个 CoT emb 的重建 loss |
FFT |
ILM | \ | 2阶训练+q-fromer | - phase1: 表示学习,交替训练两类表示学习(item-text表示学习,item-item表示学习) - phase2: item-language model 训练 |
frozen | |
EmbSum | RecSys’24 CCF-A |
meta | LLM摘要+t5 encoder | - 行为历丢给 LLM 产出摘要,对应的 hidden states 给 decoder 自回归 - 历史 item 过 t5 encoder 并 concat 过 poly - item 过 t5 encoder 过 poly |
frozen |
Agent4Ranking | \ | 百度 | agent rewrite+bert ranking | querry 重写任务,多个人群当成多个agent,每个通过多轮对话产出一个rewrite,再合在一起经过 bert+mmoe 计算 robust 损失+accuracy 损失 | frozen |
三、纯学术界
论文 | 来源 | 关键词 | 做法 | tune 方式 |
---|---|---|---|---|
Llama4Rec | \ | prompt增强+数据增强,finetune | - prompt 增强:在 prompt 里引入推荐模型的信息; - 数据增强:通过 LLM 给推荐模型增加样本 - adaptive aggregation:llm 和推荐模型各自打分并用融合公式融合 |
FFT |
SAGCN | TOIS’25 CCF-A |
分 aspect打标、构图+gcn | - LLM 为用户评论打标,确定 aspect; - 分 aspect 构建 u-i 图,并 gcn |
frozen |
CUP | \ | LLM 总结+bert双塔 | 把用户的一堆历史评论扔给 chatgpt,让它总结出 128 个 token,然后丟给双塔 bert,另一个塔是 item 的描述,freeze bert 底层,只 tune 上层 | frozen |
LLaMA-E | \ | gpt 扩展 instruct | instruction formulating 为写 300 个种子指令,让 gpt 作为teacher,对 300个种子指令进行扩展,并由领域专家评估后,去重并保证质量,得到120k个指令作为训练集,再用 lora 去 instruct tuning | lora |
EcomGPT | AAAI’24 CCF-A |
一系列电商任务FFT BLOOMZ | 设置一系列的 task(100 多个 task)来 finetune BLOOMZ,包括命名实体识别、描述生成、对话 intent 提取等 | FFT |
ONCE | WSDM’24 CCF-A |
闭源 LLM 总结、 开源 LLM 做encoder,u-i学ctr |
闭源LLM 输出文本(user profiler、content summarizer、personalized content generator),给开源 LLM 得到 user 表示,item 过开源 LLM 得到 item 表示,二者内积学 ctr | lora 训开源 frozen 闭源 |
Agent4Rec | SIGIR’24 CCF-A |
多智能体系统模拟交互,产出推荐样本 | 先训一个推荐模型,然后构建一个多智能体系统,模拟和这个推荐模型交互,产出新的样本给推荐模型做数据增强 | 仅训推荐模型, LLM frozen |
RecPrompt | CIKM’24 CCF-B |
两个 LLM 迭代出最佳prompt | 给一个初始 prompt,让LLM1 得到推荐结果,拿一个 monitor 衡量这个结果和 ground truth 的 mrr/ndcg,再用另一个 LLM 产出更好的 prompt 给第一个LLM 用,如此迭代,得到一个 best prompt | frozen |
PO4ISR | SIGIR’24 CCF-A |
反思原因并refine/augment 地迭代出最优的prompt | 给初始 prompt,收集 error case 让模型反思原因并 refine 出新的prompt,再 augment 出另一个 prompt,并 UCB 选出最好的prompt,如此迭代 | frozen |
TransRec | KDD’24 CCF-A |
受限生成 | - 将一个 item 表示成 3 部分:id+titletattr,设计三种对应的instruct-tuning 任务; - 引入一个特殊的数据结构(FM-index),并进行 constrained beam search,让模型能生成候选集中的 id/title/attr,再遍历全库候选,看不同 facet 的相似度(会考虑高热打压),加权融合出一个排序 |
lora |
四、最前沿进展
论文 | 来源 | 关键词 | 做法 | tune方式 |
---|---|---|---|---|
Reason4Rec | \ 25.02.17 |