Paper Reading:Deep Neural Networks for YouTube Recommendations

论文:Deep Neural Networks for YouTube Recommendations
发表时间:2016
发表作者:(Google)Paul Covington, Jay Adams, Emre Sargin
发表刊物/会议:RecSys
论文链接:论文链接

这篇论文是google的YouTube团队在推荐系统上DNN方面的尝试,发表在16年9 月的RecSys会议。本文就focus在YouTube视频推荐的DNN算法,文中不但详细介绍了Youtube推荐算法和架构细节,还给了不少practical lessons and insights,很值得精读一番。

ABSTRACT

YouTube视频推荐根据信息检索二分法(information retrieval dichoromy),也是分为经典的两阶段:召回(condidate generation model)+排序(deep ranking model)。

Keywords:recommender system; deep learning; scalability

1.INTRODUCTION

YouTube视频推荐系统主要面对了三大挑战:

  • 大规模(Scale):需要一个高度分布式学习算法和高效的服务系统。
  • 冷启动/更新(Freshness):需要平衡新鲜内容与已存视频的推荐(exploration/exploitation)
  • 噪音(Noisse):用户的历史行为数据稀疏,存在很多外部因素的影响,用户的满意度等这些隐信号很难处理和捕获。另一个方面就是视频本身很多数据都是非结构化的。

之所以要在推荐系统中应用DNN解决问题,一个重要原因是google内部在机器学习问题上的通用solution的趋势正转移到Deep learning,系统实际部署在基于tensorflow的Google Brain上。

2.SYSTEM OVERVIEW

整个系统分为两部分:一部分用于候选集生成,一部分用于排序。

Paper Reading:Deep Neural Networks for YouTube Recommendations

其中,召回网络使用用户历史记录作为输入,召回以百数量级的视频。召回网络通过协同过滤(collaborative filtering)提供个性化。排序网络用于对召回的视频进行精准推荐。
这两阶段策略使得可以对大规模语料库的视频进行实时的推荐。
对系统的评价分两方面。线下,采用评价指标(精准率,召回率,排序loss)。线上,使用A/B test进行评估。

3.CANDIDATE GENERATION

3.1 Recommendation as Classification

将推荐看做是一个分类问题,一个用户$U$在$t$时间观看一个特定视频$i$的概率如下描述:

\[
P(w_t=i|U,C) = \frac{e^{v_i u}}{\sum_{j \in V}e^{v_j u}}
\]

其中,$u$代表用户的高维embedding(high-dimensional "embedding"),$v_j$代表每个候选集视频的embedding。 深层神经网络的任务是根据用户的历史和上下文来学习用户的embedding。
这里使用观看记录的隐式反馈来训练模型,看完了视频的用户是一个正例。 这个选择是因为隐式用户历史更多,有益于在尾部进行深度推荐,而显式反馈是非常稀疏的。

这里的显式反馈是用户在YouTube的明确的反馈(赞/踩,内置调查等)

Efficient Extreme Multiclass

为了对百万级别的类别训练,模型依赖于负采样,其中权重为每个类别的重要性。在试验中,采样大约几千负样本,与分层softmax(hierarchical softmax)相比,这种方法效率更高。
在提供推荐服务阶段,我们需要选出top$N$个最相似的视频,这里采用最近邻搜索实现。

3.2 MOdel Architecture

利用CBOW,每一个视频的embedding可以从固定的语料库中学到,并且用到这里的前馈神经网络中。用户的观看历史由其观看的视频embedding组成(平均)。而后是三层ReLU,具体如下:

Paper Reading:Deep Neural Networks for YouTube Recommendations

3.3 Heterogeneous Signals

使用深度神经网络的一个优点是可以加入任意的连续和分类特征。人口统计特征,例如用户性别,登录状态,年龄归一化,可以提供一些先验知识,有利于用户冷启动。

“Example Age” Feature

YouTube每秒有长达若干小时的视频被上传,推荐这些新鲜视频是十分重要的(用户也会更关注新鲜的视频),所以加入了“Example Age”这个特征,在训练集设置为该视频发布的时间差,在测试集(提供服务时)设置为0。这个特征的有效性如图所示:

Paper Reading:Deep Neural Networks for YouTube Recommendations

3.4 Label and Context Selection

训练样本要用youtube上的所有视频观看记录,而不只推荐的视频的观看记录。否则,面对新视频的时候很难推荐,并且推荐器会过度偏向exploitation(这里的exploitation是针对exploration来讲的)。
另外,要为每个用户生产固定数量的训练样本,在损失函数中所有用户的权重一样。这能防止一部分非常活跃的用户主导损失函数值。
在构建训练集时,也要注意信息泄露的问题,从用户的历史视频观看记录中随机拿出来一个作为正样本时,不能使用上下文信息,而是应该只用这个视频之前的历史观看记录作为输入。

Paper Reading:Deep Neural Networks for YouTube Recommendations

3.5 Experiments with Features and Depth

添加特征和深度显着提高了对保留数据的准确性,如下图所示。

Paper Reading:Deep Neural Networks for YouTube Recommendations

网络结构呈一个常见的塔状,底部的网络最宽,每往上一层节点数减半。

4.RANKING

排序阶段用于对召回的不同视频进行排序,因为不同召回源产生的候选集是不能直接相比的。使用类似于候选集生成的神经网络,排序是根据每次展示预期的观看时间。如果按照点击率排名容易造成一些用户看了但是没看完的视频排到前面(如一些标题党的视频),而观看时间就很好的反映了用户的偏好程度。

4.1 Feature Representation

特征可以被分为单值类特征(如正在评分的视频ID)和多值类特征(如最近观看的N个视频ID)。

Feature Engineering

主要的挑战在于如何表示用户动作的时间序列以及这些动作如何与正被评分的视频相关。
重要的特征是那些描述用户以前与item本身和其他相似item的互动。例如,用户观看的与这个视频相同的渠道发布的视频的个数,用户上次观看这个主题的视频的时间。另外,召回的信息也很重要,例如,哪些数据源生成了这个候选集,这个候选集的分数,等等。
另外,描述视频展现次数的特征也很重要。如果最近给一个用户推荐了一个视频,但是用户并没有看,那么当下次页面加载的时候,模型会自然的对这个视频展示的概率降低。

Embedding Categorical Features

使用embedding来将稀疏离散特征映射到稠密矩阵。对词汇表按照ID在点击展现中出现的频率进行倒序排列,仅保留频率最高的topN个ID。不在词汇表中的值,简单的被embedding成值为0的向量。像在候选集生成阶段一样,多值离散特征映射成embedding之后,在输入网络之前需要做一下加和平均。
重要的是,离散特征对应的ID一样的时候,他们的底层embedding也是共享的。比如存在一个全局的embedding对应很多不同的特征(曝光的视频ID,用户最后一次浏览的视频ID,推荐系统的种子视频ID等等)。embedding虽然是共享的,但是每个特征在训练的时候是单独输入到网络的,以便上层网络可以学习到每个特征的特殊表示。embedding共享对于提升泛化能力、加速训练、减小内存占用是非常重要的。

Normalizing Continuous Features

神经网络对其输入的缩放和分布非常敏感。除了输入归一化的特征之外,我们还输入归一化特征的平方、特征的平方根,特征的超线性和子线性的函数使得网络有更强的表达能力。

4.2 Modeling Expected Watch Time

我们的目标是给定正负样本(展现了没有点是负样本,展现了并点击了是正样本)后,预测用户的观看时长。正样本记录了用户观看视频消耗的时间。为了预测观看时长,我们使用了专门为此而开发的加权逻辑回归(weighted logistic regression)。

Paper Reading:Deep Neural Networks for YouTube Recommendations

训练时采用基于交叉熵损失函数的逻辑回归模型。但是我们用观看时长对正样本做了加权,负样本都用单位权重(即不加权)。这样,我们通过逻辑回归学到的odds为$\frac{\sum T_i}$,其中$N$为训练集大小,$k$为正样本数量,$T_i$为观看时长。因为正样本集很小,odds大约为$ET$,其中$P$为点击率,$E[T]$为观看某视频的期望时长。因为$P$很小,这个解近似为$E[T]$。因此,最后使用了$e^{Wx+b}$作为最终的激活函数来产生近似观看时长的估计值。

如果不加权,逻辑回归学到的odds应该是 正样本数量/负样本数量,即没有任何特征信息时的一个先验概率。

4.3 Experiments with Hidden Layers

下表显示了在数据集上用不同的隐层配置得到的结果。每个配置得到的值是通过在同一个页面上展示给一个用户的正负样本而来的。首先用模型对两种样本进行打分。如果负样本的得分比正样本的得分高,就认为这个正样本的观看时长是错误预测。每个用户的损失值就是所有错误预测的数量。

Paper Reading:Deep Neural Networks for YouTube Recommendations

5. CONCLUSIONS

略。

总结

论文组成:
Section 2介绍整个系统整体框架
Section 3介绍召回网络(condidate generation model),包括如何训练,如何应用。实验部分展示了深度网络以及additional heterogeneous signals的有效性。
Section 4介绍排序网络(ranking model),包括经典的逻辑回归如何改进用于预测观看时间。实验部分展示了隐藏层深度的有效性。

由于视频数据量大,如果直接对全部视频进行比较复杂的打分预测,会造成较大时延。所以需要candidate网络从成千上万的数据中筛选出几百条候选视频然后再送入后续的rank网络进行排序。这意味着candidate网络保证一定准确率的同时强调时效,而rank网络强调的是准确率。

在rank网络中,模型架构与candidate网络相似,不同的主要是特征工程:引入更多描述视频、用户以及二者之间关系的特征,达到对候选视频集合准确排序的目的。特征如下:

  • impression video ID embedding: 当前要计算的video的embedding
  • watched video IDs average embedding: 用户观看过的最后N个视频embedding的average pooling
  • language embedding: 用户语言的embedding和当前视频语言的embedding
  • time since last watch: 自上次观看同channel视频的时间
  • previous impressions: 该视频已经被曝光给该用户的次数

第4个特征背后的思想是反应用户看同类视频的间隔时间,有一些引入attention的意思。
第5个特征previous impressions则一定程度上引入了exploration的思想,避免同一个视频持续对同一用户进行无效曝光。尽量增加用户没看过的新视频的曝光可能性。

另外,Ranking Model采用了weighted logistic regression作为输出层。在模型serving过程中为何没有采用sigmoid函数预测正样本的probability,而是使用$e^{Wx+b}$这一指数形式预测用户观看时长?
几率比(odds)是指一个事件发生的概率与不发生概率的比值。在逻辑回归中有:

\[
Odds = \frac{p}{1-p}
\]

如果对Odds取自然对数,再让$ln(Odds)$等于一个线性回归函数,那么就得到了下面的等式。

\[
logit(p) = ln(\frac{p}{1-p}) = \theta ^T x \\
\frac{p}{1-p} = e^{\theta ^T x} \\
p = sigmoid(\theta ^T x)
\]

所以,Serving函数$e^{Wx+b}$表示的即Odds。
在Weighted LR中,对于正样本$i$来说权重就是观看时长$T_i$,对于负样本来说,则指定了单位权重1。正样本权重w的加入会让正样本发生的几率变成原来的w倍,也就是说样本$i$的Odds变成了下面的式子

\[
Odds(i) = \frac{w_i p}{1-w_i p}
\]

由于在视频推荐场景中,用户打开一个视频的概率$p$往往是一个很小的值,因此上式可以继续简化:

\[
Odds(i) = w_i p = t_i p = E(T_i)
\]

由于$p$就是用户打开视频的概率,$T_i$是观看时长,因此$T_i*p$就是用户观看某视频的期望时长。因此,采用$e^{Wx+b}$这一指数形式预测的就是曝光这个视频时,用户观看这个视频的时长的期望。利用该指标排序后再进行推荐,是完全符合YouTube的推荐场景和以观看时长为优化目标的设定的。

Q&A

candidate generation model中最底层的输入是用户观看过的video的embedding向量,以及搜索词的embedding向量。这个embedding向量是怎么生成的?

作者是先用word2vec方法对video和search token做了embedding之后再作为输入的,这也是做embedding的“基本操作”。

word2vec表达item和user embedding的技巧?

word2vec可以很好的表征item之间的similarity。但下一步通过item embedding生成user embedding的过程则有很多技巧,简单的做average pooling实践中并不是一个很好的方法。另外简单把item embedding和user embedding做concatenate直接输入FCs也不是一个很有效的做法,用PNN做各种product以及引入DIN的attention都可以有效提升效果。

candidate generation model中user vector和video vector是怎么生成的?如何转化为最近邻问题?

user embedding是网络的最后一个隐层,vedio embedding是softmax的权重。 其中因为每个分类是video,所以就可以把softmax权重矩阵的列向量当作video vector。最终目标是计算item embedding(mxk) x user embedding(kx1) = m个概率值,并且取top-N。这便是最近点的最近邻问题。可以提前通过某些方式加载好$m$个向量,之后求top-N。
线上使用时候,user embedding实时生成,video embedding离线训练好之后推到线上,使用类LSH方法进行匹配(比如使用现成工具ann,faiss等)。

文中把推荐问题转换成多分类问题,在next watch的场景下,每一个备选video都会是一个分类,因此总共的分类有数百万之巨,这在使用softmax训练时无疑是低效的,这个问题Youtube是如何解决的?

softmax 采 negative sampling 提升速度,并用importance weighting的方法对采样进行calibration。

在candidate generation model的serving过程中,Youtube为什么不直接采用训练时的model进行预测,而是采用了一种最近邻搜索的方法?

在通过candidate generation model得到user 和 video的embedding之后,通过最近邻搜索的方法的效率高很多。

Youtube的用户对新视频有偏好,那么在模型构建的过程中如何引入这个feature?

引入 example age,倾向于新视频

example age特征使如何使用的?

假如用户在2.21号晚上20点0分这个时刻点击了某视频,产生了一条样本。后续训练的时候这条样本的Example Age=训练时的时刻 - 2.21号20:00时刻,和user watched video特征没有关系。

在对训练集的预处理过程中,Youtube没有采用原始的用户日志,而是对每个用户提取等数量的训练样本,这是为什么?

每个用户采用等量样本是减少高度活跃用户对于loss的过度影响,防止带偏 model

Youtube为什么不采取类似RNN的Sequence model,而是完全摒弃了用户观看历史的时序特征,把用户最近的浏览历史等同看待,这不会损失有效信息吗?

这个原因应该是YouTube工程师的“经验之谈”,如果过多考虑时序的影响,用户的推荐结果将过多受最近观看或搜索的一个视频的影响。YouTube给出一个例子,如果用户刚搜索过“tayer swift”,你就把用户主页的推荐结果大部分变成tayer swift有关的视频,这其实是非常差的体验。为了综合考虑之前多次搜索和观看的信息,YouTube丢掉了时序信息,讲用户近期的历史纪录等同看待。但RNN到底适不适合next watch这一场景,其实还有待商榷。

在处理测试集的时候,Youtube为什么不采用经典的随机留一法(random holdout),而是一定要把用户最近的一次观看行为作为测试集?

避免引入future information,防止数据穿越。

在确定优化目标的时候,Youtube为什么不采用经典的CTR,或者播放率(Play Rate),而是采用了每次曝光预期播放时间(expected watch time per impression)作为优化目标?

采用观看时长和业务场景有关,ctr 高的观看时长不一定高,有骗点击的行为,watch time更能反应用户的真实兴趣

在进行video embedding的时候,为什么要直接把大量长尾的video直接用0向量代替?

这又是一次工程和算法的trade-off,把大量长尾的video截断掉,主要还是为了节省online serving中宝贵的内存资源。当然从模型角度讲,低频video的embedding的准确性不佳是另一个“截断掉也不那么可惜”的理由。

针对某些特征,比如#previous impressions,为什么要进行开方和平方处理后,当作三个特征输入模型?

开方和平方是为了增加特征的非线性。

为什么ranking model不采用经典的logistic regression当作输出层,而是采用了weighted logistic regression?

如果简单使用LR就无法引入正样本的watch time信息,采用weighted LR,将watch time作为正样本的weight,在线上serving中使用$e^{Wx+b}$做预测可以直接得到expected watch time的近似。

参考:
重读Youtube深度学习推荐系统论文
YouTube深度学习推荐系统的十大工程问题
揭开YouTube深度推荐系统模型Serving之谜
Deep Neural Network for YouTube Recommendation论文精读
中文版《Deep Neural Networks for YouTube Recommendation》

上一篇:5 ,node03 克隆安装 ( 五分钟搞定 )


下一篇:Oracle 解决数据库连接暴增问题办法