一、Introduction
YouTube有很多用户原创内容,其商业模式和Netflix、国内的腾讯、爱奇艺等流媒体不同,后者是采购或自制的电影,并且YouTube的视频基数巨大,用户难以发现喜欢的内容。本文根据典型的两阶段信息检索二分法:首先描述一种深度候选生成模型,接着描述一种分离的深度排序模型。
YouTube在视频推荐的三大挑战:
规模大、更新快、噪声(用户历史行为稀疏;视频中很多数据是非结构化的)。
(1)数据规模:YouTube 的用户和视频量级都是十亿级别的。
(2)更新快:推荐系统需要及时对新上传的视频和用户的新行为作出响应。
(3)数据噪音:由于稀疏和外部因素影响,用户的历史行为很难预测。大部分 YouTube 视频只有隐式反馈(即用户对视频的观看行为),缺少显式反馈(即用户对视频的评分)。
二、System overview
首先来看整体架构(召回层和排序层)。
第一阶段,召回层:从百万级视频中筛选出小部分视频;要求速度快;召回层根据用户历史观看、搜索等记录进行召回,以满足用户泛化的兴趣。
第二阶段,排序层:为了更精准地推荐给用户,这阶段需要更加复杂的模型和特征进行排序。
第三阶段,线下评估:评估指标有precision、recall、ranking loss;最终线上做A/B测试(指标:点击率、观看时间)。
A/B测试即把被测对象随机分成 A、B 两组,通过对照测试的方法得出实验结论。在线上评估指标的制定过程中,要尽量保证这些指标与线上业务的核心指标保持一致,从而知道是否达成了公司的商业目标。
三、召回层
3.0 传统召回的思路
先离线计算好商品的embedding和用户的embedding,在线上召回时,根据用户的embedding和所有商品的embedding内积,找到topN。这种传统方式需要解决几个问题:
商品的embedding和用户embedding如何保证在 同一个空间
用户embedding和所有商品的内积计算,存在性能问题
如SVD奇异值分解的方法,输入协同矩阵,特征较为单一
3.1 问题建模:
在召回阶段,YouTube把推荐问题看作是一个超大规模多分类softmax问题,定义为基于特定用户 U UU 和其上下文 C CC,在 t tt 时刻,将视频库 V VV 中指定的视频 w t w_tw
t
划分为第 i ii 类的概率:
其中:
小结:给定用户历史行为和上下文,学习用户embedding,然后输入softmax,生成召回层的候选集结果。
3.2 召回层模型架构
视频召回的候选集生成模型:
图2 YouTube候选集生成模型架构
我们从下往上看网络:
(1)输入层
input特征:
(1)用户历史观看视频的embedding向量,还需要进行mean pooling。
(2)搜索词的embedding向量。
(3)用户地理特征和用户设备特征:均为一些离散特征,可以采用embedding方法或者直接采用one-hot方(当离散的维度较小时)。
YouTube是利用用户观看序列和搜索序列,通过类似Item2vec预训练生成。
特征向量中还包括用户的地理位置Embedding、年龄、性别等特征。
【注意】样本年龄这个特征,YouTube 不仅使用了原始特征值,还把经过平方处理的特征值也作为一个新的特征输入模型。该操作是为了挖掘特征非线性的特性。
对连续型特征的处理方式不仅限于平方,其他诸如开方、Log、指数等操作都可以用于挖掘特征的非线性特性。
(4)example age:在视频推荐系统中要注意一点,用户更倾向于观看新视频,但是机器学习模型是基于历史观看视频记录进行学习,所以这和初衷有点违背,所以在文中构建了一个特征example age,可以理解为视频的年龄:初始值设为0,随着时间的增长,记录视频的年龄。加入后再进行实验发现效果明显:
(5)人口属性特征:提供先验,使得对于新用户也能做出合理的推荐(冷启动),即对用户的地理区域和使用
(2)ReLU层
将(1)中的特征通过concat层连接起来,然后输入到三层ReLU神经网络中训练。
使用常见的塔状设计,底层最宽,往上每层的神经元数目减半,直到 Softmax 输入层是 256 维(1024ReLU->512ReLU->256ReLU)。
(3)softmax层
基于特定用户 U UU 和其上下文 C CC,在 t tt 时刻,将视频库 V VV 中指定的视频 w t w_tw
t
划分为第 i ii 类的概率:
(4)输出层
三层ReLU网络后,YouTube这里是使用softmax作为输出层,注意此处输出层不是做点击率预估,而是预测用户会点击哪个视频。输出层的维度和视频ID的embedding向量维度相同,最终得到用户向量u。
通过该网络结构的学习,最终可以得到所有视频的embedding向量V,维度为pool_size × k,其中:
pool_size为训练集视频资源的大小,
k为embedding的维度。
还可以得到所有用户的输出向量u,其中每个用户向量的维度为k,和视频的embedding向量维度一致。
在输出层中有两个问题需要注意:
问题1:【用视频ID作为预测label】
模型服务中,如果每次推荐请求都需要端到端地运行一遍model(处理一遍候选集),因为model参数量巨大,所以推断过程开销也大。这里为了提高模型服务效率,输出层这样搞后,就能将得到的用户和视频embedding,并且预存到线上的特征数据库中,最后通过embedding最近邻搜索方法(如局部敏感哈希LSH等)匹配。
问题2:【embedding的产生】
(1)视频embedding
视频向量的softmax层的参数本质上是一个 m × n 的矩阵,其中:
m 指的是最后一层红色的 ReLU 层的维度 m
n 指的是分类的总数,也就是 YouTube 所有视频的总数 n。
视频 Embedding 就是这个 m x n 维矩阵的各列向量。(这样的 Embedding 生成方法其实和 word2vec 中词向量的生成方法是相同的)
(2)用户embedding向量
因为input的特征向量都是用户相关的特征,如在使用某用户的u的特征向量作为模型input,最后一层ReLU层的output可以作为该用户的embedding向量。
3.3 Heterogeneous Signals
异构信号。
使用深度学习作为矩阵分解的泛化,优势在于,可以容易地将任意连续和分类特征添加到模型中。搜索历史记录与观看历史记录的处理方式相似,每个查询都被标记为unigram和bigrams,并且每个标记都被嵌入。取平均后,用户的标记化嵌入查询代表了汇总的密集搜索历史记录。
人口统计特征对于提供先验信息很重要,因此推荐对于新用户(冷启动)而言行为合理。用户的地理区域和设备已嵌入并连接在一起。简单的二进制和连续特征(如用户的性别,登录状态和年龄)将以归一化为[0, 1]的实际值直接输入到网络中。
3.4样本选择和上下文选择
正负样本和上下文选择。
在有监督学习中,最重要的是选择label,这个也决定了模型效果的上限:
使用更广的数据源:不仅仅使用推荐场景的数据进行训练,其他场景比如搜索等的数据也要用到,这样也能为推荐场景提供一些explore。
为每个用户生成固定数量训练样本:我们在实际中发现的一个practical lessons,如果为每个用户固定样本数量上限,平等的对待每个用户,避免loss被少数active用户domanate,能明显提升线上效果。
抛弃序列信息:我们在实现时尝试的是去掉序列信息,对过去观看视频/历史搜索query的embedding向量进行加权平均。这点其实违反直觉,可能原因是模型对负反馈没有很好的建模。
不对称的共同浏览(asymmetric co-watch)问题:所谓asymmetric co-watch指的是用户在浏览视频时候,往往都是序列式的,开始看一些比较流行的,逐渐找到细分的视频。下图所示图(a)是hled-out方式,利用上下文信息预估中间的一个视频;图(b)是predicting next watch的方式,则是利用上文信息,预估下一次浏览的视频。我们发现图(b)的方式在线上A/B test中表现更佳。而实际上,传统的协同过滤算法,都是隐含采样图(a)的held-out的方式,忽略了不对称的浏览模式。
3.5 Experiments with Features and Depth
四、排序层模型
召回层筛选出小规模的候选集后,就需要排序层进行精细化的排序。
4.1 Feature Representation
特征表示。
我们的特征与分类or序列特征的传统分类方法不同,可以从两个维度对特征进行分析:
取值数量:分为单值特征,比如当前待展示待打分的视频ID;和多值特征,比如用户过去观看的N个视频ID。
特征描述内容:根据item的属性还是用户/上下文(查询)的属性对特征进行分类。每个请求计算一次查询特征,同时为每个已评分项目计算展现特征。
(1)输入特征
YouTube的深度学习排序模型的架构如下图,基本模型还是embedding+MLP,重点关注输入层和输出层的部分。经过召回层的粗筛,排序层可以引入更多特征进行精排,
上图中YouTube 的输入层从左至右引入的特征依次是:
impression video ID embedding:当前候选视频的 Embedding;
watched video IDs average embedding:用户观看过的最后 N 个视频 Embedding 的平均值;
language embedding:用户语言的 Embedding 和当前候选视频语言的 Embedding;
time since last watch:表示用户上次观看同频道视频距今的时间;
#previous impressions:该视频已经被曝光给该用户的次数;
(2)特征处理
虽然DNN网络结构比较简单,但YouTube还是对数据做了很多特征工程,最重要的三方面特征:
用户历史行为:用户之前和哪些items有交互过,或者和相似的items的交互;
上次观看时间:自上次观看同个channel视频的时间,原理有点像注意力机制;
之前视频已经曝光给该用户的次数:如果一个视频之前展示过,但是用户木有观看,说明用户很可能就是对该视频不感兴趣,所以下次如果再展示,很可能用户还是不会去看该视频。
4.2 Modeling Expected Watch Time
建模观看时长。
选择的模型DNN+weighted logistic regression。负样本是有曝光但是无点击的视频,正样本是有曝光也有点击的视频,目标是预测用户的观看时长。加入观看时长这一衡量标准,也是为了解决噪声,因为很多时候用户点击观看一个视频并不代表用户是真的喜欢这个视频。
该模型是基于交叉熵损失函数的逻辑回归模型进行训练的,但是我们用观看时长对正样本做了加权,负样本都用单位权重(即不加权)。
4.3 隐层实验
表中显示了在保留数据集上用不同的隐藏层设置得到的结果,每个设置得到的值是通过在同一个页面上展示给一个用户的正负样本得来的。
首先用模型对两种样本进行打分:如果负样本的得分比正样本的得分高,就认为这个正样本的观看时长是错误的误测。每个用户的损失值就是所有错误预测的数量。
对网络结构中隐藏层的宽度和深度进行实验,从下图结构看,增加隐藏层的宽度和深度都能够提升模型效果。而对于1024→512→256这个网络,不包含归一化后根号的版本,loss增加了0.2%。如果把weighted LR替换成LR,效果下降了4.1%。