基于 CDH 构建推荐系统
我理解的推荐系统本质是一种排序方式。排序的规则是按照我们预测的用户喜好程度的一个排序的列表,而如何定义用户的喜好程度是推荐系统要解决的核心问题。机器学习的算法只是推荐系统的一部分。构建一个完整的推荐系统将会使用到多个大数据的组件,从而在实际的项目中实现数据的存储,计算,模型更新。
一、什么是推荐系统
举个例子,我使用读书,如果是去传统的图书馆,面对一个个的书架我会迷茫拿出哪一本来阅读。但是现在登录个阅读软件或者使用kindle,他们会给出一些阅读建议。
这些建议的基础就是推荐系统,底层通常是使用一些机器学习的方法提供推荐结果。推荐系统通过记录我们不断的阅读,收藏等操作,预测我们的需求或者喜好给予合适的建议。
二、推荐系统总览
推荐系统是一整个技术架构,并非仅仅是花哨的机器学习算法。推荐系统根据不同的业务会有不同的技术架构,但大多数的推荐系统一般遵循以下的技术架构。后边将会从宏观上介绍着各个组成部分的作用。

当下深度学习的流行,使得计算机视觉和自然语言处理技术更加成熟,因此在推荐系统中使用深度学习技术会有较好的效果。本文也将介绍除了使用协同过滤构建传统的推荐系统,也会介绍如何整合目前比较流行的深度学习技术来获得更好的推荐效果。
三、机器学习
机器学习的组件需要完成推荐模型的训练。选择适用的算法从历史数据学习并生成可以部署的推荐模型,调用推荐模型从而向用户提供个性化建议。值得注意的是,推荐算法的输出类型将会影响后续对它的调用和存储,因为用户通过不断的使用我们的产品会不断产生新的行为数据。
理想情况下,我们希望每产生新数据后可以重新优化我们的已有模型,但实际上难以实现,因为训练模型需要一定的时长。目前在实践中比较通用的解决方案是使用Lambda体系结构。
Lambda体系结构适用于在线学习也适用于离线学习。在线学习使用的数据是新产生的数据,数据量较小训练更快可以提供接近实时推荐结果。离线学习使用所有的历史数据,训练的频次较低。
离线训练
离线训练是机器学习推荐算法的主要学习机制。此过程通常涉及传统的机器学习算法,即在训练集上训练模型,进行交叉验证以选择最佳超参数,并将该模型导出为可供服务层使用的模型。
系统应该实现自动训练模型和选择最佳模型。并且能够按照合适的频率定时进行训练。因为离线模型训练使用所有的历史数据通常训练过程需要较长的时间,所以可以使用作业调度来完成,如使用oozie或者自己写定时启动训练程序的脚本。目前常用的方法有使用Spark DStream操作,使用用户近期产生的新数据与Hadoop文件系统(HDFS)的历史数据相结合。使用Spark MLlib中交替最小二乘(ALS)算法训练数据。 
ALS是一种矩阵分解算法,它可以用数字表示每个用户和每个物品。将用户和物品在k维空间中表示,在此空间中的距离用来表示用户的偏好。因此靠近某个用户的物品可能是该用户可能感兴趣的物品。ALS模型的输出是每个用户和每个物品的k维向量,通常存储为两个矩阵,一个用于用户向量一个用于物品向量。
选择MLlib中的ALS算法只是举个例子,也可以选择其他的推荐算法或者自己设计算法,使用ALS的优点是相对比较简单,易于实现,通用性也较好。
在线训练

在线训练的过程是将根据最近产生的数据训练出来的模型作为数据流更新到系统中,这隐含着两个需求,一是我们需要在内存中快速更新模型,当新数据到达时可以从中学习新的模型参数。二是我们需要一个支持增量更新的算法。
使用ALS算法利用最小二乘对用户和物品参数进行近似的在线更新,这种方式可以用来实时合并新数据,具体做法就是我们将当前的用户和物品矩阵放在内存中,通过SparkStreaming进行实时更新,训练后对模型进行更新。
在线更新模型可以在一定程度上解决冷启动问题,当用户第一次登陆时,我们没有用户行为数据,可能会使用一些普适性较好的推荐,然而使用在线更新意味着用户只要与第一个商品有了行为,就可以立即改善预测模型提供个性化推荐。
四、Web服务
Web服务用于建立用户和应用程序的交互关系,Web服务常用的可以选择使用JavaEE,需要满足能够向多个用户提供建议,并应该设有埋点,将新的用户行为数据采集下来推送到kafka用于在线训练更新模型。
五、部署
部署推荐模型需要考虑应用程序的时效性要求和数据规模,通常的做法是将ALS矩阵存储在内存中,使用LSH(局部敏感散列)+KNN(近邻搜索,可用于快速预测)。通过读取离线训练模型并整合在线训练的模型。

如上图是整个推荐系统的基本架构。
六、集成深度学习
我们构建一个推荐应用程序,可能会需要使用不同的机器学习算法去试验,从中选择最佳的推荐模型,深度学习技术虽然先进,但是使用传统的算法模型如ALS迭代会更简单。
更换模型时,如果模型的输入输出一致,可以直接替换,在架构中可以直接使用心得深度学习模型替换ALS,对于离线部分,我们可以在集群中配置一个或者多个GPU,使用TensorFlow或者Keras进行离线批量训练,或者使用基于Spark的深度学习框架如deeplearning4j。并将离线训练的程序在Spark集群上提交运行,神经网络默认是使用梯度下降逐步进行训练,因此在线模型训练也可以替换,在每个时间间隔内新产生的数据作为小批量的训练数据,并且可以通过向前和向后传递模型来更新模型。这部分不需要GPU加速。

在生产环境构建推荐系统时,最好是通过使用矩阵分解这种简单模型入手,如果简单模型达不到好的推荐效果,再考虑转向使用更复杂的技术,在大多数情况下,不会使用深度学习取代矩阵分解,而是使用深度学习模型与协同过滤方法结合使用构建混合模型。
一个好的推荐系统不仅仅是只需要一个好的推荐算法,而且还需要一个能根据用户需求随时调整适应的基础架构,如果说不能有效的结合生产环境,再复杂再高端的算法也是无用的。我认为建模技术固然重要,但我们首先应该关注的整个系统的基础架构,随着业务发展,系统的需求发生变化难以避免。所以推荐系统架构应该支持扩展和修改现有的算法模型,如果说需要更多的个性化推荐,我们可以在不影响基础架构设计的前提下,增加深度学习模型用于提升推荐效果。
基于 CDH 构建推荐系统的更多相关文章
- 基于神经网络的embeddding来构建推荐系统
在之前的博客中,我主要介绍了embedding用于处理类别特征的应用,其实,在学术界和工业界上,embedding的应用还有很多,比如在推荐系统中的应用.本篇博客就介绍了如何利用embedding来构 ...
- 大数据算法->推荐系统常用算法之基于内容的推荐系统算法
港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一 ...
- 大数据 -- Cloudera Manager(简称CM)+CDH构建大数据平台
一.Cloudera Manager介绍 Cloudera Manager(简称CM)是Cloudera公司开发的一款大数据集群安装部署利器,这款利器具有集群自动化安装.中心化管理.集群监控.报警等功 ...
- CDH构建大数据平台-配置集群的Kerberos认证安全
CDH构建大数据平台-配置集群的Kerberos认证安全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当平台用户使用量少的时候我们可能不会在一集群安全功能的缺失,因为用户少,团 ...
- 使用wrd2vec构建推荐系统
概览 完整的代码可以从这里下载: https://github.com/prateekjoshi565/recommendation_system/blob/master/recommender_2. ...
- 一个基于mysql构建的队列表
通常大家都会使用redis作为应用的任务队列表,redis的List结构,在一段进行任务的插入,在另一端进行任务的提取. 任务的插入 $redis->lPush("key:task:l ...
- 基于Azure构建PredictionIO和Spark的推荐引擎服务
基于Azure构建PredictionIO和Spark的推荐引擎服务 1. 在Azure构建Ubuntu 16.04虚拟机 假设前提条件您已有 Azure 帐号,登陆 Azure https://po ...
- 基于LoadRunner构建接口测试框架
基于LoadRunner构建接口测试框架 http://www.docin.com/p-775544153.html
- 基于soapUI构建WebService测试框架
基于soapUI构建WebService测试框架 http://www.docin.com/p-775523285.html
随机推荐
- Spring 中@NotNull, @NotEmpty和@NotBlank之间的区别是什么?
简述三者区别 @NotNull://CharSequence, Collection, Map 和 Array 对象不能是 null, 但可以是空集(size = 0). @NotEmpty://Ch ...
- C语言结构体定义的几种方法
什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...
- linux pxe网络装机无人值守
项目分析远程装机的实现:配置DHCP+HTTP+TFTP提供通过vesamenu.c32模块实现图形PXE菜单为不同系统分别提供ks应答文件将第三方rpm包以yum源的方式提供:集中提供ntfs-3g ...
- 决策树学习笔记(Decision Tree)
什么是决策树? 决策树是一种基本的分类与回归方法.其主要有点事模型具有可得性,分类速度快.学习时,利用训练数据,根据损失函数最小化原则建立决策树模型:预测时,对新数据,利用决策树模型进行分类. 决策树 ...
- 1.2 PCI总线的信号定义
PCI总线是一条共享总线,在一条PCI总线上可以挂接多个PCI设备.这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号.控制信号.仲裁信号.中断信号等多种信号组成. PCI总线是一 ...
- AM335x(TQ335x)学习笔记——USB驱动移植
对于AM335x来讲,TI维护的USB驱动已经非常完善了,本文称之为移植,实际上仅仅是配置内核选项使能USB HOST/OTG功能.废话少说,直接动手开启AM335x的USB驱动配置项. Step1. ...
- freemarker报错之七
1.错误描述 五月 30, 2014 11:33:57 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- MongoDB的安装和配置(Windows系统)及遇到的常见问题解答
目前比较流行的数据库大致可以分为三种: 前两种是按照图论理论建立起来的,分别是: 层次式数据库(IMS(Information Management System)是其典型代表)和 网络式数据库(DB ...
- Oracle11g客户端client的下载与安装
下载地址: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-09446 ...
- 爬数据,能让你少写1000行代码的捷径! | Python 正则表达式
▌春暖花开,又到了出门游玩拍拍拍吃吃吃的好季节了! 说到拍照摄影,你会构图吗?就是在照片有限的空间内处理人.景.物的关系,并将三者安排在画面中最佳的位置,以形成画面特定结构的方法. 学院君就是一个「拍 ...