基于深度隐语义topic的用户聚合推荐--part1 topic
背景:在个性化推荐系统中,新用户的快速兴趣探索,是推荐系统能否真正抓住用户的真正喜好,并达到留存的关键因素。如何快速兴趣探索,首先要选取一种合适的粒度,业界常用的方法有基于item粒度的,或者基于category亦或是基于subcategory的。前者item粒度太细,探索的效率太低,新用户不会给推荐系统太多的机会,几刷抓不住就不会停留。后者类别或者二级类别粒度太多,比如体育类别里面就有足球,篮球,网球,排球,足球里可以细分成欧冠,五大联赛,中国联赛等等,不喜欢足球的人可能喜欢网球,不喜欢中超的人可能喜欢欧冠。所以如何设计一种合适的粒度就成了当务之急,本文介绍一种基于深度隐语义topic的用户聚合召回算法来解决上述问题。
一:基于深度隐语义的topic。
图1.隐语义topic获取的主流程推荐系统中,每天大量的用户会产出大量的点击行为,不同用户的行为序列就是构成了丰富的训练语料,无论我们将这些训练语料看做是句子,还是基于user节点或者item节点桥接成图,还是采用监督学习的方法,将每一个点击看作正样本,都可以将系统中的item做nn级别的embeding,从而学习到item的向量表示,这里不具体介绍item embeding的方式方法,感兴趣的同学可以参考我之前的文章,我曾落地过的比较行之有效的item embeding方法与模型有(item2vec, graph embedding, deep match(youtube dnn),dssm )。
获得item的向量表示之后,利用向量之间的距离远近关系,采用传统的聚类方法如kmeans等来将相近的item聚合到一起,行成簇(cluster),每个cluster就可以表示一个隐语义topic。常用kmeans的同学会知道,需要设定topic的数目,这个topic的数目是需要根据库里总体的item数目,考虑每个topic可能的item数目(比如500或者1000)然后得到一个基本topic数目,去试验几次得到一个比较合理的topic数目,topic的数目合理的解释是同一个topic内必须都是一个主题,可以允许少量的不同topic描述的是一个主题。图2.简单揭示了topic是如何由item的向量聚合而来的。首先item映射到向量空间里就是图2中左侧很多随机的点,例子中肉眼可见,这些点分布到了左下和右上两个区域。经过聚合,可以将距离近的点合成一个cluster,也就是一个簇,就是右边的topicA,topicB。当然kmeans里面迭代多少步,或者当簇中心移动的距离小于多少时就提前停止迭代,这个需要设置一下。
图2.topic获取过程解析二:topic的实际例子解析。
随机抽取几个topic里面的top3 item 给大家展示一下:
(1)1.神奇宝贝:这个反派太温柔,毒粉蝶的春天与武藏的少女心;2.小次郎手里最强的六只神奇宝贝,最后一只能够完虐皮卡丘;3.神奇宝贝特别篇中的那些人气角色,四天王横扫四方,夏伯威震全场。 显然我们一看就能发现这个topic说的是动漫 数码宝贝的事情,这个粒度正是粗细合适。
(2)1.赶作业赶出心脏病得了心脏病怎么调养;2.心血管受损容易危害心脏,抓住这4个机会,或能助你预防心脏病;3.不论男女,心梗发作时,有4个“不明显”症状,早发现,或能救命。 同样我们一看也能发现这个topic说的是健康 心脏方面的事情。
有了topic那么接下来基于topic如何进行推荐,这里也是经过了一些思考,下一节给大家详细讲解。最后给大家留一个问题,大家可以思考一下,文中说,topic不能允许,同一个topic里面介绍两个事情,但是可以部分容忍两个topic介绍一个事情。当发现一个topic介绍多个事情时,我们只需调大一下topic数目即可,但是发现多个topic介绍同一个事情时候,我们要缩小topic的数很难缩到满意的数目,这里有没有一种合适的算法,来帮助我们呢?其实是有的,大家可以思考一下。