DNN for YouTube Recommendations

这是一篇将深度学习应用到推荐系统的论文,比较早,是YouTube提出了做视频推荐的。

Deep Neural Networks for YouTube Recommendations

Abstract

YouTube代表了世界上现有的最大规模、最复杂的工业推荐系统。这篇文章阐述了深度学习在推荐系统中带来的巨大性能提升。本文根据经典的信息检索二分法分为两部分:描述了一个深度候选生成模型,和一个分离的深度排名模型

Introduction

Youtube是世界上最大的视频分享、创造平台。他的推荐系统帮助10亿用户发现个性化的内容。本文着重介绍深度学习的作用。图1是YouTube移动端的示意图。

推荐视频的三个挑战是:(好好好,你家网站天下第一大)

  • scale:YouTube大量的用户和视频库需要一个高度专业化的分布式学习算法。
  • freshness: YouTube是个动态视频库,每秒都会有大量视频上传。因此推荐系统必须能够根据新上传的视频内容和用户最新行为来进行建模,平衡新老视频的综合推荐。
  • noise历史用户的行为是很难预测的,因为:1.稀疏性。2.无法观察到的外部因素。我们很难得到用户的满意度的groundtruth。另外,内容的元数据也不能很好的结构化(不知道什么意思)。因此算法必须对训练数据鲁棒。

本文的算法是在TensorFlow的框架上实现的,它提供了一个灵活的、大规模的分布式训练的深度网络架构。

以前的方法:

  • 矩阵分解(matrix factorization)方法:协同过滤。很少用深度学习的内容。
  • 协同过滤+深度神经网络+自编码器

本文的结构:

  • Section 2:简单的系统概述
  • Section 3:候选生成模型,实验结果
  • Section 4:排序模型,逻辑斯底回归用来训练模型并预测期望的观看时间而不是点击率。
  • Section 5:结论

System Overview

如图2:

这个系统包含两个网络:

  • candidate generation
  • ranking

candidate generation

​ 该网络将用户的历史活动作为输入,并且从一个大的视频库里面得到一个小的数据集

  • 候选集和用户的相关性:该网络使用协同过滤来提供广泛的个性化,具有高精准度。
  • 用户之间相似性:可以通过粗粒度的特征来表达,比如视频观看的ID,搜索查询单词,人口特征统计。

ranking network:

​ 候选的重要性:推荐列表中需要一种良好的特征,在具有高召回率的候选集中区分相对的重要性。排名网络通过使用一个描述视频与用户的特征集合的期望目标函数来给每个视频打分,从而完成排名的任务。根据它们的得分,然后将最高分的视频展现给用户。

在开发过程中,使用了离线的指标(准确度、召回率、ranking loss)来引导我们的系统的迭代改进。然而,为了最终测定一个算法或模型的效果,我们依靠于通过实时实验进行A/B测试。在一个实时实验中,我们能度量在点击率、观看时间与许多度量用户参与度的指标中不易察觉的变化。这是非常重要的,因为实时A/B测试结果不总是与离线实验有相关性。

Candidate Generation

这个阶段主要是从海量的YouTube视频库里面将与用户相关的视频挑选出了形成候选集合,大概几百个的样子。前人的方法是使用矩阵因式分解的方法,并对排序损失进行训练。在我们神经网络的前期迭代中,我们使用浅层的神经网络模拟了因式分解的(factorization)行为。从这个角度来看,我们的方法就行使因式分解的非线性生成方法。

Recommendation as Classification

将推荐问题转换成一个分类问题:
$$
P(w_t=i|U,C)=\frac{e^{v_iu}}{\sum_{j\in V}e^{v_ju}}
$$
用户$U$在场景$C$下,将用户看的一个视频$w_t$预测成视频$i$的概率。

其中,$u\in\textbf{R}^N$代表了一个高维的(用户,场景)的embedding,$v_j\in \textbf{R}^N$代表每个候选视频的embedding。embedding在此处表示将稀疏实体(比如video,user)映射到$\textbf{R}^N$空间的密集向量。

​ 这个深度神经网络的任务是基于用户的历史及场景,学习一个用户向量$u$的映射函数(embedding),通过一个softmax分类器,u能够有效的从视频语料库中识别视频的类别(也就是推荐的结果)。

Efficient Extreme Multiclass

为了能够有效的训练百万种类别,我们依赖一种采样方法:能够在背景分布中采样出负样本,然后通过重要性衡量来修正采样。对于每一个样本,我们只对正类和采样出来的负类来最小化交叉熵损失。实际操作中,采样了几千个负样本,对应的速度比传统softmax快了100倍,但是没能达到可比的精确度。在层次化的softmax中,遍历树中的每个节点涉及到通常不相关的类集,这使得分类问题变得更加困难,并且降低了性能。

​ 在serving time,需要计算出最可能的$N$个类别,以便从中选出top $N$个呈现给用户。

Model Architecture

受连续bag of words模型的启发,我们为每个video都学习了高维的embedding—-即是一个固定的词,并把这些embedding送入到神经网络中。一个用户的观看历史由稀疏的视频ID的可变长度序列表示,通过embedding映射到密集的矢量表示。

该网络要求输入固定大小的密集输入,并且是简单的将几种策略中embedding效果最好的几个进行简单的平均(sum,component-wise,max等)。最重要的是,embedding的参数是和其他模型一起联合学习得到的,通过梯度下降后向传播来更新。将特征简单的拼接起来送入到第一层网络,然后接着是几层全连接的ReLU.图3显示了网络结构。

Heterogeneous Signals

使用DNN来实现矩阵因式分解的泛化表示的好处是,任意连续的或者离散的特征都能很容易的加进这个网络中。搜索历史和观看历史同样处理—–每一个查询都能被标记成单word,双word,而且每个标记都被embedded了。一旦平均过后,用户的标记过的、embedded的查询都会代表了一个经过归纳的、密集的搜索历史。(不懂。。。。。啥意思。。。。。)人口统计学特征对提供先验来说也是很重要的,这样推荐系统对于新用户来说,推荐的东西也很合理。用户的地理区域和设备也被embedded和concatenated了。用户的性别、登录状态、和年龄等这些二进制的连续特征(为毛是连续的????)被归一化到0-1之间,直接输入到网络中。

总结起来就是:用到了如下几种特征:

  1. 历史搜索query:把历史搜索的query分词后的token的embedding向量进行加权平均,能够反映用户的整体搜索历史状态。
  2. 人口统计学信息:性别,年龄,地域等
  3. 其他上下文信息:设备、登录状态等

example age feature(视频上传时间特征)

视频网站的时效性很重要。每秒钟都会有大量新鲜视频上传到YouTube上。将这些新上传的视频推荐给用户是很重要的。因为对于用户来说,哪怕不相关,他们也会更倾向于更新的视频。

因为机器学习在训练阶段都是使用过去的行为来预测未来,因此预测结果对于过去的行为总会有个隐含的bias。视频热度的分布是高度非静态的,但是我们推荐系统产生的视频库上的视频分布,基本能够反应在训练阶段几星期内的平均观看的喜好。为了修正bias,我们将训练样本的时间特征(age)作为一个特征输入到训练中。在serving阶段,这个特征被置为0(或者是很小的负数),表示我们正在训练刚结束时做预测。

图4表示我们的方法在随便选的一个视频上呈现的效果。

Label and Context Selection

要强调的是,推荐问题常常涉及到解决一个代理问题并将结果转换到特定场景下。一个典型例子就是:如果能够准确的预估电影的评分,那么就能使得电影推荐更加有效。我们发现,这个代理学习问题对于A/B测试集上的性能有非常大的重要性,但是衡量离线实验也很困难。

  • 训练样本从整个YouTube测观看视频中产生,而不是仅仅使用推荐场景的数据。
  • 为每个用户产生一个固定数目的训练样本,可以有效的在损失函数中平等的权衡用户。避免了被少数高度活跃的用户主导了训练损失。
  • 有时候和直觉相反,我们需要特别小心的保留从分类器得到的信息,防止模型过度挖掘网站的结构信息从而导致过拟合。假设一个例子,一个检索为“泰勒斯威夫特”。我们的问题是预测用户下一个观看的视频回事哪个,于是分类器给出的预测是,最可能观看的视频是,出现在对应搜索页的泰勒斯威夫特的视频。但是,重现用户的上一次搜索来作为推荐结果是很糟糕的。因此我们需要丢弃掉序列信息,将搜索查询表示为一个无序的标签集,这样分类器就能够忘记原来的标签是什么了。
  • 不对称浏览问题:一般视频的消费模式会导致用户首先发现最流行的视频,然后才会在感兴趣的类别中逐渐查找细分的视频。如图5,(a)中,许多协同过滤系统选择标签和上下文的方式就是,拿出一个随机的item,然后从用户历史中的其他item来预测他。这种方式丢失了未来的信息,并且忽略了不对称浏览模式。(b)中,我们将用户的观看历史反卷起来,选择随机的一个观看视频,只输入在这之前的用户行为。在A/B测试集上,图(b)的效果更好。

Experiments with Features and Depth

如图6,增加特征和网络深度能够极大提升holdout数据上的精准度。网络深度增加到第四层时,精度提高就不明显了。

实验中,1M的视频和1M的搜索标签都被embedded到256维的向量中,每一个bag中都是一半的观看加一半的最近搜索。softmax层是输出一个256维的多元分布。

网络结构像Tower形状,底层最宽,然后慢慢变窄。并且网络层的深度慢慢增加。

RANKING

ranking阶段是对用户观看视频的喜好程度进行精确的估计。该阶段,我们能够得到更丰富的视频描述信息,以及用户和这些视频的关系,因为这时候我们通过candidate generation得到了只有几百个候选视频。举个例子:虽然用户非常喜欢某个视频,但是因为主页的缩略图选择不当,就不会点击观看了。

另外,ranking可以将不可比较的不同来源的候选视频,进行有效的ensemble。

如图7,我们使用类似candidate generation网络的DNN来给每个视频打分,使用logisitic回归。然后这些视频通过分数进行排序,最后反馈给用户。

在目标函数的设定方面,单纯CTR指标是有迷惑性的,有些靠关键词吸引用户高点击的视频未必能够被播放。因此设定的目标基本与期望的观看时长相关,具体的目标调整则根据线上的A/B进行调整。

Feature Representation

Feature Engineering

深度学习在推荐系统和图像、nlp中的应用的最大不同是:后两者都能实现端到端训练,不需要人工特征工程。而推荐场景中,虽说深度学习能够缓解人工特征工程的负担,但是我们很难将原始数据喂给前馈神经网络,因此特征工程依旧十分重要

在ranking模型中,我们通常使用几百个特征,根据离散或者连续进行划分。特征工程中最麻烦的,就是将用户和视频数据转换成有用的特征。即:将用户行为表示为一个临时序列,以及如何给这些行为和视频之间的联系打分。

我们发现,最重要的signal就是那些描述用户和item之间以往交互的信息。比如,用户之前在某频道的观看历史,包括,他在这个网站看了多少视频?上一次什么时候看的这个主题的视频?这类signal。这和Facebook在2014年提出的LR+GBDT模型Practical Lessons from Predicting Clicks on Ads at Facebook得到的结论一致。

这些连续特征能够很有力的描述用户过去的行为和item之间的联系,因为这些特征能够在完全不同的item之间泛化。另外,将candidate generation阶段得到的信息传递给ranking阶段同样很关键,比如,哪些视频源主导了候选集?他们得分是多少?

如果一个用户没有观看他被推荐的视频,那么这个视频在下一次加载中就会被降级,类似于负样本信号。

Embedding Categorical Features

和candidate generation一样,我们使用embedding来将稀疏的离散特征映射到dense representation,每个独特的ID space(vocabulary)都有一个和维度相关的embedding。在训练之前将数据过一遍就能建立一个简单的查找表。那些基数特别大的ID space比如video的ID或者搜索项,只取基于点击量打分后的前N个,其余embedded到0.而在candidate generation中,多种离散特征都被平均了。

重要的一点是,离散特征有很多是共享的。比如视频ID,在多种不同的特征中使用的是一样的。尽管共享embedding,每个特征都是分别喂给神经网络的这样神经网络层才能学习到不同的特定的特征表达。 共享embedding的好处是:1.提高了范化能力。2.加速训练。3.减少内存需要。模型参数中数量最多的就是那些高基数的embedding的space,比如,百万数量级的ID被embedded到32维的空间,他们的参数就比2048元的全连接层的参数多7倍。

Normalizing Continuous Features

神经网络对于输入的范围和分布特别敏感,而ensemble的方法比如决策树对于独立特征的scaling就invariant。(GBDT,RF).所以连续特征的归一化对于收敛显得非常重要。

使用积分分布:
$$
\tilde{x}=\int_{-\infty}^xdf
$$
计算时,使用线性插值计算,累计分为点,将值scale到【0-1】之间。

另外也可算使用$\tilde{x}^2$和$\sqrt{\tilde{x}}$作为输入,可以给网络学习到更具表达力的次线性和超线性函数(sub-linear,super-linear)。

实验发现,连续特征的幂数形式可以提高离线准确性。

Modeling Expected Watch Time

此处目的是,能够根据训练样本预测出期望观看时间,包括正样本(点击的)和负样本(没有点击的)。正样本标记是使用观看时长作为标记。我们使用weighted的逻辑斯蒂回归来做预测。

如图7,使用交叉熵进行训练,但是正样本的权重是观看时间,而负样本的是1.这样LR学习到的odd就是:
$$
\frac{\sum T_i}{N-k}
$$
其中,N是训练样本数,k是正样本的数目,$Ti$是第$i$个的观看时长。假设正样本比例很小,那么学习到的odd就是,$ET,$其中$P$是点击率,$E[T]$是期望观看时间。因为$P$很小,所以乘积就很接近与$E[T]$。前向推断中,使用指数函数$e^x$作为就激活函数,这样计算出的odd就比较接近于估计的期望时长。

Experiments with Hidden Layers

表1显示了我们在离线情况下,holdout一天的数据做的不同隐层的实验。首先使用我们的模型给两个impression打分,如果正样本的分数比负样本低,则认为正样本的观看时间是错误预测的(mispredicted watch time).之后,有权重的per-user的损失就变成了所有mispredicted watch time时间的总和。

提高深度和宽度都能提升实验结果,就是会增加前向推断时间。实验表明,在能够接受的情况下,1024ReLu->512ReLu->256ReLu的结果是最好的。

实验中,如果只归一化连续特征,没有使用power形式的特征,损失上升了0.2%;同样的网络配置,如果训练中正负样本权重一致,最后损失上升了4.1%。

Conclusion

candidate generation and ranking.

本文中这个深度协同过滤模型能够有效的吸收各种信号,并使用深度网络层对他们之间的交互进行建模,使得性能超越了之前的matrix factorizaition。

在推荐系统中选择特征是门艺术:

  1. 捕获不对称共同浏览信息和防止未来信息的泄露对于分类来说很有用。
  2. 同时还要防止过拟合问题。
  3. 利用训练样本的age信息作为特征输入也去除了bias,并且能让我们的模型表示时间独立的用户行为。这提高了离线的holdout准确率,并且在A/B测试集上的观看时间也提高了。
  4. ranking是典型的机器学习方法,然鹅我们的学习方法性能超越了之前的线性方法或者Tree-based方法。
  5. 逻辑斯蒂回归也修改成了有权重的。使得能够更好的预测观看时间和点击率。

Reference

用深度学习(DNN)构建推荐系统 - Deep Neural Networks for YouTube Recommendations论文精读

youtube_recommendation_tensorflow