YouTube是世界上最大的视频分享网站,其推荐系统需要解决的主要问题有三个。一是大规模数据,Youtube拥有海量的视频资源,其推荐系统必须使用分布式算法以及高效率的在线serving系统;二是时效性,Youtube的语料库每秒钟都会更新许多视频,推荐系统必须能够对新上传的视频以及用户最新的动作做出及时反馈;三是噪声,用户的历史行为特征十分稀疏,模型很难学习到用户真正的喜好,往往会学到更多的噪音。本篇文章将介绍经典的YouTube推荐系统论文《Deep Neural Networks for YouTube Recommendations, 2016》内容,探讨如何构建推荐系统。
YouTube推荐系统架构
推荐系统分为召回(候选集生成)和排序两个阶段。召回阶段,基于用户画像及场景数据从海量的视频库(百万级别)中将相关度最高的资源检索出来,作为候选集,召回阶段可以通过“粗糙”的方式召回候选item;排序阶段,基于更加精细的特征对候选集(百级别)进行排序,最终呈现给用户的是很少的一部分数据,排序阶段采用更精细的特征计算user-item之间的排序score,作为最终输出推荐结果的依据。
在YouTube推荐系统中,越来越多的机器学习问题solution,转移到Deep learning上来解决。YouTube推荐系统采用经典的两阶段法:召回阶段 ——deep candidate generation model和排序阶段 ——deep ranking model,系统实际部署在基于Tensorflow的Google Brain上,模型有接近10亿级参数,训练样本千亿级别。
召回阶段
论文中将推荐问题看成一个“超大规模多分类”问题,即在时刻t,为用户U(上下文信息C)在视频库V中精准的预测出视频i的类别(每一个备选video都会是一个分类,i即为一个类别):
其中U为<用户,上下文>的高维embedding向量,vj为每个候选视频的embedding向量。由于数据稀疏性问题,训练数据的正负样本选取采用用户隐式反馈数据,即完成了观看的事件作为样本。比如训练数据为(u1,c1,5) 表示用户u1在上下文c1的情况下观看了类别为5的视频。
召回阶段需从巨大的视频库中挑选几百个用户可能感兴趣的候选集。召回阶段DNN的任务就是在用户信息,上下文信息为输入条件的情况下,学习用户的embedding向量u,通过一个softmax分类器,u能够有效的从视频语料库中识别视频的类别(也就是推荐的结果)。召回阶段的模型结构如下图所示。
使用DNN的一个关键优点是,DNN的输入可以方便的处理离散和连续变量。该模型输入是用户浏览历史、搜索历史、人口统计学信息和其余上下文信息concat生成的输入向量,模型架构中间是三个隐层的DNN结构,输出分线上和离线训练两个部分。将用户观看历史和搜索历史通过embedding的方式映射成为一个稠密的向量,同时用户场景信息以及用户画像信息(比如年龄,性别等离散特征)也被归一化到[0,1]作为DNN的输入。
1.特征处理
-
embedded video watches => watch vector,用户的历史观看是一个稀疏的,变长的视频id序列,采用类似于word2vec的做法,每个视频都会被embedding到固定维度的向量中。最终通过加权平均(可根据重要性和时间进行加权)得到固定维度的watch vector
-
embedded search tokens => Search vector,和watch vector生成方式类似
-
用户画像特征:如地理位置,设备,性别,年龄,登录状态等连续或离散特征都被归一化为[0,1], 和watch vector以及search vector做拼接(concatenate)
把历史搜索的query分词后的token的embedding向量进行加权平均,可以反映用户的整体的搜索历史情况。
2.样本年龄
用户更倾向于推荐尽管相关度不高但是新鲜fresh的视频。Example age特征表示视频被上传之后的时间。每一秒中,YouTube都有大量视频被上传,推荐这些最新视频对于YouTube来说是极其重要的。推荐系统往往是利用用户过去的行为来预测未来,那么对于历史行为,推荐系统通常是能够学习到一种隐式的基准的。但是对于视频的流行度分布,往往是高度不稳定的。将example age作为一个特征拼接到DNN的输入向量。训练时,时间窗口越靠后,该值越接近于0或者为一个小负数。加入了example age特征后,模型效果和观测到的实际数据更加逼近。
3.正负样本和上下文选择
在有监督学习问题中,label选择非常关键,因为label决定了你做什么,决定了你的上限,而feature和model都是在逼近label。
-
使用更广泛的数据源,训练样本要用youtube上的所有视频观看记录,而不只是系统推荐的视频观看记录。否则,面对新视频的时候很难推荐,并且推荐器会过度偏向exploitation
-
为每个用户生产固定数量的训练样本,在损失函数中所有用户的权重一样 ,防止一部分非常活跃的用户主导损失函数值
4.样本和上下文选择中的不对称的共同浏览问题
用户在浏览视频时候,往往都是序列式的,通常会先看一些比较流行的,然后才是观看一些小众的视频,剧集系列通常也是顺序地观看。
-
图(a)是held-out方式,利用上下文信息预估中间的一个视频
-
图(b)是predicting next watch的方式,则是利用上文信息,预估下一次浏览的视频
论文发现预测用户的下一个观看视频的效果要好得多,而不是预测随机推出的视频,即从用户的历史视频观看记录中随机拿出来一个作为正样本,然后只用这个视频之前的历史观看记录作为输入。图(b)的方式在线上A/B test中表现也更佳。而实际上,传统的协同过滤类的算法,都是隐含的采用图(a)的held-out方式,忽略了不对称的浏览模式。
5.负采样 Negative Sampling
数据处理过程有时候比算法更重要。youtube的样本集中,正样本被定义为用户完整地观看一个视频,而负样本的数量远远多于正样本。采用负采样,也就是随机从全量item中抽取用户没有点击过的item作为label=0的item后,效果明显提升。
6.不同网络深度和特征的实验
所有的视频和search token都embedded到256维的向量中,开始input层直接全连接到256维的softmax层,依次增加网络深度。随着网络深度加大,预测准确率在提升,但增加第4层之后,MAP(Mean Average Precision)已经变化不大了。增加了观看历史之外的特征,对预测准确率提升很明显。
排序阶段
排序阶段用于精准的预估用户对视频的喜好程度。针对数百个item,需要更多feature来描述item,以及用户与视频的关系。比如用户可能很喜欢某个视频,但如果推荐结果采用的“缩略图”选择不当,用户也许不会点击,等等。
排序阶段可以将不同来源的候选项进行有效的ensemble(召回阶段的候选集来源很多,没办法直接比较score)。排序阶段的模型和召回阶段的基本相似,不同在于Training最后一层是Weighted LR,Serving时激励函数使用的$e^{Wx+b}$.
1.建模(针对观看时间)
CTR指标对于视频搜索具有一定的欺骗性,所以论文提出采用期望观看时间作为评估指标。观看时长不是只有0,1两种标签,所以YouTube采用了Weighted Logistic Regression来模拟这个输出。划分样本空间时,正样本为点击,输出值即阅读时长值;负样本为无点击视频,输出值则统一采用1,即采用单位权值,不进行加权。
在正常的逻辑回归中,几率odds计算,表示样本为正例概率与负例概率的比例 ,引入观看时间时,LR学到的odds为
,表示正例出现概率的和与负样本概率的和的比例。
2.特征工程
尽管DNN能够减轻人工特征工程的负担,但是依然需要花费精力将用户及视频数据转化为有效的特征。其难点在于对用户行为序列建模,并关联视频打分机制。用户对于某Channel的历史行为很重要,比如浏览该频道的次数,最近一次浏览该频道距离现在的时间。把召回阶段的信息传播到排序阶段同样能提升效果,比如推荐来源和所在来源的分数。
-
分类特征Embedding
采用embedding的方式映射稀疏离散特征为密集向量,YouTube为每一个类别特征维度生成一个独立的embedding空间;对于相同域的特征可以共享embedding,好处在于加速迭代,降低内存开销
-
连续特征归一化
神经网络对于输入数据的规模和分布非常敏感,而决策树模型对于各个特征的缩放是不受什么影响,连续特征进行归一化对于收敛很重要。设计一种积分函数将特征映射为一个服从[0,1)分布的变量
3.Hideden Layers实验
在单个页面上,对展示给用户的正例和负例的这两个impression进行打分,如果对负例打分高于正例打分的话,那么我们认为对于正例预测的观看时间属于错误预测的观看时间。YouTube定义了模型评估指标weighted,per-user loss,即错误预测的观看时间占比总的观看时间的比例。对每个用户的错误预测loss求和即可获得该用户的loss。实验证明,YouTube采用的Tower塔式模型效果最好,即第一层1024,第二层512,第三层256。