(1)精读谷歌的这篇paper《Deep Neural Networks for YouTube Recommendations》
(2)王喆老师的YouTube深度学习推荐系统的十大工程问题
YouTube 平台中几乎所有的视频都来自 UGC(User Generated Content,用户原创内容),其内容产生模式特点:
为了对海量的视频进行快速、准确的排序,YouTube 也采用了经典的召回层 + 排序层的推荐系统架构(两层都使用了深度学习方法)。其推荐过程分为两级:
(1)最底层
是它的输入层,输入的特征包括用户历史观看视频的 Embedding 向量,以及搜索词的 Embedding 向量。对于这些 Embedding 特征,YouTube 是利用用户的观看序列和搜索序列,采用了类似 Item2vec 的预训练方式生成的。
PS:也可以采用 Embedding 跟模型在一起 End2End 训练的方式来训练模型。注意预训练和 End2End 训练这两种方式的区别。
除了视频和搜索词 Embedding 向量,特征向量中还包括用户的地理位置 Embedding、年龄、性别等特征。这里我们需要注意的是,对于样本年龄这个特征,YouTube 不仅使用了原始特征值,还把经过平方处理的特征值也作为一个新的特征输入模型。
该操作是为了挖掘特征非线性的特性,当然,这种对连续型特征的处理方式不仅限于平方,其他诸如开方、Log、指数等操作都可以用于挖掘特征的非线性特性。具体使用哪个,需要我们根据实际的效果而定。
(2)确定好了特征,跟我们之前实践过的深度学习模型一样,这些特征会在 concat 层中连接起来,输入到上层的 ReLU 神经网络进行训练。
(3)三层 ReLU 神经网络过后,YouTube 又使用了 softmax 函数作为输出层。注意这里的输出层不是要预测用户会不会点击这个视频,而是要预测用户会点击哪个视频,这就跟我们之前实现过的深度推荐模型不一样了。
比如说,YouTube 上有 100 万个视频,因为输出层要预测用户会点击哪个视频,所以这里的 sofmax 就有 100 万个输出。因此,这个候选集生成模型的最终输出,就是一个在所有候选视频上的概率分布。为什么要这么做呢?它其实是为了更好、更快地进行线上服务。
小结:YouTube 推荐系统的候选集生成模型,是一个标准的利用了 Embedding 预训练特征的深度推荐模型,它遵循我们之前实现的 Embedding MLP 模型的架构,只是在最后的输出层有所区别。
为什么候选集生成模型不用“用户是否点击视频”label作为预测目标,而是使用“视频ID”label?
原因:和候选集生成模型的线上服务方式有关。刚才上图中的最上部分:
架构图左上角的模型服务(Serving)方法与模型训练方法完全不同。在候选集生成模型的线上服务过程中,YouTube 并没有直接采用训练时的模型进行预测,而是采用了一种最近邻搜索的方法:
在模型服务过程中,网络结构比较复杂,如果我们对每次推荐请求都端到端地运行一遍模型,处理一遍候选集,那模型的参数数量就会巨大,整个推断过程的开销也会非常大。
在通过“候选集生成模型”得到用户和视频的 Embedding 后,我们再通过 Embedding 最近邻搜索的方法(如局部敏感哈希LSH),就可以提高模型服务的效率了。这样就不用把模型推断的逻辑搬上服务器,只需要将用户 Embedding 和视频 Embedding 存到特征数据库就行了。
【视频embedding向量】
架构图中从 softmax 向模型服务模块画了个箭头,用于代表视频 Embedding 向量的生成。由于最后的输出层是 softmax,而这个softmax 层的参数本质上就是一个 m x n 维的矩阵:
【用户embedding向量】
用户 Embedding 的生成就非常好理解了,因为输入的特征向量全部都是用户相关的特征,一个物品和场景特征都没有,所以在使用某用户 u 的特征向量作为模型输入时,最后一层 ReLU 层的输出向量就可以当作该用户 u 的 Embedding 向量。
然后将视频embedding和用户embedding预存到线上的特征数据库中,在预测某用户的视频候选集时:
(1)YouTube 要先从特征数据库中拿到该用户的 Embedding 向量;
(2)再在视频 Embedding 向量空间中,利用局部敏感哈希等方法搜索该用户 Embedding 向量的 K 近邻,这样就可以快速得到 k 个候选视频集合。
YouTube的深度学习排序模型的架构如下图,基本模型还是embedding+MLP,重点关注输入层和输出层的部分。经过召回层的粗筛,排序层可以引入更多特征进行精排,
上图中YouTube 的输入层从左至右引入的特征依次是:
第 4 个特征和第 5 个特征,很好地引入了 YouTube 工程师对用户行为的观察:
最后:把这 5 类特征连接起来之后,需要再经过三层 ReLU 网络进行充分的特征交叉,然后就到了输出层。
注意,排序模型的输出层与候选集生成模型又有所不同。
不同主要有两点:
原因:YouTube 想要更精确地预测用户的观看时长,因为观看时长才是 YouTube 最看中的商业指标,而使用 Weighted LR 作为输出层,就可以实现这样的目标。具体的做法:
在 Weighted LR 的训练中,我们需要为每个样本设置一个权重,权重的大小,代表了这个样本的重要程度。为了能够预估观看时长,YouTube 将正样本的权重设置为用户观看这个视频的时长,然后再用 Weighted LR 进行训练,就可以让模型学到用户观看时长的信息。
这是因为观看时长长的样本更加重要,严格一点来说,就是观看时长长的样本被模型预测的为正样本的概率更高,这个概率与观看时长成正比,这就是使用 Weighted LR 来学习观看时长信息的基本原理。
候选集生成模型是可以直接利用用户 Embedding 和视频 Embedding 进行快速最近邻搜索的。但是排序层就不可以这么做了。
YouTube 的排序模型和候选集生成模型,都使用了平均池化这一操作,来把用户的历史观看视频整合起来。你能想到更好的方法来改进这个操作吗?
【答】
(1)在召回层,对用户历史观看的序列,按照时间衰减因子,对用户观看emb序列进行加权求平均,加强最近观看视频的影响力
(2)在排序层,可以加入注意力机制,类似DIN模型中,计算候选emb与用户行为序列中视频emb的权重,然后在进行加权求平均,得到用户行为序列的emb
(1)id做输入再embedding vs. 预训练embedding:
(2)用户向量做一层wx+b怎么就得到某个视频的embedding了
【答】最后一层是多分类,预测哪个物品id被观看的概率最高。所以相当于先WX+b, X是用户向量,W是m*n的矩阵(m是总视频数,n是用户embedding的纬度)。然后再把结果放入softmax中正则化得每个物品的观看概率。而大矩阵W的每一行(wi)刚好对应一个物品,所以可以被当做物品embedding。
(3)之前讲emb近邻搜索,需要用户emb和物品emb在同一向量空间。那么在召回层relu中提取的用户emb和softmax提取的物品emb,是在同一向量空间的,为什么?
【答】relu隐藏层的输出是用户向量,正好是softmax层的输入x,根据前向计算wi*x+b算得到了物品i 节点值,这里的wi也就能代表物品向量了,也就是说由用户向量参与计算生成了最后的物品向量,跟我们前面利用电影向量 sum pooling出用户向量逻辑一致。所以他们在同一向量空间。
(1)https://github.com/wzhe06/Reco-papers
(2)《深度学习推荐系统实战》,王喆