基于 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
随机推荐
- Android项目中的各个模块框架设计
作为Android开发,现对项目开发中的各个模块搭建,梳理如下: Android UI框架,开发人员需要达到专家级 网络框架 浏览框架 图片加载框架 图片裁剪压缩工具类 客户端并发框架 线程池设计 ( ...
- dojo中的xhrPost请求(JSON)
dojo中的xhrPost请求 dojo.xhrPost({ url:"../area.action", content:{ areaCode:areaCode }, handle ...
- mysql字符串连接
用SQL Server 连接字符串是用“+” 现在数据库用mysql, 写个累加两个字段值SQL语句居然不支持"+",郁闷了半天在网上查下,才知道mysql里的+是数字相加的操作, ...
- 程序bug致损失400亿,判程序员坐牢? 搞笑我们是认真的
号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句 ...
- Flex动态获取数据,服务中断报错
1.错误原因 2.错误原因 由上面提示可知,软件引起的链接中断,导致出错 3.解决办法 检查数据库链接,重新启动服务
- 芝麻HTTP:Gerapy的安装
Gerapy是一个Scrapy分布式管理模块,本节就来介绍一下它的安装方式. 1. 相关链接 GitHub:https://github.com/Gerapy 2. pip安装 这里推荐使用pip安装 ...
- visual studio编写C#代码时“未能从程序集.....中加载类型”和“找不到方法”的一种可能的解决办法
编译前报错:$exception {"未能从程序集"XSW.MySQLDAL, Version=1.0.0.0, Culture=neutral, PublicKeyToke ...
- asp.net mvc razor布局页中a标签的href的跳转问题
笔者做了一个文件上传系统,文件上传后,保存在wwwroot目录的file文件夹中,并把该文件的路径保存到数据库中, 如这样的一个路径保存在数据库: file/b775f487-0127-41e0-9d ...
- poj1417菜鸡的详细题解(希望能帮助到和我一样陷于本题的新手)
题意太麻烦就偷懒转载他人的题意..... 题意转载自http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove ...
- @SuppressWarnings("unchecked")(解决标准的后台HttpServletRequest request, HttpServletResponse response)格式
在springmvc的应用中有些限制会出现必须是 public void save(HttpServletRequest request, HttpServletResponse response) ...