召回
推荐算法架构 :召回(1) - 知乎 https://zhuanlan.zhihu.com/p/475120402
推荐算法架构 :召回(1)
作者:yangyixie
召回模块面对几百上千万的推荐池物料规模,候选集十分庞大。由于后续有排序模块作为保障,故不需要十分准确,但必须保证不要遗漏和低延迟。目前主要通过多路召回来实现,一方面各路可以并行计算,另一方面取长补短。召回通路主要有非个性化和个性化两大类。
1 推荐算法整体架构
1.1 推荐算法意义
随着互联网近十年来的大力发展,用户规模和内容规模均呈现迅猛发展。用户侧日活过亿早已不是什么新鲜事,内容侧由于 UGC 生产方式的普及,拥有几十亿内容库的平台也屡见不鲜。如何让海量用户在海量内容中找到自己喜欢的,以及如何让海量内容被海量用户精准消费,一直以来都是每个公司十分核心的问题。在这个背景下,搜索系统和推荐系统应运而生。搜索系统主要解决用户寻找感兴趣的内容,偏主动型消费。推荐系统则主要解决内容推送给合适用户,偏被动型消费。二者一边牵引用户,一边牵引内容,是实现用户与内容匹配的中间媒介。推荐系统在每个公司都是十分核心的地位,其意义主要有
- 用户侧,为用户及时精准的推送感兴趣的个性化内容,并不断发现和培养用户的潜在兴趣,满足用户消费需求,提升用户体验,从而提升用户活跃度和留存。
- 内容侧,作为流量分发平台,对生产者(如 UGC 作者、电商卖家等)有正向反馈刺激能力,通过扶持有潜力的中小生产者,可以促进整体内容生态的繁荣发展
- 平台侧,推荐系统对内容分发的流量和效率都至关重要。通过提升用户体验,可提升用户留存,从而提升日活。通过提升用户转化和流量效率,可提升电商平台订单量和内容平台用户人均时长等核心指标。通过提升用户消费深度,可提升平台整体流量,为商业化目标(如广告)打下基础,提升 ARPU(每用户平均收入)等核心指标。推荐系统与公司很多核心指标息息相关,有极大的牵引和推动作用,意义十分重要。
1.2 推荐算法基本模块
当前基于算力和存储的考虑,还没办法实现整体端到端的推荐。一般来说推荐系统分为以下几个主要模块:
- 推荐池:一般会基于一些规则,从整体物料库(可能会有几十亿甚至百亿规模)中选择一些 item 进入推荐池,再通过汰换规则定期进行更新。比如电商平台可以基于近 30 天成交量、商品在所属类目价格档位等构建推荐池,短视频平台可以基于发布时间、近 7 天播放量等构建推荐池。推荐池一般定期离线构建好就可以了。
- 召回:从推荐池中选取几千上万的 item,送给后续的排序模块。由于召回面对的候选集十分大,且一般需要在线输出,故召回模块必须轻量快速低延迟。由于后续还有排序模块作为保障,召回不需要十分准确,但不可遗漏(特别是搜索系统中的召回模块)。目前基本上采用多路召回解决范式,分为非个性化召回和个性化召回。个性化召回又有 content-based、behavior-based、feature-based 等多种方式。
- 粗排:获取召回模块结果,从中选择上千 item 送给精排模块。粗排可以理解为精排前的一轮过滤机制,减轻精排模块的压力。粗排介于召回和精排之间,要同时兼顾精准性和低延迟。一般模型也不能过于复杂
- 精排:获取粗排模块的结果,对候选集进行打分和排序。精排需要在最大时延允许的情况下,保证打分的精准性,是整个系统中至关重要的一个模块,也是最复杂,研究最多的一个模块。精排系统构建一般需要涉及样本、特征、模型三部分。
- 重排:获取精排的排序结果,基于运营策略、多样性、context 上下文等,重新进行一个微调。比如三八节对美妆类目商品提权,类目打散、同图打散、同卖家打散等保证用户体验措施。重排中规则比较多,但目前也有不少基于模型来提升重排效果的方案。
- 混排:多个业务线都想在 Feeds 流中获取曝光,则需要对它们的结果进行混排。比如推荐流中插入广告、视频流中插入图文和 banner 等。可以基于规则策略(如广告定坑)和强化学习来实现。
推荐系统包含模块很多,论文也是层出不穷,相对来说还是十分复杂的。我们掌握推荐系统算法最重要的还是要梳理清楚整个算法架构和大图,知道每个模块是怎么做的,有哪些局限性和待解决问题,可以通过什么手段优化等。并通过算法架构大图将各个模块联系起来,融会贯通。从而不至于深陷某个细节,不能自拔。看论文的时候也应该先了解它是为了解决什么问题,之前已经有哪些解决方案,再去了解它怎么解决的,以及相比其他方案有什么改进和优化点。本文主要讲解推荐算法架构大图,帮助读者掌握全局,起到提纲挈领作用。
2 召回
2.1 多路召回
召回模块面对几百上千万的推荐池物料规模,候选集十分庞大。由于后续有排序模块作为保障,故不需要十分准确,但必须保证不要遗漏和低延迟。目前主要通过多路召回来实现,一方面各路可以并行计算,另一方面取长补短。召回通路主要有非个性化和个性化两大类。
2.1.1 非个性化召回
非个性化召回与用户无关,可以离线构建好,主要有
- 热门召回:比如近 7 天播放 vv 比较高的短视频,可以结合 CTR 和时间衰减做平滑,并过滤掉人均时长偏低的疑似骗点击 item。还可以选择用户点赞多、好评多的 item 等。这部分主要基于规则实现即可。由于热门 item 容易导致马太效应,如果热门召回占整体通路比例过大,可以考虑做一定打压。
- 高效率召回:比如高 CTR、高完播率、高人均时长的短视频,这类 item 效率较高,但可能上架不久,历史播放 vv 不多,好评也需要时间积累,有可能不在热门召回内。
- 运营策略召回:例如运营构建的各个类目的榜单、片单,最新上架 item 等。
2.1.2 个性化召回
个性化召回与用户相关,千人千面,根据构建方式主要有
- content-based:基于内容,可以通过用户标签,比如新注册时填写的喜欢的导演、演员、类目等信息,也可以通过用户历史行为作为 trigger,来选取与之内容相似的 item。主要有:
- 标签召回:比如演员、导演、item 标签 tag、类目等。
- 知识图谱
- 多模态:比如标题语义相似的 item,首图相似的 item,视频理解相似的 item 等
一般先离线构建好倒排索引,在线使用时通过用户标签或者历史行为 item 作为 trigger,取出对应候选即可。基于内容来构建倒排索引,不需要 item 有丰富的行为,对冷启 item 比较友好。
- behavior-based:基于行为,主要是 userCF 和 itemCF 两种,都是通过行为来找相似,需要 user 或者 item 有比较丰富的行为。userCF 先找到与 user 行为相似的 user,选取他们行为序列中的 item 作为候选。itemCF 则找到每个 item 被行为相似的其他 item,构建倒排索引。构建方式主要有 CF 和 MF 两大类,MF 又称 model-based CF,就不具体展开了。
- feature-based:基于特征,比如 user 的年龄、性别、机型、地理位置、行为序列等,item 的上架时间、视频时长、历史统计信息等。基于特征的召回构建方式,信息利用比较充分,效果一般也比较好,对冷启也比较友好,是最近几年来的研究重点。又主要分为
- 线性模型:比如 FM、FFM 等,就不具体展开了
- 深度模型:比如基于 DNN 的 DSSM 双塔、youtubeDNN(又叫 deepMatch)。基于用户序列的 Mind。基于 GNN 的 graphSAGE 等。
线上使用时,可以有两种方式:
- 向量检索:通过生成的 user embedding,采用近邻搜索,寻找与之相似的 item embedding,从而找到具体 item。检索方式有哈希分桶、HNSW 等多种方法
- i2i 倒排索引:通过 item embedding,找到与本 item 相似的其他 item,离线构建 i2i 索引。线上使用时,通过用户历史行为中的 item 作为 trigger,从倒排索引中找到候选集
- social-network:通过好友点赞、关注关系、通信录关系等,找到社交链上的其他人,然后通过他们来召回 item。原则就是好友喜欢的 item,大概率也会喜欢,物以类聚人以群分嘛。
2.2 召回优化
多路召回的各通路主要就是这些,那召回中主要有哪些问题呢,个人认为主要有
- 负样本构建问题:召回是样本的艺术,排序是特征的艺术,这句话说的很对。召回正样本可以选择曝光点击的样本,但负样本怎么选呢?选择曝光未点击的样本吗,肯定不行
- 曝光未点击样本,能从已有召回、粗排、精排模块中竞争出来,说明其 item 质量和相关性都还是不错的,作为召回负样本肯定不合适
- SSB 问题,召回面向的全体推荐池,但能得到曝光的 item 只是其中很小的子集,这样构建负样本会导致十分严重的 SSB(sample selection bias)问题,使得模型严重偏离实际
基于这个问题,我们可以在推荐池中随机选择 item 作为负样本,但又会有一个问题,随机选择的 item,相对于正样本来说,一般很容易区分,所以需要有 hard negative sample 来刺激和提升召回模型效果。构建 hard negative sample,是目前召回研究中比较多的一个方向,主要有:
- 借助精排模型:比如选取精排打分处于中间位置的 item,如排名 100~500 左右的 item,它们不是很靠前,可以看做负样本,也不是吊车尾,与正样本有一定相关性,区分起来有一定难度。
- 业务规则:比如选择同类目、同价格档位等规则的 item,可以参考 Airbnb 论文的做法。
- 主动学习:召回结果进行人工审核,bad case 作为负样本
一般会将 hard negative 与 easy negative,按照一定比例,比如 1: 100,同时作为召回负样本。
- SSB 问题:召回面向的是全体推荐池,item 数量巨大,故需要做一定的负采样,有比较大的 SSB 样本选择偏差问题。故需要让选择出来的负样本,尽可能的能代表全体推荐池,从而提升模型泛化能力。主要问题仍然是负采样,特别是 hard negative sample 的问题。
- 目标不一致问题:目前的召回目标仍然是找相似,不论是基于内容的,还是基于行为和特征的。但精排和最终实际业务指标仍然看的是转化,相似不代表就能得到很好的转化,比如极端情况,全部召回与用户最近播放相似的短视频,显然最终整体的转化是不高的。
- 竞争问题:各召回通路最终会做 merge 去重,各通道之间重复度过高则没有意义,特别是新增召回通路,需要对历史通路有较好的补充增益作用,各召回通路之间存在一定的重叠和竞争问题。同时,召回通路的候选 item,不一定能在精排中竞争透出,特别是历史召回少的 item,由于其曝光样本很少,精排中打分不高,所以不一定能透出。召回和精排的相爱相杀,还需要通过全链路优化来缓解。
推荐策略中的“召回” | 人人都是产品经理 http://www.woshipm.com/pd/2051274.html
当你打开一个资讯APP刷新闻时,有没有想过,系统是如何迅速推送给你你想看的内容?资讯APP背后有一个巨大的内容池,系统是如何判断要不要将某条资讯推送给你的呢?这就是笔者今天想跟大家探讨的问题——推荐策略中的召回。
召回是什么
推荐系统如何根据已有的用户画像和内容画像去推荐,涉及到两个关键问题:召回和排序。
“召回(match)”指从全量信息集合中触发尽可能多的正确结果,并将结果返回给“排序”。
召回的方式有多种:协同过滤、主题模型、内容召回和热点召回等,而“排序(rank)“则是对所有召回的内容进行打分排序,选出得分最高的几个结果推荐给用户。
图1 推荐系统的算法流程
在搜索系统中,用户会输入明确的搜索词,根据搜索词进行内容的召回和呈现即可,但在推荐系统中,用户没有一个明确的检索词(Query)输入,推荐系统需要做的,就是根据用户画像、内容画像等各种信息为用户推荐他可能感兴趣的内容。
另外,由于没有明确的检索词,推荐系统就需要从整个信息集合中挑选出尽可能多的相关结果,同时又需要剔除相关性较弱的结果,降低排序阶段的工作量。
怎样的召回策略是好的
召回策略的评估主要根据两个评价指标:召回率和准确率。
召回率(Recall)=系统检索到的相关内容 / 系统所有相关的内容总数准确率(Precision)=系统检索到的相关内容 / 系统所有检索到的内容总数。
以搜索为例,当用户搜索“北京大学”时,想看到北大相关的网站、新闻等,系统返回了以下三个网页:
a. 北京大学保安考上研究生;
b. 北京互联网工作招聘;
c. 大学生活是什么样的;
可以看到,只有a是用户真正想看到的,其他两个和用户搜索词无关,而事实上数据库里还有这种网页:
d. 北大开学季;
e. 未名湖的景色;
d、e这两个网页没被搜索到,但它们和“北京大学”的相关度其实是超过b、c的,也就是应该被搜索(被召回)到但实际并没有显示在结果里的,所以,这个系统的:
- 召回率 = a / (a + d + e)=0.33;
- 准确率 = a /(a + b + c)=0.33。
这是搜索情境下的召回率和准确率,而“推荐”其实就是没有检索词输入时的搜索,例如,用户并没有输入“北京大学”这样的关键词,但其实他是北京大学的学生,对自己学校相关的新闻很感兴趣,推荐系统的召回就是要根据用户画像、内容画像等各种信息,为用户提供他感兴趣的相关内容,所以也存在召回率和准确率的问题。
召回率和准确率有时存在相互制衡的情况,好的召回策略应该在保证高准确率的情况下也保证高召回率。
当然,召回率和准确率也是存在一定关系的,而我们在做实际项目的优化目标通常是希望用户所检索的内容能够在召回率和准确率两方面都表现都好。
举个例子(或许不够准确,仅供参考)如表1,机器在给用户推荐内容的时候,会出现A(准确并召回)、B(准确不召回)、C(不准确召回)、D(不准确不召回)四种情况。那么,最理想的就是A、C两种情况。
表1 内容召回的4种情况
推荐系统如何召回
召回策略主要包含两大类,即基于内容匹配的召回和基于系统过滤的召回。
1. 基于内容匹配的召回
内容匹配即将用户画像与内容画像进行匹配,又分为基于内容标签的匹配和基于知识的匹配。
例如,A用户的用户画像中有一条标签是“杨幂的粉丝”,那么在他看了《绣春刀2》这部杨幂主演的电影后,可以为他推荐杨幂主演的其他电影或电视剧,这就是“基于内容标签的匹配”。
“基于知识的匹配”则更进一步,需要系统存储一条“知识”——《绣春刀2》是《绣春刀1》的续集,这样就可以为看过《绣春刀2》的用户推荐《绣春刀1》。基于内容匹配的召回较为简单、刻板,召回率较高,但准确率较低(因为标签匹配并不一定代表真的感兴趣),比较适用于冷启动的语义环境。
2. 基于协同过滤的召回
如果仅使用上述较简单的召回策略,推荐内容会较为单一,目前业界最常用的基于协同过滤的召回,它又分为基于用户、基于项目和基于模型的协同过滤。
其中,基于用户(User-based)的协同推荐是最基础的,它的基础假设是“相似的人会有相同的喜好”,推荐方法是,发现与用户相似的其他用户,用用户的浏览记录做相互推荐。
例如,通过浏览记录发现用户一与用户二的偏好类似,就将用户一点击的内容推送给用户二。
图2 基于用户的推荐
基于项目(Item-based)的协同过滤中的“项目”可以视场景定为信息流产品中的“内容”或者电商平台中的“商品”,其基础假设是“喜欢一个物品的用户会喜欢相似的物品”计算项目之间的相似性,再根据用户的历史偏好信息将类似的物品推荐给该用户。
图3 基于项目的推荐
基于模型的协同过滤推荐(Model-based)就是基于样本的用户喜好信息,训练一个推荐模型,然后根据实时的用户喜好的信息进行预测推荐。
总体来说,基于协同过滤的召回即建立用户和内容间的行为矩阵,依据“相似性”进行分发。这种方式准确率较高,但存在一定程度的冷启动问题。
在实际运用中,采用单一召回策略的推荐结果实际会非常粗糙,通用的解决方法是将规则打散,将上述几种召回方式中提炼到的各种细小特征赋予权重,分别打分,并计算总分值,预测CTR。
例如,根据内容匹配召回策略,用户A和内容甲的标签匹配度为0.6,同时,根据协同过滤召回策略,应该将内容甲推荐给用户A的可能性为0.7,那么就为0.6和0.7这两个数值分别赋予权重(这个权重可能会根据算法的具体情况来确定),得出总分,用它来预测用户可能点击的概率,从而决定是否返回该结果。
今日头条的召回策略
今日头条作为业界推荐系统方面的顶级选手,不免有人会好奇,它的召回策略是怎样的?
今日头条的算法架构师曾在接受采访时表示,今日头条有一个世界范围内比较大的在线训练推荐模型,包括几百亿特征和几十亿的向量特征。但因为头条目前的内容量非常大,加上小视频内容有千万级别,推荐系统不可能所有内容全部由模型预估。所以需要设计一些召回策略,从庞大内容中筛选一个模型组成内容库。
召回策略种类有很多,今日头条主要用的是倒排的思路。离线维护一个倒排,这个倒排的key可以是分类,topic,实体,来源等,排序考虑热度、新鲜度、动作等。线上召回可以迅速从倒排中根据用户兴趣标签对内容做截断,高效地从很大的内容库中筛选比较靠谱的一小部分内容。基于召回策略,把一个海量、无法把握的内容库,变成一个相对小、可以把握的内容库,再进入推荐模型。这样有效平衡了计算成本和效果。
参考文献
【1】闫泽华,《内容算法》,中信出版集团
【2】CSDN博客:信息流推荐算法实践 &深入 https://blog.csdn.net/dengxing1234/article/details/79756265
【3】IBM官网资料探索推荐引擎内部的秘密,第 1 部分: 推荐引擎初探
【4】今日头条推荐算法原理首公开,头条首席算法架构师带来详细解读 https://www.leiphone.com/news/201801/XlIxFZ5W3j8MvaEL.html
深入理解推荐系统:召回 - 知乎 https://zhuanlan.zhihu.com/p/115690499
作为【推荐系统】系列文章的第二篇,将以“召回”作为今天的主角,会从四个方面来介绍召回的不同算法方式,即基于内容的召回、协同过滤、基于FM模型召回和基于深度学习的方法。
一、背景介绍
推荐系统整体架构
召回是推荐系统的第一阶段,主要根据用户和商品部分特征,从海量的物品库里,快速找回一小部分用户潜在感兴趣的物品,然后交给排序环节。这部分需要处理的数据量非常大,速度要求快,所有使用的策略、模型和特征都不能太复杂。下面主要介绍四种常见的召回方法:
- 基于内容的召回:使用item之间的相似性来推荐与用户喜欢的item相似的item。
例如:如果用户A看了《绣春刀2》这部杨幂主演的电影后,则会为他推荐杨幂主演的其他电影或电视剧
- 协同过滤:同时使用query和item之间的相似性来进行推荐。
例如:如果用户A与用户B类似,并且用户B喜欢视频1,则系统可以向用户A推荐视频1(即使用户A尚未看过任何与视频1类似的视频)。
- 基于FM模型召回:FM是基于矩阵分解的推荐算法,其核心是二阶特征组合。
- 基于深度神经网络的方法:利用深度神经网络生成相应的候选集。
二、基于内容的召回
基于内容的召回( CB召回 ),一般也叫做标签召回。当谈起CB的时候,大家可能会觉的很简单,用tag或者用cate召回就行了,好像没什么可做的。可事实上,CB并不仅仅是用tag和cate做个倒排就搞定了。这类召回的核心思想是基于item自身的属性,这些属性可以表达为tag,Cate,也可以用来表达用户ID,用户类型等,更可以通过⼀些交叉验证的⽅式,针对内容提取向量,将内容表达为连续向量的方式进行召回。接下来我们进一步来理解基于内容的过滤。
在实际的应用中,如电影推荐,首先我们根据用户之前的历史行为信息(如点击,评论,观看等),CB会使用item相关特征来推荐给用户与之前喜欢的item类似的item。为了更形象的表示CB,假设一个应用商店要推荐给用户相应的APP。下图是相应的特征矩阵,其中每一行代表一个应用程序,每一列代表一个特征。包括不同的类别特征,应用程序的发布者信息等。为简化起见,假定此特征矩阵是布尔类型的的:非零值表示应用程序具有该特征。
还可以在同一特征空间中表示用户。一些与用户相关的特征可以由用户明确提供。例如,用户在其个人资料中选择“娱乐应用”。其他特征可能是隐式的,具体取决于它们先前安装的应用程序。例如,用户安装了由Science R Us发布的另一个应用程序。
模型应推荐与此用户有关的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)或成r电影(接近+1)的兴趣。 对于我们希望用户喜欢的电影,电影Embedding和用户Embedding的乘积应更高(接近1)。
在下图中,每个对号标记都标识特定用户观看的电影。 第三和第四用户具有的特征很好地表示了用户的偏好:第三用户偏爱儿童电影,第四用户偏爱成r电影。 但是,单个特征无法很好地表示第一和第二用户的偏好。这时候需要考虑二维甚至更高维度的特征。
3.2 二维Embedding
一个特征不足以解释所有用户的偏好。 为了克服这个问题,让我们添加第二个特征:每部电影是商业流行片或是小众文艺片上的表现程度。 通过这个特征,我们现在可以使用以下二维Embedding来表示每部电影:
我们再次将用户放置在相同的嵌入空间中,以最好地解释反馈矩阵:对于(用户,商品)对,我们希望用户Embedding和商品Embedding的点积在用户观看商品时接近1 电影,否则为0。
在这个例子中,我们对Embedding进行了手工设计。在实践中,可以自动学习Embedding向量表示,这是协同过滤模型的强大功能。在接下来的内容中,我们将讨论学习这些嵌入表示的不同模型以及如何对其进行训练。
当模型自动学习Embedding时,这种方法的协同性质就显而易见了。假设电影的Embedding向量是固定的。然后,模型可以为用户学习Embedding向量,以最好地解释他们的偏好。 因此,具有相似偏好的用户的Embedding将紧密在一起。同样,如果用户的Embedding是固定的,则我们可以学习电影Embedding以最好地解释反馈矩阵。结果,类似用户喜欢的电影的Embedding将在Embedding空间中紧密在一起。
3.3 基于模型(model based)的协同过滤
矩阵分解是一个简单的Embedding模型。 给定反馈矩阵 ,其中 是用户(或query)数量, 是item数量,该模型将学习:
- user Embedding矩阵 ,其中第i行是 的Embedding。
- item Embedding矩阵 ,其中第j行是 的Embedding。
Embedding通过学习,使得 的乘积是反馈矩阵 的良好近似。 的 项就是 和 对应的两个embedding的点积,使其尽量接近 。
注意:与学习完整矩阵相比,矩阵分解通常会得到更简洁的表示。 完整矩阵具有 项,而Embedding矩阵具有 项,其中Embedding维数 通常比 和 小得多。 最终,观测矩阵会被映射到低维子空间中,矩阵分解就可以在数据中找到其对应的潜在信息。 在前面的示例中, , 和 的值都非常小,因此优势可以忽略不计。 但是,在现实世界中的推荐系统中,矩阵分解可以比学习整个矩阵要简洁得多。
3.4 选择目标函数
一种直观的目标函数是距离的平方, 即在所有观察到的矩阵项上最小化平方误差之和:
在此目标函数中,只求观察到的对 的误差和,即对反馈矩阵中的非零值求和。 但是,只求1的误差总和并不是一个好方法。最小化矩阵中所有为1元素产生的模型,并不能进行很好的推荐,而且泛化性较差。
也许可以将未观察到的值视为零,并对矩阵中的所有条目求损失和。这样其实就是最小化 及其近似值 之间Frobenius距离的平方:
可以通过矩阵的奇异值分解(SVD)解决此二次问题。 但是,SVD并不是一个很好的解决方案,因为在实际应用中,矩阵 可能非常稀疏。 例如,将抖音上所有视频与特定用户观看过的视频进行比较。 得到的解 (对应于模型对输入矩阵的近似值)可能接近于零,从而导致泛化性能较差。
相比之下,加权矩阵分解将目标分解为以下两部分的和:
- 观察到的误差和
- 未观察到的误差和(视作0)
是调节两项加权的超参,以使目标不被其中一项所支配。 调整此超参数非常重要。
在实际应用中,还需要仔细权衡观察到的数据。例如,频繁的item(如,非常受欢迎的视频)或频繁的query(例如,重度用户)可能会主导目标功能。可以通过对频繁出现的item所对应的训练样本进行加权来纠正此影响。 换句话说,您可以将目标函数替换为:
是query 和item 对应的频率函数。
3.5 最小化目标函数
最小化目标函数的常用算法包括:
- 随机梯度下降(SGD)是使损失函数最小化的通用方法。
- 加权交替最小二乘(WALS)专用于此特定目标函数。
在两个矩阵和中,每个目标都是二次的。(需要请注意的是,联合问题并不是凸的)WALS的工作方式是随机初始化Embedding,然后在以下条件之间交替进行:
- 固定 求解 。
- 固定 求解 。
每步都可以准确地求解(通过线性问题的解决方法)并可以进行分布式计算。 该技术可以保证收敛,因为可以确保每一步都可以减少损失。
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,而无需重新训练整个模型。只需求解以下方程式或其加权形式:
上述方程对应于WALS中的一个迭代:用户Embedding保持固定,系统求解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特征数据结构:User相关、Item相关、类别相关的特征、历史行为数据特征等等,最后一列可看作是User对Item评分。FM通过不同特征的组合,生成新的含义。然而,特征组合也随之带来一些问题:
- 特征之间两两组合容易导致维度灾难;
- 组合后的特征未必有效,可能存在特征冗余现象;
- 组合后特征样本非常稀疏,如果原始样本中不存在对应的组合,则无法学习参数,那么该组合就显得无效。
虽然有这些缺点,但是也并不影响FM在广告推荐领域的地位,每个算法都有风靡一时的过去,抱着敬畏之心的态度去学习是没问题的。下面,来看看如何基于FM来做召回的。
4.1 具体召回过程
基于FM的召回与完全版本的FM不同,这里会放弃 与 特征组内部的二阶交互,即没有了age、gender、item_id、cate_id这样的交互,仅是进行到求解隐向量阶段。
摘自“推荐系统召回四模型之:全能的FM模型”
这里是“推荐系统召回四模型之:全能的FM模型”一文中给出的极简的FM召回模型,即不考虑上下文特征。
第一步,对于某个用户,我们可以把属于这个用户子集合的特征,查询离线训练好的FM模型中这个用户对应的特征embedding向量(FM模型求解出的隐向量,即 ,其长度为 ,包含 个描述特征的因子),然后将这个用户对应的n个特征embedding向量累加,形成这个用户的兴趣向量U,这个向量维度和每个特征的维度是相同的。
类似的,我们也可以把每个物品,其对应的物品子集合的特征,查询离线训练好的FM模型对应的特征embedding向量,然后将m个物品子集合的特征embedding向量累加,形成物品向量I,这个向量维度和每个特征的维度也是是相同的。
摘自“推荐系统召回四模型之:全能的FM模型”
第二步,对于每个用户以及每个物品,我们可以利用步骤一中的方法,将每个用户的兴趣向量离线算好,存入在线数据库中比如Redis(用户ID及其对应的embedding),把物品的向量逐一离线算好,存入Faiss(Facebook开源的embedding高效匹配库)数据库中,进行knn索引,然后高效检索。
第三步,当用户登陆或者刷新页面时,可以根据用户ID取出其对应的兴趣向量embedding,然后和Faiss中存储的物料embedding做内积计算,按照得分由高到低返回得分Top K的物料作为召回结果。
有关FM召回更加详细的内容:https://zhuanlan.zhihu.com/p/58160982
4.2 矩阵分解和FM
可以认为FM是加了特征的矩阵分解(MF),原来用户和物品侧都只有一个id特征,现在用户侧加了年龄、性别、学历等特征,物品侧加了品类、店铺等特征,然后进一步融入到FM模型后,它将所有的特征转化为embedding低维向量表达,然后用户侧的特征和物品侧特征两两矩阵分解,即两两特征embedding的内积,得到特征组合的权重。
五、基于深度神经网络模型
前文讲述了如何使用矩阵分解来学习Embedding。 矩阵分解的一些限制包括:
- 使用附加特征(即queryID /itemID以外的其他特征)困难。 因此只能对训练集中存在的用户或item进行推荐。
- 推荐的相关性。 正如前文所描述的那样,倾向于向所有人推荐热门item,尤其是在使用点积作为相似性度量时。 难以刻画特定的用户兴趣。
深度神经网络(DNN)模型可以解决矩阵分解的这些限制。 DNN可以轻松地融入query特征和item特征(由于网络输入层的灵活性),这可以帮助捕获用户的特定兴趣并提高推荐的相关性。
5.1 Softmax DNN 模型
一般而言,DNN模型是利用softmax作为最后一层的输出,它会将问题视为多分类问题,其中:
- 输入是用户query。
- 输出是一个概率向量,其大小等于语料库中item的数量,代表与每个item进行交互的概率; 例如,点击或观看视频的可能性。
输入层
DNN的输入可以包括:
- 稠密(dense)特征(如,点击频率、观看时长等)
- 稀疏(sparse)特征(如,观看视频类型、地区等)
与矩阵分解方法不同,可以添加年龄或地区等附加特征。 我们用x表示输入向量。
模型结构
模型结构决定了模型的复杂性和表达性。 通过添加隐藏层和非线性激活函数(例如ReLU),模型可以捕获数据中更复杂的关系。 但是,增加参数的数量通常也会使模型更难训练且服务成本更高。 我们将用 表示最后一个隐藏层的输出。
输出层: 预测的概率分布
该模型通过softmax层将最后一层的输出映射到概率分布 ,其中:
- 是softmax函数,
- 是softmax层的权重矩阵。
softmax层将分数矢量 (有时称为logits)映射到概率分布。
损失函数
最后,定义用以比较以下两项的损失函数:
- ,softmax层的输出(概率分布)
- ,groud-truth,代表用户与之互动的item(例如,用户点击或观看的视频)。 这可以表示为归一化的muti-hot分布(概率向量)。
例如,可以使用交叉熵损失来比较两个概率分布。
Softmax Embedding
的概率由 给出,其中 是不依赖于 的归一化常数。
换句话说, ,因此,的对数概率是(最大为加法常数)两个 维矢量的点积,可以将其解释为query和item Embedding:
- 是最后一个隐藏层的输出。 我们称其为query 的Embedding。
- 是将最后一个隐藏层连接到输出 的权重向量。 我们称其为item的Embedding。
5.2 DNN和矩阵分解
在softmax模型和矩阵分解模型中,系统对于每个item学习一个Embedding向量 。 我们在矩阵分解中所谓的item Embedding 矩阵 是softmax层的权重矩阵。但是,用户query Embedding是不同的。 将不再对每个query学习一个对应的query Embedding向量,而是学习从query 特征 到Embedding的映射 。 因此,可以将此DNN模型视为矩阵分解的泛化,其中将query侧替换为非线性函数 。
item特征使用
可以将相同的想法应用于item侧吗? 也就是说,除了对每个item学习一个对应的Embedding之外,模型可以学习将item特征映射到Embedding的非线性函数吗? 当然可以。可以使用由两个神经网络组成的双塔模型:
如上图所示,DSSM模型最早被提出是用来提升搜索场景下文档和query匹配的问题,模型接受两个输入到两个神经网络中,通过模型编码到同一个语义向量空间。对于推荐排序场景:
- 一种神经网络将qeury特征 映射到qeury Embedding
- 一个神经网络将item特征 映射到item Embedding
模型的输出可以定义为 的点积。 请注意,这再是softmax模型。 新模型对每对 预测一个值,而不是每个query的概率向量。
5.3 softmax训练
前文解释了如何将softmax层合并到推荐系统的深度神经网络中。 下面介绍如何利用训练数据对模型参数进行求解。
训练数据
训练数据由query特征 和与用户进行交互的item向量组成(表示为概率分布 )。在下图中,标记为蓝色。 模型的变量是不同层中的权重。 在下图中,标记为橙色。 通常使用随机梯度下降相关方法来训练模型。
六、更多召回模型
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