文章目录
- Youtube深度学习推荐系统(Youtube Deep Learning Recommend System)
- 网络结构学习
- candidate generation模型的架构(召回):
- ranking model模型的架构(排序):
- 主要问题讨论
- 在线serving
Youtube深度学习推荐系统(Youtube Deep Learning Recommend System)
网络结构学习
Youtube深度学习推荐系统的算法架构
Youtube的用户推荐场景自不必多说,作为全球最大的UGC的视频网站,需要在百万量级的视频规模下进行个性化推荐。由于候选视频集合过大,考虑online系统延迟问题,不宜用复杂网络直接进行推荐,所以Youtube采取了两层深度网络完成整个推荐过程:
- 第一层是Candidate Generation Model完成候选视频的快速筛选,这一步候选视频集合由百万降低到了百的量级。
- 第二层是用Ranking Model完成几百个候选视频的精排
candidate generation模型的架构(召回):
自底而上看这个网络,最底层的输入是用户观看过的video的embedding向量,以及搜索词的embedding向量。基础embedding可以通过多种方式获取:word2vec、GraphEmbeddinng等
特征向量里面还包括了用户的地理位置的embedding,年龄,性别等。然后把所有这些特征concatenate起来,喂给上层的ReLU神经网络
三层神经网络过后,接入softmax函数,看成是一个多分类问题,计算得到在所有candidate video上的概率分布。
ranking model模型的架构(排序):
引入另一套DNN作为ranking model的目的就是引入更多描述视频、用户以及二者之间关系的特征,达到对候选视频集合准确排序的目的
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: 该视频已经被曝光给该用户的次数
第4个特征背后的思想是
有一些引入attention的意思,这里是用了time since last watch这个特征来反应用户看同类视频的间隔时间。从用户的角度想一想,假如我们刚看过“DOTA经典回顾”这个channel的视频,我们很大概率是会继续看这个channel的视频的,那么该特征就很好的捕捉到了这一用户行为。
第5个特征#previous impressions
则一定程度上引入了exploration的思想,避免同一个视频持续对同一用户进行无效曝光。尽量增加用户没看过的新视频的曝光可能性
主要问题讨论
-
在召回架构图的左上角,为什么在online serving的时候不直接用这套网络进行预测而要使用nearest neighbor search 的方法?
经典的工程和学术做trade-off的结果,在model serving过程中对几百万个候选集逐一跑一遍模型的时间开销显然太大了,因此在通过candidate generation model得到user 和 video的embedding之后,通过最近邻搜索的方法的效率高很多。我们甚至不用把任何model inference的过程搬上服务器,只需要把user embedding和video embedding存到redis或者内存中就好了。
采用ANN(Approximate Nearest Neighbo)的方法计算相似度非常快 -
文中把推荐问题转换成多分类问题,在next watch的场景下,每一个备选video都会是一个分类,因此总共的分类有数百万之巨,这在使用softmax训练时无疑是低效的,这个问题Youtube是如何解决的
进行了负采样(negative sampling)并用importance weighting的方法对采样进行calibration。文中同样介绍了一种替代方法,hierarchical softmax,但并没有取得更好的效果
但是负采样并不会直接只抽取部分进行计算。 -
Youtube的用户对新视频有偏好,那么在模型构建的过程中如何引入这个feature?
为了拟合用户对fresh content的bias,模型引入了“Example Age”这个feature。直接把sample log距离当前的时间作为example age。比如24小时前的日志,这个example age就是24。在做模型serving的时候,不管使用那个video,会直接把这个feature设成0。使用的不是视频上传时间,而是最近被观看时间。
文章也验证了,example age这个feature能够很好的把视频的freshness的程度对popularity的影响引入模型中
从上图中我们也可以看到,在引入“Example Age”这个feature后,模型的预测效力更接近经验分布;而不引入Example Age的蓝线,模型在所有时间节点上的预测趋近于平均,这显然是不符合客观实际的 -
到底这个user vector和video vector是怎么生成的?
user vector 就是最后隐层的输出,video vector就是softmax的权重w;那条线是将vedio embedding存入ANN建库用于线上检索,这很像广义矩阵分解;训练时user embedding是没办法定位是哪个具体用户,需要在线更新user embeddinguser vector和video vector的问题,这个DNN输入的特征是<user, context>类的特征,及根据用户每次刷新的状态去输入到网络中得到的最后一层的向量作为user vector,可以做到实时反馈,每次最新的浏览点击都能反馈到输入层进而得到不同的user vector。而video vector则是Softmax中video与最后一层的w作为这个video的vector,最终通过user_vec与item_vec的内积最大索引就能快速得到结果。在这个线上实时反馈工程上去之前,也可以直接拿video vector做i2i,效果也是很棒的
-
在对训练集的预处理过程中,Youtube没有采用原始的用户日志,而是对每个用户提取等数量的训练样本,这是为什么?
为了减少高度活跃用户对于loss的过度影响。 -
Youtube为什么不采取类似RNN的Sequence model,而是完全摒弃了用户观看历史的时序特征,把用户最近的浏览历史等同看待,这不会损失有效信息吗?
应该是YouTube工程师的“经验之谈”,如果过多考虑时序的影响,用户的推荐结果将过多受最近观看或搜索的一个视频的影响。YouTube给出一个例子,如果用户刚搜索过“tayer swift”,你就把用户主页的推荐结果大部分变成tayer swift有关的视频,这其实是非常差的体验。为了综合考虑之前多次搜索和观看的信息,YouTube丢掉了时序信息,讲用户近期的历史纪录等同看待。 -
在处理测试集的时候,Youtube为什么不采用经典的随机留一法(random holdout),而是一定要把用户最近的一次观看行为作为测试集?
只留最后一次观看行为做测试集主要是为了避免引入future information,产生与事实不符的数据穿越。 -
在确定优化目标的时候,Youtube为什么不采用经典的CTR,或者播放率(Play Rate),而是采用了每次曝光预期播放时间(expected watch time per impression)作为优化目标?
从模型角度出发,是因为 watch time更能反应用户的真实兴趣,从商业模型角度出发,因为watch time越长,YouTube获得的广告收益越多。而且增加用户的watch time也更符合一个视频网站的长期利益和用户粘性。这个问题看似很小,实则非常重要,objective的设定应该是一个算法模型的根本性问题,而且是算法模型部门跟其他部门接口性的工作,从这个角度说,YouTube的推荐模型符合其根本的商业模型,非常好的经验。
-
在进行video embedding的时候,为什么要直接把大量长尾的video直接用0向量代替
又是一次工程和算法的trade-off,把大量长尾的video截断掉,主要还是为了节省online serving中宝贵的内存资源。当然从模型角度讲,低频video的embedding的准确性不佳是另一个“截断掉也不那么可惜”的理由。 -
针对某些特征,比如#previous impressions,为什么要进行开方和平方处理后,当作三个特征输入模型?
这是很简单有效的工程经验,引入了特征的非线性。从YouTube这篇文章的效果反馈来看,提升了其模型的离线准确度。 -
Example age这个feature的定义到底是什么?
example age和消除ad position bias做法类似,线下训练把example age 与其他特征做组合,线上预估置0 -
为什么ranking model不采用经典的logistic regression当作输出层,而是采用了weighted logistic regression?
采用weighted LR,将watch time作为正样本的weight,在线上serving中使用e(Wx+b)做预测可以直接得到expected watch time的近似.详细分析见下面在线serving部分 -
为什么直接用user和video的embedding乘积计算相似度
和dssm类似,都是通过内积限制两个embedding在相同空间,在CF中可以通过矩阵分解得到user和vedio的向量表示,这里最后的softmax就是在做广义矩阵分解,模型最后一层隐层就是user embedding,通过u*v得到vedio的概率,v就是vedio embedding,只不过这里用来作为softmax层的权重softmax层是dense+ softmax激活函数,假设最后一个hidden layer维度是100代表user embedding,输出节点维度200w表示videos,全连接权重维度就是[100,200w],而hidden layer与每一个输出节点的权重维度就是[100,1],这就是一个vedio对应embedding,计算一个vedio的概率时是u*v,即两个100维向量做内积,是可以在一个空间的。
-
具体负采样的理解
这里就是你有一条样本,label=item_18,如果分类总共有100个,训练到这条样本的时候,由于最后是softmax,模型更新参数使item_18的softmax输出偏向1,剩余99个item的softmax输出偏向0。负采样指的是当总分类达到十万,正常softmax需要使得剩余99999个item的softmax输出偏向0,这样更新量很大,所以采用sample softmax,在更新这次样本时指定全集只有5001,屏蔽了剩余的94999个item,即负采样数目=5000,这样这次更新只会使得当前item输出偏向1,剩余5000个item的softmax输出偏向0。这个过程和输入特征没有关系,也就和example age没啥关系。这个和word2vec的negative sampling是一样的。
参考 youtube_match_model
在线serving
为什么Ranking Model采用了weighted logistic regression作为输出层?在模型serving过程中又为何没有采用sigmoid函数预测正样本的probability,而是使用 [公式] 这一指数形式预测用户观看时长?
具体理论参考揭开YouTube深度推荐系统模型Serving之谜
参考
重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文
YouTube深度学习推荐系统的十大工程问题
揭开YouTube深度推荐系统模型Serving之谜
深度语义模型在推荐系统中的应用实战(youtube dnn)–part1