写在前面:
最近正在看该文章,今天下班路上看到朋友的这篇阅读笔记,然后对照本文又阅读论文一遍,收获很多,记录在此,便于温习,感谢!!!
论文:《Deep Neural Networks for YouTube Recommendation》
一、摘要
DeepLearning在搜索、广告上已经有了一些成功的应用案例,在推荐上应该如何应用呢?Google的这篇文章给出了一些案例。亮点有如下几个方面:
针对经典检索二步曲:召回和排序,分别都使用了DeepLearning,相对于之前使用矩阵分解进行召回、使用线性&树模型进行排序的方案,有明显效果;
选择了观看时长作为优化目标,并给出了对应策略优化方案;
线上部分采用K近邻索引减少运算开销;
二、背景
YuTube视频推荐系统的三大挑战:
大数据规模
事实证明,很多适用于小数据集的算法在大数据上都行不通,特别是对YouTube这样巨大体量的应用来说,需要定制分布式学习算法和高效的服务系统,
时效性
YouTube的视频库是快速动态变化的,推荐系统需要迅速对线上新上传的视频和用户行为进行反馈。如何在新视频和老视频之间维持平衡,可以看做一个exploration & exploitation问题。
噪声
用户的历史行为由于存在不可观测的因子而难以捕获,并且非常稀疏,很难获得用户满意的group truth,而是只能对充满噪声的隐式反馈建模。此外训练数据还是非结构化的,以上这些问题要求模型具有鲁棒性。
反观业界,目前的推荐系统,绝大部分使用传统的矩阵分解方法,DeepLearning的方法相对较少。而目前YouTube使用深度学习作为几乎所有学习问题的通用解决方案,自然也会尝试应用在推荐系统上,这套系统就是基于TensorFlow搭建。
问题建模:从1000亿样本中,学习10亿参数。
三、系统架构
从百万级别的视频库到几十个用户展现给用户的列表,中间经历了两个主要步骤:
1)候选集合生产/Candidate Generation
这个在不同的公司叫法比较多,在百度也称为Retrieval,阿里的童鞋们叫Match的多一些,都是一个意思:给定整个视频/广告/网页库,在一定的输入信息情况下(推荐是用户,搜索是Query),返回几百个高相关性的候选集。
2)排序/Rank
排序承担了从几百个候选集合中挑选top-N的结果的角色,考虑的因素会更加多。
这种Two-Stage架构的优点在于:既能够保证处理大数据的效率和相关性,又能保证个性化的准确性。另外这种设计可以很容易的扩展其他召回来源( 不同召回来源用同样的排序打分有可比较性)。
线下指标:Precision,Recall,Ranking Loss
线上指标:ABtest(观看时长,点击率)
四、Candidate Generation
在这个阶段,数以百万计的视频根据相关性被缩减到数百个。Youtube之前采用的是基于FM最小化rank loss的方法,具体请见《Scaling up to large vocabulary image annotation 》,而这篇文章采用神经网络来模拟这种矩阵分解,从这个角度来看,该方法可以被看作是因式分解技术的非线性泛化。
4.1 问题建模
深度神经网络的学习目标是用户偏好的向量表示u,于是用户观看视频i的概率分布:
其中,i表示第i个视频,u表示<user, context>的embedding,v表示视频的embedding。这里embedding就是把离散的类别(例如视频id,用户id)映射到一个dense vector。
最后通过一个softmax来输出当前用户场景下观看第i个视频的概率。
尽管在youtube中有一些显示反馈机制(thumbs up/down, in-product surveys),但是实验仍采用隐式反馈作为学习样本(是否看完视频),因为隐式反馈的比显示反馈的数量级大得多,长尾部分显示反馈会非常稀疏。
4.2 模型
受这篇文章《Distributed representations of words and phrases and their compositionality》启发,可以学习到每个视频的embedding表示,并将用户历史观看过的视频sequence通过embedding映射到一个定长的dense vector。
另外重要的一点是,embedding向量跟网络的其他参数一样同样被BP算法训练。以上特征通过拼接作为网络的输入层,后面是若干全连接的ReLU隐层。
4.3 特征
总计下五大类特征:
1) 用户历史观看
每一个蓝色的竖条表示用户看过的一个视频的embedding表示;每个用户看过的视频个数据可能不一样,但是输入网络之前会求average,这样网络层的输入就是定长的了。实验发现,average比其他方式(如sum,component-wise max 等)效果要好。
2)用户历史搜索
用户在搜索上的历史query也与上面的视频一样,做相同处理。
统计特征能很好的为新用户提供先验知识,因此还会加入如下特征:
3)一些较大维度的离散特征
地理区域特征和设备,也做embedding。
4)其他简单binary特征和连续值特征
例如age,注意连续值归一化。
5)其他
除了上述说的四类外,还有一个比较有意思的Example Age特征。由于训练数据来自于历史n天的数据,如果不加数据时效性特征,则模型预测出的是这一段时间内的平均似然。
由上图可看出,加入Example Age特征之后,样本在时间上的分布更加符合实际。
4.4 数据
1)surrogate problem
在机器学习问题中,不直接对目标建模,而是对目标相关的指标建模,反而可能达到更好的效果。例如:电影推荐可以通过预估打分来完成 ;在这个应用中,可以用观看时长来预估点击;再例如,点击率预估可以通过对停留时间建模实现。
2)训练数据
首先,采用站内加站外的全部训练样本,这样容易展现新内容,并且不容易有偏;其次,对每个用户采用固定数量的样本,防止活跃用户主导模型训练。
3)特征的时序性
(a)用户特征中的search history和watch history都是时序无关的,输入整个时间窗内的特征
(b)只采用label之前时间的特征作为用户特征输入到神经网络中
实践证明,b方法效果更佳。
举例说明原因:一个搜索过taylor swift的人,肯定看过搜索结果页上的视频了,推荐系统再给他推荐,效果肯定不好。另外,用户追剧的时候回一集一集追,喜欢一个演员也是从他的某个代表作看起,这些都是有时序性的。
4.5 实验
模型采用经典的“塔形”结构,可以看出:
1)以上提出的几类特征,都能在历史观看行为特征的基础上进一步提升效果;
2)模型深度达到3之后,再增加深度对效果提升不大,而且使得模型很难收敛;
4.6 工程
另外,文章中提到对于超多类别的分类问题(Efficient Extreme Multiclass),如何进行效率优化:
1) 训练效率
因为这是一个超多类别的分类问题,训练时对负样本的类别进行采样,之后再通过样本的权重进行修正。
2) 预测效率
由于candidates并不需要算出一个真正的概率分布P,只需要比较大小,所以可以采用一些最近邻搜索算法减少召回的时间复杂度。实验发现不同的K近邻搜索算法并不影响召回的效果。
五、Ranking
在排序阶段,由于候选集数量减少到几百,可以使得更多特征。另外由于不同召回策略返回的结果之间没有可比性,而ranking可以给出统一标准score。
5.1 问题建模
该回归模型的目标是视频观看时间(会根据线上情况做一些简单变换),损失函数为交叉熵代价函数。
这里引入weighted logistic regression:
正样本(点击)用其观看时间加权,负样本(未点击)用单位权重加权,这样LR学到的概率odds=sum(Ti)/(N-k),其中Ti是第i个展示视频的观看时间,N是样本数,k是正样本数。实际上正样本的比例很小,所以上面的odds近似于E[T]/(1+P),其中E是期望观看时间,P是点击率。最后由于P很小,odds近似于E[T]。最后,用指数函数来将odds转化为预估的观看时间。
对观看时间建模的好处:
1)以点击作为label会有“骗点击”的问题,有些视频通过标题吸引人点击,而内容却是不相关的;
2)观看时间作为训练目标,除了分类正负样本之外,模型在正样本上更有区分度;这里多说几句,其实现在很多应用都在做类似的工作:或是直接用模型拟合观看时间,或是通过观看时间加权正样本,或是通过观看时间加权学习梯度,本质上都差不多;
3)此外,作弊的难度也进一步增加;
5.2 模型
排序模块的模型结构与召回基本相同,只不过输入特征和输出层不同:
输入:除了用户维度,还有视频维度的信息;
输出:预估观看时间
5.3 特征
文章还讲述了YouTube在做特征时候的一些实践经验和体会。尽管传说DL可以减轻特征工程的工作量,但是因为这里特征数据的复杂性,实际上还是少不了人工经验参与和实践。
1)特征工程
实践发现,最重要的特征是用户对视频的历史行为(例如:用户历史看过这个频道的多少个视频?这个用户上次看这个topic的视频是什么时候?),这与《Practical lessons from predicting clicks on ads at facebook》这篇文章中对广告的实验结果一致;
另外视频历史的展现频率这个特征也很重要,可以提供多样性。例如:给用户展示某个广告多次之后仍然没有观看,这个视频就会被模型降权。
2)类别特征embedding
像candidate generation模型一样,我们需要把稀疏的类别特征映射到稠密的向量以适应神经网络的输入。在这个过程中,过大的词表(视频ID,查询query)会根据频率进行截断,未见id映射到全0向量,这个做法和LR中直接使用PV对特征做过滤的做法思路是一致的,都可以看做一种特征选择的方法、降低噪音。
最重要的是,不同特征中的相同ID的embedding向量是共享的,尽管如此,上层的网络仍然能学到每个不同特征的特殊表示。
3)归一化连续特征
神经网络模型对输入特征的scaling和distribution很敏感,相比之下树模型则不会。因为树模型是利用树结构的特点来模拟特征交叉,不同的特征之间数值上没有直接关系;
归一化公式:
另外,除了x,还将x^2和x^0.5作为特征,赋予模型更强的表示能力,因为神经网络模型只能表示特征之间的非线性关系,而不是表示特征自身的非线性关系。这个是不是有点熟悉?PRML中开章解释模型复杂度的时候用到了类似的做法,作用是增强模型的刻画能力。
5.4 实验
1)评价指标解释
其中,weighted, per-user loss : 对一次展示的所有样本打分,如果正样本的分数比负样本低,则这个正样本的观看时间叫做mispredicted watch time
weighted, per-user loss = mispredicted watch time / total watch time
直观上看,这个指标用来衡量错判的损失,对观看时间越长的正样本,把他预估为负样本的损失越大。其实可以想象为带权重的AUC。
2)效果分析
在模型结构方面:可以看出网络广度和深度的加深都会提高效果,但是需要注意线上效率和模型效果这对trade off
在特征方面:在1024 → 512 → 256 模型基础上,不加连续特征的平方项和开方项,loss增加0.2%;如果正负样本使用相同权重,loss会显著增加4.1%,这证明了之前的结论,通过建模拟合观看时间,或者用观看时间对正样本加权,可以有效提高模型的准确率。
六、总结
1)将深度学习应用在了推荐系统的两部分:召回和排序。
召回:对用户偏好建模,通过计算用户偏好的向量与视频embedding向量相似度来筛选几百相关候选集;通过K近邻索引提高线上检索效率。
排序:对视频观看时长建模,神经网络模型能有效捕捉特征间的非线性关系,效果优于线性模型和树模型。
2)一些特征处理方法
包括:使用训练样本的年龄作为输入特征,消除了对过去时间段的全局偏差,并允许模型表示视频的时间依赖;连续特征归一化之后,还将归一化后的平方项和开方项作为特征,增加模型的表达能力。
3)针对观看时长的优化问题
提出了weighted logistic regression的解决方案,将正样本用观看时间加权,效果优于直接预估点击率。
七、相关文献
[1]《Distributed representations of words and phrases and their compositionality》
[[2]《On using very large target vocabulary for neural machine translation》
[3]《Hierarchical probabilistic neural network language model》