推荐系统架构设计

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

离线训练指使用历史一段时间(一周或几周)的数据进行训练,模型迭代的周期较长(一般以小时为单位),模型拟合的是用户的中长期兴趣。基于离线训练的推荐系统常用的算法有LR、GBDT、FM

一个典型的基于离线训练的推荐系统由数据上报、离线训练、在线存储、实时计算、AB测试几个模块组成,数据上报和离线训练组成监督学习中的学习系统,实时计算和AB测试组成预测系统,除此之外还有一个在线存储模块,用于存储模型和模型需要的特征信息实时计算模块调用。

数据上报 搜集业务数据组成训练样本,一般分为收集、验证、清洗和转换几个步骤。首先收集来自业务的数据。然后对上报的数据进行准确性的验证,避免上报逻辑错误、数据错位或数据缺失等问题。第三,为了保证数据的可信度,需要清理脏数据。常见的数据清理有:空值检查、数值异常、类型异常、数据去重等。最后通过数据转换,讲收集的数据转换为训练所需要的样本格式,保存到离线存储模块。

离线训练 细分为离线存储和离线计算。离线存储模块通过分布式文件系统或者存储平台来存储海量用户行为数据。离线计算常见的操作有:样本抽样、特征工程、模型训练、相似度计算等。样本抽样为模型训练提供高质量的输入,首先需要合理定义正负样本,比如通过惩罚权重和组合等方法并合理设计正负样本来解决正负样本不均衡的情况。同时设计样本时应尽量保证用户样本数的均衡,对于恶意的刷流量、机器人用户,通过样本去重保证用户样本数的平衡。适当考虑样本多样性。特征工程对原始特征进行转换和组合,构建新的具有业务或统计意义的核心特征,通过多模态embedding等方法将来自用户、物品和背景的特征向量组合到一起,达到信息互补。经过前面两步,模型训练利用给定的数据集通过训练得到一个模型,用户描述输入和输出变量之间的映射关系。考虑到要处理大规模的训练集,一般选择可以分布式训练的近似线性时间的算法。

在线存储 线上的服务对时延都有严格的要求,需要推荐系统在几十毫秒内处理完用户请求返回推荐结果,所以针对线上服务有一个专门的在线存储模块,负责存储用于线上的模型和特征数据。一般在线存储使用本机内存或者分布式内存。为了使在线存储能够尽可能地快,在开源软件的基础上还可以进行一些定制,比如采用缓存策略、增量策略、延迟过期策略,使用固态硬盘等。

实时推荐 实时推荐模块的功能是对来自业务的新请求进行预测。在整个过程中,实时计算模块需要(1)获取用户特征,根据请求中的用户id,从在线存储模块中读取用户的画像以及历史行为,构建出该用户的模型特征(2)调用推荐模型,结合用户特征调用推荐系统的算法模型,得到用户对候选池中每个物品的喜好概率(3)结果排序,对候选池的打分结果进行排序,然后返回结果列表给手机APP。实时计算模块需要从在线存储模块读取很多的数据,同时需要在很短时间内完成大量的模型打分工作,所以对于该模块有很高的性能要求。一般来说该模块需要有一个分布式的计算框架来完成计算任务。一般常见的做法是将推荐列表生成分为召回和排序两步。更进一步,在排序得到推荐列表后,为了多样性和运营的一些考虑,还会加上第三步——重排过滤,对精排后的推荐列表进行处理。重排过滤会给用户提供一些探索性的内容,避免用户在平台上看到的内容过于同质化而失去兴趣,同时过滤掉低俗和违法的内容。

在线预测的几个阶段:召回(分类,热度,协同过滤)→排序(GBDT,LR)→重排过滤(多样性,兴趣)

AB测试 一个新的推荐算法上线前一般会经过AB测试来测试新算法的有效性

推荐结果反馈 在数据上报模块搜集的数据中,还包括对推荐结果的反馈。

模型更新的robust 大多数的推荐系统需要在线上提供不间断的服务。同时推荐系统例行的模型训练,每天或者每个数个小时都会更新新的模型,为了保证服务24小时可用,就要求系统在模型更新的时候仍然能够正常服务。程序开发的时候,需要在模型计算的时候,考虑从即使在某些特征缺失或者不匹配的情况下,也能够最大程度上返回准确的计算结果。

海量服务 对推荐系统的线上服务需要做到高可靠、高吞吐、低延迟。几个常见的优化方法有:(1)过载保护,对于突发的业务流量进行过载保护,防止服务的雪崩(2)流式计算,通过分布式计算框架应对大量在线请求(3)共享内存组件,对于一切常用的模型数据,可以考虑放在共享内存中,使得在线存储部分的性能开销尽可能降低。

通用性设计 将推荐系统通常划分为四个部分:样本库、特征库、算法和模型。其中,样本库存储从流水日志中提取的用户行为和特征。特征库存储用户和物品的属性等特征;算法是用于训练模型用到的机器学习算法;模型库存储的是从样本和特征计算得到的训练模型。为了不同的算法可以用于不同的样本和特征,我们可以使用过一个算法配置表来存储数据、算法和模型的映射关系,将模型、算法、样本和特征的关系解耦,使得算法可以复用

用户画像 用户画像是一个标签化的用户模型,用于描述用户的基础属性、生活习性和关系链等信息,对于业务了解用户具有 非常重要的意义,可以帮助大幅的提升推荐的准确度。

面向深度学习的推荐系统架构

和传统的推荐系统相比,面向深度学习的推荐系统有着自动提取特征、建模用户时序行为和融合多方数据源的优点。

面向深度学习的推荐系统增加了特征提取和模型服务两个模块。其中特征提取模块用于从样本中构建特征,提升模型效果;模型服务模块用于服务深度学习框架的预测请求,对其进行适配。总体流程和上面类似:

通过数据上报得到的样本先通过特征提取模块构建特征,然后通过模型训练得到模型。特征提取模块得到的特征一方面保存到离线存储后用于模型训练,一方面存储到线上存储用于预测时调用。模型预测流程先由模型服务模块拉去模型到线上,再通过AB测试和实时推荐模块接受来自业务的请求。通过模型服务模块得到预测结果返回给业务。

特征提取 深度学习的最大优势之一,就是能够通过一种通用的模型学习到数据的特征,自动获取到数据的高层次表示而不依赖于人工设计特征。针对不同的业务,特征提取模块会有不同的任务。特征提取模块利用深度学习进行特征提取,输入用户行为、用户画像、物品信息、背景信息,通过深度学习模型得到用户向量、物品向量、背景向量。
特征提取设计时需要考虑下面两个问题:首先,特征生成的流水线需要自动化,和业务定义好数据源的接口后,特征提取模块定期地调用特征提取任务生成特征;其次,需要由一套特征管理系统对来自不同业务、使用不同方法得到的特征进行管理。通过一个特征管理系统,将特征提取模块得到的特征注册到特征库,这个特征库负责管理原始特征以及各种经过特征工程处理后的特征,每个特征用唯一的特征ID标识。在进行特征工程的时候,通过调用特征ID,同一份原始特征可以用于不同的特征工程输入,在模型训练的时候经过特征工程处理的谋一份特征又可以被多个算法使用。

模型服务 的主要功能是对业务请求进行预测,加载推荐模型进行预测计算,之所以把模型服务模块独立出来,是因为目前的深度学习框架往往同时提供了模型预测服务的功能。模型服务提供了加载模型、请求调用和模型版本管理的功能。首先,加载模型到服务进程,等待请求调用隆起处提供一个RPC接口,供业务方请求;第三,提供模型版本管理的功能,加载最新的模型版本,同时在某个版本失败时提供回滚的功能。目前较为成熟的方案是tensorflow serving,提供了RPC框架、自动模型版本管理等功能

分布式训练 现有的深度学习框架导读提供了分布式计算的框架,使用分布式训练的原因是为了使训练的速度更快,训练的模型更大。如何更新模型的分布式存储和计算?目前最常用的解决方案是参数服务器,参数服务器提供了几个功能(1)对参数的分布式存储(2)提供参数更新机制(同步和异步)(3)对参数的划分和放置

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

在线训练的推荐系统架构适合于广告和电商等高纬度大数据量且对实时性要求很高的场景。基于在线训练的推荐系统不区分训练和测试阶段,每个回合都在学习,通过实时的反馈来调整策略。一方面在线训练要求其样本、特征和模型的处理都是实时的,以便推荐的内容更快地反映用户实时的喜好。另一方面在线训练并不需要将所有的训练数据都存储下来,所以不需要巨大的离线存储开销,使得系统具有很好的伸缩性,可以支持超大的数据量和模型。对于数据量很大的业务场景,基于在线训练的推荐系统提高了处理问题规模的上限,从而能够带来更多的收益。

基于在线训练的推荐系统使用的常用的算法有:FTRL-Promimal、AdPredictor、Adaptive Online Learning和PBODL

样本处理 对于离线训练来说,上报后的数据是鲜卑存储到一个分布式文件系统,然后等待离线计算任务来对样本进行处理,对于在线训练来说,对样本的去重、过滤和采样等计算都需要实时进行。实时训练对于样本地正确性、采集质量和采样分布,有着更严格的要求。实际业务中上报的数据因为种种原因可能会出现数据缺失、冗余和错报等情况,这就要求样本处理能够容忍缺失和错报,以及过滤掉冗余的数据。同时对于过于稀疏的数据或者噪音数据,系统会对其进行丢弃。另外,因为在线学习的算法一般都是使用已经观察到的一个数据窗口的数据来对测试的数据进行预测,非常容易过拟合,所以在样本处理的时候需要使实时采样得到的样本的分布和累计的样本分布尽量相似, 以避免模型的效果变差。

实时特征 通过实时处理样本数据拼接训练需要的特征构造训练样本,输入流式训练模块用于更新模型。该模型的主要功能是特征拼接和特征工程。特征拼接对特征进行读取、选择、组合等操作。首先根据算法的配置,从样本中选择需要的特征,从相应的存储接口读取该特征,将读取到的用户、物品和场景特征拼接在一起,然后根据从拼接好特征的样本中进行特征选择、特征交叉等操作,并将处理的结果写入流处理消息队列,用于输出至模型训练和模型评估模块进行流式训练。特征工程按照特征组合规则,对特征进行内积、外积和笛卡尔积等操作,构造出新的特征,同时将新的特征和特征库写入到特征配置表中。

流式训练 使用实时训练样本来更新模型,在线训练的优势之一,是可以支持模型的稀疏存储。虽然训练使用的特征向量的维度可能是上十亿维,但是对于某一个样本实例来说可能只有几百个非零值。因此在线训练可以对大规模的数据集进行流式训练,每个训练样本只需要被处理一次。模型方面,FTRL-Proximal结合了OGD(Online Gradient Descent)和RDA(Regularized Dual Averaging)的优点,在准确度和稀疏性上比这两个模型都更优

模型存储和加载 模型一般存储在参数服务器中,模型更新后,将模型文件推送到线上存储,并由线上服务模块动态加载

基于内容的推荐系统架构设计

新闻资讯 因为新闻的时效性要求很高,所以对内容的理解非常重要。常用的内容理解工具有文本分类、关键词提取和主题提取等。

视频音乐 要对视频和音乐进行推荐,首先要对内容进行理解,可以通过word2vec等方法将原视频或音频表示为一个低维稠密的嵌入向量,然后通过协同过滤来计算物品之间的相似度用于召回阶段,然后用DNN等算法进行精排

广告购物 针对广告和购物的场景,很重要的一件事情就是对广告物品和商品的识别,如果能对物品分类以及广告词进行OCR识别,就能够更好地理解广告的内容,从而产生更精准的推荐。

推荐系统常用组件

数据上报常用组件

Apache Kafka是一个开源的流处理平台,对实时数据源的高吞吐低延迟的统一处理框架

离线存储常用组件

HDFS是目前使用极为广泛的分布式文件系统。设计目标是低成本、高可靠性和高吞吐率。它的容错机制使得其可以基于廉价的硬件来构建分布式文件系统。

离线计算常用组件

Apache Spark是一个基于内存数据处理的高性能分布式计算框架。

tensorflow

在线存储常用组件

Redis是一个开源的基于内存数据结构的存储系统,它可以用作数据库、缓存和消息中间件,是目前最常用的key-value数据库之一。

Memcached是一种通用的高性能分布式内存缓存系统,一般用于将动态的数据缓存到内存中帮助提升读取外部数据的速度。

RocksDB是另外一个高性能的key-value数据库,针对多核和固态硬盘进行了优化,使其对IO密集的负载非常友好

模型服务常用组件

Tensorflow serving可以用于搭建机器学习模型的服务,面向生成环境设计,灵活而高效,主要特点是自动加载新模型、批量处理请求、可水平扩展等

实时计算常用组件

Apache Storm是一个开源的分布式实时计算系统,提供了简单易用的编程模型,使得数据的实时流处理变得更简单,可以方便对计算拓扑进行管理和扩展。

Spark Streaming是对spark核心API的一个扩展,提供了对实时数据流的可扩展、高吞吐、高可靠的流处理。

你可能感兴趣的:(推荐系统架构设计)