百分点亿级个性化推荐系统的发展历程和实践架构
LoganMadsen
8年前
<p>百分点个性化系统开始于2009年,是百分点公司的第一个产品,也是一直延续至今的产品。个性化系统以电商推荐为切入点,涵盖电商、媒体、阅读、应用市场等领域,以第三方技术服务的形式为企业提供个性化推荐服务。</p> <p>个性化系统的几个重要特性</p> <p>百分点个性化系统致力于解决电商个性化的问题。我们先来看一下“个性化”问题的定义:</p> <p><img src="https://simg.open-open.com/show/34622c5d122bdb23fee94b42a03799f5.png"></p> <p>对于如何定义个性化收益函数,一般有以下几方面的考虑:</p> <p>以KPI为导向:对于推荐效果考察的具体指标是什么?是点击率还是转化率,还是用户客单价,等等这些指标可以确定我们推荐优化的目标。</p> <p>根据业务需求定义:在实际推荐运营中,还会需要考虑商家的业务目标,比如追求高毛利,比如清库存,这时就要提高高毛利商品和库存商品的曝光率。</p> <p>根据业务效果修正:推荐是一个长期运营的活,对于推荐产生的效果需要能及时反馈到推荐系统中,形成动态反馈和修正的机制。</p> <p>连接现实业务和技术实现:推荐始终是服务于业务的,脱离了业务的推荐毫无意义,个性化系统就是要将业务需求转化为技术实现,最大程度自动化和智能化。</p> <p>在个性化系统中,还会面临以下技术和业务的挑战:</p> <p>数据稀疏是推荐系统中常见的问题,我们采用引入一些新的召回机制如文本相似性等非行为相关的召回制补充用户行为的不足。</p> <p>冷启动的问题,百分点本身可以汇集所有客户的上的用户行,一家新的客户接进来后,一般有30%-40%的用户是和百分点本身的用户库是重合的,对于全新的用户,可以在第一次着陆到首页采用一些大众化的推荐,当用户有进一步的行为便可以根据行为进行新的推荐了。我们大部分的算法都是实时处理的,所以真正冷启动的比例很小。</p> <p>大数据处理与增量计算,百分点大概有5000万的日活,1.5亿的pv,每天的推荐次数近2亿次,每天约1T的数据增量,对于所有组件必须能处理大量的数据,所以整体的架构以分布式和实时增量计算为主。</p> <p>多样性与精确性,推荐除了要考虑准确的召回,同时也要兼顾用户体验,避免推荐结果的单一化,也需要增加一些多样性的考虑。</p> <p>用户行为模式的挖掘和利用,用本质上说,推荐就是在做用户行为模工挖掘,找出用户的行为特征,给出相应的预测,这里面涉及到大量的算法和工程问题。</p> <p>多维数据的交叉利用,除了线上数据,不少客户有自己其他渠道的数据,这些数据也可以引入推荐系统,提升推荐的效果。</p> <p>效果评估,一套完整的推荐系统,必须一套完整的评估体系,百分点对每个推荐栏位都有详细的效果评估,除了推荐栏维度的点击率、转化率,还有商品维度和用户维度的相关评估指标。</p> <p>百分点的商业模式是做线上的电商导购员,媒体网站的导航员,提供个性化的用户体验,以百分点为数据中心,形成全网的用户行为偏好,利用大数据获得更精准的推荐。</p> <p>百分点如何实现个性化推荐系统?</p> <p>一个推荐系统的实施,大概要经历以下步骤:</p> <p>数据采集:我们主要会采集客户两方案的数据,Item的信息和User的行为,Item尽量覆盖多的属性维度,User行为尽量覆盖客户的所有业务流程。</p> <p>数据处理:数据采集上来后,经过不同算法的处理形成不同的结果数据,及时更新到内存数据库。</p> <p>推荐反馈:对于用户的每一次推荐请求,推荐服务会整合不同的算法和规则,在毫秒返回结果列表。</p> <p>在数据采集上,主要有两方面的技术:</p> <p>用户标识技术:除了cookie技术,还有硬件标识技术,精确的用户拉通和模糊的用户拉通技术,来支持跨浏览器到跨设备用户识别,其中基于GBDT的模糊拉通技术已经达到95%的准确度。</p> <p>数据获取技术:包括js埋点、sdk埋点、抓取、接口传输等,其中sdk的动态埋点技术可以实现app无升级的埋点更新,抓取系统的模版化也可以快速适应不同网站和网站改版情况下的抓取需求。</p> <p>在数据处理上,百分点也经历了从单机到主从再到全面分布式的架构变化,目前以kafka/storm/IMDB/hadoop实现主要的计算和数据处理。</p> <p>在推荐算法:主要用到的用协同过滤、关联规则、统计等,在自然语言处理上,使用了分词、索引、主题词和舆情相关的算法、同时还有基于时间序列的预测,使用了GBDT+LR的排序框架。</p> <p>在推荐服务上,我们经历了固定算法->动态参数->规则引擎的三个阶段。</p> <p>在最初的推荐系统中我们直接将算法的结果做为推荐的结果返回,形成如看过还看过,买过还买过,经常一起购买等算法;在实际业务中,发现仅仅是推荐算法是不够的,算法的结果少怎么办,业务的条件限制怎么办,逐渐增加了动态参数来控制结果的返回;但这仍然不能很好的解决业务问题,如同一页面新老用户使用不同的算法,业务需要不能推荐赠品,需要考虑相同品类或不同品类优先的策略,业务的需求逐渐催生了规则引擎的诞生。</p> <p>规则引擎</p> <p>这里要重点介绍一下规则引擎,前面说了那边多算法和业务,规则引擎的出现才真正解决业务的问题:</p> <p><img src="https://simg.open-open.com/show/661073bce5cb10ae819dc113d4077dcd.jpg"></p> <p>在实际使用中我们在一个推荐栏位中会用到类似于下面的规则:</p> <p><img src="https://simg.open-open.com/show/4ad42938d28e867032b070310c01aab3.jpg"></p> <p>在百分点的规则库中有将过100个规则模块,这些模块像搭积木一样进行不同的组合拼装,满足业务需求的同时解决个性化的问题。我们现在也对这个规则语言做了可视化,业务人员可以像画流程图一样进行拖拽来完成规则的编写。</p> <p>百分点推荐系统实践架构</p> <p>至此,百分点推荐引擎的核心架构图如下:</p> <p><img src="https://simg.open-open.com/show/cd5f87007cbf18158598cef0a3bb4cd9.jpg"></p> <p>推荐引擎主要由场景、规则、算法和展示这四部分组成。场景引擎就像是侦察兵,探察用户处理什么状态,是无目的闲逛还是有购物目标,有什么样的偏好;规则引擎就像是司令部,根据用户的状态制定相应的规则;算法引擎是后勤部队,为系统提供各种不同的算法结果;展示引擎是先头部队,以最能打动客户的形式将结果展现在用户面前。</p> <p>个性化系统的架构</p> <p>介绍完推荐引擎的核心,我们再来看整个个性化系统的架构。</p> <p><img src="https://simg.open-open.com/show/f2ac9be3d0025072284114ff7c007dfe.jpg"></p> <p>整个系统以nginx前端集群对外提供服务,通过数据采集服务进入系统,分布式的消息队列连接后后端的实时处理和离线处理框架,底层存储方式使用了多种存储技术支持不同的应用场景。整个系统以zookeeper作为配置客理的中心,配以集群运行状态的监控保障整个系统的稳定运行。</p> <p><img src="https://simg.open-open.com/show/50e7253873618f7db61096c34d241a61.jpg"></p> <p>整个实时推荐的架构以分布式、高可用、高性通、高泛化为目标,以大规模、实时性、内存计算为解决方案,构建快速响应的推荐架构。</p> <p><img src="https://simg.open-open.com/show/922280bb6fe619a48db5c5d0f5b93a74.jpg" alt="百分点亿级个性化推荐系统的发展历程和实践架构" width="550" height="200"> <img src="https://simg.open-open.com/show/b3a941ad3e7e0746cfe64d66371ee825.jpg"></p> <p>在实践过程中,百分点也正在经历由SaaS到PaaS的发展历程,推荐引擎提供云端的数据服务,而实际上Everything is DataFlow! 一切皆数据流! Bigdata time comes。在大数据时代,推荐引擎也只是大数据平台的一个应用。</p> <p>离线计算平台</p> <p>百分点离线计算平台,基于大数据的应用构建架构,是以Hadoop为基础的大数据技术生态:</p> <p><img src="https://simg.open-open.com/show/37d9ecdc00a9262f1df5de0f1ef3fc5b.jpg"> <img src="https://simg.open-open.com/show/5fbba68572c2032a4d80d5c5bd2fae97.jpg"></p> <p>离线计算平台主要服务于数据分析、离线特征工程、模型训练等工作。在线上的推荐服务中,百分点实时计算平台发挥着更大的作用。</p> <p>实时计算平台</p> <p><img src="https://simg.open-open.com/show/b60fea0cda1fa23c7b31d56218a4cedb.jpg"> <img src="https://simg.open-open.com/show/90c17ada4c15a46c8c513a3c6c848a03.jpg"></p> <p>在实时计算平台上,我们构建了实时计算应用:proxima计算框架</p> <p><img src="https://simg.open-open.com/show/bdcec7de3fe539eba0a3fdd9c194f2b2.png"></p> <p>以协同过滤为例,以结点和关系来抽象,通过结点之间的消息传递来实现算法的计算,proxima上实现协同过滤的示意图如下:</p> <p><img src="https://simg.open-open.com/show/52c67b4f0b9a52fd18e9d533767991b7.jpg"></p> <p>实时计算的另一个应用是实时的推荐效果监测:</p> <p><img src="https://simg.open-open.com/show/a5c9d63b0812d98a90b8e7d41d4fafa9.jpg"></p> <p>搜索平台</p> <p>下面介绍一下推荐的好朋友:搜索平台</p> <p><img src="https://simg.open-open.com/show/c439ef205a739abe8ab310f029e8ab73.jpg"></p> <p>百分点的搜索平台基于solr构建,架构图如下:</p> <p><img src="https://simg.open-open.com/show/2aba23aa5181c070b0dfb343c15313d3.jpg"></p> <p>对于不同的客户域,我们采用了分片的技术,同时使用不同的master和slave的划分,来实现负载的平衡,利用读写分离解决索引更新和查询的速度问题。</p> <p><img src="https://simg.open-open.com/show/674f3d8fc7b0d32fa9393576ea989255.jpg"> <img src="https://simg.open-open.com/show/5a99dbadbce410f8500447674082141a.jpg"></p> <p>搜索做为推荐算法补充,在很多推荐的场景都发挥了重要作用。</p> <p>个性化系统行业应用案例</p> <p>架构介绍到此为止,接下来介绍一下百分点个性化系统在一些行业的应用案例:</p> <p><img src="https://simg.open-open.com/show/d1500348c2ed16c132c98de0892ea8f8.jpg"> <img src="https://simg.open-open.com/show/db8ba23dd2a1f7d8c23d3075d34c5ec1.jpg"> <img src="https://simg.open-open.com/show/33f45fb56004b3189fc1febaa223a30e.jpg"> <img src="https://simg.open-open.com/show/3a025b6b9168da209ab8033bc516581c.jpg"></p> <p>Q&A</p> <p>Q1:用户及物品冷启动如何解决?</p> <p>雷银:用户冷企动可以采用基于物品的推荐或者其他推荐方式;物品冷启动可以使用基于用户的或其他推荐方式;或者提取部分流量进行探索,探索用户的兴趣。</p> <p>Q2:GBDT+LR的再排的技术实现方案?</p> <p>雷银:请参考2014年非死book相关论文即可。</p> <p>Q3:在个性化场景中怎么对人进行选品?</p> <p>雷银:人是有很多场景,包括人的长期或短期偏好、人的购物性格如冲动型/理智型等,从物品上也有很多场景,比如功能性的物品/享乐型物品等,在此之外又有上下文场景、网页场景等,我们最终要结合具体情况综合判断。</p> <p>Q4:基于GBDT的模糊拉通技术具体是如何实现的?</p> <p>雷银:主要是先通过GBDT训练产生一个比较大的连通图,然后使用聚类的方法对于较大的连通图进行拆分,最终的结果是单个的连通图可以做为一个ID使用。</p> <p>Q5:介绍冷启动中提到,百分点大概率拥有一个新用户在以往在其他平台的行为信息,所以可以认为是已有用户? 这里不太理解,比如百分点拥有该用户以往在小说平台的行为信息,但可以理解该用户在红酒电商上的行为吗?</p> <p>雷银:小说和红酒不太能对应,但是很多情况能对应上已有客户,同时非同类型客户也同样可以抽象性别、年龄、消费习惯等通用用户标签,可以基于标签进行数据整合和推荐。</p> <p>Q6:规则引擎和场景引擎和算法引擎 是如何解耦的?能不能举个例子.一般场景引擎产出某种结论作为参数输入算法模型不是很常见 一般raw特征输入?</p> <p>雷银:场景引擎决定了当前的推荐策略,规则引擎描述执行推荐策略,算法引擎产生推荐的候选结果,规则引擎会组合各个算法的结果满足推荐策略。场景引擎并不做为算法模型的输入。</p> <p>Q7:规则引擎是给业务方能够理解的规则是吗?所以是场景+规则 或者纯算法? 规则和算法的关系是? 规则调用算法吗?</p> <p>雷银:场景是业务方可以理解的当前选取推荐策略的依据,规则是描述执行的策略,规则调用组合算法结果。</p> <p>Q8:全内存数据库用的是什么数据库?数据量多大?数据是什么样的结构?数据备份什么机制?</p> <p>雷银:现在用的是Codis和百分点的Codis C++ Clinet(https://github.com/baifendian/CodisClient),可以很好的解决动态扩容和高可用的问题。目前有约6T的存储容量。数据根据业务场景使用k-v, list, hashmap等不同的数据结构,对于k-v使用的是json和protobuf的序列化方式。数据备份使用主从同步(最终一致性)。</p> <p> </p> <p>来自:http://www.dataguru.cn/article-9910-1.html</p> <p> </p>