天天看点

推荐系统9——推荐系统实例架构1,外围架构2,推荐系统的架构3,推荐引擎的架构

在之前我也看了很多人写的推荐系统的博客,理论的、算法的都有,多是个人的理解和感悟,虽然很深刻,但是对于自己而言还是不成系统,于是我参考大牛项亮编著的《推荐系统实践》将该领域知识系统整理一遍,与大家一起学习。

本系列对应的代码请查看https://github.com/wangyuyunmu/Recommended-system-practice

前面总结了:

1)基于用户行为数据的推荐方法——协同过滤、隐语义、图模型;

2)冷启动——基于物品内容、用户注册信息等;

3)基于标签的推荐方法;

4)利用上下文信息推荐方法;

5)利用社交网络数据进行推荐。

本文总结一下推荐系统的架构,如何利用这么多种类的数据进行推荐。

目录

  • 1,外围架构
  • 2,推荐系统的架构
    • 2.1 推荐系统的特征和任务
    • 2.2 推荐引擎
  • 3,推荐引擎的架构
    • 3.1 生成用户特征向量
    • 3.2 特征物品相关推荐
      • 3.2.1 候选物品集合
    • 3.3 过滤模块
    • 3.4 排名模块

前面介绍了各种各样的数据和基于这些数据的推荐算法。在实际系统中,前面几篇总结提到的数据(用户行为数据、内容数据、用户注册信息、标签、上下文信息、社交网络数据等)大都存在,因此如何设计一个真实的推荐系统处理不同的数据,根据不同的数据设计算法,并将这些算法融合到一个系统当中是本章讨论的主要问题。

1,外围架构

一般来说,每个网站都会有一个UI系统,UI系统负责给用户展示网页并和用户交互。网站会通过日志系统将用户在UI上的各种各样的行为记录到用户行为日志中。日志可能存储在内存缓存里,也可能存储在数据库中,也可能存储在文件系统中。而推荐系统通过分析用户的行为日志,给用户生成推荐列表,最终展示到网站的界面上。

推荐系统9——推荐系统实例架构1,外围架构2,推荐系统的架构3,推荐引擎的架构

从上面的结构可以看到,推荐系统要发挥强大的作用,除了推荐系统本身,主要还依赖于两个条件——界面展示和用户行为数据。

2,推荐系统的架构

推荐系统是联系用户和物品的媒介,而推荐系统联系用户和物品的方式主要有3种:

推荐系统9——推荐系统实例架构1,外围架构2,推荐系统的架构3,推荐引擎的架构

如果将用户喜欢的物品,用户兴趣相似的用户也认为是一种特征,那么用户与物品之间就通过特征相联系。

根据上面的抽象,可以设计一种基于特征的推荐系统架构。 当用户到来之后,推荐系统需要为用户生成特征,然后对每个特征找到和特征相关的物品,从而最终生成用户的推荐列表。因而,推荐系统的核心任务就被拆解成两部分,一个是如何为给定用户生成特征,另一个是如何根据特征找到物品。

推荐系统9——推荐系统实例架构1,外围架构2,推荐系统的架构3,推荐引擎的架构

2.1 推荐系统的特征和任务

用户的特征种类很多

1)人口统计学特征。

年龄、性别、国籍、民族等

2)用户的行为特征:

浏览物品、收藏物品、物品打分等

3)用户话题特征

通过topic model提取不同的话题。

推荐系统的任务有很多

1)将最新物品推荐给用户

2)将商业上需要宣传的物品推荐给用户

3)给用户推荐不同种类的物品

4)混合推荐

5)对于不同的产品推荐不同新颖度的物品。

6)考虑用户访问推荐系统的上下文。

如果要在一个系统中把上面提到的各种特征和任务都统筹考虑,那么系统将会非常复杂,而且很难通过配置文件方便地配置不同特征和任务的权重。因此,推荐系统需要由多个推荐引擎组成,每个推荐引擎负责一类特征和一种任务,而推荐系统的任务只是将推荐引擎的结果按照一定权重或者优先级合并、排序然后返回。

2.2 推荐引擎

推荐系统9——推荐系统实例架构1,外围架构2,推荐系统的架构3,推荐引擎的架构

优势:

1)可以方便地增加/删除引擎,控制不同引擎对推荐结果的影响。

2)可以实现推荐引擎级别的用户反馈。

每一个推荐引擎其实代表了一种推荐策略,而不同的用户可能喜欢不同的推荐策略。有些用户可能喜欢利用他的年龄性别作出的推荐,有的喜欢新颖性的,有的喜欢多样性的,有的喜欢专注于一个领域。

将推荐系统拆分成不同推荐引擎后,如何设计一个推荐引擎变成了推荐系统设计的核心部分。

3,推荐引擎的架构

推荐引擎使用一种或几种用户特征,按照一种推荐策略生成一种类型物品的推荐列表。

推荐系统9——推荐系统实例架构1,外围架构2,推荐系统的架构3,推荐引擎的架构

A:该部分负责从数据库或者缓存中拿到用户行为数据,通过分析用户不同的行为,生成当前用户的特征向量。如果是非行特征,就不需要进行提取。

B:该部分负责将用户的特征向量通过“特征—物品”相关矩阵转化为初始推荐物品列表。

C:该部分负责对初始推荐物品列表进行过滤、排名等处理,生成最终的推荐结果。

3.1 生成用户特征向量

一般来说,用户的特征包括两种,一种是用户的注册信息中可以提取出来的,主要包括用户的人口统计学特征。另一种特征主要是从用户的行为中计算出来的。

一个特征向量由特征、特征权重组成。 权重受很多因素的影响。

1)不同用户行为种类的权重不一样。

一般,用户付出的代价越大的行为权重越高。比如购物比收藏高。

2)用户行为产生的时间。

时间越近,权重越大。

3)用户行为次数

4)物品热门程度

如果用户对一个很热门的物品产生了行为,往往不能代表用户的个性,因为用户可能是在跟风,因此,推荐引擎在生成用户特征时会加重不热门物品对应的特征的权重。

3.2 特征物品相关推荐

特征向量得到以后,可以根据离线根据离线相关表得到初始的物品推荐列表,离线相关表可以存储在MySQL中,如下所示:

推荐系统9——推荐系统实例架构1,外围架构2,推荐系统的架构3,推荐引擎的架构

理解:这里的特征是抽象来的,可以把它认为是用户、物品、特征等。比如userCF,这里的特征就是userID,权重就是user与item之间的权值,当然根据评价指标不同,权重也不同,比如受点击数量、购买时间等影响。

在线使用的特征—物品相关表一般都不止一张,因为一般有多种推荐方法。比如论文之间的相关性,可以用协同过滤,也可以用基于内容的推荐方法(关键词、topic等),协同过滤也可以根据不同的用户行为细分,比如用户打分、浏览记录等。

总之,对于一个推荐引擎可以在配置文件中配置很多相关表以及它们的权重,而在线服务在启动时会将这些相关表按照配置的权重相加,然后将最终的相关表保存在内存中,而在给用户进行推荐时,用的已经是加权后的相关表了。

3.2.1 候选物品集合

候选物品集合的目的是保证推荐结果只包含候选物品集合中的物品。

为什么不在过滤模块中将候选集合外的电视剧过滤掉,而要在相关推荐模块中处理候选物品列表?如果有个物品B与物品A的相似度不高,则会排在topN的后面,不容易被推荐。

一般来说,如果需要在一个小的候选物品集合中给用户推荐物品,那么可以考虑上述方法。但如果是要在一个很大的候选物品集合中给用户推荐物品,那么可以考虑直接在初始推荐列表中过滤掉不在候选物品集合中物品的方法。

3.3 过滤模块

在得到初步的推荐列表后,还不能把这个列表展现给用户,首先需要按照产品需求对结果进行过滤,过滤掉那些不符合要求的物品。一般来说,过滤模块会过滤掉以下物品。

1)用户已经产生行为的物品

2)候选物品之外的物品。

比如,用户选择了价格区间。

3)某些质量很差的物品

3.4 排名模块

要更好的提升用户的满意度,需要进行不同的排名:

1)新颖性排名

比如对物品的流行度进行降权

p u i = p u i l o g ( 1 + α ∗ p o p u l a r i t y ( i ) ) p_{ui}=\frac{p_{ui}}{log(1+\alpha *popularity(i))} pui​=log(1+α∗popularity(i))pui​​实际上推荐引擎的各个部分都要考虑新颖性问题。

比如userCF算法:

p u i = ∑ j ∈ N ( u ) ∩ S ( i , K ) w j i r u j p_{ui}=\sum_{j\in N(u)\cap S(i,K)}w_{ji}r_{uj} pui​=j∈N(u)∩S(i,K)∑​wji​ruj​其中,r 在通过用户行为生成用户特征向量时计算,而w 是离线计算的物品相似度。如果要提高推荐结果的新颖性,在计算这两个数时都要考虑新颖性。

比如:用户u与物品j的关系中对物品j发热热度降权。

r u j = r u j l o g ( 1 + α ∗ p o p u l a r i t y ( j ) ) r_{uj}=\frac{r_{uj}}{log(1+\alpha * popularity(j))} ruj​=log(1+α∗popularity(j))ruj​​

比如:物品j与i的相似度,如果用户知道了j,i比j的流行度高,则大概率知道,所以对其降权。

w i j = w i j l o g ( 1 + α ∗ p o p u l a r i t y ( i ) ) ( p o p u l a r i t y ( i ) > p o p u l a r i t y ( j ) ) w_{ij}=\frac{w_{ij}}{log(1+\alpha *popularity(i))}(popularity(i)>popularity(j)) wij​=log(1+α∗popularity(i))wij​​(popularity(i)>popularity(j))

2)多样性

多样性并不一定是要提高的,比如有些用户听音乐喜欢听同类的。

如果要提高多样性:

第一种提高多样性的方法是将推荐结果按照某种物品的内容属性分成几类,然后在每个类中都选择该类中排名最高的物品组合成最终的推荐列表。但这种方法也有严重的缺点,内容的属性选择影响很大。

第二种提高推荐结果多样性的方法是控制不同推荐结果的推荐理由出现的次数。那么,要提高推荐结果的多样性,就需要让推荐结果尽量来自不同的特征,具有不同的推荐理由,而不是所有的推荐结果都对应一个理由。

3)时间多样性

提高推荐系统的时间多样性要从两个地方着手。首先要保证推荐系统的实时性,在用户有新行为时实时调整推荐结果以满足用户最近的需求。提高推荐结果多样性的第二个方面是要在用户没有新的行为时,也要保证推荐结果每天都有变化。

4)用户反馈

如果推荐系统的目标是提高用户对推荐结果的点击率,那么可以利用点击模型(click model)预测用户是否会点击推荐结果。

继续阅读