推荐系统论文:Deep Neural Networks for YouTube Recommendations

论文地址:Deep Neural Networks for YouTube Recommendations

这篇论文由YouTube团队发表于2016年,十分经典,所以今天精读一下。

1. INTRODUCTION

YouTube的视频推荐系统规模十分巨大,需要为庞大的用户群在百万级数量的候选视频中提供个性化推荐,主要面临三个挑战:

规模:也许一些推荐算法在小规模数据上效果很好,但并不适用于YouTube庞大的用户群体和视频数量。

新鲜度:YouTube的语料库更新十分频繁,每秒钟有很多的视频被上传,一个好的推荐系统,应该根据新上传的视频和用户的最新行为而动态变化,从Exploration / Exploitation的角度平衡新旧视频。

噪声:由于用户历史行为的稀缺性和其他外部因素,因此难以获得用户真实的满意程度,而只能对有噪声的隐式反馈信号进行建模。此外,数据的很多特征都不是结构化的,算法应该对这些特殊特征具有鲁棒性。

YouTube正转向使用深度学习解决几乎所有问题。

2. SYSTEM OVERVIEW

推荐系统如图所示,由两个神经网络组成,即最流行的召回+排序策略。

推荐系统论文:Deep Neural Networks for YouTube Recommendations_第1张图片

召回部分将用户的YouTube历史行为记录作为输入,从大型语料库中检索出部分(数百个)视频。这些候选视频通常与用户密切相关,仅通过协同过滤提供宽泛的个性化,用户之间的相似性通过粗糙的特征来表达,比如观看过的视频id、搜索查询token和人口统计特征。

从候选集中选择一些最佳推荐需要一个精细的表示,来区分候选集的相对重要性(recall指标)。Ranking网络通过使用丰富的视频和用户特性,按照期望的目标函数为每个视频计算分数,将根据视频的分数排名对用户进行推荐。

在开发过程中,使用离线指标(precision, recall, ranking loss等)来指导对系统的迭代改进。使用线上A/B test 最终确定算法的有效性。在线上测量点击率、观看时间和许多其他度量用户参与度的指标的细微变化,这很重要,因为线上A/B test结果并不总是与离线实验相关。

3. CANDIDATE GENERATION

3.1 Recommendation as Classification

在生成候选视频的过程中,在庞大的YouTube语料库中筛选出数百个可能与用户相关的视频。在这一阶段,把问题看作是一个超大规模的多分类问题,即根据用户U和上下文C,预测在t时刻的要观看的视频 w_t 在视频语料库V的概率分布问题,

u\in \mathbb{R}^N代表 <用户,上下文> embedding, v_j\in \mathbb{R}^N代表每个候选视频的embedding,深度神经网络的任务就是根据用户的历史行为和上下文学习用户embedding u。

虽然在YouTube上有明确的反馈机制(手指向上/向下滑动,产品内部调查等),但这里使用观看视频的隐式反馈来训练模型,用户完成观看一个视频是一个正例。

为了有效训练超大规模的多分类问题,使用采样负样本的方法,并使用importance weighting修正,对每个训练样本,在正样本和采样的负样本上最小化交叉熵损失函数,这里采样的负样本个数为几千个,比传统softmax速度快了100倍。还有一种方法是hierarchical softmax,但效果不佳。

在线上推荐时,需要召回最可能的N个类(视频),以选择top N个呈现给用户。在延迟为几十毫秒的情况下对数百万项进行评分,如果跑一遍模型需要的开销太大了,因此在线上阶段采用近似的评分方案而不是像离线训练阶段使用softmax输出概率。由于在serving时不需要从softmax层输出概率,因此得分问题简化为在点积空间中的最近邻检索(nearest neighbor search)。A/B test 的结果对最近邻搜索算法的选择不是特别敏感。

图中user vector u就是网络的最后一个隐层的输出,vedio vectors  v_j 是softmax的权重。假设最后一个hidden layer维度是100代表user embedding,输出节点维度200w表示videos,全连接权重维度就是[100,200w],而hidden layer与每一个输出节点的权重维度就是[100,1],这就是200w个vedio中的每一个对应的embedding,计算一个vedio的概率时是u*v,即两个100维向量做内积,计算出来的就是用户对视频发生观看行为的概率。

其中user vector在线实时计算,输入为用户当前的浏览、搜索记录(实时变化)和 年龄性别(相对稳定),然后经过底部各域分别embedding->MLP得到一个k维向量,这个就是用户实时的embedding。而video vector是softmax层的权重可以离线存好直接取。

此外如果召回阶段有新视频,那只能期待在下次训练中引入。或者新视频使用一个默认的embedding,或者针对新视频用一些独立的召回策略。

3.2 Model Architecture

类似于word2vec,首先对video和search token训练embedding之后再输入神经网络。用户的观看历史由一个可变长度的稀疏id序列表示,由于神经网络需要固定长度的输入,因此通过average得到固定维度的 watch vector 。此外输入的特征还包括:搜索token 的 embedding,地理位置的embedding,年龄,年龄的平方(引入非线性),性别等。把这些特征concatenate起来喂给神经网络进行训练,特征的embedding也被同时训练。

推荐系统论文:Deep Neural Networks for YouTube Recommendations_第2张图片

3.3 Heterogeneous Signals

使用神经网络的好处是任意的连续特征或离散特征都可以加入模型中。搜索历史与观看历史类似,也把搜索历史的embeddings average,人口统计特征对于提供先验信息非常重要,能对新用户做出合理推荐。用户的地理信息和设备信息也做embedding。简单的二值特征和连续特征,如性别、登录状态、年龄,归一化到 [0,1] 之后直接输入到网络中。

Example Age特征:每秒钟都有很多视频被上传到YouTube,推荐这种新鲜的内容对YouTube来说极其重要的,我们注意到,用户更喜欢新鲜的内容,但不会以牺牲相关性为代价。机器学习系统在训练阶段都是利用过去的行为预估未来,则通常对过去的行为有隐式的bias,实际上视频受欢迎程度的分布是非常不平稳的(non-stationary),但我们的推荐系统产生的视频的分布,反映的是在训练时间的窗口内的平均的观看喜好。因此在训练时引入age特征。在serving时,这个age特征被置为0或微负,代表模型是在训练窗口的尾部做预测(the model is making predictions at the very end of the training window)。

Example Age的取值应该是训练的时间去Sample Log产生的时间(而不是视频上传的时间),即这一条样本产生的时间(用户点击某个视频的时间),而不是视频发布的时间。所以在serving的时候,example age设为0,来说明需要预测用户现在这一刻的兴趣。或者设为微负是为了,由于推荐系统的计算需要一定时间,为了模拟当用户收到系统的推荐时的example age恰好为0,所以inference时设为微负。

假设某个视频的点击集中在7天前(比如7天前点击率10%),而训练前的时间点点击率比较低(训练前10分钟点击率3%),模型学出来之后预测的时候把Example Age置为0去预测,预测出这个视频点击率就会更接近3%。同理如果某视频以前不火,训练前突然火了,预测的时候Example Age置为0就可以预测到更高的点击率。如果不带Example Age,模型学出来的该视频点击率更接近于这个训练区间下这个视频平均点击率。也就是通过拟合 t=10, t=9, ..., t=2, t=1 不同时间点的item数据,去预测t=0处,也就是当前的item的情况。这种做法和消除advertising position bias做法类似。

推荐系统论文:Deep Neural Networks for YouTube Recommendations_第3张图片

3.4 Label and Context Selection

对于推荐系统,需要选择一个合适的label来表示模型好坏,例如能准确预测电影评分的电影推荐系统是有效的。

训练样本来自YouTube的所有观看记录,而不仅仅是推荐场景下的观看,否则,新内容将很难被展示,而且推荐系统也会过度偏向Exploitation。

如果用户通过我们推荐以外的方式发现视频,我们希望能够通过协同过滤将这一发现迅速传播给其他人。

为每个用户固定训练样本数量,即平等对待每个用户,可以避免活跃用户对模型的影响。

将用户的最后一个搜索作为主页推荐的效果非常差,用户的实际体验也会非常差。因此丢弃时序信息,使用无序的一组的tokens表示查询,平等看待用户最近的历史记录。

用户在浏览视频时候,往往都是序列式的,开始看一些比较流行的,逐渐找到细分的视频。因此,我们发现预测用户的下一个观看的效果要比预测一个随机的观看要好得多(图5)。许多协同过滤系统隐式地选择标签和上下文,方法holding out a random item and predicting it from other items in the user’s history(5a)。这造成了未来信息的泄露。相比之下,我们通过随机选择一个观看来回滚用户的历史记录,只输入用户再次之前所做的动作(5b)。

推荐系统论文:Deep Neural Networks for YouTube Recommendations_第4张图片

3.5 Experiments with Features and Depth

如图所示,随着加入特征和加深深度明显提升了精度。实验中,共有1M个视频和1M个搜索,都embedded到256维的向量中,每笔样本最多使用最近50次观看和最近50次搜索。softmax层由256维输入映射到1M个输出视频(类别),也可以看作是256维的vedio vector。网络结构遵循常见的“塔”模式,即网络的底部最宽,每个连续的隐层的神经元个数减半。

推荐系统论文:Deep Neural Networks for YouTube Recommendations_第5张图片

4. RANKING

Ranking的主要作用是精准的估计用户对视频的喜好程度,在这一阶段可以使用更多的特征来描述视频和用户的关系,Ranking对于不同来源的候选集合的ensemble也至关重要,因为不同来源的候选集的分数并不具有直接可比性。

模型与召回阶段的模型类似,但最后一层是LR,候选视频根据得分排名被推荐给用户,我们的最终排名的指标根据实时的A/B test 结果不断调整,但通常是一个关于预期观看时间的简单函数。通过CTR排名往往会产生用户没有完成的欺骗性结果(点击诱饵),而观看时间则能更好地捕捉用户的参与度。

推荐系统论文:Deep Neural Networks for YouTube Recommendations_第6张图片

4.1 Feature Representation

Feature Engineering:在排序模型中使用了数百个特征,大致平均地分为类别和连续特征。尽管深度学习希望减轻手工特征工程的负担,但原始数据的性质使其不容易被直接输入到神经网络中,仍要花费大量的资源将用户和视频数据转换成有用的特性。主要的挑战是如何表示用户行为的时间序列(temporal sequence of user actions),以及这些行为如何与视频相关。

最重要的signals是那些描述用户之前与商品和其他类似商品的交互信号,即加入用户刚刚看过“LOL”相关视频,那么他接下来可应该很愿意继续看LOL的相关视频。例如,考虑用户过去在某个频道的历史:用户从这个频道看了多少视频?用户最后一次观看关于这个主题的视频是什么时候?这些描述用户过去在相关项上的行为的连续特征特别强大,因为它们可以很好地泛化。

视频过去被推荐的次数特征(previous impressions)对于在推荐中引入“搅动”也很重要(连续的请求不会返回相同的列表)。如果用户最近被推荐了一段视频,但没有观看,那么模型自然会在下一个页面加载时降级该视频。

Embedding Categorical Features:和召回模型类似,把稀疏的类别特征embedded为dense特征,每个ID空间(user_id,video_id等)都有一个单独的嵌入空间,嵌入维度与ID空间值的个数成正比。非常大基数的ID空间(例如视频ID或搜索查询词),按照点击排序,选择top N个视频做embedding,其余的长尾video都被截断,置为0向量,节省了资源,而且低频video的embedding的准确性不佳所以截断也可行。而对于multivalent特征,与召回阶段的处理相同,进行embedding average。

同一个ID空间中的类别特征共享emedding,例如,存在视频ID的embedding,被许多不同的特征使用(浏览过的视频ID,观看的最后一个视频ID,seeded视频ID等)。尽管共享embedding,但特征在输入时要分别喂给网络,因此上面的层可以学习每个特征的专门表示。共享embedding对于泛化、加速训练和减少内存需求非常重要。大多数模型的参数量的主要集中在高基数的embedding表中,例如,一个100万个id的特征空间,embedding维度是32,它参数是有2048个神经元全连接层的7倍。

Normalizing Continuous Features:神经网络对输入的尺度和分布都很敏感,实际上除了树模型外都是如此,发现归一化对收敛很关键,这里使用归一到[0,1]区间的方法:\tilde{x} = \int_{x}^{-\infty }df,累计分位数(quantile),(这里的归一化并不是很懂),此外还引入非线性特征 \tilde{x}^{2}\sqrt{\tilde{x}}

4.2 Modeling Expected Watch Time

模型的目标是预测期望观察时长,正样本用观看视频的时间来标注,有浏览过但没有点击行为的是负样本。为了预测期望观看尺长,使用weighted logistic regression。

正样本权重为观看时长T_i,负样本权重为1,因此,LR学习的odds为 \frac{\sum T_i}{N-k} ,N是训练样本个数,k是正样本个数,T_i是第i个正样本的观看时长。当正样本的比例较小,odds可以近似为E[T](1+P),P是点击率,E[T]是期望观看时间,由于P比较小,则上式接近于E[T],为了进行预测,使用指数函数e^{x}作为最终的激活函数,得到近似期望观看时长的odds。

4.3 Experiments with Hidden Layers

表格展示了不同的网络结构下,hold-out一天的数据的离线结果,如果一个负样本的模型得分比正样本的还高,就认为这是预测错误的观看时长(得分)。weighted, per-user loss 就是预测错误的观看时长占总观看时长的比例。

推荐系统论文:Deep Neural Networks for YouTube Recommendations_第7张图片

对于1024->512->256网络,如果不引入连续特征的平方和根号,loss增加0.2%。如果把weighted logistic regression 换成LR,即正负样本的权重相同为1,loss增加4.1%

5. CONCLUSIONS

把推荐系统分成召回+排序两个阶段。召回阶段使用的模型吸收了多种特征,比矩阵分解的方法更好。加入训练样本的Example Age作为输入特征,并允许模型代表流行视频的时间依赖行为。

排序阶段对类别特征做embedding,对连续特征归一化。模型最后一层使用weighted logistic regression,对训练样本加权,正样本权重为观看时长,负样本权重为1,则LR的odds可以近似于期望观看时长。

 

你可能感兴趣的:(Deep,Learning,推荐系统)