基于 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
随机推荐
- Docker系统五:Docker仓库
创建Docker Hub账户 登录和上传镜像到Hub.docker.com docker login //登陆hub.docker.com docker tag ubutun1404-baseimag ...
- OJ的初步了解
注意源文件的注释可能跟题目不一样. 注意工程文件已有主函数. 注意输出结果还是返回值. 注意带参数的方法不用手动输入. 注意提交的次数的正确率会计入编程能力.
- IS-IS 路由协议 总结
第一章 is-is的协议概述 1. 发展史 Is-is最早是iso为osi模型中CLNP而设计的协议,后来根据发展需要,也支持了TCP/IP协议,因此,is-is叫做integrated is-is或 ...
- Android学习开发中如何保持API的兼容
Android学习开发中如何保持API的兼容: 1,采用良好的设计思路 在设计过程中,如果能按照下面的方式来进行设计,会让这个API生命更长久 面向用例的设计,收集用户建议,把自己模拟成用户,保证AP ...
- 什么是 JSX
JSX 即 JavaScript XML--一种在 React 组件内部构建标签的类 xml 语法.React 在不使用 JSX 的情况下一样可以工作,然而使用 JSX 可以提高组件的可读性,因此推荐 ...
- HighGUI图形图像界面初步——滑动条的创建和使用
---恢复内容开始--- 滑动条是OpenCV动态调节参数特别好用的一种工具,它依附于窗口而存在.由于OpenCV没有实现按钮功能,所以很多时候,我们可以用仅含0-1的滑动条来实现按钮的按下于弹起效果 ...
- Object Detection︱RCNN、faster-RCNN框架的浅读与延伸内容笔记
一.RCNN,fast-RCNN.faster-RCNN进化史 本节由CDA深度学习课堂,唐宇迪老师教课,非常感谢唐老师课程中的论文解读,很有帮助. . 1.Selective search 如何寻找 ...
- 嵌入式Linux引导过程之1.3——Xloader的sys_init
上一篇文章对XLOADER_ENTRY进行了分析,看到其中调用的第一个标号就是sys_init,本文就对这个标号对应的代码段进行粗略的分析,这里我也还有好多没有搞明白的,就先留着,日后慢慢明白,先把自 ...
- $_FILES数组为空的原因
今天做上传的文件时候,打印$_files总是为空,查阅了下资料. 发现是 max_file_uploads=0 知道了原因 file_uploads = On upload_max_filesize ...
- [javascript]一段焦点图的js代码
<html> <head> <meta name="name" content="content"charset="ut ...