最近继续总结之前读过的经典论文,正好看到知乎王喆老师提出的关于youtube的十大工程问题,研究之后发现自己第一遍阅读还是读的太粗陋,遂再次阅读,这里记下自己这几次阅读的一些思考与总结。总的来说youtube的推荐系统架构已经是如今各个互联网公司的基本操作了,十分具有纪念意义,那我我们来一起看看youtube的前辈们如果解决这个问题的。

Youtube的用户推荐场景自不必多说,作为全球最大的UGC的视频网站,需要在百万量级的视频规模下进行个性化推荐。由于候选视频集合过大,考虑online系统延迟问题,不宜用复杂网络直接进行推荐,所以Youtube采取了两层深度网络完成整个推荐过程:

  1. 第一层是Candidate Generation Model完成候选视频的快速筛选,这一步候选视频集合由百万降低到了百的量级。
  2. 第二层是用Ranking Model完成几百个候选视频的精排

《Deep Neural Networks for YouTube Recommendations》论文总结

接下来我们先看看粗排的模型

《Deep Neural Networks for YouTube Recommendations》论文总结

我们自底而上看这个网络,最底层的输入是用户观看过的video的embedding向量,以及搜索词的embedding向量。至于这个embedding向量是怎么生成的,作者的原话是这样的 :Inspired by continuous bag of words language models, we learn high dimensional embeddings for each video in a xed vocabulary and feed these embeddings into a feedforward neural network。

简单来说就是分别利用word2vec对embedded video watches和embedded search tokens做了一个embedding,然后网络训练的时候直接查表就完事儿,具体在网络训练的时候可以fine-tuning也可以frozen,具体看哪个效果好了。那么这里我们还是多说两句,这个word2vec是怎么训练的,也很容易,把一个user观看过的video当作一句话,然后给word2vec训练就行,这里具体的应该叫他item2vec,与word2vec训练时预测上下文单词不同,item2vec中的训练集(即一个item序列)并没有时间窗口关系,所以这两个算法区别就是目标函数的区别,item2vec是每一个单词都对句子中其他item进行预测。除了作者提到的这种方法,还可以采用端到端的方式,即直接在模型中加入embedding一起训练,两种方法有各自不同的使用场景。

特征向量里面还包括了用户的地理位置的embedding,年龄,性别等。然后把所有这些特征concatenate起来,喂给上层的ReLU神经网络。

三层神经网络过后,我们看到了softmax函数。这里Youtube的同学们把这个问题看作为用户推荐next watch的问题,所以输出应该是一个在所有candidate video上的概率分布,自然是一个多分类问题。

好了,这一套深度学习的“基本操作”下来,就构成了Youtube的candidate generation网络,看似平淡无奇,其实还是隐藏着一些问题的,比如

  1. 架构图的左上角,为什么在online serving的时候不直接用这套网络进行预测而要使用nearest neighbor search 的方法?
  2. 多分类问题中,Youtube的candidate video有百万之巨,意味着有几百万个分类,这必然会影响训练效果和速度,如何改进?

answer1:第一个问题的答案我想了蛮久,也看了很多大神的观点,在这里把我领悟到的做一个阐述。这个问题的答案是一个经典的工程和学术做trade-off的结果,在model serving过程中对几百万个候选集完整跑完模型最后一层softmax开销太大,因此在通过candidate generation model得到user 和 video的embedding之后,通过最近邻搜索的方法的效率高很多。我们甚至不用把任何model inference的过程搬上服务器,只需要把user embedding和video embedding存到redis或者内存中就好了。现在咱们来具体说一下video embedding是如何让生成的,假若模型最后relu输出的维度是Nx1的向量(这也就是所谓的user embedding),接下来的softmax层是一个MxN的矩阵,M是候选视频集合的数量,那么这里每个行向量就是对应的vedio embedding。这个embedding是在离线模型中训练好的,线上只用softmax之前的那些网络,每次推荐都会生成一个Nx1的user embedding,然后对离线训练好的MxN的video矩阵进行一个近邻搜索,看哪个视频向量和他的相似度最高,这里可以提升的原因是因为,可以利用LSH之类的方法提升匹配效率。

answer2:采用negtive sampling,我认为这里的思路和word2vec中的差不多,采用这种负采样,降低了每次参数更新的复杂度。我们知道如果不负采样的话每次更新都会对所有的vedio向量进行更新,因为softmax层存在的缘故,采用负采样之后,直接利用极大似然法,最大化正样本出现的概率最小化负样本出现的概率,而不必进行softmax计算。

既然得到了几百个候选集合,下一步就是利用ranking模型进行精排序,下面是ranking深度学习网络的架构图。

《Deep Neural Networks for YouTube Recommendations》论文总结

其实粗排模型和精排模型区别就在于更细致的特征工程,作者的原话是:During ranking, we have access to many more features describing the video and the user's relationship to the video because only a few hundred videos are being scored rather than the millions scored in candidate generation.

具体一点,从左至右的特征依次是

  1. impression video ID embedding: 当前要计算的video的embedding
  2. watched video IDs average embedding: 用户观看过的最后N个视频embedding的average pooling
  3. language embedding: 用户语言的embedding和当前视频语言的embedding
  4. time since last watch: 自上次观看同channel视频的时间
  5. #previous impressions: 该视频已经被曝光给该用户的次数

第四个特征是来反应用户看同类视频的间隔时间。有一点attention的意味。第五个特征可以避免同一个视频对用户进行反复的曝光。

接下来引出王喆老师对这篇论文提出的其他问题,并附上我的理解。

3.Youtube的用户对新视频有偏好,那么在模型构建的过程中如何引入这个feature?

模型引入了“Example Age”这个feature。直接把sample log距离当前的时间作为example age。比如24小时前的日志,这个example age就是24。在做模型serving的时候,不管使用那个video,会直接把这个feature设成0。引入这个特征可以更加偏向于新的视频。

4、在对训练集的预处理过程中,YouTube没有采用原始的用户日志,而是对每个用户提取等数量的训练样本,这是为什么?

这个的原因是避免活跃用户的训练样本主宰整个模型训练

5、YouTube为什么不采取类似RNN的Sequence model,而是完全摒弃了用户观看历史的时序特征,把用户最近的浏览历史等同看待,这不会损失有效信息吗?

最近打算抽空看看这篇论文https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/46488.pdf

6、在处理测试集的时候,YouTube为什么不采用经典的随机留一法(random holdout),而是一定要把用户最近的一次观看行为作为测试集?

这个也很容易想到,避免引入未来信息,带来数据穿越,产生过拟合。

7、在确定优化目标的时候,YouTube为什么不采用经典的CTR,或者播放率(Play Rate),而是采用了每次曝光预期播放时间(expected watch time per impression)作为优化目标?

最近在看《美团机器学习实战》里面讲到这么一句话:从机器学习的发展现状 来看,很多机器学习从业者在处理问题时直接进行特征工程和模型选择,而忽略了问题建模。问题建模是十分重要的一个环节,必不可少!评价指标有很多,我们应该选择一个能跟业务指标波动一致的评估指标,这样通过观察评估指标就能判断模型效果,可以大大提高模型迭代效率。显然,在youtube的场景,用户停留时长是一个最重要的指标,同样是点击视频,如果我点击了立马关掉,和我点击了完整看完,传达的是不一样的信息。

8、在进行video embedding的时候,为什么要直接把大量长尾的video直接用0向量代替?

这又是一次工程和算法的trade-off,把大量长尾的video截断掉,主要还是为了节省online serving中宝贵的内存资源。当然从模型角度讲,低频video的embedding的准确性不佳是另一个“截断掉也不那么可惜”的理由。

9、针对某些特征,比如#previous impressions,为什么要进行开方和平方处理后,当作三个特征输入模型?

直接引入连续数值特征的非线性

10、为什么ranking model不采用经典的logistic regression当作输出层,而是采用了weighted logistic regression?

这个我暂时还没有相同,看到别的大神说在线上serving中使用e(Wx+b)做预测可以直接得到expected watch time的近似,这一点因为我没有具体尝试过相关的业务,所以暂时没有更深的理解,为什么这么算就可以逼近expected watch time,可能也是一种工程经验吧。

相关文章: