本文原文地址:Youtube基于深度学习的视频推荐
一、引言
Google团队在2016年发表paper,公布了他们在Youtube视频推荐上的最新的推荐算法。本次发表的论文中,最主要的特点是:无论在推荐召回还是推荐排序都采用最近兴起的深度学习模型。现在将该文章的主要思路整理一下,供大家参考。
二、YouTube 推荐场景
YouTube的视频推荐场景大致有如下几个特点:
大规模:YouTube用户量多达1billion,视频数量也超过1billion,因此需要高效的分布式学习算法和在线服务系统来满足这种规模的推荐服务。
新鲜度:YouTube上每天会有超过100K的新视频被上传,因此要求推荐系统能够对新视频有足够的响应速度。而且在新视频和好视频之间的推荐有比较好的平衡,也就是我们常常说的exploration & exploitation。
噪音性:YouTube上的用户行为很稀疏,还充满了大量的噪音,而且上传的视频缺少结构化的meta数据,因此推荐系统对于噪音要有足够的鲁棒性。
YouTube的研究人员通过与其他团队如google brain的人合作,在类似于tensorflow的开源深度学习的架构上开发出了本文所说的推荐算法。
三、推荐系统框架
本文介绍的推荐系统仍然是包括两个部分:
第一部分是“候选集生成网络”(在国内一般都成为推荐召回阶段)。利用用户的历史行为数据,采用一个深度学习网络粗略地从所有视频集合中检索出用户感兴趣的候选视频。这一步生成的后选集合是用户比较粗略的、广泛的兴趣集合。
第二部分是“排序网络”。还是通过深度学习网络对第一部分生成的候选集进行打分,然后将分数高的视频展示给用户。
具体的系统架构图如下图所示:
我们知道,工业应用中采用召回+排序两个阶段的架构主要是基于以下考虑:
- 实际的推荐应用场景中需要我们实时计算出topK的物品,在大量的物品中筛选出topK物品,不能利用太复杂的算法。因此我们需要在召回阶段采用计算复杂度较小的算法做粗排,而在粗排后只对几百个物品进行更高精度的排序。
- 召回+排序2个阶段的架构,使得多种召回算法具有可比性。多种推荐召回算法所产生的推荐列表可以一同作为ranking的输入,就是上图中的"other candidate sources"。
下面分别介绍一下这两部分的逻辑。(在后面的描述中,为了方便叙述,并与国内其他做推荐的称呼一致,我们把候选集的生成叫做推荐召回,然后把排序网络叫做推荐排序。)
四、推荐召回
前面介绍,推荐召回阶段要在所有视频集合中检索到符合用户兴趣的候选集,大约筛选出几百个候选的列表。
作者提到,早期Youtube的推荐主要采用了一种叫做Wsabie的Matrix Factorization技术。本论文中提到的深度学习方法在一开始时也是借鉴了这种方法,采用浅层的神经网络,只对用户的观看历史做embedding,后面才加入更多的embedding特征。所以从这个角度看,本文中的深度召回算法可以当作是factorization技术的非线性通用化。(后续有时间会写一篇Wsabie的解读文章,大家就会明白作者为什么这么说了)
推荐当作分类
本文将推荐列表的筛选过程当成一个多分类问题。既在给定某个用户(包括该用户的行为)、上下文、以及所有视频集合的情况下,预测出用户在时刻会看某个视频的概率。
公式中,是用户的embedding向量,是视频的embedding向量。
神经网络模型的主要任务就是要学习出用户的embedding向量和视频的embedding向量。
需要注意的是,虽然YouTube有用户的显式打分数据,但是文中用到的是用户的隐式反馈数据,主要是用户的隐式数据比较多,而显式数据比较稀疏。
模型架构
大家通过看上图的模型架构,知道训练时是如何得到用户和视频的embeddign向量的吗?预测时又是如何做推荐的吗?
- 训练阶段:模型架构的右侧是训练时的应用,大家可以看到最后一层隐含层的输出乘以模型权重然后做softmax就得到了,所以其实最后一层隐含层的输出就是用户的embedding向量,该层的模型权重其实就是视频的embedding向量。(其实模型的输入有用户的观看视频的embedding,它也是视频的另一个embedding,不过最后做推荐时一般都是用模型最后一层的权重作为视频的embedding向量)
- 服务阶段:模型架构的左侧是线上做召回时的应用,线上通过实时特征的输入得到用户的embedding向量,然后最邻近搜索算法(nearest neighbor search)与语料库中的视频向量做内积,检索出内积值最大的几百个推荐候选列表。这里需要与所有视频库的视频向量做内积,时间花费太大,文中采用了一种hash的快速算法。
弄明白了训练和预测阶段的工作原理后,大家有没有注意到:神经网络召回模型与MF模型的任务其实是一样的,都是要学习用户和物品的embedding向量,然后召回时直接计算用户和物品的向量内积,只不过本文中的方法进行了一下几点改进:
- 首先是通过多层神经网络来学习出用户的embedding向量(网络的最后一层隐层的输出就是用户的embedding向量,模型的最后一层W权重就是视频的embedding向量表示),如果网络只有一层(即没有隐层),那退化成类MF方法了。所以作者说,MF是线性embedding,而本文的方法推广到了非线性embedding。
- 不仅利用用户的历史行为数据,还加入更多的非用户观看特征。
- 损失函数不一样。
介绍到这里,还有一个问题不知大家有注意到:把推荐问题当作分类来处理,google公司的工程师肯定不是第一个想到(不怕大家嘲笑,我曾经也想过),但是为什么没有人早点提出来呢。其实有一个问题之前一直没有解决,那就是要推荐的物品是在太多,要分类的类别也就特别多,计算损失函数时要对所有类别的概率做,这样计算量太大,基本没办法实现。
但是现在这个问题在2013年就解决了,当时也是google公司的工程师在做word2vec是也遇到了类似的问题,他们通过采用分层softmax方法(hierarchical softmax方法)和负样本采样方法(negative sampling)解决了该问题。本文尝试这2中方法后,由于分层softmax精度不够,所以最终采用了negative sampling+交叉熵损失的方法。
特征处理
模型的输入特征主要有:
- 用户观看过的视频id列表做embedding、取embedding向量的平均值,得到观看embedding向量。
- 同时把用户搜索过的视频id列表也做如上的embedding,得到搜索embedding向量。
- 用户的人口统计学属性做embedding得到特征向量。
- 一些非多值类的特征如性别,还有数值类特征直接做为神经网络的输入。
- 还有一些数值类特征,可以利用经验知识,对其进行变换。如对年龄特征进行平方操作,然后作为新的特征。
此外,作者还提出了一些数据与特征选择方面的经验:
样本时间特征:训练时的样本用到了好几个月的数据,而作者通过统计发现一个视频被用户观看的概率不是平稳的,在刚上传时会有一个山峰,然后随着时间的流逝,观看概率会缓慢下降,然后趋于平稳。因此通过把样本的时间作为特征可以捕捉到这种变化曲线。
样本筛选:为了捕捉用户的兴趣趋势,样本不仅仅用推荐的展示、点击日志,而是用到了所有的包括其他非推荐页面的日志数据。这样,用户在其他页面的行为也可以快速被捕捉到,然后在推荐的页面也能反应出用户的兴趣。
上下文选择: 一般来讲,大家衡量一个算法的效果是都是通过交叉验证来完成的。在进行交叉验证时要注意的是非对称的同看,既用户看完A之后可能会看B,但是看完B之后不一定会看A,即这种关系是非对称的。因此在进行交叉验证是,这里选择用之前的日志来训练模型,然后对当前时刻的行为进行预测。不然的话,可能会出现“交叉验证时AUC提升但是线上效果却反而下降”的情况。
五、推荐排序
排序的目的是要利用展示、点击(或转化)数据,然后加入更多的上下文、用户、物品特征,对推荐候选进行更精细的修正、打分。
特征工程
如上图所示的推荐排序框架图,除了对用户看到过的视频ID进行了embedding、对该次展示的视频ID也进行embedding,同时还对用户语言和视频语言等进行了embedding。
除此之外,作者提到了几个比较重要的特征:
- 用户在该分类观看了多少个视频?
- 用户上次观看该分类的视频是什么时候?
- 召回该候选视频的主要算法是什么?该算法给了这个视频多少打分?
- 该视频已经展示给该用户的频率?
虽然深度学习可以自动学习、捕捉出一些人工无法观测到的特征,但是一些人工已知的、被证明有效的特征工程的工作还是建议做一些,比如描述某个视频展示次数、点击次数的特征,需要做一些统计的工作。
类别特征 : 对类别类特征,如该视频所属的类别,可以取topN的类别进行embedding,然后作为神经元的输入。
连续特征: 对连续值类的特征进行归一化,对连续值类的特征进行分片累积将其归一到0~1之前;还可以对某些特征进行取根号、取对数和取平方的相关操作。这些其实都是特征工程的工作。
对观看时间建模
论文中没有直接对视频是否点击进行建模,而是对用户观看该视频的时间进行建模。当然,也不是直接预测用户对视频的观看时间,而是把视频的观看时间,转换成训练时的样本的权重,也就是通过加权逻辑回归的方法来间接对观看时间建模。
六、实验结果
由于论文中没有直接对视频是否点击进行建模,而是对用户观看该视频的时间进行建模,所以离线衡量效果的指标也不是大家常用的AUC,而是一种叫做“加权单用户损失”(weighted, per-use loss)的指标。具体的计算过程是这样的:
对一个用户的当时展示及其点击数据,如果一个展示没观看的视频的打分比一个观看的视频的打分要高,那么就把这个观看过的视频的时间叫做未预测观看时间,“加权单用户损失”就是所有未预测观看时间的总和占所有观看时间的百分比。
下图是推荐排序阶段采用不同神经网络结构下的实验结果数据:
此外作者提到:
- 如果不对归一化后的连续特征进行平方再作为另一维特征输入,模型的loss会增加0.2%。
- 如果不对样本进行加权,也就是正负样本的权重就是等值的1,那么loss会增加4.1%。
七、总结
作者采用深度学习的方法来替代我们常用的各种推荐算法,如协同过滤算法、基于内容的推荐。对用户的embedding其实有点类似与Matrix Factorization的思想,所不同的,一是MF算法是对用户和物品直接线性变换,而本文是用神经网络,二是MF一般都是拟合用户对物品的偏好分,而本文却把推荐问题看成是分类问题,采用了交叉熵损失函数进行训练。
在推荐排序时候,作者也是采用了神经网络对候选集进行打分,对ID类特征,类别特征也是采用了同样的embedding策略。只不过训练时采用了观看时间对样本进行了加权,既文中所说的加权逻辑回归。