《Deep Neural Networks for YouTube Recommendations》 -2016 RecSys-论文阅读

这是Google16年在RecSys大会上发表的一篇深度学习在youTube视频推荐上应用的论文,原文地址 点这里

本文主要专注在候选集生产网络的网络架构,如何负采样,如何训练视频的embedding,网络中的u的含义,最终网络学习到的是什么


论文里提到的洞察、还有youtube视频推荐算法考虑了哪些方面的问题等可自行阅读论文或下面的链接 用深度学习(DNN)构建推荐系统 - Deep Neural Networks for YouTube Recommendations论文精读


系统介绍

整个推荐系统包括了两个神经网络:候选集生成网络、排序网络。

对于每个用户,该算法先通过候选集生成网络从海量的视频库里选出几百个视频,然后通过排序网络从这几百个视频里,选择出最终推荐给用户的视频。

两阶段方法的好处:使得该算法可以适应大规模的数据,第一层候选网络的压力也没那么大,这样只需要不多的特征就可以完成候选任务,降低算法计算。在第二层,还可以利用以前的算法积累的经验和特征,用来精准的排序。


候选集生成网络

此处通过浅层网络来模拟矩阵分解算法,从这个角度,可以将候选集生成网络看成是一个泛化的非线性矩阵分解模型。

这里将候选集生成问题看成了一个极限的多分类的预测问题,视频库里的每个视频都是一个类别。

网络架构

这个网络采用塔型结构,特征先输入宽的第一层,后面全连接了多层的ReLU层,每层的ReLU单元数量减半。最后一层是256个ReLU,来连接256维的softmax。

训练时最后一层ReLU的结果是一个256维的用户向量u,训练时连接softmax分类器。上亿个视频向量V与u进行softmax计算,输出每个视频的可能性。按照可能性排序,选择前topN作为候选集。

softmax预测可能性的公式:

其中u代表了一个高维的用户、上下文信息的embedding向量,vj代表视频库里的每个视频id的embedding向量。公式计算结果表示基于上下文C,用户U最终在t时间看的一个视频wt是视频库里的视频i的可能性。

这个候选集网络是参考了Word2vec里的CBOW模型。CBOW模型结构如下:

负采样下的CBOW模型的理解可以参考 word2vec 中的数学原理详解(五)基于 Negative Sampling 的模型 - CSDN博客

这里参考一下 tesorflow wor2vec的skip-gram model的实现里的loss计算 word2vec_basic.py

这里的nce loss的计算参考 Tensorflow 的NCE-Loss的实现和word2vec - 简书

这两个看完,对cbow理解基本解决了。

cbow中间只有一层,中间层的输出是Xw,youtube在此基础上多加了几层。且输入不仅仅只有context的视频的embedding的均值,还包含了用户的context信息的embedding(这里的embedding可以提前训练好),视频年龄等特征

下面从cbow过渡到youtube,理解里面的细节

广义上,这里的u可以理解成cbow中的Xw,cbow中的theta参数就是视频的embedding。word2vec_basic.py里是单独申请的权重变量,这里视频的embedding和最后一层的参数是同一个。

注意:代码里为了实现视频的embedding和最后一层的nce权重参数是同一个,同时更新,采取了2个操作:
1,将输入的embedding在申请变量的时候,设置成不可训练,即不会加到optimizer的参数列表里,因此后向传播时不会被求梯度然后被更新,但是最后一层的NCE-权重参数会被更新
2,将更新的NCE-权重(其实是真正的视频embedding)重新赋值给输入的embedding变量。


以上就是对候选集生成网络的架构的理解。

正负样本的选取

  • 完成了某个视频,则该视频就是正样本。这里没有选择用户对推荐结果的显式反馈(比如用户对已推荐的视频的点赞行为)作为正样本,之所以没有这样,是因为隐式反馈(比如看完了某个视频)在量级上更高,显式反馈数据稀疏并且长尾效果不好。通俗地讲,就是一个用户历史记录里看完了某个视频这样的行为可能要比点赞的行为更多。

  • 正样本以外的就是负样本,但是为了加速计算,这里负样本使用了基于背景权重分布的采样方式获得

输入特征

1用户的观看历史、2用户的搜索历史、3用户的地理特征、4设备类型、5用户性别、6年龄、7登录状态、8样本年龄

12采用平均的embedding,34采用简单的embedding,567归一化到[0,1]就行。

12各自最多选择50个,然后作embedding,然后平均,集成为一个观看向量/搜索向量作为输入特征。

  • 8样本年龄的设计

    第一,YouTube每秒都会上传巨大量的视频,所以新的视频也能被推荐至关重要。第二,发现用户喜欢点击新上传的视频,即使这些视频在内容上跟用户偏好关系不大。此外,简单地将用户喜欢的新的视频放在推荐位置的前面,这对于内容的病毒性传播现象是关键的。

    机器学习系统通常是利用用户历史记录预测未来的行为,也就是在训练时样本的年龄是被看成平均分布的,为了纠正这个问题,训练时将样本年龄作为一个训练特征加入。在上线时,把训练阶段上传的视频的所有样本年龄设置成0或者很小的非负值。

图中显示,加入了样本年龄,样本年龄在0+附近预测出的可能性最高,10天以后的基本保持稳定。这样的效果符合原本设计。

  • 1用户观看历史的设计

    a. 训练样本是YouTube所有的视频(包括嵌在YouTube里其他网站的视频),而不只是推荐槽位上出现的视频。

    这样选择的原因是只选择推荐结果里的视频泛化性不好、对于视频的爆炸性传播现象(如果大量用户火热的观看了一个视频,我们希望这个视频能够通过协同过滤快速的传播出去)适应性不好(通过非推荐槽位的其他方法看到的视频不能很好的爆炸性传播)。

    b. 更一个关键的洞察:每个用户选择统一大小的训练集,平衡冷热用户对loss函数的影响。

    c. 用户消费的非对称问题:用户对于同系列的视频消费多,或者比起冷门音乐人的视频,用户通常会先看流行的音乐人的视频。所以预测用户可能观看的下一个视频要比随机的预测可能会看的视频会取得更好的效果。通常的协同过滤算法是随机选取一个样本和这个样本的上下文,然后利用其他所有的历史记录来预测。这显然忽略了非对称问题。所以这里,先随机选择一个视频,然后只选择它之前的历史记录作为输入。

  • 2用户搜索历史的设计

    a. 为了防止过拟合,比如一个用户刚搜索了一个词,推荐结果就变成了这个词相关的视频。这里先打乱用户历史搜索词,然后做embedding。

    b. 采用同样的方式处理用户非对称消费问题。

评估

增加特征个数会有更好的效果,神经网络的层数增加到4层效果提升已经不明显了。


排序网络

排序的目标,是为了预测用户对每个视频的观看时间。

之所以不预测点击率然后排序取topN,是因为存在clickbiat(点击行为提高了那些只点了而未观看的伪视频的可能性)。

正负样本选择

在推荐槽位上用户点击了的作为正样本,推荐槽位上未点击的作为负样本。

特征处理

排序的时候通常使用几百个特征。

  • 输入特征

    后续附上

  • 离散特征的embedding

    后续附上

  • 连续特征的归一化

    采用累计分位点的方法进行归一化。

  • 衍生特征

    加入某些特征的次线性和超线性项作为输入特征: x^0.5、x^2

网络架构

神经网络的架构与候选集生成网络相似。

训练时最后一层ReLU的结果是一个256维的向量W,连接带权重的logistic层。正样本的权重设置为观看时间,负样本的权重设置为单位值。logistic层使用W和视频向量Vj,赋上权重,logistic层输出层是一个时间的预测值的Sigmoid值。

在线上时,采用e^(Wx+b)。至于原因,是因为正样本量很小时,有以下成立:

损失函数及参数更新

后续附上

评估

对于第二天的推荐结果里,先用模型计算出一个观看时间,如果负样本(用户没点击)收到了比正样本(用户点击了的)一个更高的分数,则正样本的预测时间计为预测错误时间。

loss = 预测错误的时间/总的预测时间

次线性和超线性加入后提升不高。

有权重的LR是有必要的。

0 Comments