Deep Neural Networks for YouTube Recommendations

问题

YouTube推荐在以下三个方面有极大的挑战性:

  • 规模大
  • 新的item多
  • 噪声 由于稀疏性和一些无法观测的外部因素,YouTube的历史用户行为是十分难以预测的,而与内容相关的元数据也不能定义一个规整的结构。我们的算法需要足够健壮以应对我们训练数据的这些特性。

系统架构

Deep Neural Networks for YouTube Recommendations
系统中有两个网络,分别用于召回(candidate generation)和排序。
召回网络从用户行为历史中拿到event作为输入,最终从一个巨大的video集中拿到几百个video。这一网络仅通过协同过滤来提供粗糙的个性化。用户之间的相似性通过观看video的id,查询token和一些人口统计学特征来表征。
在调整网络的过程中我们利用了一些离线指标,例如精度、召回、ranking loss等等。我们最终利用了A/B测试,通过观察点击率、video观看时长等指标来证明模型的有效性。

召回

我们将推荐视作一个巨多类别的多分类问题,即给出user UU和上下文CC,从百万量级的video集VV中确定时刻tt的video取值wtw_t
P(wt=iU,C)=eviujVevjuP(w_t = i | U, C) = \frac{e^{v_i u}}{\sum_{j\in V}{e^{v_ju}}}
其中uRNu \in R^N表示(user, context)的高维度embedding,vjRNv_j \in R^N表示每个候选video的embedding。这部分网络的任务就是学习到用户历史和上下文构成的用户embedding uu
尽管YouTube有很多显式反馈,我们还是选择了隐式反馈来训练模型,即用户看完一个video是一个正样本。这种选择有利于我们对于长尾video的推荐。
为有效地对模型进行训练,我们选择了candidate sampling并对权重进行了修正。对每个样本,目标是使正确label和采样到的负类别的交叉熵最小化。

模型结构

Deep Neural Networks for YouTube Recommendations
模型结构如上图所示。对一个固定大小的video集中的每个video,我们学到它的embedding,然后将这些embedding输入一个前馈网络(?)。用户的观看历史用一个变长的video id序列表示,然后再利用这些video的embedding来映射成一个向量表示,我们尝试后发现对这些video的embedding取均值是最好的方法。这些embedding和网络的其他参数一样,通过一个梯度下降后向传播过程来学习。这些特征首先被拼接成一个很长的第一层,然后通过几个全连接ReLU层。

其他各种特征

用户的搜索历史采用了和观看历史相似的处理方法——query被分成字或词的token并进行embedding,然后对token embedding取平均作为搜索历史embedding。人口统计学特征为新用户的推荐提供帮助,其中地域和使用设备等特征进行embedding并拼接输入,性别、年龄、登录状态等特征直接映射为0-1之间的数字进行输入。
“样本年龄”特征:单个样本的流行程度分布是不稳定的,然而我们模型输出的video集的多项分布能够反映在训练时间窗内的平均watch likelihood(?)。为对此进行纠正,我们在训练期间把样本的“年龄”作为一个特征喂给网络。在线上服务中这个值设置为0或者一个负的小数,表示预测的时间在训练时间窗的最末。

标签和context选择

值得强调的是,推荐系统的通常做法是把推荐转化为替代问题,然后把结果转换为特定的context。一个经典的例子就是精确地预测出分数能够更加有效地推荐电影。我们发现这种选择在AB测试时表现优秀,然而在离线实验时很难去评估它。
训练样本是从所有的YouTube用户中产生的,而不只是我们有过推荐的用户,否则新内容将会很难被发掘出来。如果用户在通过推荐之外的方式看视频,我们希望能够通过协同过滤来传播这一发现。另一个重要发现是,为每个用户生成固定数量的训练样本,在loss中有效地使用户权重相等,能够有效地提升推荐效果。这样做能够防止一小撮高度活跃用户对loss造成干扰。
此外需要格外注意给分类器提供的信息以防止模型在替代问题上过拟合。举例来说,如果一个用户刚刚搜索过Taylor Swift,由于我们的推荐问题被转换为了预测下一个会被观看的视频,那么Taylor Swift相关的搜索结果页的视频就会出现在推荐结果里,然后用户就会对他刚搜索过的东西不感冒。通过取消query中的序列信息,将query表示为没有顺序的token,分类器就不会直接学习到label。