Funrec读书笔记3️⃣:基于向量的召回(含YoutubeDNN)

87 阅读9分钟

前面介绍的协同过滤和矩阵分解存在的劣势就是仅利用了用户与物品相互行为信息进行推荐, 忽视了用户自身特征, 物品自身特征以及上下文信息等,导致生成的结果往往会比较片面。

FM召回

FM - 资源多的时候并不常见但是易于上手,并且完全可以用于召回、粗排和精排;FM召回的主流作法,是用生成的user embedding直接查找最相近的item embedding。 首先FM遇到的问题是:在完成独热编码的整理过后,每个物品的特征向量都会非常的稀疏;并且独热编码的特征空间非常大;同时,在观察大量的样本数据后可以发现,某些特征经过关联之后,与label之间的相关性就会提高。(这里的特征既包括用户特征也包含物品特征)

image.png

观察此公式可以得知:如果x_i为0,那么他的所有交叉特征其实也都为0; 在训练过程中,实际上二次项参数的训练是非常困难的。其原因是每个参数W_ij都需要大量的 x_i和Y_j的非零样本,但是样本本来就是稀疏的,所以很难进行训练。 引入矩阵分解的概念,对于每个特征都引入一个隐向量,把W_ij变为<Vi,Vj>的点乘,这样的话只要用到该特征那么就可以学习该隐向量

image.png

更重要的是,通过化简,可以将推理和训练的复杂度都简化为O(kn),其中n为特征数量。 之后,FFM引入了Field的概念,但是时间复杂度升至O(n^2)

FM优点: 1. 可以看到打分拆解到哪个特征和特征组合上,非常白盒 2. 性能尚可,对于单个特征,以及多个特征的embedding交叉,能够自动挖掘长尾 3. 便于上线,O(n)的时间复杂度非常好用;如果说有些应用无法实时更新用户embedding,那么FM只需要把一系列的特征Embedding相加就可以用作用户变化的Embedding用于召回

Item2Vec

Word2Vec

语言学基础:“一个单词的意义由它周围的单词决定”,引入上下文的概念,不断调整单词的embedding表示。其中有两个训练方式,通过上下文预测中心词(CBOW),通过中心词预测上下文(skip-gram),并提升条件概率。

在计算Embedding的时候,使用softmax的负采样技术:最大化正样本和目标的相似度的同时,随机采样k个负样本,最小化负样本与目标的相似度; 以下为负采样softmax的损失函数:

image.png

两向量的点积越大,则表示两向量的语义越相似;

Item2Vec

基于skip-gram模型的物品向量训练方法的改进:基于物品集合做物品向量的训练 , 因此物品向量无空间时间信息。 只考虑这个集合内的商品是非常相似的,对于其他并不关心。同一集合的商品作为正样本,不同集合的商品作为负样本进行embedding的训练。目标函数如下:

image.png

在训练过后,每个物品会有两个不同表示(作为中心词和作为上下文词): 可用表示情况:只使用中心词embedding;两者相加的embedding;两者拼接起来(concat,维度加倍)

YoutubeDNN

主要针对的三大挑战:

a.scale规模问题:视频数量非常庞大,大规模数据下需要分布式学习算法以及高效的线上服务系统,线下训练 - 负采样;线上 - hash映射,然后近邻检索的方式来满足实时性的需求。b. Freshness新鲜度问题:Youtube的视频是一个动态的,用户实时上传并访问,那么最新的视频应该有偏好 - 策略中加入"example age"。 c. Noise噪声问题:数据比较稀疏等原因,需要推荐系统变得鲁棒一点 - 召回考虑更多实际因素,比如非对称消费特性,高活用户因素,时间因素,序列因素等,并采取了相应的措施,而排序上做更加细致的特征工程。

YoutubeDNN推荐系统架构

image.png 系统主要由两大部分组成:召回和排序。召回的目的是根据用户部分特征,从海量物品库,快速找到小部分用户潜在感兴趣的物品交给精排,重点强调块,精排主要是融入更多特征,使用复杂模型,来做个性化推荐,强调准。

  1. 召回侧的输入一般是用户的点击历史,还有一些人口统计学特征,而召回的输出一般是该用户相关的一个候选视频集合,量级一般为几百。两大类召回方式:a.策略规则 b.监督模型+embedding;其中策略规则往往和真实场景的业务理解有关;后面模型+embedding是一种普适方法
  2. 一般运用:特征工准确模型设计以及训练方法让精排更加精准

YoutubeDNN召回模型细节剖析

召回模型目的是在大量Youtube视频中检索出数百个和用户相关的视频来。 时刻t下,用户U在背景C下对每个视频i的观看行为建模成下面的公式:

image.png

v表示视频向量,u表示用户向量。真实含义是用户对于视频i的相似程度 ➗ 用户对所有视频的相似程度。 召回模型任务:用户的历史点击和上下文特征 -> 用户的表示向量u和视频的表示向量vi;

YoutubeDNN召回模型结构

image.png

输入:用户侧特征(观看历史,搜索历史,人文特征); 观看历史里每个id对应一个embedding(Word2Vec),再进行融合(average pooling,每一个维求平均得到一个最终向量);论文中使用最近50次搜索历史token,embedding维度是256维,采用average pool。 用户人文特征:离散型的使用labelEncoder,embbedding转成低维稠密,而连续型特征,一般是先归一化操作,然后直接输入。(连续型可以加入更多非线性) YoutubeDNN有一个比较特色的特征:example age 以上所有特征处理好了之后拼接起来成为非常长的向量,通过DNN(深度神经网络),然后做多分类问题,求损失。

模型训练好之后,用户向量和item向量在哪里取?

  1. 用户向量:其实就是全连接的DNN网络的输出向量,其实即使没有全连接,原始的用户各个特征拼接起来的那个长向量也能用,不过维度太大了,所以这里DNN的作用是特征交叉和降维
  2. item向量:每个item其实用两个embedding矩阵(作为中心词W and 作为上下文W')YoutubeDNN最终从这个矩阵里面拿item向量,这里的softmax使用全局随机选择负例。

训练数据的选取和生成

训练样本来源于全部的YouTube观看记录,而不仅仅是被推荐的观看记录,否则对于新视频会难以被曝光,会使最终推荐结果有偏;其次新联数据来源于用户的隐式数据,且看完的视频作为正样本;

经验:训练数据中对于每个用户选取相同样本;避免让模型知道不该知道的信息。

如果数据比较少,那么就可以使用滑动窗口生成多个训练样本(类似CBOW),但是不同点是只使用更早时间的用户行为,防止信息泄漏

“Example Age”特征

背景:视频有明显的生命周期,例如刚上传的视频比之后更受欢迎,也就是用户往往喜欢看最新的东西,不论它是不是和用户相关,所以视频的流行度随着时间的分布是高度非稳态变化的,但是我们预测的倾向于预测平均播放概率。

所以引入Example age = t_max - t,其中t_max是训练数据中所有样本的时间最大值(或当前时间),t为当前样本的时间。线上预测时,直接把example age全部设为0或者一个小的负值,这样就不依赖于各个视频呢的上传时间了。

传统的时间bias是video bias

image.png 其实这两种定义是等价的,但是Example age有两个好处:

  1. 线上预测时Example age是常数值,所有item可以设置成统一的。
  2. 对不同的视频,对应的Example age所在范围一致,只以来训练数据选取的时间跨度,便于归一化操作。

实验结果

  1. DNN的层数,层数越多越好,但是超过4层之后提升有限
  2. 作者这里还启发了一个事情, 从"双塔"的角度再看YouTubeDNN召回模型, 这里的DNN个结构,其实就是一个用户塔, 输入用户的特征,最终通过DNN,编码出了用户的embedding向量。

而得到用户embedding向量到后面做softmax那块,不是说了会经过一个item embedding矩阵吗? 其实这个矩阵也可以用一个item塔来实现, 和用户embedding计算的方式类似, 首先各个item通过一个物品塔(输入是item 特征, 输出是item embedding),这样其实也能得到每个item的embedding,然后做多分类或者是二分类等。 所以YouTubeDNN召回模型本质上还是双塔结构, 只不过上面图里面只体现了用户塔。

线上服务

采用最近邻搜索的方法去完成topK推荐

image.png

总结(背)

召回部分:

  1. 训练数据的样本来源应该是全部物料,而不仅仅是被推荐的物料,否则对于新物料难以曝光
  2. 训练数据中对于每个用户选取相同的样本数,保证用户在损失函数等权重(考虑到打压高活用户或者高活item的影响)
  3. 序列无序化:用户的最近一次搜索和搜索之后的播放行为有很强关联,为了避免信息泄露,将搜索行为顺序打乱
  4. 训练数据构造:预测接下来播放只使用目标前的历史信息
  5. 召回模型中,input embedding和output embedding两组并不共享。其中input时word2vec提前训好的。
  6. 召回模型的用户embedding来自网络输出,而video的embedding往往用后面output的
  7. 使用example age特征处理time bias,这样线上检索时可以预先计算好用户向量。

参考资料:Funrec, 石塔西《FM:推荐算法中的瑞士军刀》,美团技术博客《深入FFM原理与实践》,