一、好的推荐系统
1. 什么是好的推荐系统——用户视角
什么是推荐系统?
当你心理产生一个需求的时候,能通过这个工具顺利实现对这个需求的搜索,并获得符合心理预期的产品列表,这个工具我们就称之为——推荐系统。
例如在现实生活中我们经常会用淘宝、京东、百度等产品,人们通常会基于目的(例如买洗面奶、洗发水、图书)的情况下去搜索想要的产品;或是在需求不明确的情况下,期望外部能传达符合自身内心需求的信息。
那么,什么样的推荐系统是好的推荐系统呢?
1.1 用户层面:对用户真正有价值的推荐
1.1.1 符合用户的预期
推荐结果精准,能较大概率的覆盖用户的需求;用户搜索词与推荐物品有较高的匹配度,这里通常用召回率和准确率来衡量上述指标。
召回率:正例在实际总的正例中被预测正确的概率
准确率:正例被预测正确的概率
1.1.2 让用户产生惊喜
在满足精准性的情况下,推荐系统能挖掘人性需求,帮用户拓展眼界探索未知,产生惊喜。
其体现在推荐结果的多样性,物品间知识关联性等。比如用户搜索古典音乐类书籍,可以在列表中增加与此类型音乐相配的古典舞蹈、茶艺等书籍.
另外,推荐物品不能和用户所购买物品物理绑定。比如用户购买红楼梦上,系统推荐红楼梦下,这个推荐对用户来说并不存在真正心理需求
1.2 系统层面:技术
对用户而言,对推荐结果的预期、反馈的时间、推荐物品更新的频率、系统容错机制等,都会直接影响用户体验。因此在系统层面,一个优秀的推荐系统需具备但不限于:
强大抵御并处理噪声数据(例如刷单产生的无效数据)的能力
高效数据计算及传输能力
稳定的存储机制
算法的精准性
1.3 不断完善与优化
就像人一样,只有不断的学习,才能完善自身的知识体系以及对世界的认知,系统亦然。
好的推荐系统一定具备自我学习的能力,通过建立反馈机制和用户进行交互,从而不断优化对用户群体的认知,最终能实现对用户群体的精准聚类,为每类群体建立模型,物品精准投放。
1.4 让用户信服的推荐理由
好的推荐系统势必会让用户产生强烈的信任与依赖感,给用户提供物品推荐的依据——推荐理由。
推荐理由可以体现出系统是如何判断物品进入用户的兴趣范围的。常用的推荐理由大概分为以下四类:
热门商品;推荐系统通常都会赋予部分热门商品一定的权重,由于感兴趣的人基数非常大,所以系统判断目标用户感兴趣的概率也较大
目标用户的好友同时也喜欢此类物品
喜欢某类物品的用户同时也喜欢这类物品
与某类物品内容有极大的关联性;这里关联性可以逐步细化,比如基于知识体系的推荐,即不同领域的匹配,或同一领域的梯度匹配等
1.5 实现双赢
好的推荐系统不仅能让用户找到目标物品,也能让商家发现目标/潜在的用户群体,实现共赢。
2.什么是好的推荐系统——产品视角
推荐系统都会有一个明确的目的,无论是为了突破技术壁垒还是基于商业目的,最终都会根据目标,通过特定的用户行为数据来判断成功与否。
比如对于电商平台,用户关注、点赞、收藏、加入购物车等操作,都可以在一定程度上衡量推荐结果的精准性,但并未达到此系统的最终目标——支付。
因此我们可以选与系统最终目标最匹配的用户行为,也就是在这个过程中用户付出代价最大的行为作为主要的判断依据,比如购买成功,对此行为赋予相对较大的权重。
二、推荐系统架构
通过上面的介绍,大家应该对推荐系统有一个初步的认识了,那么推荐系统是由哪几部分构成呢,在这一部分,我将逐一解答。
大部分推荐系统都是由前台展示页面、后台日志系统和推荐算法系统三部分构成。
1. 前台展示页面
前台展示页面是直观展示给用户的界面,通过UI与用户交互,交互产生的用户行为数据将存储在后台日志系统中,开发者根据推荐算法对日志系统中的数据进行处理及分析,最终生成推荐结果。
那么,交互产生的用户行为数据包括哪些呢?
用户自身基础属性;即性别、年龄、学历、职业、所在地等,通常来源于用户注册信息或是其他平台数据。
用户行为结果:产生的话题、搜索关键词及反馈(评论/打分)等。
每种类型的数据可以抽象为一种特征,获取方式可来源于目标网站或社交网络。
2. 后台日志系统
日志系统主要是用来记录系统运行的轨迹,在记录的同时,跟踪分析错误,审计系统运行的流程。
日志记录的内容通常分为两大类,一是面向用户,二是面向开发者,这里我们更多关注第一类。
用户行为都会存储在日志数据库中,由于用户产生的数据量巨大且速度快,为了保证数据传输的稳定性,可以嵌入高吞吐量分布式消息系统——Kafka。
同时为了提高数据处理效率,通常会设定日志内容边界对检测出的无效数据源(例如刷单数据)先做过滤。当然经过筛选后的数据也并非规整,这就需要对数据进行一定层级的分级分类和格式规范了。
比如用户点击行为,会生成相应的点击日志,用户的每次查询会生成一个展示日志,与此同时会有一个并行的程序将归并点击日志与展示日志。
3. 推荐系统算法
有了前端展示后和后端数据之后,那么如何实现他俩的交互呢,这中间需要一个连接的桥梁——推荐系统算法。
推荐系统算法可以抽象为一个规则,只有把这个规则定义好,前端才知道哪些数据该展示并如何展示,后端数据库也知道哪些数据有价值。否则,如果将所有日志内容输出,不仅会增大用户信息检索的困难,系统也就失去了自身意义。
总的来说,推荐系统的实质就是一个用户行为特征与物品特征匹配的过程。
用户端特征包含用户自身、用户行为和用户行为结果三部分;物品特征包含标签、内容(关键词)等。
推荐结果均是基于用户特征及物品特征原始数据,在不同维度(时间、多样性、流行度等)上,根据用户需求赋予权重并进行处理(筛选、排序等)后的结果。即遵循用户—特征—物品过程。当推荐系统生成初始结果后,在通过过滤、排名算法生成最终推荐结果和推荐理由。
推荐引擎可抽象成一种特征,每种特征对应成一种推荐策略,结合不同用户需求,调整每个具体特征上所赋予的权重,最终生成特征物品-特征映射{item:Userfeature},Userfeature为多个特征权重相加后的最终值。
三、常用推荐系统算法
1. 常用系统原理介绍
我们从推荐系统具体要解决什么问题以及如何解决问题来剖析原理。
首先,推荐系统要解决的最核心的两个关键点是:如何发现用户感兴趣的物品和如何确定物品之间的关系。其次,每个问题分别如何解决呢?
1.1 如何发现用户感兴趣的物品
1.1.1 用户主动告诉系统对哪些类型感兴趣
用户自行选定感兴趣的关键词标签,系统将找到与此标签匹配的物品。
1.1.2 通过分析用户行为数据
利用用户在平台的历史浏览记录获取能代表用户的关键词,或导入社交数据,获取用户好友列表,从而基于用户好友喜爱物品生成推荐列表。
1.2 如何确定物品与物品间的关系——相似度
相似度计算原理:所有相似度的计算都是基于矩阵的运算。
1.2.1 基于内容(关键词/标签)
大部分物品都会多维度特征,通过特征从而实现与用户的期望得以匹配,常用的是通过物品内容关键词或是给物品打标签的形式来匹配。
1.2.2 协同过滤
协同过滤也是推荐系统中常用的算法,其分为两种,基于用户和基于物品。
那什么是基于用户呢?
就是找到和你相似的一个小群体,小群体里面喜欢的东西都是你喜欢的,你获得的推荐结果就是这个小群体喜爱的物品集合。
那什么基于物品呢?
基于用户兴趣交集计算物品间的相似度,即喜欢物品i的用户有多少也喜欢物品j,通常用来表示物品间的相似度,同时结合用户历史行为生成推荐列表;用户的历史行为对物品间的相似性也具有一定的贡献度。
这样看来,基于物品的推荐系统,更加个性化同时也一定程度上反映了用户的兴趣传承。
2. 如何实现更加精准的分类
仅仅通过用户间兴趣交集生成推列表往往是不够的,在内容、标签的分类以及人群之间的关系上,如何进行深度挖掘?下面几种方法提供了一些优化思路。
2.1 混合推荐
在实际的案例中,单个的推荐模型大多都无法满足预期,所以通常从系统、算法、结果、处理流程上采用不同的混合策略。
例如基于内容增强协同过滤(The content-boosted collaborative filtering recommender),此算法融合了协同过滤和基于内容的算法思想,和基于内容或协同过滤的单个模型相比,它预测能达到比较高的精度,同时它也能解决了数据稀疏和冷启动问题。
2.2 隐语义模型
2.2.1 隐语义概念
类似于协同过滤中基于物品的方法;在每个具体分类中,以用户行为(兴趣)作为物品权重的分配依据。
2.2.2 与协同过滤不同之处(优化点):
物品可以有多个分类维度;基于用户行为决定每个类中物品的权重(eg:如果某类用户群体都对某一物品特别感兴趣,在这类中这个物品的权重就非常大)
分类粒度更加细化;比如关于《深入理解OpenCV》这本书原来被划分为【计算机】类,细化之后可以分为【图像处理】类;
2.3 文本精准匹配
为量化文本间的关联度,引入一个概念——TF-idf,通过比对搜索关键词与物品库单个物品的关键词或标签的相似性,从而生成推荐列表。
TF-idf值越大,说明相关性越大,反之;这里对TF-idf公式原理做简要说明加强理解:
计算公式:TF-idf = f(t,d) x idf(t,D)
TF:频率;搜索词在特定文档中出现的频率:
Idf:搜索词在其他文档中出现的次数:
在文档搜索中,不仅要考虑搜索关键词在目标文档出现的频率,也要考虑关键词在其他文档出现的频率。
如果搜索词是大众词语,那么搜索的结果完全不具备参考价值,比如搜索词为the;在idf公式中,分子为所有文档的个数,分母为包含这个关键词的文档个数,如果是大众词语,则:idf=0,TF-idf=0,物品(关键词)间没有相关性。
2.4 利用社交网络数据
社交网络中包含大量的用户数据,能更好的反映用户间的关系,用户关系通常有三种:
互为好友(Facebook)
单向关注(Twitter)
兴趣小组模式(豆瓣小组)
利用社交网络数据进行推荐通常都将用户间的熟悉程度和兴趣相似度作为最主要的两个判别指标。
用户间熟悉程度,即通过用户共同好友数量计算;兴趣相似度,即通过两个用户喜爱物品的重合度进行衡量。
弊端:用户数据量巨大,数据库读取消耗时间太长。
优化方法:
减少数据量;
重构数据库;
2.5 时间特征
在日常生活中,物品迭代速度非常快,人们的近期行为通常比远期行为更加符合目前自身兴趣需求,因此在系统满足精准性的情况下,需要考虑推荐系统的时效性,根据不同推荐内容赋予时间权重。
例如新闻与经典书籍,新闻更新频繁具有较高的时效性,而经典书籍例如红楼梦,社会对它的需求已经处于平稳,因此时效性不高。
如何将时间权重赋予物品:
物品的生命周期:物品生命周期的长短决定了物品的时效性。一个物品随着流行度的增长,在线时长(一个物品在某天被用户产生过行为)也随之增加,斜率越大说明具有较低的时效性生命周期较长(如wikipedia),斜率越小说明具有较高的时效性生命周期较短(如nytimes)。所以物品生命周期越长,与时间相关性越低。
人的兴趣爱好会随着时间而改变,不同阶段所感兴趣的物品差异较大,时间相隔越久,用户对物品产生的行为权重越低,近期行为赋予较高权重。
除此之外,不同物品推荐的时间点也是需要考虑因素之一,比如用户在工作时间,尽可能推送与工作相关的资讯或资料,与工作内容不相关的信息做降权,下班时间再适当调整权重。
但是同时也要考虑不同岗位工作状态存在不一致的情况,具体推送情况可以通过每个用户大量的行为数据来判断。
2.6 环境特征
环境特征通常可以与时间特征配合。用户在不同的时间与地点的需求差异可能会很大甚至完全不同,或是在特定的时间与地点,对某种信息的需求会急速上升。
例如用户在纽约旅游,关注点会大量集中在纽约的衣食住行,但如果这个时候推荐系统推荐的信息都是伦敦的,那么结果可想而知。
四、 实战篇——如何维护用户数据
当用户数据量太大,例如引入社交网络或是新闻实施推荐,此时如果每次更新都读取一次数据库,那么效率会大幅下降导致用户体验不佳。
目前常用的有两种方案:
1. 消息队列
为每个用户维护一个消息队列,里面包含用户的基本属性(如年龄、性别、职业等)、喜爱的物品、朋友圈等。每当这个用户产生新的动作(搜索),系统将根据特定的规则,赋予消息队列中每部分数据的权重。最终获得推荐列表。
这里科普一下什么是消息队列。顾名思义,就是把传输的消息放在队列里,队列,可以抽象为一个容器,所以消息队列,就是一个用作保存传输中的消息容器。
在这个基础上,这个容器可以跨平台、语言提供可靠的、持久的异步通讯机制。
可靠是指:有且只有一次;有序。
异步是指:发送方和接收方可以不同时在线。
另外,通过消息队列还能实现系统解耦,这使得各个系统间可以相对独立运行。
2. 建立喜好词关键表
在数据库中,我们为每个用户维护一个map,也就是建立“key-value”键值对,key对应用户喜好词,value对应喜好程度。
每个新闻会有对应的关键词和Tf-idf值。当用户浏览一篇新闻时,系统会将这篇新闻的关键词和Tf-idf值插入到用户喜好此列表里。如果用户浏览了包含与原有相同关键词的新闻,Tf-idf值会自动相加并更新原有值。同时考虑数据库存储问题,根据具体需求为关键词量设定一个上限。
当然,除了存储问题,这里还有一个新问题:用户兴趣是否会变化呢?
比如在某某手机的发布会前或是世界杯,用户只在这段时间集中关注某一话题,但之后可能完全不在意了,那么在喜好词列表里,如何体现用户兴趣迁移呢?
这里引入一个新概念——衰减机制。每一个Tf-idf值乘上一个衰减因子, 同时在喜好列表中设定一个阈值L,当Tf-idf减少到小于L的时候,关键词直接删除。
五、未来思考
一个人在群体中的重要性和影响力以及人与人之间一直是难以通过几个参数或几个模型就能判别的,它们均是一个不规则的非线性模型。
平台数据对于深度挖掘人与人之间的关系来说其实是微不足道的,在现实生活中,人与人之间的关系本来就难以定论,存在着表层关系与深层关系。
表层关系具体是指社会赋予你们的关系,比如同事、上下属、同学等,深层关系则是指你们除了是同事以外,可能私下里是有着相同的兴趣爱好的朋友。
表层关系通常可以用数据挖掘定义,比如两个人的通话记录(这里不是指通话内容,而是打电话的时间、时长等)、位置信息等,但是外部信息数据通常会根据个人习惯而产生误差。
其实,对推荐系统的理解等价于对人性的理解;挖掘人与人的关系、人与物的关系、物与物的关系。
除了人们主动表达的需求,我认为最重要的,其实是人性的欲望。所谓道生一,一生二,三生万物,万物由道生出,而欲望乃道的其中一个产物。所以欲望通常不会平白无故的产生,欲望与欲望之间也不会毫无关联,个人的成长经历及生活环境造就了一个人的性格,让他养成了一些习惯。
习惯通常是有形无意识表达,而欲望通常是无意识无形表达。我在想,是否把习惯与欲望结合起来,是否就是对人性的建模。大数据时代,通过大量的用户成长数据与环境数据或许可以适当挖掘其中规则,但更加深入的,其实是要推导因果的关系。