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

相关文章

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

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 克隆仓库 执行指令用以创建一个本地仓库的