论文精读5:DNN for YouTube RC
论文题目:Deep Neural Networks for YouTube Recommendations
作者:Google
发表时间:2016年
0 摘要
YouTube 代表存在规模最大、最复杂的工业推荐系统之一。在本文中,我们以顶层视角描述系统,并专注于深度学习带来的显着性能改进。本文根据经典的两阶段信息检索二分法进行分割:首先,我们详细介绍了深度召回模型,然后描述了单独的排序模型。我们还提供了从设计、迭代和维护大量具有巨大面向用户影响的推荐系统中获得的实际经验和见解。
1 介绍
YouTube 是世界上最大的创作、分享和观看视频的平台。YouTube 的推荐系统负责帮助超过 10 亿用户从不断增多的视频库中找到自己感兴趣的内容。在本文中,我们将重点关注深度学习最近对 YouTube 视频推荐系统的巨大影响。图1展示了移动端YouTube在主页推荐视频的页面。
图 1:移动端YouTube在主页推荐视频的页面。
YouTube 的视频推荐遇到的困难主要有三个方面:
- 推荐的规模:许多现有的推荐算法被证明在小规模问题上工作良好,无法在我们的规模上操作。高度专业化的分布式学习算法和高效服务系统对于处理 YouTube 的大规模用户基础和语料库至关重要。
- 新鲜度:YouTube 有一个每秒就会上传很多小时级别的视频的非常动态的候选库。推荐系统应该对新上传的内容能够及时响应,以追踪用户采取的最新动作。从探索/开发的角度来看,应将新上传的内容和已有的视频进行平衡。
- 噪音:由于稀疏性和各种不可观察的外部因素,YouTube 上的历史用户行为本质上难以预测。我们很少获得用户满意度的基本事实,而是对嘈杂的隐式反馈信号进行建模。此外,在没有明确定义的本体的情况下,与内容相关的元数据结构很差。我们的算法需要对训练数据的这些特定特征具有鲁棒性。
与 Google 中的其他产品区域结合,YouTube 经历了一个基本的范式转变,即使用深度学习作为几乎所有学习问题的通用解决方案。我们的系统建立在 Google Brain$^{[4]}$上,最近作为 TensorFlow$^{[1]}$开源。TensorFlow 提供了一个灵活的框架,用于使用大规模分布式训练试验各种深度神经网络架构。我们的模型学习了大约 10 亿个参数,并在数百亿个数据上进行了训练。
与矩阵分解方法$^{[19]}$的大量研究相比,使用深度神经网络进行推荐系统的工作相对较少。神经网络用于推荐 [17] 中的新闻,[8] 中的引用和 [20] 中的评论分级。协同过滤被表述为 [22] 中的深度神经网络和 [18] 中的自动编码器。Elkahky 等人使用深度学习进行跨域用户建模$^{[5]}$。在基于内容的设置中,Burges 等人使用深度神经网络进行音乐推荐$^{[21]}$。
本文组织如下:第 2 节介绍了一个简短的系统概述。第 3 节更详细地描述候选生成模型,包括如何训练和用于服务推荐。实验结果表明,该模型如何从隐藏单元的深层和额外的异构信号中受益。第 4 节详细说明了排序模型,包括如何修改经典逻辑回归来训练模型预测视频预期观看时间(而不是点击概率)。实验结果表明,隐藏层的深度在这种情况下也是有帮助的。最后,第 5 节介绍了我们的结论和一些经验。
2 系统整体介绍
我们的推荐系统的整体结构如图2所示。该系统由两个神经网络组成:一个用于召回,一个用于排序。
图 2:推荐系统架构,展示了在仅向用户展示推荐视频之前召回和排序候选视频的筛选过程。
召回网络将来自用户的 YouTube 活动历史观看记录作为输入,并从候选库中检索一小部分视频(数百个)。这些候选物品通常与用户的兴趣高度相关。召回网络仅通过协同过滤提供广泛的个性化。用户之间的相似性是根据观看过的视频 ID、搜索查询的 token 和人口统计数据等粗略特征来表达的。
在推荐列表中提出一些“最佳”建议需要一个精细级别的表示来区分具有高召回率的候选者之间的相对重要性。排序网络通过使用所需的目标函数,并给定一系列描述视频和用户的丰富的特征,给每个视频打分来完成此任务。按其分数进行排名,得分最高的视频展现给用户。
推荐的两阶段方法使我们能够从非常大的视频语料库(百万)中提出推荐,同时仍然确定手机上出现的少量视频是个性化和吸引用户的。此外,这种设计支持混合其他来源生成的候选物品,例如早期工作中描述的候选物品 [3]。
在开发过程中,我们广泛使用离线指标(精度、召回率、排名损失等)来指导模型的迭代。然而,为了最终确定算法或模型的有效性,我们依赖于通过线上实验的 A/B 测试。在线上实验中,我们可以测量点击率、观看时间和许多其他衡量用户参与度的指标的细微变化。这很重要,因为实际的 A/B 结果并不总是与离线实验相关。
3 召回生成
在召回期间,庞大的 YouTube 语料库现在被缩小到与用户相关的数百个视频。这里描述的推荐器的前身是在秩损失 [23] 下训练的矩阵分解方法。我们的神经网络模型的早期迭代用仅嵌入用户之前观看的视频的浅层网络来模拟这种分解行为。从这个角度来看,我们的方法可以看作是分解技术的非线性泛化。
3.1 将推荐问题视为分类
我们将推荐作为极端的多类分类问题,其中预测问题在基于用户 $U$ 和上下文 $C$ 的整个视频语料库 $V$ 中准确分类数百万个视频 $i$(类)中的观看的特定视频 $ w_t$。
$$
P\left(w_{t}=i \mid U, C\right)=\frac{e^{v_{i} u}}{\sum_{j \in V} e^{v_{j} u}}
$$
其中 $u \in \mathbb{R}^{N}$ 表示一个对用户的高维嵌入的向量,上下文对和 $v_{j} \in \mathbb{R}^{N}$ 的表示对每个候选视频的嵌入。在这种情况下,嵌入只是将稀疏实体(单个视频、用户等)映射到 $\mathbb{R}^{N}$ 中的稠密向量。深度神经网络的任务是学习用户嵌入 $u$ 作为用户历史和上下文的函数,这对于使用 softmax 分类器区分视频很有用。
尽管 YouTube 上存在显式反馈机制(点赞/不喜欢、产品调查等),但我们使用观看数据的隐式反馈 [16] 来训练模型,其中观看完整个视频的用户是一个正样本。使用完播这种隐式反馈所能构造出来的正样本比显式反馈的『点赞』多了一个数量级,使我们能够在显式反馈极其稀疏的尾部产生更有价值的建议。
3.1.1 进行高效检索
为了有效地训练这样一个具有数百万个类的模型,我们依靠一种技术从背后的分布(“候选采样”)中采样负类,然后通过重要性加权 [10] 校正该采样。对于每个示例,真实标签和采样的负类的交叉熵损失最小化。在实践中,采样了几千个负类,对应于比传统 softmax 快 100 倍以上。一种流行的替代方法是分层 softmax [15],但我们无法达到可比的精度。在分层 softmax 中,遍历树中的每个节点涉及区分通常不相关的类集,使得分类问题变得更加困难和降低性能。
在服务时,我们需要计算最可能的 N 类(视频),以便选择呈现给用户的前 N 个。在几十毫秒的严格服务延迟下对数百万个项目进行评分需要一个近似评分方案,该方案在类的数量上次线性。以前在 YouTube 上的系统依赖于哈希散列 [24],这里描述的分类器使用了类似的方法。由于服务时不需要来自 softmax 输出层的校准似然,因此评分问题简化为可以使用通用库的点积空间中的最近邻搜索 [12]。我们发现 A/B 测试的结果对最近邻搜索算法的选择并不特别敏感。
3.2 模型架构
受连续词袋语言模型 [14] 的启发,我们学习了已有词汇表中每个视频的高维嵌入,并将这些嵌入输入到前馈神经网络中。用户的观看历史由可变长度的稀疏视频 ID 序列表示,该序列通过嵌入映射到密集向量表示。该网络需要固定大小的密集输入,并且简单地平均在几个策略(总和、组件最大值等)中执行的嵌入。重要的是,嵌入是通过正常的梯度下降反向传播更新与所有其他模型参数共同学习的。特征被连接成一个广泛的第一层,然后是几层全连接整流线性单元 (ReLU) [6]。图 3 显示了具有下面描述的额外非视频观看特征输入的通用网络架构。
图 3:深度候选生成模型架构,显示嵌入的稀疏特征与密集特征连接。嵌入向量在连接之前进行平均,以将不同大小的稀疏 ID 包转换为适合隐藏层输入的固定宽度向量。所有隐藏层都是全连接层。在训练期间,通过对采样 Softmax 的输出进行梯度下降来最小化交叉熵损失。在推荐时,执行近似最近邻查找以生成数百个候选视频推荐。
3.3 异构信号
使用深度神经网络作为矩阵分解泛化的一个关键优势是可以轻松地将任意连续和分类特征添加到模型中。搜索历史处理类似于观看历史——每个查询都被标记为 unigrams 和 bigrams,每个 token 都被嵌入。一旦平均,用户的 token 化、嵌入的查询代表一个汇总的稠密搜索历史。统计特征对提供先验很重要,以致于推荐对新用户表现得相当好。用户的地理位置和使用的手机类型被嵌入并拼接在一起。简单的二元和连续特征,例如用户的性别、登录状态和年龄,归一化后为 $[0, 1]$ 直接输入到网络中。
3.3.1 “发布时间”特征
每秒都会有几个小时的视频上传到 YouTube。推荐最近发布的(“新鲜”)内容对于 YouTube 来说非常重要。我们一直发现到用户更喜欢最新的内容,尽管这个视频的内容那个用户直接没有接触过。除了简单地推荐用户想要观看的新视频的一阶效应外,引导和传播内容存在关键的次要现象 [11]。
机器学习系统通常表现出对过去的隐含偏见,因为它们经过训练可以从历史示例中预测未来的行为。视频流行度的分布是高度非平稳的,但我们的推荐器生成的语料库上的多项分布将反映几周训练窗口中的平均观看可能性。为了纠正这一点,我们在训练期间将训练数据的发布时间作为特征。在线上推荐的时候,此功能设置为零(或轻微负面),以反映模型在训练窗口的最后进行预测。
图 4 展示了这种方法在任意选择的视频 [26] 上的有效性。
图 4:对于给定的视频 [26],以发布时间作为特征训练的模型能够准确地表示数据中观察到的上传时间和时间依赖性流行度。如果没有特征,模型将大致预测训练窗口的平均可能性。
3.4 标签和上下文选择
需要强调的是,推荐通常涉及解决代理问题并将结果转移到特定上下文中。一个经典的例子是,准确预测评分会导致有效的电影推荐 [2]。我们发现,这种代理学习问题的选择对 A/B 测试的性能具有相当大的重要性,但使用离线实验很难测量。
训练示例是从所有 YouTube 观看过的视频(甚至是嵌入在其他网站上的示例)生成的,而不仅仅是观看我们生成的推荐视频。否则,在用户的首页推荐新内容是非常困难的,推荐系统会过度偏向于已经曝光过的物品。如果用户通过我们的推荐之外的方式找到视频,我们希望能够通过协同过滤将这一发现快速传播到其他人。改进实时指标的另一个关键发现是为每个用户生成固定数量的训练示例,并且有效地在损失函数中平等地加权我们的用户。这防止一小部分高度活跃的用户主导损失函数的变化。
有点违反直觉的是,必须谨慎地从分类器中提取信息,以防止模型利用网站的结构并过度拟合代理问题。例如,用户刚刚发布了“taylor swift”搜索查询的情况。由于我们的问题是预测下一个观看的视频,因此给定此信息的分类器将预测要观看的最可能的视频是那些出现在“taylor swift”的相应搜索结果页面上的视频。毫无疑问,将用户的最后一个搜索页面复制为主页推荐的性能非常差。通过丢弃序列信息并用无序的 token bag表示搜索查询,则分类器不再直接知道标签的来源。
视频的自然消费模式通常会导致非常不对称的共观看概率。情节系列通常是按顺序观看的,用户在关注小众的内容之前,通常发现该领域中最受欢迎的艺术家。因此,我们发现预测用户下一次观看的性能要好得多,而不是预测一个随机的 held-out 观看(图 5)。许多协同过滤系统通过保留一个随机项目并从其他用户的浏览记录中进行挑选(5a)中预测它来隐式地选择标签和上下文。这泄漏了未来的信息,并忽略了任何不对称的消费模式。相比之下,我们通过选择一个随机的视频并仅输入用户在保留标签表 (5b) 之前采取的行动来“回滚”用户的历史。
图 5:为模型选择标签和输入上下文对于离线评估具有挑战性,但对实时性能有很大影响。在这里,实体事件 • 是网络的输入特征,而中空事件 ◦ 被排除在外。我们发现预测未来的手表 (5b) 在 A/B 测试中表现更好。在 (5b) 中,示例年龄表示为 tmax - tN,其中 tmax 是训练数据中最大观察到的时间。
3.5 模型特征和深度的实验
添加特征和深度显着提高了留出法的数据的精度,如图 6 所示。在这些实验中,1M 视频和 1M 搜索标记的词汇表使用 256 个浮点数进行嵌入,每个浮点数最多包含大小为 50 个最近的观看和 50 个最近的搜索。Softmax 层输出相同的维度为 256的 1M 视频类别的多项分布(可以将其视为单独的输出视频嵌入)。这些模型在数据集上训练几个 epoch 直到收敛到所有 YouTube 用户。网络结构遵循一个共同的“塔”模式:网络的底部很宽,每个连续的隐藏层将单元的数量减半(类似于图 3)。深度零网络实际上是一个线性分解方案,它的表现与前驱系统非常相似。添加宽度和深度,直到增量收益减少和收敛变得困难:
- 深度0:线性层简单地变换连接层以匹配256的softmax维度
- 深度1:256 ReLU
- 深度2:512 ReLU → 256 ReLU
- 深度3:1024 ReLU → 512 ReLU → 256 ReLU
- 深度4:2048 ReLU → 1024 ReLU → 512 ReLU → 256 ReLU
图 6:视频嵌入之外的特征提高了保持平均精度(MAP)和深度层增加了表现力,以便模型可以通过建模它们的交互来有效地使用这些附加特征。
4 排序
排序的主要作用是使用之前曝光过的数据来专门校准特定用户界面的候选预测。例如,用户可能通常以高概率观看给定的视频,但可能由于推荐的视频采用的缩略图不当,导致用户没有点击对应的视频。在排序的过程中,因为只有几百个视频进行排序,所以我们可以使用更多用于描述视频的特征以及用户与视频的关相似度,但是在召回的时候有数百万个物品需要被打分,就不能使用很多特征。排序可以同时处理来自不同召回源的物品的分数(不同召回通道可能打分标准不同)。
我们使用类似于召回的深度神经网络,使用逻辑回归为每个视频印象分配独立的分数(图 7),然后将视频按此分数排序并返回给用户。我们的最终排序目标不断根据线上的 A/B 测试结果进行调整,但通常是每个推荐视频的预期观看时间的简单函数。通过点击率排名通常会促进用户不完整(“标题党”)的欺骗性视频,而视频的观看时间更好地体现参与度 [13, 25]。
图 7:描述嵌入分类特征(二值和多值)的深度排序网络架构,具有共享嵌入和归一化连续特征的幂。所有层都是完全连接的。在实践中,数百个特征被输入到网络中。
4.1 特征表示
我们的特征与分类和连续/序数特征的传统分类法隔离。我们使用的分类特征在其基数上差异很大——有些是二分类的(例如,用户是否登录),而另一些则具有数百万个可能的值(例如用户的最后一次搜索查询)。特征根据它们是否仅贡献单个值(“二值”)或一组值(“多值”)来进一步拆分。单分类特征的一个例子是被评分印象的视频 ID,而相应的多价特征可能是用户观看的最后 N 个视频 ID 的包。我们还根据它们是否描述了项目的属性(“印象”)或用户/上下文的属性(“查询”)来对特征进行分类。查询特征为每个请求计算一次,而为每个项目评分计算印象特征。
4.1.1 特征工程
我们通常在我们的排名模型中使用数百个特征,连续特征和离散特征各占一半。尽管深度学习可以不同人工设计特征,但我们的原始数据的性质不容易直接输入到前馈神经网络中,所以仍然需要人工花费很多精力来将用户和视频数据转换为有用的特征。主要挑战是表示用户点击的时间顺序以及这些点击如何与正在评分的视频相关联。
考虑其他人在广告排序方面的经验 [7],我们观察到最重要的信息是那些描述用户之前与物品本身以及其他相似物品的交互。例如,考虑用户过去上传过被评分的视频的频道——用户会从这个频道观看多少视频?上次用户在这个频道观看视频是什么时候?这些描述过去用户对相关物品行为的连续特征特别有用,因为它们可以很好地在不同的物品之间进行泛化。我们还发现,以特征的形式将信息从召回到排序至关重要,例如哪些源召回了这个视频?他们打的分数是多少?
描述过去推荐视频的特征对于在推荐中引入“churn”也很重要(后继推荐请求不返回相同的视频)。如果用户最近被推荐了一个视频,但没有观看它,那么模型将自然地将这个视频降到下一个页面负载。服务于每秒钟的印象和观看历史是本文范围之外的自身工程壮举,但对产生响应建议至关重要。
4.1.2 嵌入分类特征
与召回类似,我们使用嵌入将稀疏的分类特征映射到合适的神经网络稠密向量。每个唯一 ID 空间(“词汇表”)都有一个单独的学习嵌入,其维度与唯一值数量的对数近似成正比。这些词汇表是简单的查找表,它是通过在训练期间一次传递数据来构建的。非常大的基数 ID 空间(例如视频 ID 或搜索查询术语)在根据点击印象的频率进行排序后只选择前 N 个。词汇表外的值简单地映射到零嵌入。与召回一样,多个分类特征的嵌入在被馈送到网络之前进行平均。
4.1.3 连续特征归一化
众所周知,神经网络对其输入[9]的缩放和分布非常敏感,而决策树等替代方法对单个特征的缩放是不变的。我们发现连续特征的适当归一化对于收敛至关重要。通过缩放值将分布 $f$ 的连续特征 $x$ 转换为 $\tilde{x}$,使用累积分布 $\tilde{x}=\int_{-\infty}^{x} \mathrm{~d} f$ 使得特征在 $[0, 1)$ 中均匀分布。该积分近似于在训练开始之前,在单次传递数据上计算的特征值的分位数上的线性插值。
除了原始归一化特征 $\tilde{x}$,我们还输入幂 $\tilde{x}^{2}$ 和 $\sqrt{\tilde{x}}$,通过对特征做非线性运算来使赋予网络更具表现力。通过对连续特征做变换有助于改进线上精度。
4.2 对预估观看时间进行建模
我们的目标是在给定正面(点击视频)或负面(未点击视频)的训练样本的情况下预测预估观看时间。正样本使用用户真实观看视频的时间进行标注。为了对预估观看时间进行预测,我们使用了为此目的开发的加权逻辑回归方法。
该模型在交叉熵损失下使用逻辑回归进行训练(图 7)。然而,正(点击)样本是由实际的视频观看时间加权。负(未点击)样本所有接收单元权重。这样,逻辑回归学习的几率是 $\frac{\sum_{i} T_{i}}{N-k}$,其中 $N$ 是样本数,$k$ 是正样本的数量,$T_i$ 是第 $i$ 个视频的观看时间。假设正样本的比例很小(在我们的例子中是正确的),学习的几率约为 $E[T](1+p)$ ,其中 $P$ 是点击概率,$E[T]$ 是视频的预期观看时间。由于 $P$ 很小,这个乘积接近 $E[T]$。对于推理,我们使用指数函数 $e^{x}$ 作为最终激活函数来产生这些接近预估观看时间的概率。
4.3 隐藏层的实验
表 1 显示了我们在具有不同隐藏层配置的下一天 holdout 数据上获得的结果。通过考虑单个页面上显示给用户的正(点击)和负(未点击)评价来获得每种配置(“加权、每个用户的损失”)的指标。我们首先使用我们的模型对这两种评价进行评分。如果负面视频的得分高于正面视频,那么我们认为正面视频的观看时间是错误的。加权的每个用户的损失是,与坚持印象对相比,错误预测的观看时间占总观看时间的一小部分。
表 1:更广泛和更深的隐藏 ReLU 层对观察第二天保持数据计算的时间加权成对损失的影响。
这些结果表明,增加隐藏层的宽度可以改善结果,就像增加它们的深度一样。然而,需要权衡的是服务器推理所需的 CPU 时间。1024 宽 ReLU 的配置,然后是 512 宽的 ReLU,然后是 256 宽的 ReLU,为我们提供了最好的结果,同时计算开销能够留在我们的服务器的 CPU 预算之内。
对于 1024 → 512 → 256 模型,我们尝试只输入归一化的连续特征而不提供幂运算,这将损失增加了 0.2%。在相同的隐藏层配置下,我们还训练了一个模型,其中正例和负例的权重相等。不出所料,这将观看时间加权损失增加了 4.1%。
5 结论
我们已经介绍了用于推荐 YouTube 视频的深度神经网络架构,分为两个不同的问题:召回和排序。
我们的深度协同过滤模型能够有效地输入很多特征,并对它们与深度层的相互作用进行建模,优于YouTube [23] 中使用的以前的矩阵分解方法。在选择推荐的替代问题时,科学比科学更有艺术,我们发现通过捕获非对称共观看行为并防止未来信息的泄漏,对未来观看进行分类以在现场指标上表现良好。从分类器中保留判别信号对于获得良好的结果也是必不可少的——否则模型将过度拟合代理问题,而不是很好地转移到主页。
我们证明了使用训练示例的年龄作为输入特征消除了对过去的固有偏差,并允许模型表示流行视频的时间相关行为。这提高了离线保持精度结果,并在 A/B 测试中最近上传的视频上显着提高了观看时间。
排序是一个更经典的机器学习问题,但我们的深度学习方法优于以前的线性和基于树的观看时间预测方法。推荐系统特别受益于描述过去用户行为与物品的专业特征。深度神经网络需要离散和连续特征的特殊表示,我们分别通过嵌入和分位数归一化进行变换。深度层被证明可以有效地对数百个特征之间的非线性交互进行建模。
通过对正例的观看时间和负例的统一训练示例进行加权来修改逻辑回归,使我们能够学习密切建模预期观看时间的几率。与直接预测点击率相比,这种方法在观看时间加权排名评估指标上的表现要好得多。
6 鸣谢
作者要感谢 Jim McFadden 和 Pranav Khattan 的宝贵指导和支持。Sujeet Bansal、Shripad Thite 和 Radek Vingralek 实现了培训和服务基础设施的关键组成部分。Chris Berg 和 Trevor Walker 贡献了深思熟虑的讨论和详细的反馈。