Youtube DNN的灵魂拷问

Youtube DNN解析

上图左上角是线上召回服务的方法。模型训练好后,Item Embedding就是一个Embedding table,将其存储到redis等数据库中。线上召回时,用户Embedding通过调用模型计算(最后一个ReLU的输出),实时返回用户Embedding;而Item Embedding则直接在数据库中调取(模型训练完后是个静态的embedding table)。

Embedding放到redis,只是存储方法。线上相似度检索并不是直接从几百万Embedding中计算相似度,一般都是基于ANN检索(近似最邻近检索),比如使用Facebook的向量检索工具Faiss,离线构建索引,然后计算每个用户最邻居的K个Item,最后再把每个用户最邻近的K个Item存储到redis中,线上直接查找K个结果就可以。

表示学习

1、文中把推荐问题转换成多分类问题,在预测next watch的场景下,每一个备选video都会是一个分类,因此总共的分类有数百万之巨,这在使用softmax训练时无疑是低效的,这个问题YouTube是如何解决的?

简单说就是进行了负采样(negative sampling)并用importance weighting的方法对采样进行calibration。文中同样介绍了一种替代方法,hierarchical softmax,但并没有取得更好的效果。当然关于采样的具体技术细节以及优劣可能再开一篇文章都讲不完,感兴趣的同学可以参考tensorflow中的介绍(https://www.tensorflow.org/extras/candidate_sampling.pdf)以及NLP领域的经典论文 http://www.aclweb.org/anthology/P15-1001

2、在candidate generation model的serving过程中,YouTube为什么不直接采用训练时的model进行预测,而是采用了一种最近邻搜索的方法?

这个问题的答案是一个经典的工程和学术做trade-off的结果,在model serving过程中对几百万个候选集逐一跑一遍模型的时间开销显然太大了,因此在通过candidate generation model得到user 和 video的embedding之后,通过最近邻搜索的方法的效率高很多。我们甚至不用把任何model inference的过程搬上服务器,只需要把user embedding和video embedding存到redis或者内存中就好了。

但这里我估计又要求助场外观众了,在原文中并没有介绍得到user embedding和video embedding的具体过程,只是在架构图中从softmax朝 model serving module那画了个箭头(如下图红圈内的部分),到底这个user vector和video vector是怎么生成的?有经验的同学可以在评论中介绍一下。

Candidate Generation Model, video vector是如何生成的?

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

为了拟合用户对fresh content的bias,模型引入了“Example Age”这个feature,文中其实并没有精确的定义什么是example age。按照文章的说法猜测的话,会直接把sample log距离当前的时间作为example age。比如24小时前的日志,这个example age就是24。在做模型serving的时候,不管使用那个video,会直接把这个feature设成0。大家可以仔细想一下这个做法的细节和动机,非常有意思。

当然我最初的理解是训练中会把Days since Upload作为这个example age,比如虽然是24小时前的log,但是这个video已经上传了90小时了,那这个feature value就是90。那么在做inference的时候,这个feature就不会是0,而是当前时间每个video的上传时间了。

我不能100%确定文章中描述的是那种做法,大概率是第一种。还请大家踊跃讨论。

文章也验证了,example age这个feature能够很好的把视频的freshness的程度对popularity的影响引入模型中。

从上图中我们也可以看到,在引入“Example Age”这个feature后,模型的预测效力更接近经验分布;而不引入Example Age的蓝线,模型在所有时间节点上的预测趋近于平均,这显然是不符合客观实际的。

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

原文的解答是这样的,

Another key insight that improved live metrics was to generate a xed number of training examples per user, e ectively weighting our users equally in the loss function. This prevented a small cohort of highly active users from dominating the loss.

理由很简单,这是为了减少高度活跃用户对于loss的过度影响。

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

这个原因应该是YouTube工程师的“经验之谈”,如果过多考虑时序的影响,用户的推荐结果将过多受最近观看或搜索的一个视频的影响。YouTube给出一个例子,如果用户刚搜索过“tayer swift”,你就把用户主页的推荐结果大部分变成tayer swift有关的视频,这其实是非常差的体验。为了综合考虑之前多次搜索和观看的信息,YouTube丢掉了时序信息,讲用户近期的历史纪录等同看待。

但RNN到底适不适合next watch这一场景,其实还有待商榷,@严林 大神在上篇文章的评论中已经提到,youtube已经上线了以RNN为基础的推荐模型, 参考论文如下: https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/46488.pdf

看来时隔两年,YouTube对于时序信息以及RNN模型有了更多的掌握和利用。

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

这个问题比较好回答,只留最后一次观看行为做测试集主要是为了避免引入future information,产生与事实不符的数据穿越。

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

这个问题从模型角度出发,是因为 watch time更能反应用户的真实兴趣,从商业模型角度出发,因为watch time越长,YouTube获得的广告收益越多。而且增加用户的watch time也更符合一个视频网站的长期利益和用户粘性。

这个问题看似很小,实则非常重要,objective的设定应该是一个算法模型的根本性问题,而且是算法模型部门跟其他部门接口性的工作,从这个角度说,YouTube的推荐模型符合其根本的商业模型,非常好的经验。

我之前在领导一个算法小组的时候,是要花大量时间与Business部门沟通Objective的设定问题的,这是路线方针的问题,方向错了是要让组员们很多努力打水漂的,一定要慎之又慎。

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

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

当然,之前很多同学在评论中也提到简单用0向量代替并不是一个非常好的选择,那么有什么其他方法,大家可以思考一下。

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

这是很简单有效的工程经验,引入了特征的非线性。从YouTube这篇文章的效果反馈来看,提升了其模型的离线准确度。

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

impression video ID embedding: 当前要计算的video的embedding

watched video IDs average embedding: 用户观看过的最后N个视频embedding的average pooling

language embedding: 用户语言的embedding和当前视频语言的embedding

time since last watch: 自上次观看同channel视频的时间

#previous impressions: 该视频已经被曝光给该用户的次数

因为在第7问中,我们已经知道模型采用了expected watch time per impression作为优化目标,所以如果简单使用LR就无法引入正样本的watch time信息。因此采用weighted LR,将watch time作为正样本的weight,在线上serving中使用e(Wx+b)做预测可以直接得到expected watch time的近似,完美。

11、Example age这个feature的定义到底是什么?

是为了体现新颖性,上线时置0

12、本论文中,用于 candidate generation网络serving部分的user embedding vector和video embedding vector是怎么生成的?

我们知道,user embedding的shape就是[bs,emb_size],其中bs是一个batch中user的个数(其实user embedding就是[1,emb_size])。而embedding table的shape是[emb_size,N],N就是上面说到的11,及多分类的类别总数。这个embedding table就是Item Embedding的table,它的每一列都是一个Item embedding。于是我们有[bs,emb_size] * [emb_size, N],得到[bs,N],参与到交叉熵的计算中。获取embedding的方式,和word2vec中embedding table的生成是一样的。

13、除了用0向量embedding替代长尾内容,有没有其他好的方法?

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

也欢迎有相关经验的同学在评论中给出更好的回答,本文参考了王喆等多位大佬的文章。

你可能感兴趣的:(Youtube DNN的灵魂拷问)