推荐系统
内容参考:FunRec,下文的图片均CV自FunRec中。
- 系统架构:以数据利用情况和系统响应要求出发,将推荐系统架构分为离线层、近线层、在线层三个模块、
- 算法架构:分为召回、粗排、排序、重排
1.系统架构
- 将数据保存下来交给离线层进行处理,该部分主要管理离线数据,对算法的时间复杂度限制少,可以批量的处理大规模数据。
- 在线层能更快的处理响应数据并与用户进行交互,对时间要求高。
- 近线层介于两种方法之间,可以执行类似于在线计算的方法,但又不必以实时方式完成。
这个架构为什么要这么设计,本质上是因为推荐系统是由大量数据驱动的。
数据处理将作为推荐系统的关键部分之一:
- 客户端及服务器实时数据处理:即埋点,将用户在平台上的行为记录下来,包括当前推送的内容、用户发生与未发生交互的内容、用户在该内容停留时间、用户的设备信息、发生交互的时间以及Session。该部分将用于训练推荐模型。
- 准实时数据处理:准实时数据即为当前几分钟内的数据,可以解释为存在时间误差的即时数据。这类数据指用户行为数据,包括:用户观看历史,用户交互行为。一般通过消息队列加载在在线缓存中。
- 离线数据处理:对与前面两者记录的用户交互数据中的关联性信息进行处理,比如数据清洗、整合和深度分析。丰富数据集提高其质量。
1.1离线层
离线层主要用于处理大规模数据、执行复杂计算以及模型训练。
- 首先收集埋点数据,将数据进行初步清洗、去重、格式化等操作
- 根据业务和数据特性,构建用户和内容的特征,转换为可用于模型训练的数据
- 结合预处理的数据开始推荐模型的训练
- 模型性能测试与验证
- 上线
离线层无实时性要求,可以积累一定量的数据后再进行处理。目前主流的做法是HDFS(分布式文件系统,设计用来跨多个物理服务器运行,以便处理大量数据),收集到我们所有的业务数据,通过HIVE(建立在Hadoop上的数据仓库工具,可以用来进行数据提取、转换和加载(ETL)操作)等工具,从全量数据中抽取出我们需要的数据,进行相应的加工,离线阶段主流使用的分布式框架一般是Spark(提供了API来执行分布式ETL、机器学习、流处理和图处理等任务)。
1.2近线层
近线层的主要特点是准实时,它可以获得实时数据,然后快速计算提供服务,满足用户的实时兴趣变化,但是并不要求它和在线层一样达到几十毫秒这种延时要求。
适合于处理:
- 统计用户对不同类型的点击转换率(点击次数/曝光次数)
- 解决训练时和预测时的数据分布不同的问题:离线层用历史数据来训练模型,但当模型上线的时候,用户的行为特性已经发生了变化,导致了当前的数据分布和训练时的分布不一样了。
近线层可以:
- 获取最新的用户行为数据,而不是依赖于历史数据。
- 根据用户实时行为,如点击、浏览、购买等来计算特征值。
- 减少训练数据与预测数据间的分布差异,提高系统准确性和效果。
1.3在线层
在线层,就是直接面向用户的的那一层了。最大的特点是对响应延时有要求,因为它是直接面对用户群体的,你可以想象你打开抖音淘宝等界面,几乎都是秒刷出来给你的推荐结果的,不会说还需要让你等待几秒钟时间。所有的用户请求都会发送到在线层,在线层需要快速返回结果。
提供了:
- 召回和排序
- 快速的数据处理
- 推荐模型的切换(不同用户的推荐模型不同)
- 运营服务(商家流量扶持、特定内容限流)
将推荐系统使用Docker在k8s上部署,使用RPC框架进行调用。在线层的数据源就是我们在离线层计算好的每个用户的行为和商品特征(提前放到了数据库里面),在线层将这些数据进行拼接,不进行复杂的特征运算,然后输入已经训练好的模型进行推荐业务,然后就是召回、粗排、精排、重排展示。
这一层对时间的要求非常严格,往往需要近线层协助。
2.算法架构
算法架构用于解决从海量数据中选择出适合推荐给用户的部分,以及如何合理的展示给用户。
- 召回层:不要求准确率,但要求延迟低,并且不可遗漏数据。
- 粗排:根据一些业务规则(如物品的热度、新鲜度)进行筛选,或者使用一些轻量级的模型(如LR、浅层神经网络)进行快速打分和排序。召回阶段可能会基于物品的销量或者视频的热度或内容相似度来推荐,这些数据的量非常大,粗排会考虑用户特征和物品/视频特征的结合,对召回的结果进行个性化的排序,从而更准确地截断候选集。
- 精排:对粗排后的数据的topN条进行排序。
- 首先进行特征工程:收集用户的基本信息、视频热度信息(商品信息)、用户历史记录、设备&时间信息等等进行交叉组合,生成新的特征数据,以此预测更加复杂的情况
- 用这些数据训练并优化精排模型:采用一个主模型+多个辅助模型的方式,防止单个模型的过拟合情况。辅助模型可以捕捉到数据的不同方面并加上不同的权重(比如用户买了什么什么东西,或者给某个视频点赞或者收藏了,权重就会高一些),并作为主模型的输入数据。
- 上线模型~o( =∩ω∩= )m
- 重排:
- 常见的有三种优化目标:Point Wise、Pair Wise 和 List Wise。重排序阶段对精排生成的Top-N个物品的序列进行重新排序,生成一个Top-K个物品的序列,作为排序系统最后的结果,直接展现给用户。
- 重排序在业务中,获取精排的排序结果,还会根据一些策略、运营规则参与排序,比如强制去重、间隔排序、流量扶持等、运营策略、多样性、context上下文等,重新进行一个微调。
- 用户最终是否会点击购买一个商品,除了和它自身有关外,和它周围其他的item也息息相关。
3.推荐系统技术栈
画像层
用户画像即用户的标签,内容画像即作者打的标签(可能不是很明确的标签),采取多模态的一个内容理解,识别视频或者商品的图片或文字信息。
文本理解
- 数据源:标题、正文、OCR文本、评论等。
- 算法:RNN、TextCNN、FastText、Bert等,用于提取文本的语义信息。
关键词标签
- 算法:TF-IDF、Bert、LSTM-CRF等,用于提取关键词和标签,通常以多热编码(multi-hot)形式表示。
内容理解
- 视频/图片分析:使用算法如TSN(时序分段网络)进行视频分类,RetinaFace进行人脸识别,PSENet进行语义分割等。
- 信息提取:分类信息、OCR文本、视频标签等。
知识图谱
- 作用:整合关键词、实体关系、用户行为数据,构建兴趣图谱。
- 算法:KGAT(知识图谱注意力网络)、RippleNet等,用于知识表示学习和兴趣推理
通过整合这些多模态信息,推荐系统能够更全面地理解内容,从而提供更加精准和个性化的推荐
召回
一般都是多路召回,保证推荐模型输入数据的多样化。
- 经典模型召回:类似于RAG系统的Embedding,通过某种算法将数据向量化表示,然后进行KNN(K-Nearest Neighbors)算法来实时地找出与当前用户最相似的物品。类似于Milvus向量数据库~~~
- 序列模型召回:用户在使用 APP 或者网站的时候,一般会产生一些针对物品的行为,比如点击一些感兴趣的物品,收藏或者互动行为,或者是购买商品等。而一般用户之所以会对物品发生行为,往往意味着这些物品是符合用户兴趣的,而不同类型的行为,可能代表了不同程度的兴趣。比如购买就是比点击更能表征用户兴趣的行为 。如何根据用户行为序列打 embedding,可以采取有监督的模型,比如 Next Item Prediction 的预测方式即可;也可以采用无监督的方式,比如物品只要能打出 embedding,就能无监督集成用户行为序列内容,例如 Sum Pooling。
- 用户多兴趣拆分:
- 用户行为序列中的物品被看作为数据点,将这些数据点根据特征聚类到不同类别中,这样每个类别都得到一个对应的embedding,代表了用户在该类别的喜好。
- 胶囊网络是一种神经网络架构,它能够识别数据中的层次结构,并保持不同实体(在本例中为用户的兴趣)之间的空间关系。
- Memory Network:是一种可以存储和检索复杂信息的神经网络,它能够根据用户的历史行为记忆来生成多个兴趣Embedding。
- 知识图谱 :当推荐系统基于知识图谱推荐某个物品时,可以通过追踪知识图谱中的关系路径来为推荐提供解释。例如,如果系统推荐了一本书,知识图谱可能会显示这本书与用户之前喜欢的作者或者主题相关联。除此之外知识图谱中的关系路径可以是直接的(如“用户喜欢作者A的书,所以推荐作者A的新书”),也可以是更复杂的(涉及多个中间实体和关系)。
精排
-
特征交叉模型:
-
序列模型:对用户历史行为序列的建模是准确推荐的关键,通过分析用户历史行为序列捕捉用户当前的兴趣,转换为兴趣向量
胶囊网络旨在更好地捕捉实体之间的关系,它们可以用于推荐系统中的用户兴趣建模,以识别不同的兴趣模块。
Transformer模型,特别是自注意力(self-attention)机制,已经成为处理序列数据的一个非常强大的工具。它能够同时考虑序列中的长距离依赖关系,并且计算效率较高。
-
多模态信息融合:多模态数据(内容画像、基于CV或者NLP抽取的信息)。用于解决推荐系统的冷启动问题:
- 首先,新用户并不是什么数据都没有的,但多模态信息并不完全依赖于用户的历史数据。
- 新用户注册的时候会提供年龄、性别、地理位置、职业等等个人信息,这些信息可用来初步构建用户画像。
- 新用户在平台的首次互动,即使行为非常少,也可以用来推断用户的兴趣
- 利用多模态的内容
- 首先是基于内容的推荐:首次随机送出的数据,利用多模态分析商品的风格、颜色、文本、描述的情感等,然后将这些特征进行相似度检索。
- 其次是协同过滤的扩展:利用物品的多模态信息来寻找与新用户可能感兴趣的物品相似的物品。其次,寻找相似的用户:这些有着相似用户画像的其他用户喜欢的东西,可能新用户也会喜欢~。
- 利用外部数据:
- 社交媒体:公开的社交媒体中的数据
- 公共数据集:找些开源的数据集训练模型,用于新用户喜好的判断
- 交互:
- 新用户的即使反馈(可以结合上文提到的离线层近线层和在线层)可以用来快速的调整推荐,逐步改善推荐质量。
- 冷启动的策略:
- 基于规则的推荐:首次先直接给用户推荐热门商品或者热门视频。
- 利用多模态预训练模型:使用在大规模数据集上预训练的多模态模型来提取特征,这些模型已经学习了如何从不同模态中提取有用的信息。
- 首先,新用户并不是什么数据都没有的,但多模态信息并不完全依赖于用户的历史数据。
-
多任务学习:单独优化点击率模型容易推出来标题党,单独优化时长模型可能推出来的都是长视频或长文章,单独优化完播率模型可能短视频短图文就容易被推出来,所以多目标就应运而生。
- 多任务学习指的是,不单单是用户的点击,还有点赞等基本行为,还要考虑到用户的下单,视频完播率这些权重更加大的交互行为。而所有的这些基本和重要的交互行为综合起来,归纳到一个模型里面进行学习,这就是推荐系统的多目标学习。(经典算法ESSM、MMoE、DUPN)
-
强化学习 :一般来说,强化学习比有监督的深度学习相比有更加显著的优势,最总要的就是强化学习可以设计某个指标的优化函数,这有利于通过用户行为动态产生推荐效果。
-
跨域推荐:小红书、微信、腾讯视频等等平台的数据,都获取出来构建用户画像,非常有利于冷启动,有利于更加精确的推荐。而跨域推荐的难点就在于数据迁移。(这方面典型的模型有:DTCDR、MV-DNN、EMCDR等)
精排序是根据PointWise得分,容易造成推荐结果同质化严重,有很多冗余信息。一般在精排层我们使用AUC作为指标。
重排序
我们知道常见的有三种优化目标:Point Wise、Pair Wise 和 List Wise。重排序阶段对精排生成的Top-N个物品的序列进行重新排序,生成一个Top-K个物品的序列,作为排序系统最后的结果,直接展现给用户。
重排序面对的挑战就是海量状态空间如何求解的问题,在重排序更多关注NDCG等指标。
重排序在业务中,还会根据一些策略、运营规则参与排序,比如强制去重、间隔排序、流量扶持等,但是总计趋势上看还是算法排序越来越占据主流趋势。重排序更多的是List Wise作为优化目标的,它关注的是列表中商品顺序的问题来优化模型,但是一般List Wise因为状态空间大,存在训练速度慢的问题。这方面典型的做法,基于RNN、Transformer、强化学习的都有。