一、简介
本文首发于微信公众号:机器学习荐货情报局
首先,YouTube的推荐系统主要包括两个部分:Deep Candidate Generation model
和Deep Ranking model
. 这两部分全都是用的神经网络,而且网络结构相似。Deep Candidate Generation model
在成千上万的视频集中选出几百个视频作为推荐候选集;Deep Ranking model
对这些候选集里所有视频进行打分排序,然后按照排序的结果像用户推荐视频。
YouTube的推荐系统相比于其他的推荐系统不同之处在于,三个不同的挑战:
-
Scale
YouTube用户和视频数量都非常大,在小规模数据上效果不错的推荐系统在这里的表现差强人意。(文章没有说具体的数量在什么级别,现在国内的互联网公司用户和内容的数量应该也非常大吧,这应该不能算是YouTube特有的挑战了) -
Freshness
用户每时每刻都会上传很多新视频;如何平衡新老视频的推荐是一个问题,属于exploration
orexploitation
的问题。 -
Noise
用户和视频数量巨大导致行为数据矩阵特别稀疏,难以利用;同时,无法有效获取用户对内容的真正满意程度;内容数据还没有一个完善的结构化表示方法;
于是,YouTube利用Google Brain
构建深度学习模型来解决问题。Google Brain
就是Tensorflow
的前身。训练的模型规模大概是10亿参数,使用了hundreds of billions
样本来进行训练。
上千亿条训练样本么?真的有这么大么
二、系统概览
系统架构如下:
YouTube推荐系统架构
系统包含两部分:Candidate generation和Ranking。Candidate Generation
的作用是从上百万视频库中选出几百个视频作为候选推荐集,主要是利用协同过滤实现比较粗的个性化,比如利用用户观看的视频IDs、搜索查询的tokens、人口统计信息;Ranking
的作用是在这数百个视频中进行更加精确的深层次的个性化推荐,主要做法包括根据自定义目标函数对视频打分、使用更加丰富的视频和用户特征、根据打分来进行排序;当然,我们也可以用一些其他的规则方法等进行候选集的扩充;
线下的评估方法包括:precision、recall、ranking loss等;最终的效果还是需要线上做A/B测试,关注的指标包括:点击率、观看时间等;需要指出的是,线上线下有时候并不能保持一致的结果。
三、Candidate Generation Model
该模块最初是用matrix factorization
在rank loss
下训练的;最初改用DNN后,仅仅对用户之前的观看视频进行了embeding,这可以看成是矩阵分解技术的非线性扩展;
3.1 Recommendations as Classification
把推荐看成是一个类别非常多的多分类问题
,形式化如下:
一个特定的用户U,在时刻t,在一个特定的上下文环境C下,U从所有的视频V中选中i进行观看。u表示pair(User, Context)
;Vj表示候选视频j的embedding向量;
训练集负样本太多怎么办?
对负样本进行负采样,并用importance weighting进行校正。
损失函数是什么?
模型使用cross-entropy loss
来进行训练,loss使用正类和采样后的负类进行计算;
Serving latencey如何保证?
因为视频是在是太多了,线上要求,必须在几百毫秒内计算并选择出最可能的N个类别(videos)并呈现给用户。为了降低服务延迟,原来的做法是hashing
,现在的做法是利用已有的nearest neighbor search
in the dot space,已经有很多成熟的算法来做这件事。
3.2 模型架构
Deep Candidate Generation Model架构非常清楚:
- 观看视频记录、搜索记录全部进行embedding,转换成低维度的dense vector
- 因为每个人的观看和搜索记录是变长的,为了统一输入,对embedding vectors进行average。而且作者也指出尝试了其他策略,比如max min sum等等,发现取平均效果最好;
- 激活函数是ReLU;最后用softmax得到概率;loss函数为cross-entropy交叉熵(适用于多分类)
3.3 特征
特征包括:
-
观看历史 + 搜索历史
搜索历史处理办法:对每一个query使用一元和二元模型tokenized,然后embedded;最后取平均,认为它是对用户搜索历史的一个代表;
-
人口统计特征
为我们的推荐引入先验知识 -
地理位置、Device、gender、logged-in state、age
连续值正则化到[0,1],离散值进行编码处理
这里单独说一个对性能带来很大提升的特征:训练样本年龄(Example Age Feature)
很简单的道理:视频刚刚被上传不久的时候,观看的人要多一些;时间越长观看的人越少;所以加入了这个时间特征,表示视频上传时间距当前时间有多久。对于真正的待预测的视频,则直接用一个比较小的值就可以了。效果很明显,因为没有这个特征的话,模型试图给出的是在整个训练周期上的一个平均的观看时间;
Example Age Feature
3.4 标签选取
针对每一个用户,都选出固定数量的训练样本;防止一些高活跃度用户主导loss的计算,保证每个用户对loss的贡献都是均等的;
3.5 特征和模型深度
毫无疑问,特征越多,模型深度适当的加深会提高模型的性能,实验结果也是如此:
Features and Depth
四、Ranking Model
现在Candidate Generation Model已经给出了候选集;在Ranking阶段,我们可以使用更多的特征,因为我们只需要对候选集中的视频打分即可,依旧针对每一个展示的观看时间来进行学习;
4.1 特征表示
从两个维度对特征进行分析:
- 取值数量。分为单一特征(univalent),比如当前待展示待打分的视频ID;和多值特征(multivalent),比如用户过去观看的N个视频ID;
- 特征描述内容;分为描述Item(“impression”)还是描述user/context(“query”);query特征每次请求都会被重新计算,因为他一直在变化;Item特征描述其固有属性只需要针对每个Item计算一次就可以了;
具体的特征处理包括:
特征工程:
虽然DNN隐含了特征工程,但是作者还是做了很多特征工程(个人认为,这说明网络模型并不是很适合这个数据,或者说这个网络结构不像CNN那样高效)。
最重要的两方面特征如下:
- 用户历史行为。用户之前和那些items有过交互,或者和相似的items的交互;
- 之前视频展示的频率。如果一个视频之前展示过,用户没有观看;那么用户在下次展示的时候依旧不会观看的概率比较大;
离散特征Embedding:
针对观看视频ID等离散特征,依旧是embedding的处理方式,embedding的维度参考log(nunique(value))
。对于取值特别多的特征,可以根据出现的频率进行截取,比如只取前N个;对于这N个之外的值的embedding可以全用零填充;
针对multivalent的离散特征,处理方式是取均值(也是常规的做法了)
连续特征Normalizing:
这个已经是老生常谈了,尤其是对于深度学习必须做归一化;但是作者还提到他们对归一化后的特征还取了平方、开方得到两个新特征,也提高了线下性能;
这样看似毫无逻辑的特征竟然也有用。。。可能真的是丰富了特征的表达吧,只能这么理解了
4.2 模型架构
Ranking Model模型架构网络结构上图画的非常清楚,三层ReLU,最后用logistic得到概率;针对连续特征归一化+增强处理;针对离散特征主要是进行embedding,对于多值边长离散特征,比如观看视频IDs,对么embedding的结果取平均;
同时,模型依旧是对观看时间建模,使用点击率容易被标题党欺骗;同时还对不同深度的网络进行了测试,增加网络深度能稍微提升性能,考虑性价比的话并不是很合适,实验结果如下:
Ranking Model Experiment
五、总结
总结起来值得特别主要的关键点如下:
- 训练样本Age,很好的对刚上传的视频观看率高这一事实进行了建模,显著的提升了性能,消除了模型隐含推荐老视频的问题;
- 推荐系统,最重要的特征还是在挖掘描述用户对商品的历史行为上;
- 最后Ranking Model的logistic regression,针对正样本使用其观看时间作为权重,负样本统一为单位权重,进行调整。这样让我们可以更好的对观看时间进行建模;
Reference
-
《Deep Neural Network for Youtube Recommendations》
机器学习荐货情报局.jpg
网友评论