Deep Neural Networks for YouTube Recommendations 工程Tricks总结

2024-02-15 17:20

本文主要是介绍Deep Neural Networks for YouTube Recommendations 工程Tricks总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Deep Neural Networks for YouTube Recommendations 2016  继项亮书后值得反复品味的推荐入门神文。

首先奉上两位大佬的博客,也是主要参考的地方。其实这篇文章已经看过两三次了,一些地方总是看不懂,直到这两天王喆大佬在某乎提供了一个大家分享经验的平台后,很多地方都理解了,一些至今仍在工程中应用的东西,原来都能在这篇文章中找到。

王喆

沙韬伟

其中关于样本age的工程实践我没有详细看,可以到上面两个地址找到。

下面主要是对两篇博客的汇总和一些简单的解释,方便自己日后查阅。

整体:

  • 有监督的学习,每个视频作为一个类别,观看完成作为一个正样本,预测目标是观看的时间长度。
  • 为什么要分match和rank两个阶段???

matching的模块,目的是把百万级的商品、视频筛选出百级、千级的可排序的量级;再通过ranking模块,选出十位数的展示商品、视频作为最后的推送内容。之所以把推荐系统划分成Matching和Ranking两个阶段,主要是从性能方面考虑的。Matching阶段面临的是百万级,而Ranking阶段的算法则非常消耗资源,不可能对所有目标都算一遍,而且就算算了,其中大部分在Ranking阶段排名也很低,也是浪费计算资源。

召回的本质就是解决计算的性能问题。

 

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

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

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

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

  • ranking model似乎与candidate generation模型没有什么区别,模型架构还是深度学习的“基本操作”,唯一的区别就是特征工程和最后预测的函数建模softmax vs. weighted lr
  • Youtube的用户对新视频有偏好,那么在模型构建的过程中如何引入这个feature?=>电商用户对展示靠前的坑位有偏好,点击率高

为了拟合用户对fresh content的bias,模型引入了“Example Age”这个feature,文中其实并没有精确的定义什么是example age。按照文章的说法猜测的话,会直接把sample log距离当前的时间作为example age。比如24小时前的日志,这个example age就是24。在做模型serving的时候,不管使用那个video,会直接把这个feature设成0。(电商就是把坑位的特征纳入 训练,serving时候直接把该特征置零、)

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

减少高度活跃用户对于loss的过度影响

  • 针对某些特征,比如#previous impressions,为什么要进行开方和平方处理后(处理后才离散化),当作三个特征输入模型???

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

召回阶段

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

把大量长尾的video截断掉,主要还是为了节省online serving中宝贵的内存资源。从模型角度讲,低频video特征其实去掉比embedding更好效果更好,出现次数太少emb学不好。实际也可以用HashBucket去映射,对于大规模稀疏ID类特征,实际使用上用Hash不会对结果产生太大影响,反而在增量更新的情况上可能会比置为0更好。

  • 召回阶段把问题归结为多分类softmax问题后,DNN其实就是处理特征的方式!
  • 用户最近看过的N(固定)个video集合embedding vector,取平均作为watch vector, 和同样处理的search tokens拼接后,再和年龄,性别等特征拼接输入第一层RELU!输入RELU中后,在最后一层的隐层输出的就是最终的user embedding。
  • 对召回阶段最后的softmax层的进一步理解:

softmax层是dense+ softmax激活函数,假设最后一个hidden layer维度是100代表user embedding,输出节点维度200w表示videos,全连接权重维度就是[100,200w],而hidden layer与每一个输出节点的权重维度就是[100,1],这就是一个vedio对应embedding(权重组成video embedding),计算一个vedio的概率时是u*v,即两个100维向量做内积,是可以在一个空间的。下图中对于video1,他的embedding vector就可以是隐层输入到它的权重向量,100维。这里也存在另一种说法,可能是通过其他的方法得到这些向量,比如word2vector得到item embedding vector后直接作为item特征,直接喂给网络。(pre trained to feed)

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

Negative sampling

提到随机负采样要由于霍夫曼树这种方法(hierarchical soft-max)!

  • 召回阶段生成了召回集,serving的过程中,为什么不直接采用训练时的model进行预测,而是采用了一种最近邻搜索的方法???

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

Rank阶段

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

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

  • Rank阶段特征要更丰富!目的就是引入更多描述视频、用户以及二者之间关系的特征,达到对候选视频集合准确排序的目的。
  • rank阶段的特征:

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个和第5个。因为这两个很好的引入了对用户行为的观察

 

 

这篇关于Deep Neural Networks for YouTube Recommendations 工程Tricks总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712023

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数