|
卡布奇诺:本文来源于TOP100SUMMIT速记分享,2015-08-24 但并不能代表为王志勇分享时间,根据下面的PPT文档,得知为,2014年,估计2014年至2015至今一直用这个ppt文档,变化不大,所以在此,也对文档进行了分享,请移步下载,本文只是对于京东个性化搜索技术的技术分享,与真正的京东卖家运营并无太大的关系,但是总能再文档内以及下方速录文字中寻找可以学习的知识点,所以才做了本次分享。
《京东个性化推荐技术实践PPT》-王志勇
讲师:王志勇(考虑肖像权问题大神照片就不分享了)
个性化推荐是为用户私人订制的信息服务,不仅是一种精准营销的商业手段,更重要的是能提升用户体验,增强用户黏度。本次分享基于京东的实时个性化推荐实践,介绍包括用户数据收集,用户兴趣建模,商品知识库模型以及实时推荐算法等核心功能。
加入京东后主导搜索Rank引擎v1.0,京东快车播放系统V1-V3以及全站实时个性化推荐的研发。对ML和DM在推荐,搜索和广告系统中的应用有较深入的理论研究和工程实践;对高并发和大数据处理的后台系统架构有丰富的实践经验。加入京东前,曾供职阿尔卡特朗讯,主要负责Surepay&ICC等实时计费系统的研发
王志勇:大家下午好。非常高兴今天下午天这么好,大家都有这么高的技术热情来参加沙龙,非常感谢大家。我先做一个简单的自我介绍,我叫王志勇,2012年加入京东,2012年就开始做京东的第一版搜索的排序系统的上线,后面又做了京东站内的一个收费的广告系统,主要有CBC、CBD这块的,主要负责CTI竞价模型方面的算法和后台系统架构。2014年开始个性化推荐,也有个性化搜索算法的应用。今天我分享的主题是个性化搜索相关的架构和算法。上一场张乐给我们分享了搜索的后台的架构,也为我这块做了很多的铺垫。
我简单介绍一下,目前我们京东搜索这块的业务范围。我们再说一下为什么要个性化的搜索?以及我们目前个性化搜索在京东的一些在线应用。最后,我们会重点介绍个性化搜索的设计的相关技术。
首先,京东搜索覆盖的一些跨屏的服务,首先就是PC。PC上的搜索,就是说产品内容是最丰富的,也最能够做一些玩法的,像APP很小,一些产品上的需求就会相对弱一些,但是个性化强度需求又是最高的一个。这是我们在APP上的一个搜索,也是我们团队负责。这就是微信手Q的搜索,这也是我们部门的支持的。其他商城的垂直搜索也支持,但不是大的。这三大块流量也是挺大的。
我们先开个头,就是为什么需要个性化搜索?因为大家说,搜索一般用户行为目标是比较主动的,他会引擎他明确的需求,但是实际上是这样的吗?其实我们通过用户需求发现,大部分用户都会搜一些意图不是特别明确的需求。
因为用户表达购物需求的时候,很难用一个非常明确,非常具体的搜索去表达,所以他会通过一些比较宽泛的需求在引擎里尝试搜索,然后再通过我们一些导购的筛选去找到他想要的一些商品。
还有对需求中文方面也有很多歧义,像红豆,红豆是一个男装品牌,也是我们吃的,其实类似的也挺多的,像苹果、小米,都会有这样的一些意义不明确的点。还有就是在宽泛词里其实是非常趋性化中老年人的,羽绒服,男性的、女性的、长的、短的,这种是各种各样的一些商品其实是用户有不同的选择的,如果我们在知道一些用户的习惯,以及基于他的行为做了相应的分析,最后我们其实是能够更好的去满足用户的这些搜索需求的。 从用户层面来说,满足用户不同的检索需求,缩短用户的购物路径,让用户购物简单、快乐。平台层次就是我们更希望能更好的利用流量,把流量整个效率提升上去,然后提升整体的GMV,其实长微商品很难得到曝光的,我们通过个性化是能够解决这一部分问题的。此外,大家也都知道刷单,也是可以通过个性化做一定程度缓解的。
下面目前京东在个性化搜索方面的线上应用。最直接的就是说我们基于用户历史行为的个性化,就是说我们会记录每一个用户之前在我们平台的一些历史行为,他关注的商品,购买的商品以及最近浏览的商品,这是每一个用户都不一样的。 这个其实算法上没有太大的难度,其实就是分析和存储,以及怎么告诉的在在线应用上去获取相关的数据的问题。当时我们也是做了线上的ADTEXT,有一个10%流量的对比,红线就是我们个性化搜索尝试,这其实在不同的时间段也是有一定程度的提升。
对于性别偏好的使用,就是说搜的需求是“上衣”,上衣的话就会有女性层次,当然看女性里也有一些男性的服饰,这个我们只是做调整,不是做过滤,其实用户每次随着他需求的表达,还是有一些不同的,产品上还是不是特别准备。 购买力,我们可以看到这块的搜索结果是针对的是低端用户人群,都是在100元左右的毛衣。这个就是中等,就是稍微好一点的,也有性别,以及购买力上的展现,到200多了。同样是毛衣的需求,可能发现这个相对而言就会更高档一点,品牌也会更时尚和质量会更好一些。这是我们基于用户历史购买的行为分析出他购买力的偏好,然后来对用户实施不同排序结果。 然后还有兴趣偏好的尝试,我们通过他的购买,他对图书这方面的需求是非常宽泛的,在图书层面其实是有一定的延续性的,我对某一类商品比较感兴趣。比如说这是我们组的一个同学的结果,他对算法上面的应用会关注的比较多,我们就会相应的出这些结果,如果是旅游方面的就会是旅游的书了,如果是有小孩的就会更多的是绘本的。
除了我们主体的商品之外,还有个性化下拉和导航的,像下拉,可以对他频繁使用的词有展现,像男性搜体恤的时候,我们首先展现的是在男装分类里去搜索。还有个性化的导航,对于女性用户的凉鞋,我们在导航栏里会有高跟鞋排在前面,品牌也会更女性化。 前面主要就是做一个铺垫,后面就是说我们真正怎么做到个性化,所涉及的一些相关技术。其实个性化这块,因为要涉及的数据比较多,就是活跃用户都是几千万,每天访问的用户也是几千万,另外,我们基于这个要在在线上做很多的计算,要把这些数据拉到在线,然后做分析,这个其实对架构也是一个比较大的挑战,对它的一些辅助的框架也是有一些技术要求的。
首先我说一下搜索逻辑架构,就是不是物理上的方式了。首先我们有一个重点,我们会做一个分流,我们要做ADTEXT,首先要分出流量,把流量分均匀了,后面相关的分析才会比较准确。分流器,分流还会遇到一个问题,就是说我们要做的实验很多,但是我们的流量配比就不够,这样的话如何合理的分配流量?
如果每一个实验都分10%,可能最多也就只有10组实验,其实我们不可能把百分之百流量都用在做实验,这样的话对系统的影响还是比较大的,我们做一些,在流量的分配上会做一些堆叠,首先会把流量打上标签,到后面的排序引擎了,然后商品画像根据这个标签进行算法上的调整,我该触发哪个算法实验,这样就可以在后面分配了。
意图分析器首先要通过这块了解用户的购物意图,把他的需求做文本等的分析,找出用户真实想要做的事情,做需求改写,因为用户会经常出错,我们会提示用户,把它做一些改写。下面就是我们召回引擎。还有就是商品画像,给商品打上很多模型标签,这样就能进入到召回引擎里能够排序使用。 这块是用户画像,我们给每一个在我们平台上面有历史行为的用户去分析建模,给用户的维度的信息供排序使用。下面就是支持这些模型以及排序等等都是在离线上做的。其实我们的索引这块也是一个分布式的,在hadoop上建好的离线索引。
说到要建模,肯定首先一部分就是要搜集数据,没有数据就没有后面所有的产品呈现了。我们设计好了一个能够支持用户行为分析的数据采集系统,是一个重要的问题。首先是用户在我们各个产品上产生需求,然后我们数据采集系统就能去搜集用户相关的数据,之后到达我们的数据后台的集群,这就是kafka集群,我们把用户所有的实时行为数据都发送到这块,基本上是秒级的一个后续的storm集群的运算,就能够体现在我们搜索排序以及推荐的个性化服务里。这块相当于是存储服务,是我们京东自己的缓存云。
下面这个图主要讲的是它的数据采集的具体框架。右边这块是实时的数据采集的流程,主要是通过我们的点击流的服务,它就会在点击流服务里直接以消息的形式发送到kafka集群的后台。分主题,不同的主题,根据主题消息的消息量分不同的主题。我们这个集群目前有一两百台。每天支持的消息量应该接近百亿。
左边这块主要是我们的离线,这个应该有一点老了,实际上后面是说在ETL的过程,就是大数据分析这块也是后来变成了,直接通过kafka发送,然后到大数据平台,供我们做离线模型分析。之前是用文件的方式去做这种事情的。
说到商品画像,其实商品的数据有人可能想,说商品画像比较简单,因为像电商的数据都比较规范,但实际上还是有很多的挑战的。为什么这么说呢? 因为商家会做很多的SEO,他为了引入流量,就会加入很多的文本去描述他的商品,在商品后台库里也会把一些品牌、颜色、尺码会做一些有利于自己的行为,本来是一个小品牌它要绑一个大品牌,是这个产品而说成是另外一个产品,在商品的title上会加一些不相关的文本修饰,我们需要很多的自然源处理的技术,去提取商品的产品词。
主要分四大块:首先,我们会去算出产品之间的关系数据。关系数据是什么呢?就是说这个商品是和哪些商品是同时购买的,就是典型的购物栏分析。还有浏览相似和内容相似,就是说根据用户在整个浏览的轨迹中他们浏览中贡献的一些相关数据,来计算商品之间的相似程度。
另外,通过内容的方式,内容就会有它的文本的内容,属性的内容,这些内容都会组成特征去分析它们的关系度。我们还会根据商品的销售的数据,给商品做一些数据分析。比如说我们去预测一下这个商品大概是多长时间用户会购买一次,就是购买周期。
这个购买周期数据其实要算准还是挺难的,因为现在国内的电商环境基本上是以促销为营销方式的,所以不是理性消费。还有价格指数,这个不意味着它是多少钱多少钱,其实不同的商品价格是没有可比性的。像苹果手机和毛巾肯定不是一个价格,所以这个价格指数也要依赖于对这个商品分类以及产品的一些准确的定义,才能计算出它的价格指数来。 这块讲的是适用人群,像男性用户,女性用户。这块母婴产品,会根据年龄的划分更细致。0-3个月,3-6个月,特别是奶粉分几段几段的,纸尿裤也要分多少斤的。
还有就是图片分析,这个的技术含量就更大一些,因为在电商产品里,用户大部分的注意力可能都会在图片上面,特别是在需求最开始展现的时候,没有浏览商品详情的时候,一般都是靠图片去吸引用户的。然后就是一些商品在流量层次上它会有多大的贡献,它的点击率是怎 的,它的历史转化率是什么样的,一系列的信息都需要去计算。把这些信息都计算好了,我们对商品的了解就基本上是比较丰富了。
对商品的了解是个性化的基础,如果我们不懂商品,就没法儿给用户做一个好的推荐或者是排序了。
用户画像,就是说商品画像做好了,我们说用户画像很多数据源也是基于商品的。比如说用户的性别,我怎么去判断他的性别?我们肯定不可以说用户在登录的时候,根据他登记的性别,首先那个性别很少,很少有用户会做这个,并且这个也不一定准。我们这个性别是用户的购物性别。
什么意思呢?就是说他在整个平台里浏览轨迹和历史行为,他买的大部分商品是什么,通过商品性别可以反对用户性别。然后通过购买相似等等可以把商品扩展,对用户的行为也可以扩展,这就是典型的CF的方式。
前面说购买力、兴趣、性别,这几个模型是我们用的最多的,也是最准确的。还有品牌模型,还有说判断他是否有小孩,因为有没有小孩对用户的购物影响挺大的。有了小孩后可能大部分时间都在给小孩选商品。
有了这个模型以后我们怎么高效快速的提供给在线服务使用呢,这也是一个比较大的挑战。这块模型主要说的是用户画像的服务结构,以及它内部的数据存储的方式。
对于最外面来说,比如说我们搜索应用,推荐应用,相当于这个client,我直接通过服务接口化的方式,我们就可以指定我要取哪一个模型或者哪几个模型,比如我们同时取用户购买力和用户性别模型,那么我们通过服务接口就可以获取到这两个模型。这两个模型首先用QBS就有一个比较大的挑战,必须要保证它在10个毫秒之内,这样才不会影响我们后面的排序业务。
系统有四种典型使用流程:第一,模型数据定期更新,第二,模型数据内部实时更新,第三,模型数据外部实时更新,第四,模型服务。我们离线加实时,通过一个平台来获取用户所有相关的数据。
对于搜索来说我们有一个很重要的,刚才说我们个性化意图分析,对于“手机”、“巧克力”这种宽泛的,我们是要做意图识别,然后分析用户具体性别、购买力、年龄、品牌偏好,把这块的分别去理解清楚之后,我们再做后面的模型触发。
到了一个宽泛的需求以后,我们从意图识别,并且拿到用相关的行为信息的时候,这些模型数据,我们加上商品的这些数据,我们就可以做一些个性化的排序的算法的触发。但是这个模型我们主要用的有逻辑合规和RankSVM 和GBDT。 还有日志做模型训练,就是说有一些标注,首先要有特征。标注和特征其实有两种方式:
一种就是说我们把既展示日志就Ok了,后面的特征我们到训练模型的时候去做重新恢复,比如我们用到某个特征我们再重新计算。
其实更好的一种方式,是我们在做排序的时候,直接就把能利用的特征都用日志记录下来,记录下来之后我们在后续去做模型训练的时候,数据恢复就比较简单了,因为很多数据其实是很难分,因为它有时间维度的一些因素,我们其实很难恢复到当时那个排序结果所对应相关信息的,最好的其实作排序的时候就把这些日志给记录下来,后续分析的时候就会简单很多了,对于模型的准确率也有很大的提升。
这几个模型我就不详细说公式了,其实我也讲不太清楚,因为在这个场合下大家还是很难理解,如果大家感兴趣的话可以通过网上的一些资料学的会更快一些。 我要说的是,对于标记来说,就是用排序队的方式去标注,比如我们说我们的商品是排序列表是ABCD,用户点击A商品,也点C商品,最终购买了C商品。
我们怎么衡量在这个需求下,商品质量的好坏的?我们还是通过用户行为,就是用户来帮我去识别。当然具体的数值我们会在模型里做调整的。
还有就是我们在做一些排序学习的时候,这个标注,我们其实不希望在一个排序的实验里对原有的排序结果做特别大的变动,如果变动特别大,首先会带来一些风险,也会干扰一些用户的浏览习惯。所以我们会做一些,我们不是完全基于用户点击购买去构建一些Pair队,我们会对原始的展示结果做Pair队。
除了单个用户行为,还会根据用户统计的数据,比如B商品在这个需求下的平均点击转化率,通过这个来构建Pair队,这样能够更稳定的表达这个商品质量好坏,在这个需求下用户的喜好程度。这样就能更直接。
这里可以看到,ABCD是有一个问题的,就是它的原始结果,就是A在B之前,其实用户是很容易用脚投票,就是A比B好,A上的点击会多很多,你把B放在第一位置上B的点击也会多很多,这就是因为位置偏差造成的。这就是每一个排序不管横着竖着的都会存在位置偏差的,我们要进行修正,把这个偏差补进来。
这是GBDT的算法,我要说的是这块,这个其实也是facebook里一篇论文的方法,我们也是在借鉴,在尝试。这个就是我们怎么去构建feature,我们先用GBDT对人工的,基于GBDT的分类。根据分类的叶子节点去做特征。
像这个是树,这个是叶子节点,每个节点就是一个feature。在这个技术之上我们去用LR做排序的模型,这样的话相当于基于这些特征的基础之上我们去做排序模型的训练,这块能够让我们的特征更稳定,更能体现数据里面的一些本质的东西。其实也和我们之前的特征工程相似,比如我们按照特征数据分布,去相应的做bin,其实也差不多。
这块是我们整个的算法实验的迭代流程。这里因为我们在搜索这块主要还是在线下的模式。首先我要强调特征集市,这个能快速提升算法团队的迭代效率。
因为可能很多算法工程师都容易自己构建自己特征,每个人构建一份特征,每个人有自己的后手,但是这个不利于整个团队的快速迭代。我们把所有算法工程师用到的特征,用特征集市的方式组织,并且让其他同事能够共享,这块能够很快的加快迭代的效率。 下面是一些特征,这个特征不仅仅是简单的途径,它会有前面的用户画像,商品画像的模型数据也是在这块里面去体现的。
数据清洗这块涉及的面挺大,因为在电商里的数据太多了,有时候需要过滤,还有一些脏的数据我们要通过各种方法去把它清洗干净。还有就是用户的标志,特别在PC端有很多用户是不习惯于先登录,然后再来浏览、购买。一般都是说到最后我选中了,就加入购物车去结算的时候才登录。
这样的话用户行为的分析,这个如果基于登录帐号的行为需做数据分析,就会丢失很多的数据;如果我们基于UID的数据去统计分析用户数据的时候,又会发现有很多数据错乱的问题。这块我们就是要通过各种算法上的方式去做数据过滤。
还有一个重点,我们评估的,其实很多算法可以在离线去做评估,能让它不需要繁长的在线的过程才得出这个算法好坏的结果,这样能加快整个的算法迭代的周期。
做了一个离线评估之后,如果效果不错,就上线。上线就是前面说的AB测试的平台,这个平台需要我们很好的评估的产品,这样能评估各种各样像点击率、用户体验方面的留存等等。
通过各项指标的在线的真实的流量的统计分析,我们就能很快得出相应的实验分析报告了,我们觉得哪个实验提升多少比例,我们还提流量还是该下线,这个就是通过实验分析模块我们能够快速发现和得出结论。
说一下离线的评测指标,对于搜索来说我们主要用的是MAP和MRR以及分类的ROC和AUC曲线。这就是我们几个版本的实验的数据,通过各个维度的对比,我们得出哪个离线实验效果是比较好的,我们就可以尝试这个比较好的结果来上线。
这是上线后的评价指标,这个我们举了一个用户下单转化率的例子,其实我们同时在线的至少有六七个。我们通过这些指标,当然我们还有一个在上线前会有一个产品评估的过程,这个指标再好,还是在产品体验上会有一些因素的,我们充分的通过人工的方式去做评估,虽然指标很好,但是不一定你这个模型就一定会很好,因为会有长期和短期。对于长期的一些产品体验的问题,虽然我们会有一些指标,但是那些指标还是比较延后的,所以我们需要有产品层面的评估。
今天要分享的内容就到此结束了。谢谢大家。
|
|