虽然国内必须FQ才能登陆YouTube,但想必你们都知道这个网站。基本上算是世界范围内视频领域的最大的网站了,坐拥10亿量级的用户,网站内的视频推荐天然是一个很是重要的功能。本文就focus在YouTube视频推荐的DNN算法,文中不但详细介绍了Youtube推荐算法和架构细节,还给了很多practical lessons and insights,很值得精读一番。下图即是YouTube APP视频推荐的一个例子。算法
在推荐系统领域,特别是YouTube的所在视频推荐领域,主要面临三个挑战:网络
之因此要在推荐系统中应用DNN解决问题,一个重要缘由是google内部在机器学习问题上的通用solution的趋势正转移到Deep learning,系统实际部署在基于tensorflow的Google Brain上。架构
1、系统概览app
在工业界工做的同窗对下图的系统划分并不陌生。整个推荐系统分为candidate generation(淘宝称为Matching,后面用Matching代替)和Ranking两个阶段。Matching阶段经过i2i/u2i/u2u/user profile等方式“粗糙”的召回候选商品,Matching阶段视频的数量是百级别了;Ranking阶段对Matching后的视频采用更精细的特征计算user-item之间的排序分,做为最终输出推荐结果的依据。 less
之因此把推荐系统划分红Matching和Ranking两个阶段,主要是从性能方面考虑的。Matching阶段面临的是百万级视频,单个视频的性能开销必须很小;而Ranking阶段的算法则很是消耗资源,不可能对全部视频都算一遍,实际上即使资源充足也彻底没有必要,由于每每来讲通不过Matching粗选的视频,大部分在Ranking阶段排名也很低。接下来分别从Matching和Ranking阶段展开介绍。dom
2、Matching机器学习
2.1 问题建模函数
咱们把推荐问题建模成一个“超大规模多分类”问题。即在时刻,为用户
(上下文信息
)在视频库
中精准的预测出视频
的类别(每一个具体的视频视为一个类别,
即为一个类别),用数学公式表达以下:性能
很显然上式为一个softmax多分类器的形式。向量是<user, context>信息的高纬“embedding”,而向量
则是视频 j 的embedding向量。因此DNN的目标就是在用户信息和上下文信息为输入条件下学习用户的embedding向量
。用公式表达DNN就是在拟合函数
。学习
而这种超大规模分类问题上,至少要有几百万个类别,实际训练采用的是Negative Sampe,相似于word2vec的Skip-Gram方法,相似文章 DNN论文分享 - Item2vec: Neural Item Embedding for Collaborative Filtering 的item-embedding用的方法。
2.2 模型架构
整个模型架构是包含三个隐层的DNN结构。输入是用户浏览历史、搜索历史、人口统计学信息和其他上下文信息concat成的输入向量;输出分线上和离线训练两个部分。
离线训练阶段输出层为softmax层,输出2.1公式表达的几率。而线上则直接利用user向量查询相关商品,最重要问题是在性能。咱们利用相似局部敏感哈希(Locality Sensitive Hashing,不展开介绍了,感兴趣的同窗能够读读这篇论文 An Investigation of Practical Approximate Nearest Neighbor Algorithms)的算法为用户提供最相关的N个视频。
2.3 主要特征
相似于word2vec的作法,每一个视频都会被embedding到固定维度的向量中。用户的观看视频历史则是经过变长的视频序列表达,最终经过加权平均(可根据重要性和时间进行加权)获得固定维度的watch vector做为DNN的输入。
除历史观看视频外的其余signal:
其实熟悉Skip-Gram方法的同窗很容易看出来,2.1把推荐问题定义为“超大规模多分类”问题的数学公式和word2vec的Skip-Gram方法的公式基本相同,所不一样的是user_vec是经过DNN学习到的,而引入DNN的好处则是任意的连续特征和离散特征能够很容易添加到模型当中。一样的,推荐系统经常使用的矩阵分解方法虽然也能获得user_vec和item_vec,但一样是不能嵌入更多feature。
主要特征:
“Example Age” (视频上传时间)特征
视频网络的时效性是很重要的,每秒YouTube上都有大量新视频被上传,而对用户来说,哪怕牺牲相关性代价,用户仍是更倾向于更新的视频。固然咱们不会单纯的由于一个视频新就直接推荐给用户。
由于机器学习系统在训练阶段都是利用过去的行为预估将来,所以一般对过去的行为有个隐式的bias。视频网站视频的分布是高度非静态(non-stationary)的,但咱们的推荐系统产生的视频集合在视频的分布,基本上反映的是训练所取时间段的平均的观看喜爱的视频。所以咱们咱们把样本的 “age” 做为一个feature加入模型训练中。从下图能够很清楚的看出,加入“example age” feature后和经验分布更为match。
2.4 label and context selection
在有监督学习问题中,最重要的选择是label了,由于label决定了你作什么,决定了你的上限,而feature和model都是在逼近label。咱们的几个设计以下:
2.4 不一样网络深度和特征的实验
简单介绍下咱们的网络构建过程,采用的经典的“tower”模式搭建网络,基本同2.2所示的网络架构,全部的视频和search token都embedded到256维的向量中,开始input层直接全链接到256维的softmax层,依次增长网络深度(+512-->+1024-->+2048--> ...)。
下图反映了不一样网络深度(横坐标)下不一样特征组合状况下的holdout-MAP(纵坐标)。能够很明显看出,增长了观看历史以外的特征很明显的提高了预测得准确率;从网络深度看,随着网络深度加大,预测准确率在提高,但继续增长第四层网络已经收益不大了。
3、Ranking
Ranking阶段的最重要任务就是精准的预估用户对视频的喜爱程度。不一样于Matching阶段面临的是百万级的候选视频集,Ranking阶段面对的只是百级别的商品集,所以咱们能够使用更多更精细的feature来刻画视频(item)以及用户与视频(user-item)的关系。好比用户可能很喜欢某个视频,但若是list页的用的“缩略图”选择不当,用户也许不会点击,等等。
此外,Matching阶段的来源每每不少,无法直接比较。Ranking阶段另外一个关键的做用是可以把不一样来源的数据进行有效的ensemble。
在目标的设定方面,单纯CTR指标是有迷惑性的,有些靠关键词吸引用户高点击的视频未必可以被播放。所以设定的目标基本与指望的观看时长相关,具体的目标调整则根据线上的A/B进行调整。
3.1 模型架构
Ranking阶段的模型和Matching基本类似,不一样的是training最后一层是一个weighted LR层,而serving阶段激励函数用的是,具体在3.3阐述。
3.2 特征表达
a). Feature Engineering:
尽管深度学习在图像、语音和NLP等场景都能实现end-to-end的训练,没有了人工特征工程工做。然而在搜索和推荐场景,咱们的很难吧原始数据直接做为FNN的输入,特征工程仍然很重要。而特征工程中最难的是如何建模用户时序行为(temporal sequence of user actions),而且关联这些行为和要rank的item。
咱们发现最重要的Signal是描述用户与商品自己或类似商品之间交互的Signal,这与Facebook在14年提出LR+GBDT模型的paper(Practical Lessons from Predicting Clicks on Ads at Facebook)中获得的结论是一致的。好比咱们要度量用户对视频的喜欢,能够考虑用户与视频所在频道间的关系:
这两个连续特征的最大好处是具有很是强的泛化能力。另外除了这两个偏正向的特征,用户对于视频所在频道的一些PV但不点击的行为,即负反馈Signal一样很是重要。
另外,咱们还发现,把Matching阶段的信息传播到Ranking阶段一样能很好的提高效果,好比推荐来源和所在来源的分数。
b). Embedding Categorical Features
NN更适合处理连续特征,所以稀疏的特别是高基数空间的离散特征须要embedding到稠密的向量中。每一个维度(好比query/user_id)都有独立的embedding空间,通常来讲空间的维度基本与log(去重后值得数量)至关。实际并不是为全部的id进行embedding,好比视频id,只须要按照点击排序,选择top N视频进行embedding,其他置为0向量。而对于像“过去点击的视频”这种multivalent特征,与Matching阶段的处理相同,进行加权平均便可。
另一个值得注意的是,同维度不一样feature采用的相同ID的embedding是共享的(好比“过去浏览的视频id” “seed视频id”),这样能够大大加速训练,但显然输入层仍要分别填充。
c). Normalizing Continuous Features
众所周知,NN对输入特征的尺度和分布都是很是敏感的,实际上基本上除了Tree-Based的模型(好比GBDT/RF),机器学习的大多算法都如此。咱们发现归一化方法对收敛很关键,推荐一种排序分位归一到[0,1]区间的方法,即,累计分位点。
除此以外,咱们还把归一化后的的根号
和平方
做为网络输入,以期能使网络可以更容易获得特征的次线性(sub-linear)和(super-linear)超线性函数。
3.3 建模指望观看时长
咱们的目标是预测指望观看时长。有点击的为正样本,有PV无点击的为负样本,正样本须要根据观看时长进行加权。所以,咱们训练阶段网络最后一层用的是 weighted logistic regression。
正样本的权重为观看时长 ,负样本权重为1。这样的话,LR学到的odds为:
其中是总的样本数量,
是正样本数量,
是第
正样本的观看时长。通常来讲,k相对N比较小,所以上式的odds能够转换成
,其中
是点击率,点击率通常很小,这样odds接近于
,即指望观看时长。所以在线上serving的inference阶段,咱们采用
做为激励函数,就是近似的估计指望的观看时长。
3.4 不一样隐层的实验
下图的table1是离线利用hold-out一天数据在不一样NN网络结构下的结果。若是用户对模型预估高分的反而没有观看,咱们认为是预测错误的观看时长。weighted, per-user loss就是预测错误观看时长占总观看时长的比例。
咱们对网络结构中隐层的宽度和深度方面都作了测试,从下图结果看增长隐层网络宽度和深度都能提高模型效果。而对于1024-->512-->256这个网络,测试的不包含归一化后根号和方式的版本,loss增长了0.2%。而若是把weighted LR替换成LR,效果降低达到4.1%。