在当今 DT 时代,每天都在产生着海量的数据,移动互联网的兴起更是让我们体验到获取信息是如此的简单和方便。
同时,更多的选择也带来更多的困扰,面对层出不穷的信息和服务带来的困扰,使得个性推荐迅速崛起,并且大放异彩,在金融、电商、视频、资讯、直播、招聘、旅游等各个领域都能看到推荐系统的存在。
达观数据凭借多年在推荐系统方面的技术积累和优质的大数据服务,已经有数百家公司接入达观推荐系统,覆盖多个行业,实现企业经营业绩的大幅提升。本次分享结合达观数据个性化推荐引擎在各个行业的从业经验,围绕以下内容展开:
- 个性化推荐应用场景和价值
- 用户画像和个性化推荐算法
- 推荐系统优化方法
1.个性化推荐应用场景和价值
首先,我们先来说说个性化推荐应用场景和价值。
个性化推荐产生的初衷是为了解决信息过载和物品长尾的问题。信息过载是在信息时代信息过于丰富的一种现象,也就是人所接受的信息超过了个人所能接受、处理或有效利用的范围,导致的一种无所适从的问题。
同时,如此多样丰富的信息中,大部分是属于冷门而没有曝光的机会。对于处于移动互联网的今天,这些问题尤其突出。
对用户而言,每天面对海量的资讯、商品、视频、音乐等各种服务时,如何快速找到自己感兴趣的内容确实是件耗费时间和精力的事情,尤其是在没有明确意图的情况下。
而对于企业而言,手握海量资源,而只有一小部分曝光在用户面前,大部分都石沉大海,资源浪费的同时,还留不住用户。在当前各种产品同质化的今天,如何讨好并留住用户,挖掘数据中存在的价值,对企业也是一种极大的挑战。
越来越多的事实证明,个性化推荐系统是解决上述问题的有效工具。
美国最大的视频网站 YouTube 曾做过实验比较个性化推荐和热门视频的点击率,结果显示个性化推荐的点击率是后者的两倍。
美国著名视频网站 Netflix 曾举办过全球的推荐系统比赛,悬赏 100 万美元,希望参赛选手能将其推荐算法的预测准确度提升至少 10%。
号称“推荐系统之王”的电子商务网站亚马逊曾宣称,亚马逊有 35% 的销售来自于推荐系统。其最大优势就在于个性化推荐系统,该系统让每个用户都能有一个属于自己的在线商店,并且在商店中能招到自己最感兴趣的商品。
日常生活当中,当我们打开各种各样的 app 和网页,首先进入视野的很多都是个性化推荐。对于企业而言,推荐系统可以帮助让更多的资源得到曝光,也改善了用户体验、增加了用户的停留市场和粘性,最终也会提高转化。
最后总结下,推荐系统的核心价值主要包括:
- 描述物品的特点,并与用户的个性化偏好进行匹配,帮用户便捷的筛选出感兴趣的内容
- 进行有效的信息过滤以解决用户的过载问题,面对陌生领域时提供参考意见
- 根据用户反馈迅速捕捉用户的兴趣,以及兴趣的变化,需求不明确时,作用户的“贴心助手”
- 选择合适的场景、时机、表现方式进行推荐,满足用户的好奇心
2.用户画像和个性化推荐算法
个性化推荐的两个关键点:用户画像和个性化推荐算法。
目前普遍存在的两种个性化推荐结果生成方法。一是依靠人工编辑进行推荐,这种方式不仅需要大量的人力成本,费时费力,最终推荐出来的结果是千篇一律,并没有考虑到用户个性化的差异,也没有考虑用户反馈。
二是通过一定逻辑生成的热门榜单。这种方式极易导致马太效应,一些热门物品会会一直霸占榜单,也容易造成刷单,毕竟占据着更好的流量入口,需要引入反作弊机制才能保证推荐结果的公平公正。
高质量的个性化推荐系统其实包括三大部分:
- 基于海量用户行为数据,挖掘多种多样的高质量推荐候选集
- 对用户实时兴趣进行精准定位,秒级更新结果满足个性化需求
- 基于高性能分布式计算框架,快速迭代算法生成多维度用户画像进行千人千面的推荐
个性化推荐精准性的非常至关重要的影响因素是用户画像的生成。
用户画像通过对海量的用户行为数据进行深入的分析和挖掘,从多个维度来描述用户的基础属性、标签及兴趣点等,清晰并且准确地勾勒出用户的轮廓概貌。这些数据帮助应用方更好了解用户行为路径,明确用户流失情况和原因,为应用方的产品功能优化决策提供可靠参考依据。
下图是一个小说类客户的用户画像生成流程。
通过多种方式收集到用户数据,包括用户各种行为数据,结合书籍、用户、作者等基础数据,首先进行数据预处理和用户归一化处理,然后进行数据统计与特征抽取,最后基于机器学习中的分类、聚类等方法进行智能挖掘分析,形成了用户各个维度的属性信息。
有了用户画像之后,接下来就交给个性化推荐算法了,这里主要聊下基于内容的推荐和协同过滤。
这个算法适合于待推荐物品带有丰富语义信息的场景,如标题、标签、类别、作者等信息。但是想直播这个行业,直播内容是和主播当前的播放状态紧密相关的,而且内容变化也较频繁,就不适宜使用此算法。在资讯媒体、视频等行业效果还是客观的。
基于内容的推荐主要过程是将推荐物品的信息特征和待推荐对象的特征相匹配的过程,从而得到待推荐的物品集合。匹配算法很多是借鉴了信息检索领域中的技术,如 K 最近邻 KNN 和 Rocchio 的相关性反馈方法。主要是以含有相同标签的其它物品、同类别的其它物品等形式出现。
这种方法能保证推荐内容的相关性,并且根据内容特征可以解释推荐结果。缺点是由于内容高度匹配,导致推荐结果的惊喜度较差,另外用户的反馈数据也没有使用。
主要思想是基于群体智慧,利用已有大量用户群过去行为数据来预测当前用户最可能感兴趣的东西。这种方法克服了基于内容方法的一些弊端,最重要的是可以挖掘物品之间隐含的相关性,推荐一些内容上差异较大但又是用户感兴趣的物品。
对于基于用户的协同过滤,首先计算用户之间的距离,得到与当前用户距离最近的 N 个用户,将这些用户喜欢的 item 进行合并和评分预测,得到推荐结果。基于物品的协同过滤则是计算物品间的距离进行评分预测得到推荐结果
基于领域的方法重点关注物品之间的关系或者用户之间的关系,基于物品的方法是根据用户对和他感兴趣的物品相似的物品评分,来对该用户的偏好物品建立模型。
隐语义模型采用的是另外一种方法,把物品和用户映射到相同的隐语义空间。这个空间试图通过描述物品和用户两种实体在潜在因子上的特征来解释评分,而这些因子是根据用户的反馈自动判断出来的。
用隐语义模型来进行协同过滤的目标是揭示隐藏的特征,这些特征能解释观测到的评分。该模型包括 pLSA(Probability Latent Semantic Analysis)模型、神经网络模型、LDA(Latent Dirichlet Allocation)模型,以及由用户 – 物品评分矩阵的因子分解推导出的模型(也叫基于 SVD 的模型,Singular Value Decomposition)。
计算用户 – 用户距离和物品 – 物品距离有很多方法,在实际业务中会有很多的变形,比如对热门物品的降权,不然会引入一些噪声数据,因为相对一些不那么热门的物品更能表征用户的偏好信息
由于矩阵因子分解技术在线上业务的准确性和稳定性的突出表现,已经成为协同过滤算法的首选。
首先,对于 user-item 关系矩阵,也叫评分矩阵,表示用户对每个 item 的评分,比如 1 表示 1 分,5 表示 5 分,分数越高就表示越喜欢。
通过用户的操作行为数据我们就得了这样一个矩阵,通过矩阵分解的方式就得到了两个矩阵,分别是物品 – 潜在因子矩阵和潜在因子 – 用户矩阵,我们的目标是预测用户对未打分的物品的喜好程度,也就是图中除了黄色格子之外的数据。
对于未知的评分,可以使用分解后两个矩阵相乘,就得到图中空白处的评分数据,进行排序和过滤,最终就可以得到用户对物品的喜好程度,也就得到最终的推荐结果。
原始的 SVD 并没有考虑到用户和物品自身的差异(bias),进行升级,我们来看看 SVD++ 是怎么的形式。
相对于之前的方式这里引入了 b ui,也就是用户本身的 bias 和物品本身的 bias。对于用户的 bias,有的用户倾向于打高分,有的倾向于打低分。物品的 bias,比如有的电影出自于大导演、大公司等倾向于得到高分,有的比较小众容易得低分。在计算中,这些 bias 信息都需要包含进来
通过对算法的升级,就可以使用各种各样的用户、物品的 bias 信息,包括用户和物品的 profile,同时各种属性也可以进行组合,如用户性别、年龄信息。
最终的模型求解问题就转化为求解最优化问题,这个最小二乘法问题可以通过随机梯度下降算法有效地解决。
这里是达观数据推荐系统的架构图,从基础层的数据传输、存储和运算,到模型层的用户画像、物品画像等的挖掘生成,然后到多种推荐算法的计算得到部分初选的推荐候选集,最后交由融合层的机器学习模型进行重排序,生成最终的推荐结果返回给用户。整个流程在数十家客户上都取得了卓越的推荐效果,覆盖资讯、视频、直播、电商等多个行业。
接下来,聊聊个性化推荐的优化,当然推荐系统的优化方法有很多种,今天挑选了三个,都和当前火热的深度学习有
3.推荐系统优化方法
达观数据接入了数百家客户,数据量的规模之大是可想而知,对于性能的要求非常高,尤其在高并发的推荐场景中。基于硬件成本和性能的综合考虑,达观个性化推荐引擎除了使用内存和 redis 作为缓存之外,也引入了 LevelDB。
LevelDB 是 Google 的两位大神 Jeff Dean 和 Sanjay Ghemawat 发起的开源项目,简而言之,LevelDb 是能够处理十亿级别规模 Key-Value 型数据持久性存储的 C++ 程序库。LevelDb 是一个持久化存储的 KV 系统,和 Redis 这种内存型的 KV 系统不同,LevelDb 不会像 Redis 一样狂吃内存,而是将大部分数据存储到磁盘上。
LevelDB 在随机写,顺序读 / 写方面具有很高的性能,但是随机读的性能很一般。换句话说,LevelDB 很适合应用在查询较少,而写很多的场景。
个性化推荐引擎需要尽可能快的响应用户的每一次操作,以适应用户短期兴趣的变化,进而提高推荐效果的精准性。各种推荐算法生成候选集、多算法融合、返回结果的时候,牵涉到频繁的读取操作。
在高并发量的场景下,当内存或者 redis 不足以完全支撑线上业务时,使用 LevelDB 将会对性能有不错的提升。毕竟 LevelDb 在写的时候对内存要求不高,读的时候则根据性能要求的不同需要对应的内存。
谈到效果优化,业界都达成了一个共识:case-by-case 查看推荐结果,也就是说需要具体问题具体分析。只有通过这种方式发现问题,才能更好地优化推荐效果。
下面分析几个常见的优化方法:
在实际的推荐场景中,抓住了用户的喜好,但推荐出来满屏的“相似”结果会带来极差的用户体验。如何在保证用户兴趣的前提下又能让推荐结果的多样性更好呢?
物品信息中很重要的一个特征是标签。好的推荐系统不仅体现在精准性,还有多样性和惊喜度方面的要求。对物品信息进行深层度的挖掘分析,进而对标签进行拓展,也是一种实现上述要求行之有效的方法。
其实使用 word2vec 就可以解决这类问题。
Google 于 2013 年开源推出了一个用于获取 word vector 的工具包 word2vec,它包含了对两种模型的训练,如下图。在训练每种模型的时候又分 HS 和 NEG 两种方法。(具体的数学原理可以参考相关论文)
在 Word2Vec 的训练过程中,每个 word vectors 都被要求为相邻上下文中的 word 的出现作预测,所以即使随机初始化 Word vectors,但是这些 vectors 最终仍然能通过预测行为捕获到 word 之间的语义关系,从而训练到较好的 word vectors。
这是仅有一个词的 CBOW 模型。Word2Vec 尽量让具有相同上下文的 word 的向量相似,从而获得较好的 vector representation 的相似性。这种相似性有时候是线性的,临近的结果会与相似,即 Word2vec 可以学习到词与词之间语义上的联系。
另外,由于 Word2Vec 采用了非常多的方法简化网络结构,简化训练流程,导致 Word2Vec 可以很轻易的训练超大的训练集。一个优化后的单机实现版的 Word2Vec 算法可以在一天时间内训练 100 bililion words。
word2vec 可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。基于得到的向量,也就得到了可以扩展的词。
从图中可以看出,基于 word2vec 训练好的模型,输入“美食”,返回了相似程度最高的十个词及相似权重,从结果上看都是和美食相关的。基于这些相似词召回相关推荐结果,不仅可以保证语义上的相关性,也可以大大改善推荐结果的多样性。
20 16 年 Oren Barkan 以及 Noam Koenigstein 借鉴 word2vec 的思想,提出 item2vec,通过浅层的神经网络结合 SGNS(skip-gram with negative sampling) 训练之后,将 item 映射到固定维度的向量空间中,通过向量的运算来衡量 item 之间的相似性。
词的上下文即为邻近词的序列,很容易想到,词的序列其实等价于一系列连续操作的 item 序列,因此,训练语料只需将句子改为连续操作的 item 序列即可,item 间的共现为正样本,并按照 item 的频率分布进行负样本采样。
Oren Barkan and Noam Koenigstein 以 SVD 作为 baseline,SVD 的隐类以及 item2vec 的维度都取 40,用 Microsoft Xbox Music service 收集的 user-artists 数据集,对结果进行聚类,同一个颜色的节点表示相同类型的音乐人。
图 a 是 item2vec 的聚合效果,图 b 是 SVD 分解的聚合效果,很显然 item2vec 的聚合效果更胜一筹。