推荐系统从零单排系列(一)--Deep Neural Network for YouTube Recommendations

一、简介

本文首发于微信公众号:机器学习荐货情报局

首先,YouTube的推荐系统主要包括两个部分:Deep Candidate Generation modelDeep Ranking model. 这两部分全都是用的神经网络,而且网络结构相似。Deep Candidate Generation model在成千上万的视频集中选出几百个视频作为推荐候选集;Deep Ranking model对这些候选集里所有视频进行打分排序,然后按照排序的结果像用户推荐视频。

YouTube的推荐系统相比于其他的推荐系统不同之处在于,三个不同的挑战:

  1. Scale
    YouTube用户和视频数量都非常大,在小规模数据上效果不错的推荐系统在这里的表现差强人意。(文章没有说具体的数量在什么级别,现在国内的互联网公司用户和内容的数量应该也非常大吧,这应该不能算是YouTube特有的挑战了)

  2. Freshness
    用户每时每刻都会上传很多新视频;如何平衡新老视频的推荐是一个问题,属于exploration or exploitation的问题。

  3. 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 factorizationrank loss下训练的;最初改用DNN后,仅仅对用户之前的观看视频进行了embeding,这可以看成是矩阵分解技术的非线性扩展;

3.1 Recommendations as Classification

把推荐看成是一个类别非常多的多分类问题,形式化如下:

Candidate Generation Model Format

一个特定的用户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

架构非常清楚:

  1. 观看视频记录、搜索记录全部进行embedding,转换成低维度的dense vector
  2. 因为每个人的观看和搜索记录是变长的,为了统一输入,对embedding vectors进行average。而且作者也指出尝试了其他策略,比如max min sum等等,发现取平均效果最好;
  3. 激活函数是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 特征表示

从两个维度对特征进行分析:

  1. 取值数量。分为单一特征(univalent),比如当前待展示待打分的视频ID;和多值特征(multivalent),比如用户过去观看的N个视频ID;
  2. 特征描述内容;分为描述Item(“impression”)还是描述user/context(“query”);query特征每次请求都会被重新计算,因为他一直在变化;Item特征描述其固有属性只需要针对每个Item计算一次就可以了;

具体的特征处理包括:

特征工程:
虽然DNN隐含了特征工程,但是作者还是做了很多特征工程(个人认为,这说明网络模型并不是很适合这个数据,或者说这个网络结构不像CNN那样高效)。
最重要的两方面特征如下:

  1. 用户历史行为。用户之前和那些items有过交互,或者和相似的items的交互;
  2. 之前视频展示的频率。如果一个视频之前展示过,用户没有观看;那么用户在下次展示的时候依旧不会观看的概率比较大;

离散特征Embedding:
针对观看视频ID等离散特征,依旧是embedding的处理方式,embedding的维度参考log(nunique(value))。对于取值特别多的特征,可以根据出现的频率进行截取,比如只取前N个;对于这N个之外的值的embedding可以全用零填充;

针对multivalent的离散特征,处理方式是取均值(也是常规的做法了)

连续特征Normalizing:
这个已经是老生常谈了,尤其是对于深度学习必须做归一化;但是作者还提到他们对归一化后的特征还取了平方、开方得到两个新特征,也提高了线下性能;

这样看似毫无逻辑的特征竟然也有用。。。可能真的是丰富了特征的表达吧,只能这么理解了

4.2 模型架构

Ranking Model模型架构

网络结构上图画的非常清楚,三层ReLU,最后用logistic得到概率;针对连续特征归一化+增强处理;针对离散特征主要是进行embedding,对于多值边长离散特征,比如观看视频IDs,对么embedding的结果取平均;

同时,模型依旧是对观看时间建模,使用点击率容易被标题党欺骗;同时还对不同深度的网络进行了测试,增加网络深度能稍微提升性能,考虑性价比的话并不是很合适,实验结果如下:


Ranking Model Experiment

五、总结

总结起来值得特别主要的关键点如下:

  1. 训练样本Age,很好的对刚上传的视频观看率高这一事实进行了建模,显著的提升了性能,消除了模型隐含推荐老视频的问题;
  2. 推荐系统,最重要的特征还是在挖掘描述用户对商品的历史行为上;
  3. 最后Ranking Model的logistic regression,针对正样本使用其观看时间作为权重,负样本统一为单位权重,进行调整。这样让我们可以更好的对观看时间进行建模;

Reference

  1. 《Deep Neural Network for Youtube Recommendations》


    机器学习荐货情报局.jpg

你可能感兴趣的:(推荐系统从零单排系列(一)--Deep Neural Network for YouTube Recommendations)