7 推荐系统架构设计

  • 7.1:推荐系统基本模型
  • 7.2:常见的推荐系统架构
  • 7.3:常用软件,供进行架构设计时选用。
  • 7.4:一些常见问题

7.1推荐系统基本模型

  • 推荐系统是监督学习
    • 监督学习分学习和预测
  • 学习系统用给定训练样本
    • 训练得到模型,模型随后会被用于预测系统的预测。
  • 预测系统对给定的测试样本,由模型给出预测

在这里插入图片描述

  • 推荐系统的目的
    • 通过学习系统有效地训练模型,使得预测系统的结果贴近测试样本真实结果
  • 预测的内容,
    • 对一条资讯、一首歌或是一个视频的喜欢程度
    • 购买某个商品的概率
  • 推荐系统的优化,
    • 通过(模型、算法、数据、特征),
    • 提高预测结果的准确度,
    • 给用户推荐的物品更贴近用户真实喜好

  • 学习系统处理的用户数据量会更大,数据的维度也更多,用到的推荐模型也会更复杂
  • 协同模型、内容模型和知识模型
  • 协同模型主要通过我的朋友喜欢什么来猜测我喜欢什么;
  • 内容模型则是根据物品本身来预测用户喜欢A所以也可能喜欢B;
  • 知识模型则是根据用户的限定条件,按他的需要推荐

  • 推荐系统架构设计,是在监督学习基本模型的基础上,按照业务的需要定制,将训练和预测过程中的每个步骤细化,将训练和预测过程中使用到的模型、特征、工具都实例化,从而打磨出一个适合业务需要的推荐系统。
  • 学习系统中,要对数据上报、清洗、特征构造,
  • 就需要有一个用于存储和处理数据的平台。
  • 取决于数据量的大小和数据类型的不同,可能需要对学习系统进行定制。
  • 预测系统中,需要将预测请求服务化,封装成API供业务调用。
  • 同时,还需要保证线上服务的可靠性和可扩展性。

  • 接下来,先介绍推荐系统常用的架构,
    • 然后在了解了这些架构的基础上介绍每个模块常用的一些组件,
    • 最后介绍推荐系统的一些常见问题。

7.2推荐系统常见架构

  • 本节介绍的几种推荐系统架构,并不是互相独立的,实际的推荐系统可能会用到其中一种或者几种的架构。
  • 实际中可把本文介绍的架构作为一个设计的起点,更多地结合自身业务特点独立思考,从而设计出适合自身业务的系统。

  • 响应用户行为速度,基于离线训练和在线训练的推荐系统。
  • 用传统机器学习和使用深度学习的推荐系统
  • 由于业务的重要性,再单独介绍一个类别:面向内容的推荐系统。
  • 每一节的最后,会介绍实际系统设计中遇到的问题,
    • 供设计时参考。

7.2.1基于离线训练的推荐系统架构设计

  • “离线”
  • 用历史一段时间(一周或几周)的数据训练,
    • 模型迭代的周期较长(小时为单位)
  • 拟合的是用户的中长期兴趣。
  • 手机应用市场,音乐推荐
  • “在线”训练指的是增量的、实时的训练,
    • 要求模型对于每个训练样本快速响应。
    • 用户当前观看一个美食视频且停留很长时间,
    • 那下一个视频推荐系统察觉到你短期的兴趣后可给你推荐更多相似的视频
    • 训练数据的更新频率秒为单位。
    • 资讯、购物、短视频推荐

  • 基于离线训练的推荐系统:逻辑回归,梯度提升决策树
    • 因子分解机

在这里插入图片描述

  • 数据上报和离线训练: 学习系统
  • 实时计算和A/B测试: 预测系统
  • 还有一个在线存储模块,
    • 存储模型和模型需要的特征信息供实时计算模块调用
  • 图中各模块组成训练和预测两条数据流,
    • 训练的数据流搜集业务的数据最后生成模型存储于在线存储模块;
    • 预測的数据流接受业务的预测请求,通过AB测试模块访问实时计算模块获取预测结果。
  • 训练的数据流需处理大量的训练数据,更新的周期较长,以小时,
    • 所以对应的这种架构称为基于离线训练的架构
  • 预测的数据流用于互联网线上的业务,对延时在几十毫秒内,
    • 使得对于训练和预测两条数据流上的各个模块有不同的架构要求。

  • 捜集业务数据组成训练样本
  • 分收集、验证、清洗和转换
  • 需收集来自业务的数据。
  • 业务驱动,从物品、用户、场景几个维度收集,
    • 核心数据样本要保证质量。
    • 量化一切,越细越好
  • 对上报的数据准确性验证,避免上报逻辑错误、数据错位或数据缺失
  • 为了保证数据的可信度,要清理脏数据。
    • 常见的数据清洗:空值检查、数值异常、类型异常、数据去重
  • 数据转换,将收集的数据转化为训练所需要的样本格式,
    • 保存到离线存储模块。
  • 数据的质量非常重要,预测结果是否准确,
    • 取决于模型的强弱,更重要的是训练数据的质量和数量。

在这里插入图片描述

  • 离线训练离线训练模块分离线存储和离线计算
  • 离线存储要有一个分布式的文件系统或存储平台
  • 离线计算常见操作:样本抽样、特征工程、模型训练、相似度计算

  • 样本抽样合理设计样本,为模型训练提供高质量的输入,从而训练出一个比较理想的模型。
  • 合理定义正负样本,实际中,经常遇到正负样本不均衡
    • 通过惩罚权重和组合等方法解决,
    • 结合业务理解,合理设计正负样本。
  • 设计样本时应尽量保证用户样本数的均衡。
  • 对恶意的刷流量、机器人用户,通过样本去重保证用户样本数的均衡。
  • 适当考虑样本的多样性。通过采集和当前推荐算法独立无关的用户样本来丰富样本来源。

  • 特征工程利用领域相关的知识,从原始数据中获取尽可能多的信息,组成特征用于提高模型训练效果。
  • 特征选择通过评价函数、停止准则、验证过程等步,从特征集合中挑选一组最具统计意义的特征子集。
  • 特征提取通过成分分析、判别分析等方法,对原始特征进行转换和组合,构建新的具有业务或统计意义的核心特征。
  • 第三,特征组合通过多模态 embedding等方法,将来自用户、物品和背景的特征向量组合到起,达到信息互补

  • 前两步后,模型训练利用给定的数据集,通过训练得到一个模型,用于描述输入和输出变量之间的映射。
  • 实际中,考虑到需要处理大规模的训练集,一般会选择可以分布式训练的近似线性时间的算法。

在这里插入图片描述

  • 除图7.1,图7.2的推荐系统中提到的模块,还有一个在线存储模块
  • 线上的服务对于时延都有严格的要求。
  • 用户打开APP,希望能快速响应
  • 这就要求推荐系统在几十毫秒内处理完用户请求返回推荐结果,
  • 针对线上服务,要有一个专门的在线存储模块,
    • 存储用于线上的模型和特征数据
  • 在线存储模块需本机内存或分布式内存
  • 为了在线存储能够尽可能地快,在开源软件的基础上,还可进行一些定制,缓存策略、增量策略、延退过期策略,固态硬盘

在这里插入图片描述

  • 实时推荐模块对来自业务的新请求预测
  • 打开APP,APP后台发一个请求给服务器,
    • 服务器收到请求后根据用户以前在应用市场的历史猜测其喜好
    • 然后返回一个推荐的应用列表给手机APP,再在APP界面呈现给用户。
  • 实时计算模块需以下计算:
    • (1)获取用户特征,系统根据请求中的用户ID,从在线存储模块中读取用户的画像以及历史行为,构建该用户的模型特征
    • (2)调用推荐模型,结合用户特征调用推荐系统的算法模型,得到用户对某个APP候选池中物品的喜好概率;
    • (3)结果排序,对候选池的打分结果排序,然后返回结果列表给手机APP。
  • 实时计算模块需从在线存储模块读取很多数据,
    • 很短时间内完成大量的模型打分
    • 对该模块有很高的性能要求。
  • 该模块一个分布式的计算框架来完成计算任务。

  • 业务的物品列表太大,
    • 实时计算对每一个物品使用复杂的模型打分,
    • 耗时过长
  • 将推荐列表生成分为召回和排序
  • 召回: 从大量候选(上百万)选出可能喜欢的候选集(几百)
  • 排序对召回得到的相对较小的候选集使用排序模型打分
  • 在排序得到推荐列表后,
    • 为了多样性和运营的一些考虑,
    • 还加上第三步----重排过滤,用于对精排后的推荐列表处理
  • 重排过滤给用户提供一些探索性的内容,
    • 避免用户在平台上看到的内容过于同质,过滤掉低俗违法
  • 架构如图7.6

在这里插入图片描述

here

7.3推荐系统常用组件

7.3.1数据上报常用组件

  • apache Kafka 开源的流处理平台
  • 对实时数据源的高吞吐低延迟的处理框架。
  • 逻辑上,是对多生产者多消费者队列的分布式实现
  • 消息通过主题来管理,一个主题可有多个生产者和消费者
  • 生产者产生消息并推送到某一主题,订阅这一主题的消费者则从主题中拉取消息

在这里插入图片描述

7.3.2离线存储常用组件

  • HDFS( Hadoop Distributed File System)是目前使用极为广泛的分布式文件系统。
  • 低成本、高可靠性和高吞吐率。
  • 其容错机制使得HDFS可以基于廉价的硬件来构建分布式文件系统,在即使有组件失效时仍然可以提供可靠存储。

  • Hive是基于 Hadoop的数据仓库,较完整的SQL功能,
    • 用HDFS作存储底层
  • 方便熟悉SQL的人对数据操作而不需进行复杂的编程。
  • 数据规模达上百PB,且支持结构化数据的存储。

7.3.3离线计算常用组件

  • Apache Spark基于内存数据处理的高性能分布式计算框架,
  • 简单、灵活、强大的API帮助用户开发高效的程序用于复杂的数据分析。
  • Spark提供了和 Hadoop类似的 Mapreduce计算模型,但和 Hadoop不同, Spark使用了基于内存的中间数据结构,使得它能更好地支持需要多轮迭代的工作负载。

  • tensorflow
  • 开源的软件框架,用于对数据流图的数值计算。
  • 强大多样的API供研究者来开发各种应用。

  • 分布式tensorflow提供对参数服务器的支持。
  • 和其他参数服务器不一样
    • Tensorflow的参数服务器对参数的更新是隐式
    • 程序员不用手动去push和pull这些参数。
  • 使基于tensorflow的参数服务器的开发变简单
  • 而编写分布式tensorflow程序的主要任务,
    • 就成了如何将参数合理地分布到不同的参数服务器上,
    • 通过集群配置接口、指定设备接口和同步模式接口来进行参数配置。

7.3.4在线存储常用组件

发布了589 篇原创文章 · 获赞 300 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/zhoutianzi12/article/details/105619174
今日推荐