推荐系统技术内幕(一):导论篇

摘要

目前炙手可热的AI技术,最成熟的落地应用之一就是推荐系统。目前对介绍推荐系统的资料有很多,有关于数据挖掘,关于推荐算法,关于工程的,等等,但是大多数的资料都是比较零散的、碎片化的,很少有系统全面的知识讲解,我会试图用这一系列的文章为大家展现一个比较完整的推荐系统。本人的讲解将分为以下这些篇章展开:

  • 导论篇: 主要对本系列文章的内容做一个概要性的介绍。
  • 算法篇: 主要介绍推荐系统涉及的各类算法的原理,内容将涵盖传统的推荐算法以及新兴的深度学习类推荐算法,还将包括很多数据清洗、数据挖掘领域的算法。
  • 工程篇: 主要是关于算法如何落地的内容。围绕着算法的落地实现,会有很多工程方面的工作,例如数据的存储和访问(包括用户行为日志数据,训练数据,画像数据,等等),模型的训练与更新,以及在线serving,等等,涉及系统架构、技术选型等大大小小的事情。大厂的业务场景复杂,实力雄厚,可能会选择自主研发,对于中小长来说,最经济的方式还是借助开源工具和社区的力量,快速搭建和验证算法效果。对涉及的各种开源工具,我也会做些介绍。
  • 团队篇: 前面的两个主题都是关于技术方面的,最后一个主题将介绍一下关于推荐系统团队建设方面的一些浅显的思考。

本文作为导论篇,在讲解推荐系统的技术实现之前,本篇将用剩下的篇幅回答下面几个问题:

  • 什么是推荐系统
  • 推荐系统与普通软件系统相比有哪些特点
  • 什么是好的推荐系统,专业术语就是如何评测推荐系统
  • 如何实现好的推荐系统

首先我们来回答第一个问题,什么是推荐系统。

推荐系统简介

其实推荐系统并不算一个新事物,生活中很多地方都会接触到,下面几个例子都是典型的推荐系统:

  • 个性化广告系统
  • 电商系统中的商品推荐服务
  • 视频/图文推荐服务
  • 个性化音乐电台
  • 社交网络的好友推荐

这些推荐系统,早期在产品中往往扮演者锦上添花的角色,并非核心功能,但是这一现象正在发生着改变,推荐系统的重要性越来越大。有非正式的公开数据显示,亚马逊的销售有35%来自推荐系统,Netflix宣称有60%的用户是通过其推荐系统找到感兴趣的电影和视频,Youtu曾实验证明其个性化推荐的点击率是热门视频点击率的两倍。

并且近些年出现了一些以推荐系统作为主打功能的商业化产品,比如主打兴趣阅读的信息流类产品,包括图文的和视频的信息流产品。这些产品将推荐系统完完全全的作为产品的核心功能,并取得了成功。产品和商业上的成功,也吸引了大量的研究人员投入到推荐系统的研究中来。

透过各种各样的推荐系统的外在和他们完成的具体任务,如何定义推荐系统呢?

推荐系统的定义

维基百科对推荐系统的定义是:

A recommender system or a recommendation system (sometimes replacing 
"system" with a synonym such as platform or engine) is a subclass of 
information filtering system that seeks to predict the "rating" or 
"preference" a user would give to an item

翻译过来就是:

推荐系统是一种信息过滤系统,它试图预测一个用户对一件物品的"评分"或则"偏好"。

百度百科的定义是:

推荐系统是利用电子商务网站向客户提供商品信息和建议,帮助用户决定应该购买什么产品,模拟
销售人员帮助客户完成购买过程。个性化推荐是根据用户的兴趣特点和购买行为,向用户推荐用户
感兴趣的信息和商品。

上面两个定义都有些偏颇,维基百科的将推荐系统定义为一种信息过滤系统,这一点个人还是比较认同的,但是定义的后半部分描述推荐系统的实现方式是通过预测一个用户对物品的"评分",这个观点就不是很全面。

推荐系统除了通过评分预测之外,还有很多中实现方式,后面我将具体介绍。定义的后半部分与其说是在定义推荐系统,倒不如说是在描述推荐系统的实现方式,这本身就是两个问题。

百度百科的定义,问题就更明显了,它其实是描述了电商领域的商品推荐系统,属于推荐系统的一个具体实例,而并非推荐系统的定义。

《Recommender Systems Handbook》中对推荐系统的定义是:

Recommender Systems(RSs) are software tools and techniques providing
suggestions for items to be of use  to a user.The suggestions are relate 
to various decision-making processes, such as what items to buy, 
what music to listen to, or what online news to read.

翻译一下就是:推荐系统为用户的各种决策,比如买什么商品、听什么音乐、看什么新闻等,提供建议的物品。

这个定义中规中矩,没什么大的问题,但本人觉得没有反应推荐系统背后的本质。

综合前面的几种定义,我认为要解释清楚什么是推荐系统,可以从下面两个方面来回答:

推荐系统解决什么问题

生活中的有一类问题,其实可以归类为选择问题,比如吃什么,买什么,看什么电影,读什么书,听什么音乐,选择哪个学校,读哪个专业,选择什么职业等等。

一方面,从消费者角度来讲,我们每天都在做着这些各种各样的选择,从大量的信息中挑选自己需要的信息,这其实是件不容易完成的事情,特别是随着社会的发展,我们正在从信息匮乏的时期走向信息过载的时期,这时候个人的时间和精力相对于信息来说,成为了稀缺的资源,我们迫切的需要一些工具来帮助消费者完成信息挑选的问题。

在互联网发展阶段的早期,人们寻找信息的方式主要是导航网站,提供这类服务的最著名的公司就是雅虎,再到后来,网络中的信息变的越来越多,信息匮乏的状态逐渐变成了信息过载的状态,信息不可能通过简单罗列的方式展现出来,于是出现了提供信息搜索服务的公司,比如google。

信息搜索服务需要用户提供准确的关键字,满足了用户主动查找信息的需求。但是用户对信息的需求不止是这种目的性很强的需求,还有目的不是很强的需求,譬如,打开音乐类APP,很多时候我们没有明确想听什么歌,只是想随便听听,或则吧歌曲当做背景音乐。视频类APP也是如此,除了明确想要看什么的追剧类需求,有时候,我们只是想放松一下,看一个自己喜欢的电影,具体是什么电影自己也不知道,等等。

可以看出,搜索和推荐系统的出现的一个重要的原因是信息的不断丰富。而搜索和推荐是用户对信息需求的两个方面。

事实上,后面可以看到,推荐系统的很多技术都是从搜索领域借鉴过来的。例如在基于内容的推荐系统中,很多内容挖掘的算法都是可以直接从搜索领域拿过来直接使用的,包括很多文本处理算法,这些算法会在算法篇里做具体的介绍:

  • 关键字提取
  • 主题分析
  • 分类
  • 聚类
  • 命名实体识别

并且,很多推荐系统整体设计上,也仿照了搜索系统,设计成两个主要的处理过程:召回与排序,对标搜索系统中的检索与排序。

在搜索系统中,召回阶段会根据用户的检索关键字,通过倒排索引找到相关的信息,然后进入排序阶段,考虑相关性和上下文信息、信息的质量等各种因素,对检索的结果进行排序。

在推荐系统中,召回阶段会通过各种推荐算法,有基于内容的,基于协同过滤,还有基于规则的,等等,召回待推荐的信息。进入排序阶段后,考虑实际的优化目标(比如点击率,时长等),对各种推荐算法召回的内容做个融合排序。

两阶段的设计其实是工程上的妥协,因为当库存数量比较大的情况下,对全量信息进行排序是非常耗资源的,推断的延迟会比较大,实际中是不可行的,所以才有了两阶段的设计。

回到我们的信息挑选的问题,它的另一方面,从信息的生产者来说,他们迫切的希望自己生成的信息能得到用户的关注,获得用户的时间。特别是在信息过载,用户注意力有限,用户获取成本越来越大的今天,他们也迫切的需要一些工具能把自己生成的信息带给合适的用户,实现信息的价值。

推荐系统就是解决这两方面问题的重要工具。社会学领域有一个现象:强者越强,弱智越弱,被称为马太效应,简单来说就是热门的信息会得到更多的关注,从而变的更加热门。推荐系统其实是在减弱马太效应,使得各种非热门的信息都能展示给合适的用户,从而发掘长尾物品的价值。

推荐系统的解决问题的方式是什么

我们在做决策的时候,面临的候选项可能很多,注意力成为稀有的资源。比如看什么电影,备选项就太多了,推荐系统为了减轻选择决策时候的负担,会过滤掉很多它觉得你不会感兴趣的电影,从资源库存里挑选出一个较小的备选集供用户选择观看。这个备选集也就是推荐集合,后面介绍推荐算法的时候,我们会看到生成推荐集的具体算法有很多种,总体来看,这些方式都是在完成信息过滤这个任务。简单来说,推荐系统解决问题的方式是通过信息过滤。

推荐系统里存在三种概念:

  • 用户(user):物品的消费者
  • 物品(Item):可以是商品,广告,视频,图片,文章,等等。
  • 关系(relation):用户和物品间存在各种各样的关系,涵盖非常广,用户对物品的态度、喜恶、行为,等等,都可以构成关系。

用户与物品之间的关系有强弱的之分,并且关系的强弱不是恒定的,与很多因素(时间、场景等等)有关。比如人在海南岛的用户可能对羽绒服的需求就不是那么强(除非他最近打算去比较寒冷的地方度假),最近新买了汽车的用户可能对车载装饰品可能比较感兴趣,喜欢李连杰的电影用户可能对其他功夫类电影也比较感兴趣,等等。

推荐系统的实现方式可以分为评分预测和行为预测两大类,两种方式背后本质都是在推断用户与物品之间的潜在(因为关系强弱是推断出来的,还没有发生,所以是潜在)关系,而预测的依据的则是用户与物品之间已经存在的关系。

推荐系统的信息过滤依据的就是用户与物品之间的潜在关系:过滤掉那些潜在关系较弱的物品,将潜在关系较强的物品挑选出来。

现在来回答第二个问题:推荐系统与普通软件系统相比有哪些特点。

推荐系统与传统软件系统的比较

推荐系统与普通软件系统,差别比较大,开发者首先要有思维方式上的转变。主要的差别在与推荐系统的行为是目标驱动的、概率性的,传统软件系统的行为是确定性的。

工具类软件就是典型的传统软件系统,在使用工具的时候,每一步操作的结果都是在预期范围内的,如果不在,那就是软件出现了BUG。而推荐系统并非如此,在一个推荐系统里,我们无法预期会出现什么具体内容,但是可以预期多大概率出现什么类型的内容,也可以预期用户消费此内容的概率是多大。事实上这正是用户需要的行为,希望推荐系统不断带给他们惊喜。

所以在开发推荐系统的时候,这样一个思维的方式要转变过来。

例如,经常会有人抱怨说:“这个内容我又不喜欢,为什么推荐给我,你们的推荐系统有BUG吗?”.

事实上,只凭这点,是无法判断推荐系统是否存在BUG的,因为推荐你不喜欢的内容,可能也是推荐系统的策略之一。

这句话听起来有点骇人听闻,我来解释一下这是为什么。

这是因为推荐系统并不会什么魔法,也不能预测未来,他能做的事情就是根据用户的行为来猜测用户的喜好,所以这里就存在一个问题,也是推荐系统中比较经典的问题之一:

  • EE(Exploit vs Explore)问题

EE问题描述的是,用户使用推荐系统一段时间之后,推荐系统知道了用户喜欢的东西,例如有A类,B类。那么接下来的推荐策略是怎样的呢?有这样几种选择:

  • 只推荐A,B两类物品
  • 忽视用户喜好,随机推荐
  • 推荐A,B两类物品,但是掺杂一些用户喜好未知的物品,发掘用户的兴趣

显然第二类方式是不可取的。也能感觉到第一类做法会让用户觉的单调乏味。比较好的做法就是第三类做法,满足用户当前的喜好的同时,试探性的开发用户新的兴趣点。

这就是为什么你会在自己的推荐列表里看见自己不喜欢的物品。

另外,与普通系统相比,推荐系统还有一个特点,就是推荐系统是数据贪婪型系统,系统表现的好坏,除了更采用的算法有关,还更数据有关,再好的算法在没有数据的情况下,也是无用武之地。

因此推荐系统还有一个经典的问题,就是冷启动的问题,描述的是用户刚开始使用系统,或物品刚加入系统,数据匮乏的情况下,推荐系统如何应对。这也是普通软件系统不会存在的问题。

认识什么是推荐系统之后,再来回答第三问题:什么是好的推荐系统?

推荐系统的评测

有了评测标准,系统才可能被优化。所以评测标准是推荐系统的首先要确定的问题。用一句时髦的鸡汤来讲,就是方向比努力更重要。

推荐系统一般会有三方参与者:

  • 物品消费者
  • 物品生产者
  • 平台

三方都有各自的目标,好的推荐系统的设计需要兼顾三方的目标,首先,推荐系统需要保证向物品消费者推荐他们满意的物品,另外,需要保证物品生产者的物品能得到展现,而不只是展现部分生产者的物品,再则,需要保证平台的良性发展,证明平台自身的商业价值。

目标有了以后,接下来就是分解目标,并且最好能对目标完成的程度做到很好的评测,这些评测有定性的,也有定量的。对于不同的物品的推荐系统,指标也会有所不同。

物品消费者侧的指标,常用的指标人均点击物品次数,人均停留时长等等,这些指标反应了消费者对推荐内容的满意程度。信息生产者侧的指标有信息展现次数,信息的点击率,等等,生产者的信息的不到预期的展示效果,平台就可能会流失这部分的生产者。平台方的指标有用户日活,用户留存率,用户增长率,营收能力,等等。

这些指标最终决定了一个推荐系统的好坏。同时,这些最终的指标的获取成本比较大,需要系统实际上线并运行一段时间后才能得到。

系统一旦上线影响比较大,造成的影响往往是不可逆的,所以一般新系统上线前,会先进行AB测试。我们可不想带有BUG的系统影响到大量的实际用户体验。

除了这些在线的指标,实际当中,在系统上线之前,还会经过多次的离线测试。离线测试优点是风险可控,可操作性强,可以反复实验验证。有很多的离线测试指标可以衡量推荐系统,比如常见的离线指标有:

  • 推荐准确率: 衡量推荐结果的准确性,比如对于评分预测的推荐算法,常用的准确度指标有均方误差,绝对值误差等

R M S E = ∑ i , u ( r i u − r i u ′ ) 2 N RMSE=\sqrt{\frac{\sum_{i,u}(r_{iu} - r_{iu}')^2}{N}} RMSE=Ni,u(riuriu)2

M A E = ∑ i , u ∣ r i u − r i u ′ ∣ N MAE=\frac{\sum_{i,u}|r_{iu}-r_{iu}'|}{N} MAE=Ni,uriuriu

  • 推荐覆盖率: 衡量推荐系统召回的信息占平台总信息量的比例,反应推荐系统对长尾物品的推荐能力。覆盖率越高,说明系统推荐长尾信息的能力越强,覆盖率越低,说明有越多信息始终得不到推荐。
  • 推荐多样性: 衡量一次推荐结果中信息之间的差异性。
  • 推荐的健壮性: 衡量推荐算法的抗攻击性,也就是推荐算法的鲁棒性。攻击者会通过各种各样的攻击方式,让推荐系统的行为有利于自己。比如信息是生产者会通过各种方式提高自己信息被推荐的概率。推荐系统的健壮性可以通过对比测试攻击流量加入前后的推荐结果来测量。

离线指标并不能替代在线指标,如何通过离线指标的优化来提高在线指标,是推荐系统领域重要的研究课题。目前并没有统一的方法,主要依靠研究人员的经验和感性认识,比较普遍的做法是:保证其他指标在合理范围内的情况下,尽量提高推荐的准确率。

目前也有些新的离线指标被提出,例如:

  • 推荐的新颖度:衡量推荐系统对非热门类物品的推荐能力
  • 推荐的信任度:衡量用户对推荐结果的信任度
  • 推荐的实时性:衡量推荐的时效性,比如新闻类物品,时效性就比较重要

评测推荐系统还可以通过用户调查。用户调查就是人工调查的方式直接询问实际用户对推荐结果的满意度。优点是评测结果直接反应了用户的满意度,但是这种评测方式的缺点是无法大范围的测试,并且结果有很大的主观性,因为不同用户对结果的要求标准不一样,实际操作中就需要考量调查中提取的具体问题,从而降低回答的主观性。另外还要注意采样误差,调查的用户分布尽量符合产品真实的用户分布。

有了评测标准之后,该考虑的问题就是如何实现好的推荐系统了。

如何实现好的推荐系统

实现好的推荐系统,首先需要开发者养成目标驱动的思维方式,目标是开发推荐系统的时候首先要确定的问题,因为推荐系统追求的是目标的增长。这一点与传统软件系统有很大区别,后者追求的是系统行为满足预期。

其次,宏观上我们需要了解做好一个推荐系统需要哪些关键要素。

这问题上目前存在一些误解,最常见的误解是过高估计算法的重要性。甚至认为推荐系统约等于推荐算法。这肯定是不对的,个人总结了推荐系统的关键要素有以下几点:

  • 数据: 数据是推荐系统上层建筑的基石。包括用户行为数据,物品数据。事实上推荐系统的大部分算法都是围绕数据处理的。包括数据采样,数据清洗,数据结构化等等。数据决定了推荐系统的上限,其他要素是逼近上线的方式。
  • 领域知识: 例如音乐推荐、新闻推荐、商品推荐等等,属于不同领域的推荐系统。领域知识相对与通用知识而言的。音乐推荐有自己的领域知识,新闻推荐有自己的领域知识,商品推荐领域也有自己的领域知识。算法就属于通用知识。善用领域知识能解决很多问题,例如对于推荐系统的顽疾:冷启动问题,一种解决方式就是根据具体领域的实际情况,结合领域知识,人工制定出一些人推荐规则进行推荐。另外,推荐系统的目标优化过程,也里不开具体领域知识。因为算法可能帮助我们自动学习出很多参数,但是推荐系统里一定存在着无法自动学习参数,或是因为数据稀疏无从学习,或是因为计算量庞大,或是因为还不存在很好的学习算法,等等,此时就需要人工决策这些参数了,而决策的重要依据便是领域知识。推荐系统的目标与算法之间存在的一些鸿沟,需要领域知识去填充。
  • 算法: 算法的重要性就不用在强调,后面将会用专门的篇章来介绍算法。因为与领域知识相比,它属于推荐系统通用知识。

这些就是推荐系统的关键要素,也是分析和解决问题的方向。

好的问题是解决问题的一半,因为提问其实反应了思考的角度和方向。面对如何实现好的推荐系统这个大问题,我习惯性会问自己以下这些问题:

  • 目标设定的是否合适
  • 如何衡量目标完成质量
  • 有没有合适数据
  • 有哪些领域知识
  • 有哪些适合的算法

推荐算法工程师的自我修养

作为推荐算法工程师,应该以什么样的标准来要求自己呢?

  • 要做到业务敏感,注重业务内领域知识的积累,这部分与推荐产品同学其实是有知识重叠的,比如新闻推荐,音乐推荐,职位推荐等等,不同的领域内有不同的领域知识。
  • 算法技术知识积累,重要性毋庸置疑,包括样本处理,特征选择,模型等等
  • 目标思维与数据驱动
  • 沟通能力
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值