推荐系统之YouTube推荐算法中的召回策略

YouTube推荐算法之前就看过,但是没有对论文的内容做总结,而且其中的很多细节没有做详细研究。最新重新读这篇论文,总结的内容如下。

1. 概述

考虑到YouTube数据规模庞大,用户量和视频都很多,YouTube构建了两级推荐结构,从百万级别的视频候选集中进行视频推荐:第一级candidate generation model负责“初筛”,从百万量级的视频库中筛选出几百个候选视频;第二级ranking model负责“精排”,引入更多的feature对几百个候选视频进行排序。YouTube的两级模型架构构成了现在推荐系统的主流架构,即召回+排序,算法架构如下:
在这里插入图片描述
不管是candidate generation model还是ranking model在架构上都是DNN的基本结构,不同的是输入特征和优化目标不同。

本文主要针对论文中的召回算法做详细分析:

2. 召回算法

2.1 总体结构分析

首先,我们先看一下召回算法的总体架构,如下图所示。自下而上可以分成三个部分:第一部分为Embedding层;第二部分为全连接层;第三部分为输出层。下面我们按照自下而上的顺序分析召回策略:

在这里插入图片描述

(1)Embedding层

首先来看模型的输入特征。第一部分是视频观看列表,论文的实验中包含最近的50条观看视频。然后是搜索记录,同样也是50条最近的搜索记录,采用和历史观看记录同样的处理方法。这一层将用户观看的video和search token记录表示成低维稠密的向量Embedding,然后对embedded video watches和embedded search tokens向量求平均,得到watch vector和search vector,另外特征向量里面还包括了用户的地理位置的Embedding,年龄,性别等。然后把所有这些特征concatenate起来,喂给上层的ReLU神经网络。

这一部分最核心的内容是如何做Embedding?

对video和search token列表做Embedding的方法实际有两种:

第一种方法是,先用word2vec对video和search token列表做Embedding,然后将训练好的Embedding向量作为输入喂给上层,这是做Embedding的“基本操作”;
第二种方法是DeepCTR算法中常用的,就是通过加一个Embedding层跟上面的DNN一起训练,这样可以省去单独做word2vec的过程,统一训练参数。

至于哪种方法更好,就需要工程经验了。

(2)全连接层

第二部分比较简单,就是最常用的DNN,网络结构包含三个隐含层,并且使用tower pattern,如下图所示:
在这里插入图片描述
其中网络的最后一个隐含层的输出作为一个用户的表示向量u,用来表示用户的偏好和场景信息,向量u的维度是256。

(3)输出层

三层神经网络过后,我们看到了softmax函数。这里论文把这个问题看作为用户推荐next watch的问题,所以输出应该是一个在所有candidate video上的概率分布,自然是一个多分类问题。

我们使用隐式反馈来进行学习,用户完整观看过一个视频,便视作一个正例。如果将视频库中的每一个视频当作一个类别,那么在时刻 t,对于用户U和上下文C,用户会观看视频 i 的概率为:
在这里插入图片描述
其中,u 是用户的Embedding,这个Embedding是网络最后一个Relu激活函数的输出; v i v_i vi是视频 i 的Embedding,是softmax的权重;所以 u 和 v 的维度都是256。

这样问题就来了,视频 i 的Embedding与Embedding层中视频对应的Embedding有什么关系?

首先,这两组应该是不同的Embedding,输入层的Embedding分别是用户空间和视频空间的向量,二者通过一系列全联接层的线性变化,到达最终的输出层,转换到了同一空间。所以对于用户和视频来说,输出层的Embedding是同一空间,可以认为是兴趣空间,这样video和user可以在同一个特征空间中用向量 u u u v i v_i vi表示,二者的内积可以代表相似性,然后才可以采用最近邻搜索方法执行 top N 召回。

对在线服务来说,有严格的性能要求,必须在几十毫秒内返回结果。因此,YouTube没有重新跑一遍模型,而是通过保存用户兴趣Embedding和视频兴趣Embedding,通过最近邻搜索的方法得到 top N 的结果。该近似方法中的代表是局部敏感Hash方法,在文章3.1节中介绍。

2.2 召回模型中的经验和技巧

整个召回的过程基本是这样,看起来很简单,但是其中有大量的经验和技巧,下面进行介绍:

(1)正样本的选择。虽然YouTube中有显示反馈,比如点赞,调查问卷之类的,但是显示反馈的数据量太少。因此在训练数据中只采用隐式反馈,完整地看完一个视频作为一个正样本。

(2)负样本的选择。召回算法需要从百万级的视频库中进行筛选,如果每次都做一个百万类别的分类,计算量非常庞大,因此每次只采样几千个负样本,并通过设置权重来进行修正,这样每次分类的类别数就只有几千。负采样的技术在3.2节中介绍。

(3)对于每个用户都生成同样数量的训练样本。这种方法可以避免一些观看记录过多的用户对模型产生更大的影响。

(4)打乱搜索记录序列。如果用户刚刚根据某个关键词搜索完视频,接着就去推送相关的视频,用户可能并不感兴趣,因此需要打乱搜索记录序列。

(5)训练数据不使用未来信息。一些协同过滤算法在训练时预测某一次行为,既用到了之前的行为,也用到了之后的行为,如下图(a)所示,空心圆点表示待预测视频,实心圆点表示这条记录之前和之后的观看记录和搜索记录。但是对于短视频或者新闻来说,用户的兴趣可能会发生变化,比如刚开始看的时候,可能会广泛涉猎,随后会慢慢聚焦到某一些主题上去。图(a)的训练方法泄露了用户未来的信息。通过试验证明,只利用待预测行为之前的历史记录做训练效果更好,如图(b)所示。
在这里插入图片描述

3. 算法中的补充知识

3.1 局部敏感哈希(Locality-Sensitive Hashing, LSH)

这里简单介绍一下局部敏感哈希的基本思想。

LSH的基本思想如下:我们首先对原始数据空间中的向量进行hash映射,得到一个hash table,我们希望,原始数据空间中的两个相邻向量通过相同的hash变换后,被映射到同一个桶的概率很大,而不相邻的向量被映射到同一个桶的概率很小。因此,在召回阶段,我们便可以将所有的物品兴趣向量映射到不同的桶内,然后将用户兴趣向量映射到桶内,此时,只需要将用户向量跟该桶内的物品向量求内积即可。这样计算量被大大减小。

这里关键的问题是,如何确定hash-function?在LSH中,合适的hash-function需要满足下面两个条件:

(1)如果d(x,y) ≤ d1, 则h(x) = h(y)的概率至少为p1;
(2)如果d(x,y) ≥ d2, 则h(x) = h(y)的概率至多为p2;

其中d(x,y)表示x和y之间的距离, h(x)和h(y)分别表示对x和y进行hash变换。

满足以上两个条件的hash function称为(d1,d2,p1,p2)-sensitive。而通过一个或多个(d1,d2,p1,p2)-sensitive的hash function对原始数据集合进行hashing生成一个或多个hash table的过程称为Locality-sensitive Hashing。

使用LSH进行对海量数据建立索引(Hash table)并通过索引来进行近似最近邻查找的过程如下:

(1)离线建立索引

a. 选取满足(d1,d2,p1,p2)-sensitive的LSH hash functions;

b. 根据对查找结果的准确率(即相邻的数据被查找到的概率)确定hash table的个数L,每个table内的hash functions的个数K,以及跟LSH hash function自身有关的参数;

c. 将所有数据经过LSH hash function哈希到相应的桶内,构成了一个或多个hash table;

(2)在线查找

a. 将查询数据经过LSH hash function哈希得到相应的桶号;

b. 将桶号中对应的数据取出;(为了保证查找速度,通常只需要取出前2L个数据即可);

c. 计算查询数据与这2L个数据之间的相似度或距离,返回最近邻的数据;

   \;

3.2 Negative Sampling 负采样

前面说到,召回算法需要从百万级的视频库中进行筛选,如果每次都做一个百万类别的分类,计算量非常庞大,因此我们每次只采样几千个负样本。

下面我们介绍word2vec中负采样的方法:

我们想要通过负采样得到 neg 个负例。如果词汇表的大小为 V,那么我们就将一段长度为 1 的线段分成 V 份,每份对应词汇表中的一个词。当然每个词对应的线段长度是不一样的,高频词对应的线段长,低频词对应的线段短(YouTube论文中说到的对样本设置权重应该也是类似的方法)。每个词 w w w的线段长度由下式决定:
l e n ( w ) = c o u n t ( w ) ∑ u ∈ v o c a b c o u n t ( u ) len(w) = \frac{count(w)}{\sum\limits_{u \in vocab} count(u)} len(w)=uvocabcount(u)count(w)
在word2vec中,分子和分母都取了3/4次幂如下:
l e n ( w ) = c o u n t ( w ) 3 / 4 ∑ u ∈ v o c a b c o u n t ( u ) 3 / 4 len(w) = \frac{count(w)^{3/4}}{\sum\limits_{u \in vocab} count(u)^{3/4}} len(w)=uvocabcount(u)3/4count(w)3/4
在采样前,我们将这段长度为 1 的线段划分成 M 等份,这里 M > > V M>>V M>>V,这样可以保证每个词对应的线段都会划分成对应的小块。而 M 份中的每一份都会落在某一个词对应的线段上。在采样的时候,我们只需要从 M 个位置中采样出 neg 个位置就行,此时采样到的每一个位置对应到的线段所属的词就是我们的负例词。
在这里插入图片描述
在word2vec中,M的取值默认为 1 0 8 10^8 108

   \;
   \;

参考文献:

[1] 重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文
[2] 推荐系统遇上深度学习(三十九)-推荐系统中召回策略演进!
[3] 详细解读Youtube推荐算法
[4] 局部敏感哈希(Locality-Sensitive Hashing, LSH)
[5] word2vec原理(三) 基于Negative Sampling的模型
[6] youtube_recall

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值