2.2.1 Lambda 架构

如图 2-5 所示,Lambda 架构主要划分为三层,分别是

Batch Layer、

Real-time Layer

Serving Layer[57-58]。

lambda架构设计 lambda架构三层_spark

图 2-5 Lambda 架构 Batch Layer(批处理层)主要负责合并新数据与历史数据、训练数据得到模 型以及数据的存储等。由于模型的训练通常基于整个合并后的数据集进行,这就会 造成高昂的计算开销,例如时间延迟或者磁盘消耗,因此批处理任务(作业)通常 以天为周期进行执行。该层一般选用批处理框架 Hadoop 或者 Spark 进行实现。 Real-time Layer(在线加速层)为了减少模型全量更新产生的巨大开销,提供 低延迟、实时或者近实时的计算结果,改用增量更新的方式。加速层可以使用分布 式流式计算框架 Spark 或者 Storm 进行数据处理。 Serving Layer(服务层)则负责合并 Batch Layer 和 Real-time Layer 提供的结 果,并通过 HTTP 协议或者某些定制的客户端等方式对外提供各种查询访问服务。

2.3.1 评测方法

目前,在推荐系统领域主要通过离线实验、用户调查和在线实验三种方 法来评估系统的推荐效果[60]。 离线实验需要配合 OLTP 系统,通过预先定义好的一些埋点动作收集用 户行为数据,例如用户在页面上的点击动作、鼠标在当前页面的停留时间等。 这些用户行为数据按照一定的格式存储到各种关系型数据库、非关系型数据 库或者分布式文件存储系统中,也便于后续的分析处理。然后,将数据按照 一定规则划分为训练数据集和测试数据集,分别用于推荐模型的训练以及模 型的预测,最后再按照评测指标的计算公式进行推荐算法的评估即可。 用户调查则直接招募一些真实用户,让他们在需要测试的推荐系统上完 成一些任务,通过观察、记录和分析这些用户的行为来了解被测试系统的性 能。

lambda架构设计 lambda架构三层_spark_02

 2.3.2 评测指标

在评价一个推荐系统的推荐效果时应该从多方面考虑,只考虑一个维度

lambda架构设计 lambda架构三层_推荐算法_03

 

lambda架构设计 lambda架构三层_lambda架构设计_04

 

召回率呈负相关关系,我们自然希望两个指标都 能取得比较高的结果。因此,为了综合评估准确率和召回率,还会使用 F1 指 标,F1 的计算公式如(2-5)所示:

lambda架构设计 lambda架构三层_推荐算法_05

2 Precision Recall F1= Precision+Recall   (2-5) F1 的值越大,表示推荐算法的综合性能越好。

 

 第三章 离线推荐算法与实时推荐算法的研究与改进

在电影推荐系统中,离线推荐功能和实时推荐功能是两个最为核心的存在,其 功能的设计与实现需要考虑数据特征、算法引擎、系统架构等诸多因素。本章主要 将从推荐算法的角度出发,考虑在 Apache Spark 大数据计算框架下,充分发挥 Spark 的区块管理以及分布式并行化的优势,对基于交替最小二乘法的协同过滤推荐算 法进行改进和优化,从而在保证推荐的预测准确度的情况下,大大提升算法的执行 效率;同时,针对用户在推荐系统中的实时评分行为,设计一种能考虑用户长短期 兴趣偏好的实时推荐算法,为其提供实时推荐服务。在后续章节完成对系统的设计 与部分模块搭建后,还会对离线推荐算法和实时推荐算法的推荐效果进行实验验 证与结果分析。 3.1 基于 ALS 的协同过滤算法的改进和优化 在实际的生产环境中,推荐系统往往涉及大量的用户和物品。以 GroupLens 研究小组提供的 MovieLens 开源数据集为例,中等数据量大小的 ratings.bat 文 件中涵盖了 71567 个用户对 10681 部电影的 10000054 条评分数据。如果使用矩 阵的形式表示的话,每一行代表不同的用户,每一列代表不同的电影,矩阵的每一 个元素为用户对电影的评分,那么这个矩阵的存储将产生大量的内存开销;并且, 用户评分过的电影数量往往很小,导致评分矩阵具有相当高的稀疏度,这都给用户 或电影相似度的计算带来不小的困难,最终的推荐效果难以令人满意。矩阵分解的 出现则为稀疏性问题提供了一个不错的解决思路。 3.1.1 矩阵分解与交替最小二乘法 以电影推荐系统为例,假设在推荐系统中有 m 个用户,n 部电影,以用户为 行,电影为列,用户对电影的真实评分作为矩阵的每一个元素,可以得到用户评分 矩阵 11 1 1 n m n m mn r r R r r             。矩阵分解的核心思想可以通过公式(3-1)进行概括: T R X Y m n m k n k     (3-1)

 3.1.2 基于 Spark 的 ALS 算法的改进和优化

目前,常用的分布式计算框架或者机器学习算法库都提供了交替最小二乘法 的算法实现,使用起来也非常简单方便。Spark MLlib 作为 Spark 中专门用于实现 机器学习相关算法的子项目,也提供了这样一种基于模型的协同过滤算法,即 Spark ALS 算法。它属于隐语义模型中的一种,通过降维的方式来补全用户-项目 评分矩阵以对用户产生推荐,但在具体实现矩阵补全时考虑到了 Spark 集群中各节 点之间的通信,希望并行化的方式加速算法的执行。 Spark ALS 算法需要传入用户评分数据集 ratingRDD,隐语义模型中的隐因子 个数 rank、最大迭代次数 count 以及正则化参数 λ 作为输入参数,以对模型进行训 练。这里的 RDD(Resilient Distributed Dataset)是 Spark 中出现和被使用次数最多 的一个概念。它表示弹性分布式数据集,是 Spark 中最基本的数据抽象。可以说, 对数据进行的一切操作都是基于 RDD 进行实现的。整个 ALS 模型训练过程如图 3-2 所示。

lambda架构设计 lambda架构三层_推荐系统_06

 

 

 

lambda架构设计 lambda架构三层_spark_07

(3)Jaccard 相似度

Jaccard 相似度表示为两个集合的交集元素个数与并集元素个数的比值,如式 (3-9)所示:

lambda架构设计 lambda架构三层_lambda架构设计_08

 4.3.3 实时推荐模块

实时推荐功能的实现需要系统业务模块、日志采集服务、消息缓冲通道三个模 块一同协作。图 4-6 描述了基于前述各组件搭建实时推荐模块的数据流向,也展示 了这些组件在实时推荐模块中承担的角色和发挥的作用。

 

lambda架构设计 lambda架构三层_推荐算法_09

首先,借助于目前常用的 Java 日志工具(如 log4j)将业务服务器的系统日志 收集到特定的日志文件中。然后,Flume 根据预先定义好的过滤规则,过滤得到用 户评分相关的日志,并以 Kakfa topic 的形式发送到 Kafka 集群。这里的过滤规则 与设定的埋点动作有关。Kafka 作为流式数据的缓存组件,负责接受来自 Flume 的 最原始的系统日志,并通过自定义的 Kafka Stream 对这些日志进一步处理,获取 格式为 UID|MID|RATEING|TIMESTAMP 的用户评分数据流,并发送到另外一个 Kafka 队列。UID、MID、RATEING、TIMESTAMP 分别表示用户 ID、电影 ID、 此用户对此电影的评分以及评分时间,即需要对这部分用户行为作出实时响应。最 后,由两种流式计算框架 Flink 和 Spark Streaming 依次处理 Kafka 中的每条数据,取出预先计算好的并存储在 MongoDB 数据库中的电影相似度矩阵,根据 MID 获 取相似电影构造备选电影池,同时根据 UID 获取 Redis 队列中的用户评分数据, 进行实时推荐算法的执行,为用户提供实时推荐服务。在下一章中,将针对基于 Flink 和 Spark Streaming 两种计算引擎的实时推荐算法的推荐效果进行对比分析。 4.3.4 系统业务模块

业务模块主要采用 JavaEE 的相关开发技术,基于目前比较主流的微服务架构 风格。如图 4-7 所示,相较于传统的“单块架构”系统,微服务架构是指整个应用 系统可以拆分成一系列细小的服务,每个服务专注于单一的功能实现,其复杂度可 自由控制;可独立部署,独立开发,并运行于独立的进程中;服务之间边界清晰, 采用轻量级的通信机制(如 HTTP/REST)相互沟通、相互配合来实现完整的功能, 从而满足用户的需求。