Система рекомендаций: отзыв (4)

алгоритм
Система рекомендаций: отзыв (4)

0/ссылочный URL

参考 https://zhuanlan.zhihu.com/p/115690499?from_voters_page=true

1/резюме

推荐系统中的召回环节,你也可以把它理解为是一个复合模型,因为我们通常用多路召回。
召回,多路召回
多个召回模型,每个模型都有自己的策略,也就是多路召回的侧重定不同。
海量的item库(千万级别或者亿级别),也就是语料库,这是我们的数据基础。

当前的召回算法有:协同过滤,FM,FFM,图模型
召回这个环节:需要大量的数据计算,因为需要从海量的数据中召回用户潜在感兴趣的内容。
           所以不可避免的会进行大量的数据计算。
           所以要求速度快,模型和使用的策略都不能过于复杂。

召回是推荐系统的第一环节,排序是推荐系统的第二环节。


常用的召回算法:
    基于内容的召回(简称cb召回Content Based):
       基于内容的推荐又被称为Content Based,
       使用item之间的相似性来推荐与用户喜欢的item相似的item。
       例如:老张在腾讯视频看了一部爱情动作片,之后他就会发现腾讯视频给他推送其他的爱情动作片。
       投其所好(目标用户喜欢啥,就给推荐啥)
       稀疏矩阵,
       用余弦距离作为衡量item之间相似度的指标。
       只能根据用户现有的兴趣去推荐item,,很难扩展用户新的兴趣点。
       
    协同过滤的召回(简称cf):
         这里的'协同'就是说user和item这二者之间相互配合,协同合作,
         而不是像cb召回那样只是考虑item而不考虑user.
         
         user协同过滤user-based: 和你爱好类似的人看过什么
         item协同过滤item-based: 看过你看过的item的人还看过什么
         
    fm的召回:
        因为分解机
    
    ffm召回;
       ffm是fm的一个变体,整体差不多。

基于内容的召回:
    优点:针对目标用户,不需考虑其他用户的特征数据。这可以很容易扩展到大量的用户。   
         可以抓到用户的兴趣点。
    缺点:只能根据用户的现有兴趣去推荐,而不能扩展用户的兴趣。
         也就说对于扩展用户的兴趣是不足的。
         另外给item贴标签的时候,需要掌握一定的特定的领域知识。

在计算相似度的时候,是根据稀疏矩阵计算的,0和1。所以计算的是余弦距离,而不是欧式距离。

召回是推荐系统的第一阶段,该阶段因为要处理的数据很大多,所以要求特征不能太多,模型不能太复杂。

2/ Что такое отзыв

 我们都知道,推荐系统包括召回,排序(粗排和精排),人工规则干预。
 召回环节是推荐系统的第一个环节。

image.png

上图中,video corpus是海量的视频物料库,是一个总的池子。
然后根据user的用户画像或者item的特征体系,利用各种召回策略算法,从video corpus中召回用户潜在感兴趣的物料。
这里的物料可以是人,也可以是物。
比如是电商app,那么就是给人推荐物,如果是社交app,那么就是给人推荐人。
召回这个阶段处理的数据量非常大,要求速度快,所有使用的策略、模型和特征都不能太复杂。

召回的目标是从千万级甚至亿级的候选中(池子中)召回几千个item。
召回一般由多路组成,每一路会有不同的侧重点。
如在广告中,成熟期广告和冷启动广告分为两路召回。
在推荐系统中,不同路可能代表了不同的优化目标,如喜欢、关注、观看时长、评论这些都可以分不同的路召回。

所谓的召回,就是根据某个条件(及一定的策略),从海量的item库中选择一部分物料出来。
召回,即从海量的内容里去召回每一个用户他可能感兴趣的内容,前提是——拥有海量的物料库,因为当内容不足时,也就不需要去搭建复杂的推荐系统。

所以,当有海量item时,需要用召回的算法从不同类别的内容里为用户生成他可能感兴趣的内容。
比如某位用户既喜欢体育内容,也喜欢军事内容,那么在第一步,无论用哪些模型,都希望达到为该用户生成一些体育、军事相关内容的效果。
另一个用户可能喜欢美食和游戏,在召回阶段,我们就希望通过模型去为他生成一些美食和游戏相关的内容。

在召回阶段可能就会存在许多个模型(算法策略,不同的侧重点),也就是多路召回。
而经过多路召回阶段之后,得到的是多个召回列表。我们需要根据一定的方法把多个召回列表融合成一个列表。
然后把这个列表输入给排序环节,再经过排序环节的打分,最后根据ctr预估的概率进行倒排。

3/ Общие алгоритмы отзыва

Отзыв на основе содержания

(1) Концепция

简称cb,及content based
使用item之间的相似性来推荐与用户喜欢的item相似的item。
item一般是稀疏矩阵,所以item之间的相似性可以用余弦距离来衡量。
完全基于内容的相似度,不考虑用户的特征:及目标用户喜欢什么样的,我们就给推荐什么样的。
用户喜欢什么类型的电影,就给他推荐什么类型的电影。
用户喜欢什么类型的app,就给他推荐什么类型的app。

例如:如果用户A看了《绣春刀2》这部杨幂主演的电影后,则会为他推荐杨幂主演的影视作品。
例如:用户看了亚瑟士的某款男鞋,然后给该用户推荐亚瑟士的其他款的男鞋。
例如:用户在小米的应用商店里,搜索了‘探探’这个app,那么第一条是探探这个app之外,
     陌陌,伊对,他趣等app也会被召回。
总的来说就是:投其所好,并且可解释性强。

image.png

从上图我们可以看到:
     用户A喜欢看爱情和浪漫类型的电影,
     正好电影c也是爱情浪漫类型的,
     所以把电影c推荐给用户A。
     这就是基于内容的召回。

基于内容的召回( CB召回 ),一般也叫做标签召回。
当谈起CB的时候,大家可能会觉的很简单,用tag或者用cate召回就行了,好像没什么可做的。
可事实上,CB并不仅仅是用tag和cate做个倒排就搞定了,这里的倒拍指的是item相似度的倒排,不是排序阶段分数的倒排。
这类召回的核心思想是基于item自身的特征,这些属性可以表达为tag,Cate,也可以用来表达用户ID,用户类型等,更可以通过⼀些交叉验证的⽅式,针对内容提取向量,将内容表达为连续向量的方式进行召回。
接下来我们进一步来理解基于内容的召回。

在实际的应用中,如电影推荐,首先我们根据用户之前的历史行为信息(如搜索query,点击,评论,观看,收藏等)来刻画人物画像,及该用户平时喜欢什么类型的电影。
CB会使用item相关特征来推荐给用户与之前喜欢的item类似的item,这就是投其所好,用户喜欢什么就推荐什么。
为了更形象的表示CB,假设一个应用商店要推荐给用户相应的APP。
下图是相应的特征矩阵,其中每一行代表一个app,每一列代表一个特征。
为简化起见,假定此特征矩阵是布尔类型的的:黑点表示该app具有该特征。
其实这就是一个关系型的数据库。

image.png

由于特征有很多,所以一般都是稀疏矩阵,可以用余弦距离作为item相似性的衡量指标。
2个向量的内积(点乘法) a.b,得到的是一个标量。方便存储,占用内存很小。

(2) Преимущества, основанные на запоминании контента

  - 给目标用户推荐item的时候,只考虑item之间的相似度即可,不需要考虑其他user的数据。
    该有点使得cb召回可以扩展到大量的目标用户上。
  - 该模型可以准确捕获用户的现有兴趣点。
  - 可解释性强

(3) Недостатки припоминания на основе содержания

 - 由于item的特征表示在某种程度上是手工设计的,因此该技术需要大量领域知识。
   也就是说,item具有哪些标签,是需要我们掌握一定的特定领域知识来手工设计的。
   因此,模型很依赖手工设计特征的好坏。
   
 - 该模型只能捕获目标用户的现有兴趣点,但是不能扩展目标用户的兴趣点。
   也就是扩展性不足。

(4) Обратная оптимизация

优化倒排的主要目的是提升cb召回的推荐效果,常见的倒排基本是和线上排序指标⼀致的。
比如,如果排序的指标是点击率,倒排理所应当,也是点击率。但这样的排序方式有个小问题,因为倒排排序使用的是后验的值,而排序通常也是单指标排序,这样,就很容易出现我们之前提到的,单指标被hack的问题。
比如,用点击率倒排,头部都是`标题党`等。所以,这个问题是需要额外注意的。
另外,也要考虑指标的bias偏差的问题,例如,用`完播率`倒排导致短的视频都排到了头部,长的视频都拍在了后面。
这种问题可以通过`归一化`的方式缓解。
但有⼀个潜在风险,资源的后验表现的分布往往会跟资源本身的类型有关。

(5) Оптимизация ключа триггера

key的优化要求只有⼀点,保证每次选择的key,是用户点击概率最⼤的key即可,所以通用的方式是把用户的点击历史按照属性加和取top,比如,在某个类别上点击的次数排序,把点击次数最多的那几个类别留作触发的key,这个过程很简单,没太多优化点,我们就不继续讨论了。
这⾥想聊的是关于用户不⼀样的行为差异化权重的问题,我们选取key的过程实际是判断用户对某⼀类内容感兴趣的过程,也就是通过行为,来判断用户的感兴趣程度,在只有浏览功能的产品⾥,点击就是表达用户兴趣的唯一行为,但产品通常会设计很多交互功能,来帮助用户进行有效的兴趣表达,所以,在触发key的选取的时候需要考虑到这⼀点,至于怎么做是和业务形态相关的事,这⾥就不展开了。

(6) Атрибуты многомерных элементов (функции)

最后,我们来讲⼀下cb⾥⾯比较高阶的问题,就是item多维度属性的问题。
我们先考虑这样⼀种情况,一个视频有很多个tag,tag的特性是平行不唯⼀。
比如军事,探索,美食,穿搭,美女帅哥等这些都是item的属性(特征),这些属性(特征)之间是平行且唯一的。

我们在线通过点击量汇聚得到了目标用户的高频点击tag,通常的方式是,每⼀个tag都会有⼀个倒排,然后各自召回。
但很容易想到的,当用户同时有“帅哥”,“萌宠”这两个tag的时候,通过萌宠给用户召回⼀个美女+萌宠的视频显然没有召回⼀个帅哥+萌宠的视频更有吸引力,也就是说,我们在召回的时候,如果能同时考虑多个term之间的关系,会更有效⼀些。
传统搜索⾥对于多term召回是有⼀套实现方式的,通过设置每个term的权重,可以在返回结果⾥去得到包含多term的结果,这部分属于搜索架构的内容范畴,我在此不展开了,有兴趣的同学可以找身边做搜索的同学了解⼀下。
我们讲⼀个更和推荐match的方式,用户身上有多个标签tag,内容上面也有多个标签tag,我们在做多term匹配的时候,就是标签的list到标签的list,使得他们点击的概率最大即可。
是不是觉得豁然开朗了?是不是转化成点击率建模问题了?
更简单地,直接使用word2vec,把用户标签和内容标签作为⼀个sentence训练,再离线把内容的标签加和表征为内容的属性向量,在线做召回即可。
当然,也可以⽤更复杂的⽅式来做,提升精度,大同小异,就不展开说了。
那作者,内容的其他纬度等信息也是可以⼀样的方式加进去的,这就留给大家来讨论了。
    

Отзыв о совместной фильтрации

为了解决cb召回所存在的弊端(扩展性不足),人们提出了系统过滤cf召回方式。
同时使用user和item之间的相似性来进行推荐,可样可以提高推荐的扩展性。
例如:如果用户A与用户B类似,并且用户B喜欢视频1,
     则系统可以把视频1推荐给用户A(即使用户A尚未看过任何与视频1类似的视频)。
计算相似度,稀疏矩阵,不用欧式距离,而是用余弦距离。

举个例子:如果小红和小霞是同一类人,那么我们就默认小红喜欢的东西,小霞也很可能会喜欢。
        那么我们就把小红喜欢的东西推荐给小霞。
        这样,则可能会扩展小霞的兴趣点。
此外,可以自动学习Embedding,而无需依赖手工设计的特征。

一般来说,协同过滤推荐分为三种类型。
   第一种是基于用户(user-based)的协同过滤
   第二种是基于物料(item-based)的协同过滤
   第三种是基于模型(model based)的协同过滤

(1) Совместная фильтрация на основе пользователей

 主要考虑的是用户和用户之间的相似度,只要找出与目标用户相似的用户喜欢的item,
 并预测目标用户对这些item的喜欢的评分,
 就可以找到评分最高的若干个item推荐给目标用户。
 及物以类聚,人以群分。
   

(2) Совместная фильтрация на основе элементов

 和基于用户的协同过滤类似,只不过这时我们转向找到物品和物品之间的相似度,
 只有找到了目标用户对某些物品的评分,那么我们就可以对相似度高的其他物品进行预测,
 将评分最高的若干个相似物品推荐给用户。
 比如你在网上买了一本机器学习相关的书,网站马上会推荐一堆有关机器学习或者大数据的书给你,这里就明显用到了基于物料的协同过滤思想。
 
 可能会有人疑问:item-based系统过滤召回和基于内容的召回不是一样么?
 其实这里看起来却是很类似,但是又不同。
 在基于内容的召回中,是完全基于item的标签,也就是说推荐的item会跟目标用户喜欢的item及其类似。
 但是在item-based协同过滤召回算法中,我们是根据item计算相似度来推荐其他的item.
 也就是说,我们推荐的item并不一定就是和目标用户之前喜欢的item完全同类别,也可以是其他类别的item.
 这样也可以扩展推荐的多样性。
   

(3) Совместная фильтрация на основе моделей

 其实就是机器学习模型。
 用机器学习模型来帮助我们进行召回,而不是像user-based和item-based那样通过计算相似度来召回。
 
 model-based是目前最主流的协同过滤类型了,
 所含算法是非常之多的,如矩阵分解、关联规则算法、聚类算法、深度学习、图模型等等。
   
这里我们带来一个有关电影推荐系统的简单例子帮助更好的理解协同过滤。
首先,考虑一个电影推荐系统,其中训练数据由一个反馈矩阵组成,其中每行代表一个user,每一列代表一个item(及一部电影)。

关于电影的反馈分为以下两类:
 - 显示反馈:用户通过提供评分来指定他们对特定电影的喜欢程度。
 - 隐式反馈:如果用户观看电影,则系统会推断用户感兴趣。

假设反馈矩阵是布尔类型的,即值为1和0分别表示对电影是否感兴趣,当用户访问首页时,系统会根据以下两种情况推荐电影:
 - 与用户过去喜欢的电影相似(Item-Based CF)
 - 类似用户喜欢的电影(User-Based CF)

(4) Одномерное вложение

假设我们为每部电影分配一个标量,用于描述该电影是适合儿童(负值)还是适合成人(正值)观看。 
该标量的范围是[-1,+1],越接近-1说明越适合儿童观看,越接近+1说明越适合成人观看
          
假设我们还为每个用户分配一个标量,用于描述用户对儿童电影(接近-1)或成人电影(接近+1)的兴趣。 
该指标的范围是[-1,+1],越接近-1说明该用户越喜欢儿童类的电影,越接近+1说明该用户越喜欢成人电影。

对于我们希望用户喜欢的电影,电影Embedding和用户Embedding的乘积应更高(接近1)。

image.png

在下图中,每个对号标记都标识特定用户观看的电影。 
第三和第四用户具有的特征很好地表示了用户的偏好:
       第三用户偏爱儿童电影,
       第四用户偏爱成人电影。
       
但是,单个特征无法很好地表示第一和第二用户的偏好,这时候需要考虑二维甚至更高维度的特征。

image.png

(5) Двумерное вложение

一个特征不足以解释所有用户的偏好。 
为了克服这个问题,让我们添加第二个特征:每部电影是商业流行片或是小众文艺片上的表现程度。
通过这个特征,我们现在可以使用以下二维Embedding来表示每部电影:

image.png

我们再次将用户放置在相同的空间中,以最好地解释反馈矩阵:对于(用户,商品)对,
我们希望用户Embedding和商品Embedding的点积在用户观看商品时接近1电影,否则为0。

image.png

Отзыв на основе модели FM

fm是2010年提出的,其核心是特征组合,以此来减少人工参与特征组合的工作。
对于FM,其优势可分以下三点:
    1.FM能处理数据高度稀疏场景,SVM则不能;
    2.FM具有线性的计算复杂度,而SVM依赖于support vector。
    3.FM能够在任意的实数特征向量中生效。

image.png

FM特征数据结构:User相关、Item相关、类别相关的特征、历史行为数据特征等等,最后一列可看作是User对Item评分。FM通过不同特征的组合,生成新的含义。然而,特征组合也随之带来一些问题:

1.特征之间两两组合容易导致维度灾难;
1.组合后的特征未必有效,可能存在特征冗余现象;
1.组合后特征样本非常稀疏,如果原始样本中不存在对应的组合,则无法学习参数,那么该组合就显得无效。

虽然有这些缺点,但是也并不影响FM在广告推荐领域的地位,每个算法都有风靡一时的过去,抱着敬畏之心的态度去学习是没问题的。下面,来看看如何基于FM来做召回的。


    

Метод на основе глубокой нейронной сети

利用深度神经网络生成相应的候选集。