个性推荐理论与实践(上篇)

2019 年 8 月 22 日

个性推荐理论与实践(上篇)

一. 背景


去年年底开始做手 Q 个性装扮的个性推荐的事情,进行了一次分享,主要讲了个性推荐的一些理论和我们的一些实践。本文重点从理论上出发,会提及少量个性装扮的实践。


为什么要做个性推荐这个事情,比较常见的答案就是要做精细化运营。对于个性装扮业务也是一样,因为个性装扮的物品越来越多,表情就有 1600 多套,加上原创开放平台的上线,各种作品迅猛增加。用户手机端展示的区域有限,为了能让用户在有限的展示区域里面尽量看到自己最喜欢的东西,所以启动了个性推荐。


二. 衡量算法效果


在做个性推荐之前,我们需要先了解衡量这个事情效果的方法。《推荐系统实践》这本书上有讲到好多评估推荐效果的理论指标,其中使用频率最高的还是准确率、召回率和覆盖率。


准确率其实就是推荐给用户的东西里面有多少东西是用户用了的。如果推荐的东西绝大部分都被用户使用了,那就是推荐得准;如果推荐的东西用户都不喜欢,不使用,那就是推荐得不准确。公式如下:



召回率其实就是用户用的东西里面有多少是推荐的。公式如下:



覆盖率就是推荐物品的集合占整体物品全集的比重有多大。公式如下:



在离线训练挑选模型的时候通常都会使用这些指标来指导我们选择哪个算法模型。推荐算法在线上运营的时候,我们更多的就是看一些实际的业务指标了。比如拉开通的数据对比、拉活跃的数据对比、下载的数据对比。在我们个性装扮的业务场景里面更多的是希望用户能点击看详情或使用,所以我们重点关心的指标是点击曝光率——用点击量除以曝光量。关于衡量指标和数据上一定要有对比,保留一部分流量走原来的逻辑,大部分流量走推荐逻辑,这样就可以进行数据的对比,而且可以在后续的运营和算法更新中,检查算法是不是出问题了。更好的一种做法是保留对比逻辑的那部分小流量也不是固定的某些用户,这样能避免这些用户无法使用体验较好的逻辑,也能避免因为流量用户划分的因素对数据的影响。


三. 协同过滤


推荐最早最经典的算法就是基于物品的协同过滤算法。使用的地方也很多,典型的就有亚马逊网站。其基于的一个理念是:一个用户可能会喜欢跟他曾经喜欢过的物品相似的物品。比如说你比较喜欢《机器学习》这本书,《深度学习》和《机器学习》比较类似,是不是你也很大可能喜欢《深度学习》。


怎么来定义物品是相似的呢?比较自然的想法是看物品的属性信息,比如类型、标签、描述等。也有一些推荐算法就是这么来做的,但是根据这些判断比较依赖标签等信息的客观和完整,不好确定物品之间的相似性。可以参考的一个思路就是对物品的属性数据,根据文本相似度来衡量物品的相似度。


相比这个比较自然的想法,还有一个经典的思路就是协同,根据用户已经产生的行为来计算物品之间的相似度。这个相似度基于的一个假设是:喜欢物品 A 同时喜欢物品 B 的人越多,那么 A 和 B 的相似度就越高。这样一来根据用户的行为数据计算物品的相似读就有一个公式:



这样的话计算出来的物品相似度是基于用户行为空间的,并不是基于物品属性空间的。经典的案例就是啤酒和尿布,这两个在物品属性空间上风牛马不相及的物品,在用户行为空间上就是相似度特别高的。下面的图就是示例如何从用户行为数据得到物品之间相似度的数据:



上面的公式在有一种场景时比较不合理,就是物品 j 是一个热门物品,这样的话物品 j 和所有物品的相似度都很高。热门物品往往没有非热门物品更能体现一个用户的喜好。所以对上面的公式进行优化就有:



从上面的步骤,我们得到了物品之间的相似度,那么怎么给一个具体的用户进行推荐呢,哪个物品又更应该推荐在前面呢?我们可以通过用户对自己已有的物品的喜欢程度和这些物品相似度高的物品进行计算得到一个用户对一个推荐物品的喜欢预估,公式如下:



公式中 K 的值怎么选取可以根据工程实际来确定一个比较合适的值。K 值在非极端情况下,差一点点对结果影响很小。


比如说用户有一本《C++Primer 中文版》喜欢度是 1.3,有一本《编程之美》喜好度是 0.9,下面的示例就是怎么计算即将推荐的物品的先后排序。



这里是在用户行为空间找物品的相似度,然后根据用户已有的物品推荐行为空间上的相似物品。基于物品属性空间相似度的推荐思路其实差不多。


这里其实还有两个问题,一个就是用户冷启动,一个就是物品冷启动。


从预估用户对推荐物品的喜欢程度的公式可以看出,如果用户拥有或喜欢的物品集合是空集,那这个公式就无从算起。针对用户冷启动有很多解决方案,我们通常简单有效的方法就是对冷启动用户推荐热门物品。另外一个思路就是从其他的一些特征(比如用户的性别、年龄、教育程度、文化、职业等)找到相似的用户,然后推荐相似的用户用的多的物品。


物品冷启动就是一个物品新上架的时候,还没有任何用户使用,这个时候在用户行为空间是找不到跟这个物品相似的物品的。所以对这种物品也就无法用上面的方法进行推荐。一个比较简单有效的方法就是在产品逻辑层面增加一个新品模块,新上架物品在新品模块展示推广。也有一些其他的思路,就比如利用物品的属性空间上物品的相似度来进行推荐。


说了基于物品的协同过滤推荐算法,必然少不了要提及基于用户的协同过滤算法。基于用户的协同过滤算法基于的一个理念是:一个用户会喜欢与 Ta 相似的用户所喜欢的东西。比如你和 Ta 都是喜欢看科幻片的人,Ta 喜欢看《西部世界》,你很大可能也喜欢看《西部世界》。那这里的相似的用户又是怎么定义和衡量的呢。一个比较自然的想法就是用户的属性,比如用户的性别、宗教信仰、年龄、教育程度、文化、职业等。同样的也可以在用户的行为空间上来定义和衡量用户的相似——使用共同物品越多两个用户越相似。


在用户的行为空间上通常使用距离来衡量用户的相似度,典型的距离计算公式有 Jaccard 公式和余弦相似度,公式分别如下:



Jaccard 距离公式



余弦相似度公式


通常会使用余弦相似度公式进行用户相似度的计算。基于一个假设:对非热门物品的喜欢更能代表喜欢的一致,可以得到一个改进的余弦相似度公式,如下:



得到用户的相似度之后,可以通过如下的公式计算用户对即将推荐的物品的喜欢程度预估,公式如下:



这个公式里面也有一个 K 值需要确定,可以根据工程实际来确定一个。下图是 MovieLens 数据集在不用 K 值下的测评性能。



从图中我们可以看到,K 值只要在合适区间内,值大小差一点对结果影响很小。同时 K 值不是越大越好。


协同过滤算法在推荐系统上是很经典和适用很广泛的算法。同样有很多库可以帮助我们使用协同过滤算法,比如 spark 里面 mllib 库就有 CF 算法,比如 mahout(The Apache Mahout™ project’s goal is tobuild an environment for quickly creating scalable performant machine learningapplications.)也能帮助我们快速的实现一个协同过滤算法。不同的库网上能找到不同的参考代码,这里贴部分 mahout 实现的关键实现部分代码。



四. Word2Vec 的尝试


上面都是传统经典的推荐算法,很多时候会跟其他推荐算法混合到一起使用,有的时候会借鉴这些算法的思想,衍生出一些新的推荐算法,比如在我们表情商城就有参考 ItemCF 的思想,用 Word2Vec 进行物品之间的相似度计算,然后推荐的。


用 Word2Vec 进行推荐的一个处理思想是:把每个表情当作是一个词,用户下载和使用表情的序列当作一句话,使用全部用户的行为数据,用 Word2Vec 算法模型计算出每个词(表情物品)之间的距离(相似度)然后进行推荐。



Word2Vec 网上可以下载到源代码,有兴趣的可以从代码上深入了解。


表情商城的推荐部分流量就是使用 Word2Vec 进行的。同时更多的场景使用的是 GBDT 进行推荐。先给出下效果(如下图)



下篇详细分析 GBDT 推荐和深度学习在推荐上的实验。


作者介绍:


唐云兵,在腾讯从事后台开发 6 年多,手 Q 个性装扮和动漫后台 leader。喜欢了解一些后台优秀组件设计,喜欢徒步和羽毛球。最近学习和实践个性推荐。


本文转载自公众号小时光茶舍(ID:gh_7322a0f167b5)。


原文链接:


https://mp.weixin.qq.com/s/Y1x0GUkfRbWEz6YsJrMTAQ


2019 年 8 月 22 日 20:321898

评论

发布
暂无评论
发现更多内容

LeetCode题解:20. 有效的括号,while循环replace,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

第11周 安全和高可用

陆不得

Cause: java.sql.SQLTimeoutException: ORA-01013: user requested cancel of current

青乡之b

Druid

调度选得好,下班回家早

易观大数据

架构师训练营第十一章作业

吴吴

【Elasticsearch 技术分享】—— Elasticsearch 存储一条数据, put 过程是什么样子的?

程序员小航

Java elasticsearch 搜索 ES Lucene Elastic Search

极客大学架构师训练营---习题

李朋

合同、封条、电梯……通通上链!

CECBC区块链专委会

区块链技术 监管平台

区块链技术可提高数据可信性和安全性

CECBC区块链专委会

区块链技术 安全性

不可用与高可用

dongge

奈学:红黑树(RedBlackTree)的概述

古月木易

XSKY S3 Console 为对象存储系统赋能

XSKY融合存储

安全&高可用架构

dony.zhang

高可用 安全 安全架构 高可用系统的架构 高可用系统的运维

Java二进制和位运算,这一万字准能喂饱你

YourBatman

位运算 二进制

奈学:红黑树(RedBlackTree)的概述

奈学教育

AVL

SpreadJS 纯前端表格控件应用案例:在线问卷系统

Geek_Willie

java 是什么?作用是什么?

InfoQ_34a83d636158

朱嘉明:新冠肺炎疫情如何改变社会成本观念和结构

CECBC区块链专委会

社会结构 社会观念

导致系统不可用的原因有哪些?

张磊

Week11总结

张磊

架构师课程第十一周总结

dongge

系统高可用

陈皮

区块链钱包系统开发服务商,区块链钱包应用搭建

13530558032

30万奖金等你拿!Apache Flink 极客挑战赛入门指南(附Demo)

Apache Flink

flink

对于三千万攀登者来说,云是安全绳,是登山杖,是趋顶之路

脑极体

架构师训练营第 11 周——练习

李伟

极客大学架构师训练营

图解 K8s 核心概念和术语

后端进阶

Docker Kubernetes 容器 云原生 k8s

week11 作业

雪涛公子

合约跟单APP开发模式,合约跟单系统源码搭建

13530558032

架构师培训 -11 安全、高可用

刘敏

《黑神话:悟空》出圈背后,国产3A游戏的技术新机

脑极体

个性推荐理论与实践(上篇)-InfoQ