写在前面
【推荐系统】专栏历史文章:
鱼遇雨欲语与余:深入理解YouTube推荐系统算法zhuanlan.zhihu.com
作为【推荐系统】系列文章的第二篇,将以“召回”作为今天的主角,会从四个方面来介绍召回的不同算法方式,即基于内容的召回、协同过滤、基于FM模型召回和基于深度学习的方法。
一、背景介绍
召回是推荐系统的第一阶段,主要根据用户和商品部分特征,从海量的物品库里,快速找回一小部分用户潜在感兴趣的物品,然后交给排序环节。这部分需要处理的数据量非常大,速度要求快,所有使用的策略、模型和特征都不能太复杂。下面主要介绍四种常见的召回方法:
- 基于内容的召回:使用item之间的相似性来推荐与用户喜欢的item相似的item。
例如:如果用户A看了《绣春刀2》这部杨幂主演的电影后,则会为他推荐杨幂主演的其他电影或电视剧
- 协同过滤:同时使用query和item之间的相似性来进行推荐。
例如:如果用户A与用户B类似,并且用户B喜欢视频1,则系统可以向用户A推荐视频1(即使用户A尚未看过任何与视频1类似的视频)。
- 基于FM模型召回:FM是基于矩阵分解的推荐算法,其核心是二阶特征组合。
- 基于深度神经网络的方法:利用深度神经网络生成相应的候选集。
二、基于内容的召回
在实际的应用中,如电影推荐,首先我们根据用户之前的历史行为信息(如点击,评论,观看等),CB会使用item相关特征来推荐给用户与之前喜欢的item类似的item。为了更形象的表示CB,假设一个应用商店要推荐给用户相应的APP。下图是相应的特征矩阵,其中每一行代表一个应用程序,每一列代表一个特征。包括不同的类别特征,应用程序的发布者信息等。为简化起见,假定此特征矩阵是布尔类型的的:非零值表示应用程序具有该特征。
模型应推荐与此用户有关的item。为此,必须首先选择一个相似性指标(如,点积)。然后,推荐系统会根据此相似性度量标准为每个候选item打分。请注意,建议是针对该用户的,因为该模型未使用其他用户的任何信息。
2.1 基于内容召回的优点
- 该模型不需要其他用户的任何数据,因为推荐是针对该用户的。 这使得更容易扩展到大量用户。
- 该模型可以捕获用户的特定兴趣。
2.2 基于内容召回的缺点
- 由于item的特征表示在某种程度上是手工设计的,因此该技术需要大量领域知识。因此,模型很依赖手工设计特征的好坏。
- 该模型只能根据用户的现有兴趣提出建议。换句话说,该模型扩展用户现有兴趣的能力有限。
基于内容的召回看似比较容易,如果当我们的item属性越来越多的时候,比如⼀个视频可能有多个平行的tag以及其它属性,那么,为了把这些信息综合利用起来,我们还会利用多term检索的方式,去提升CB的效果。下面,我们针对这些内容详细的来聊⼀聊CB的常见优化点。
2.3 倒排优化
优化倒排的主要目的是提升cb召回的推荐效果,常见的倒排基本是和线上排序指标⼀致的,比如,如果排序的指标是点击率,倒排理所应当,也是点击率。但这样的排序方式有个小问题,因为倒排排序使用的是后验的值,而排序通常也是单指标排序,这样,就很容易出现我们之前提到的,单指标被hack的问题,比如,用点击率倒排,头部都是标题党等。所以,这个问题是需要额外注意的。另外,也要考虑指标的bias的问题,例如,用完成率倒排导致短的视频都排到了头部。这种问题可以通过归一化的方式缓解。但有⼀个潜在风险,资源的后验表现的分布往往会跟资源本身的类型有关。
2.4 触发key的优化
key的优化要求只有⼀点,保证每次选择的key,是用户点击概率最⼤的key即可,所以通用的方式是把用户的点击历史按照属性加和取top,比如,在某个类别上点击的次数排序,把点击次数最多的那几个类别留作触发的key,这个过程很简单,没太多优化点,我们就不继续讨论了。这⾥想聊的是关于用户不⼀样的行为差异化权重的问题,我们选取key的过程实际是判断用户对某⼀类内容感兴趣的过程,也就是通过行为,来判断用户的感兴趣程度,在只有浏览功能的产品⾥,点击就是表达用户兴趣的唯一行为,但产品通常会设计很多交互功能,来帮助用户进行有效的兴趣表达,所以,在触发key的选取的时候需要考虑到这⼀点,至于怎么做是和业务形态相关的事,这⾥就不展开了。
2.5 多维度内容属性
最后,我们来讲⼀下cb⾥⾯比较高阶的问题,多term的问题。我们先考虑这样⼀种情况,一个视频有很多个tag,tag的特性是平行不唯⼀。我们在线通过点击量汇聚得到了用户的高频点击tag,通常的方式是,每⼀个tag都会有⼀个倒排,然后各自召回。但很容易想到的,当用户同时有“帅哥”,“萌宠”这两个tag的时候,通过萌宠给用户召回⼀个美女 萌宠的视频显然没有召回⼀个帅哥 萌宠的视频更有吸引力,也就是说,我们在召回的时候,如果能同时考虑多个term之间的关系,会更有效⼀些。传统搜索⾥对于多term召回是有⼀套实现方式的,通过设置每个term的权重,可以在返回结果⾥去得到包含多term的结果,这部分属于搜索架构的内容范畴,我在此不展开了,有兴趣的同学可以找身边做搜索的同学了解⼀下。我们讲⼀个更和推荐match的方式,用户身上有多个标签,内容上面也有多个标签,我们在做多term匹配的时候,就是标签的list到标签的list,使得他们点击的概率最大即可。是不是觉得豁然开朗了?是不是转化成点击率建模问题了?更简单地,直接使用word2vec,把用户标签和内容标签作为⼀个sentence训练,再离线把内容的标签加和表征为内容的属性向量,在线做召回即可。当然,也可以⽤更复杂的⽅式来做,提升精度,大同小异,就不展开说了。那作者,内容的其他纬度等信息也是可以⼀样的方式加进去的,这就留给大家来讨论了。
三、协同过滤
为了解决基于内容的召回所存在的弊端,人们提出了协同过滤召回方式(Collaborative filtering,CF),CF同时使用user和item之间的相似性来进行推荐。 这样可以提高模型的推荐拓展性。也就是说,协同过滤模型可以根据相似用户B的兴趣向用户A推荐商品。此外,可以自动学习Embedding,而无需依赖手工设计的特征。
一般来说,协同过滤推荐分为三种类型。第一种是基于用户(user-based)的协同过滤,第二种是基于项目(item-based)的协同过滤,第三种是基于模型(model based)的协同过滤。
- 基于用户(user-based)的协同过滤:主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。
- 基于项目(item-based)的协同过滤:和基于用户的协同过滤类似,只不过这时我们转向找到物品和物品之间的相似度,只有找到了目标用户对某些物品的评分,那么我们就可以对相似度高的类似物品进行预测,将评分最高的若干个相似物品推荐给用户。比如你在网上买了一本机器学习相关的书,网站马上会推荐一堆机器学习,大数据相关的书给你,这里就明显用到了基于项目的协同过滤思想。
- 基于模型(model based)的协同过滤:是目前最主流的协同过滤类型了,所含算法是非常之多的,如矩阵分解、关联算法、聚类算法、深度学习、图模型等等。
这里我们带来一个有关电影推荐系统的简单例子帮助更好的理解协同过滤。首先,考虑一个电影推荐系统,其中训练数据由一个反馈矩阵组成,其中每行代表一个user,每一列代表一个item。
关于电影的反馈分为以下两类:
- 显示反馈:用户通过提供评分来指定他们对特定电影的喜欢程度。
- 隐式反馈:如果用户观看电影,则系统会推断用户感兴趣。
假设反馈矩阵是布尔类型的,即值为1和0分别表示对电影是否感兴趣,当用户访问首页时,系统会根据以下两种情况推荐电影:
- 与用户过去喜欢的电影相似(Item-Based CF)
- 类似用户喜欢的电影(User-Based CF)
为便于举例阐述,让我们手工设计用以描述电影的一些特征:
3.1 一维Embedding
假设我们为每部电影分配一个标量,用于描述该电影是适合儿童(负值)还是适合成人(正值)观看。 假设我们还为每个用户分配了一个标量,用于描述用户对儿童电影(接近-1)或成人电影(接近 1)的兴趣。 对于我们希望用户喜欢的电影,电影Embedding和用户Embedding的乘积应更高(接近1)。
一个特征不足以解释所有用户的偏好。 为了克服这个问题,让我们添加第二个特征:每部电影是商业流行片或是小众文艺片上的表现程度。 通过这个特征,我们现在可以使用以下二维Embedding来表示每部电影:
当模型自动学习Embedding时,这种方法的协同性质就显而易见了。假设电影的Embedding向量是固定的。然后,模型可以为用户学习Embedding向量,以最好地解释他们的偏好。 因此,具有相似偏好的用户的Embedding将紧密在一起。同样,如果用户的Embedding是固定的,则我们可以学习电影Embedding以最好地解释反馈矩阵。结果,类似用户喜欢的电影的Embedding将在Embedding空间中紧密在一起。
3.3 基于模型(model based)的协同过滤
3.6 SGD和WALS
下面对SGD和WALS优缺点进行比较:
SGD优点:非常灵活:适用于其他损失函数;可以并行化。
SGD缺点:较慢,收敛速度不那么快;难以处理未观察到的项(entries),需要使用负采样或gravity。
WALS优点:可以并行化;收敛速度比SGD更快;更容易处理未观察到的项(entries)。
WALS缺点:仅适用于平方损失;
3.7 协同过滤的优缺点
优点
- 无需领域知识:不需要相关领域知识,因为Embedding是自动学习的。
- 发掘用户兴趣:该模型可以帮助用户发现新的兴趣点。 系统可能并不知道用户对给定的item的兴趣度,但是模型仍会推荐给他,因为相似的用户有着相同的兴趣点。
- 很好的初始模型:在某种程度上,该方法仅需要反馈矩阵即可训练矩阵分解模型。 而且该方法不需要上下文特征。 实际上,该方法可以用作多个召回队列中的一个。
缺点
- 冷启动问题
模型预测结果是给定的(用户,商品)相应Embedding的点积。因此,如果在训练数据中item从未出现过,则系统也无法计算其Embedding,也无法得到相应的预测结果。此问题通常称为冷启动问题。但是,以下技术可以在某种程度上解决冷启动问题:
(1)利用WALS进行预测。给定一个在训练集中未出现的item,如果系统与用户有一些交互,则系统可以很容易计算出该item的Embedding,而无需重新训练整个模型。只需求解以下方程式或其加权形式:
(2)启发式生成新item的Embedding。如果系统没有相应的交互信息,则系统可以通过对来自同一类别,来自同一上传者(在视频推荐中)的item的Embedding进行平均来近似其Embedding。
- 难以融入query/item的附加特征
附加特征是query或itemID以外的其他特征。 对于电影推荐,附加特征可能包括国家或年龄。 融入可用的附加特征可以提高模型的效果。 尽管在WALS中融入付诸特征可能并不容易,但是WALS的泛化模型使这成为可能。
四、基于FM模型召回
FM是Steffen Rendle在2010年提出的,FM算法的核心在于特征组合,以此来减少人工参与特征组合工作。对于FM,其优势可分以下三点:
- FM能处理数据高度稀疏场景,SVM则不能;
- FM具有线性的计算复杂度,而SVM依赖于support vector。
- FM能够在任意的实数特征向量中生效。
- 特征之间两两组合容易导致维度灾难;
- 组合后的特征未必有效,可能存在特征冗余现象;
- 组合后特征样本非常稀疏,如果原始样本中不存在对应的组合,则无法学习参数,那么该组合就显得无效。
虽然有这些缺点,但是也并不影响FM在广告推荐领域的地位,每个算法都有风靡一时的过去,抱着敬畏之心的态度去学习是没问题的。下面,来看看如何基于FM来做召回的。
4.1 具体召回过程
特征组内部的二阶交互,即没有了age、gender、item_id、cate_id这样的交互,仅是进行到求解隐向量阶段。
这里是“推荐系统召回四模型之:全能的FM模型”一文中给出的极简的FM召回模型,即不考虑上下文特征。
第二步,对于每个用户以及每个物品,我们可以利用步骤一中的方法,将每个用户的兴趣向量离线算好,存入在线数据库中比如Redis(用户ID及其对应的embedding),把物品的向量逐一离线算好,存入Faiss(Facebook开源的embedding高效匹配库)数据库中,进行knn索引,然后高效检索。
第三步,当用户登陆或者刷新页面时,可以根据用户ID取出其对应的兴趣向量embedding,然后和Faiss中存储的物料embedding做内积计算,按照得分由高到低返回得分Top K的物料作为召回结果。
有关FM召回更加详细的内容:https://zhuanlan.zhihu.com/p/58160982
4.2 矩阵分解和FM
五、基于深度神经网络模型
前文讲述了如何使用矩阵分解来学习Embedding。 矩阵分解的一些限制包括:
- 使用附加特征(即queryID /itemID以外的其他特征)困难。 因此只能对训练集中存在的用户或item进行推荐。
- 推荐的相关性。 正如前文所描述的那样,倾向于向所有人推荐热门item,尤其是在使用点积作为相似性度量时。 难以刻画特定的用户兴趣。
深度神经网络(DNN)模型可以解决矩阵分解的这些限制。 DNN可以轻松地融入query特征和item特征(由于网络输入层的灵活性),这可以帮助捕获用户的特定兴趣并提高推荐的相关性。
5.1 Softmax DNN 模型
一般而言,DNN模型是利用softmax作为最后一层的输出,它会将问题视为多分类问题,其中:
- 输入是用户query。
- 输出是一个概率向量,其大小等于语料库中item的数量,代表与每个item进行交互的概率; 例如,点击或观看视频的可能性。
输入层
DNN的输入可以包括:
- 稠密(dense)特征(如,点击频率、观看时长等)
- 稀疏(sparse)特征(如,观看视频类型、地区等)
与矩阵分解方法不同,可以添加年龄或地区等附加特征。 我们用x表示输入向量。
模型结构决定了模型的复杂性和表达性。 通过添加隐藏层和非线性激活函数(例如ReLU),模型可以捕获数据中更复杂的关系。 但是,增加参数的数量通常也会使模型更难训练且服务成本更高。 我们将用
表示最后一个隐藏层的输出。
item特征使用
可以将相同的想法应用于item侧吗? 也就是说,除了对每个item学习一个对应的Embedding之外,模型可以学习将item特征映射到Embedding的非线性函数吗? 当然可以。可以使用由两个神经网络组成的双塔模型:
5.3 softmax训练
前文解释了如何将softmax层合并到推荐系统的深度神经网络中。 下面介绍如何利用训练数据对模型参数进行求解。
Youtube DNN召回:YouTube在2016年发表的论文《Deep Neural Networks for YouTube Recommendations》为背景进行YouTube的深度神经网络推荐模型的介绍。YouTube的dnn matching召回,将用户和context特征输入DNN,用隐含层最后一层作为向量表示,用Softmax每个item对应的参数作为item的向量表示,通过内积最大索引得到top k
论文地址:Deep Neural Networks for YouTube Recommendations
DSSM语义召回:DSSM模型是微软2013年发表的一个关于query/ doc的相似度计算模型,后来发展成为一种所谓”双塔“的框架广泛应用于广告、推荐等领域的召回和排序问题中。
论文地址:Learning Deep Structured Semantic Models for Web Search using Clickthrough Data
RNN序列召回:基于用户session中的点击序列进行建模召回有很多种方式,其中使用RNN深度网络结构来刻画是其中比较有代表性的一种。相应的网络结构其实很简单,如下图所示。使用用户session中的点击序列作为模型输入,输出则为用户下次点击的item相应的得分。
论文地址:Session-based recommendations with recurrent neural networks
TDM深度树匹配召回:TDM模型是阿里巴巴于2018年提出的新一代深度召回模型,试图通过结合树结构搜索与深度学习模型来解决召回的高性能需求与使用复杂模型进行全局搜索与之间的平衡。它将召回问题转化为层级化分类问题,借助树的层级检索可以将时间复杂度降到对数级。即认为用户对某节点的兴趣是大于等于其叶子节点的,所以只需在每层选出topk,且在下一层仅计算上一层选出来的节点相应子节点的兴趣,对于规模为M的语料库,只需要遍历 2 * k * logM个分支就可以在完全二叉树中找到topk的推荐结果。
论文地址:Learning Tree-based Deep Model for Recommender Systems
参考文献
- https://zhuanlan.zhihu.com/p/34497989
- https://developers.google.cn/machine-learning/recommendation
- https://zhuanlan.zhihu.com/p/58160982
- https://zhuanlan.zhihu.com/p/87578318
内容抢先看
在第三讲的文章中,我将会对推荐系统中的排序进行介绍,主要内容分为建模目标、常见模型、粗排与精排、指标选取等部分。