推荐系统经典模型YouTubeDNN

news2025/1/16 8:10:13

文章目录

    • YouTubeDNN概念
    • YouTubeDNN模型架构图
    • YouTubeDNN召回阶段
      • YouTubeDNN层级介绍
    • YouTubeDNN排序阶段
    • YoutubeDNN模型中的一些Trick
      • 负采样问题
      • 特征构造
      • 上下文选择
    • 总结

YouTubeDNN概念

  • YouTubeDNN是YouTube用于做视频推荐的落地模型,其大体思路就是召回阶段使用多个简单的模型来进行筛选,这样可以大量地筛除相关度较低的内容,而排序阶段则是使用相对复杂的模型来获得精准的推荐结果。YouTubeDNN模型主要分为两个阶段:召回阶段和排序阶段。
  • YouTubeDNN模型的召回主要是完成候选视频的快速筛选(在论文中被称为 Candidate Generation Model),也就是候选集的生成模型。在这一部分中,模型要做的就是将整个YouTube数据库中的视频数量由百万级别降到数百级别。
  • 为什么要使用YouTubeDNN模型?
    • 答:传统的协同过滤算法处理百万级数据量,很明显是不够的,因为CF算法的本质就是计算两两内容之间的关系矩阵,然后将结果保存在内存当中,当然随着数据量的增大,就会很容易地出现OOM的现象。假设有个无限大的内存的分布式计算系统(Spark等),对于百万级矩阵计算处理时所耗费的时间,也不是我们想看到的结果。而YouTubeDNN则利用了Embedding向量加上对负样本的特殊采样处理,巧妙地解决了这一问题。

YouTubeDNN模型架构图

  • YouTube推荐系统架构图
    在这里插入图片描述
    • 从论文的解释中我们可以得知这个架构就像是一个沙漏(funnel)一样,从最初的百万级→数百级→十级别。

YouTubeDNN召回阶段

  • YouTubeDNN召回模型架构图
    在这里插入图片描述

YouTubeDNN层级介绍

  • 我们可以把召回模型的结构分为三层。
    • 输入层:输入层总共有四种特征。

      • 用户看过视频的 Embedding(embedded video watches)
      • 用户搜索的关键词的 Embedding 向量(embedded search tokens)
      • 用户所在的地理位置的特征(geographic embedding)适用于冷启动
      • 用户基本特征(example age, gender)
      • 在处理观看的视频序列和搜索词时需要格外注意,每一个人所观看的内容的数量、长度一定不同、所搜索的关键词也一定不同,所产生出来的Embedding也会千差万别,所以就需要用多值特征和平均池化进行处理。由于每个人的序列长度不同,我们在进行训练时就需要将多值特征中的每一个视频ID经过Embedding Lookup(通过矩阵相乘类似于一个全连接层)操作后,得到其对应的Embedding向量,然后再经过平均池化处理,最后得到这个多值特征所对应的Embedding特征。
      • 最后将处理完的特征拼接成一个大的Embedding输入给模型。
    • 三层神经网络(训练层):这一层也就是模型训练层,这里采用了三层ReLU结构,实际上在YouTubeDNN中,这三层ReLU的作用就是接收输入层特征的CONCAT,然后使用常见的塔形设计,对自底向上的每一层神经元数目作减半处理,直到得到的输出维度与Softmax所要求的输入维度相同(256维)。也就是1024→512→256。

    • Softmax层(输出层):在经过三层ReLU之后,召回层使用Softmax作为输出层。我们知道,传入Softmax层的参数是用户的Embedding向量,而这里的用户的 Embedding并不是在输入层里面的用户Embedding,而是经过实时计算得到的,也就是最后一层ReLU的输出。

      • Softmax层最终的输出并不是点击率的预估,而是预测用户最终会点击哪个视频。首先看右侧的Softmax部分,这一部分实际上是把上一步ReLU输出的user u接到了Softmax 层,得到其概率分布。
      • YouTubeDNN把每一个视频当做一个类别,这里的Softmax可以理解为每一个视频进行了一个概率上的打分。从论文的角度来说,就是将user u和video v进行内积(这个内积实际上就是求其相似度然后再进行 Softmax),这样就可以得到用户观看每个视频的概率,也就是上面这张图中所展示的class probabilities。Softmax右侧部分也就是一个离线的Training(主要是加快线上预测效率)当得到右侧最终的用户向量之后,为了与离线的训练保持一致,需要对每个video进行内积计算,然后得到概率Top N个结果作为输出。
      • Softmax最左边是一个nearest neighbor index,这个部分就是核心所在。这里YouTubeDNN采用最临近搜索的方法去完成topN的推荐,通过召回模型得到user u和video v做内积,然后再用最临近搜索来得到最后的 topN,这样的效率实际上是最高的。
      • Softmax层概率公式:基于用户U与上下文C,在t时刻,将视频库V中指定的视频wt划分为第i类的概率
        在这里插入图片描述

YouTubeDNN排序阶段

  • YouTubeDNN排序模型架构图
    在这里插入图片描述
  • YouTubeDNN排序阶段模型图与召回层模型相似,排序模型面对的只是来自检索的数百候选视频,所以可以使用更多精细的特征,重点是精准预测。论文中已特征工程的角度对各个视视频特征进行了embedding处理,然后再进行ReLU层,最终通过加权LR进行Training,在线上Serving部分使用了e^(wx+b)进行预测。
  • 论文中将特征分成了两类一类是impression一类是query。
    • video embedding包含impression video ID(展示视频)、watched video ID(用户已观看视频后续还需要进行avg-pooling处理)。
    • language embedding包含:user language(用户语言)和video language(视频语言)。
    • time since last watch(自上次观看同channel视频的时间)进行归一化处理,刚看过这个channel的视频,还会继续曝光该channel的其他视频
    • previous impressions(该视频已经被曝光给该用户的次数)进行归一化处理,主要是防止无效曝光。
  • 这里就简单介绍一下排序模型的架构,因为排序模型更改迭代速度实在是太快了。本章主要是还是从召回模型做思考。

YoutubeDNN模型中的一些Trick

负采样问题

  • YouTubeDNN采用了负采样,训练样本来自全部观看记录,观看记录包括用户被推荐的内容,再加上用户自己搜索或者在其他地方点击的内容,这样做的好处是可以使新的视频也能够有比较好的曝光。
  • 把用户看完的内容作为正样本,再从视频库里随机选取一些样本作为负样本。没有曝光过的内容理论上有可能被点击过,但是这里把它们全都变成了负样本,这样就有了一定的随机性
  • 在采样时,训练数据中对每个用户选取相同的样本数。这样做的目的是保证用户在损失函数的权重是相等的,这样可以尽可能地减少高度活跃的用户对整个推荐结果的Loss的影响。
  • 为什么加入负采样的目的是提高训练的速度?
    • 对于每一个样本来说,所有视频来说都有可能是正样本,YouTubeDNN Softmax实际上对每个视频都计算出一个概率,如果不做负采样,则会形成一个数以万计的分类,显然增加了训练难度,所以作者这里正常提取正样本,把负样本从视频库中根据重要性进行抽样,这样可以缓解训练压力,提升整体效率。

特征构造

  • 对于一些简单的特征(用户性别、年龄)没有经过特殊的处理,直接输入,然后做一层归一化后,把最终的结果压缩到[0, 1]范围内。

  • 对于用户观看的视频(video)在模型中并没有取视频的特征,只是简单将视频ID 作为特征传入进来,然后利用DNN来自动学习商品的Embedding特征。

  • 因为用户更偏向于喜欢观看最新的视频,而随着时间的增长喜爱程度会下降,为了修复此问题,引入了召回模型中的example age特征。
    在这里插入图片描述

  • 历史信息是一个边长的视频ID序列,根据ID序列和Embedding视频矩阵来获取用户历史观看的Embedding向量序列,通过weighted、avg、attention等方法,将这个 Embedding序列映射成一个定长的Watch Vector,作为输入层的一部分。

上下文选择

  • 在上下文和标签的选择中,主要利用了序列的方法。用户每次进入YouTube一直到退出都有一定的序列,而这个序列一开始会选择范围比较广的视频进行浏览,然后再慢慢地专注到一个比较小的范围内。类似于冷启动里的EE问题,先探索再开采。这种浏览行为实际上就是一种不对称的浏览行为。因此,作者从观看序列中随机抽取一个视频作为Label,这样就忽略了这种不对称性所产生的影响,如下图所示:
    在这里插入图片描述
  • 上图是一个对比实验,很多算法都是采用左边的方法,利用全局观看的信息作为输入,这样就忽略了观看序列的不对称性。而YouTubeDNN则是使用右边的方法,就是把历史信息当做输入,用历史来预测未来。这样做的优点就是模型的测试集往往也是用户最近一次的观看行为,后面可以把用户最后一次的点击放到测试集中,防止信息穿越的问题,在线上AB测试方面表现更佳。

总结

  • 这些内容对于初学推荐系统的小伙伴还是比较有帮助的,具体一些细节还是得在论文中查看,这里老规矩放上论文链接,关于代码方面,会在后面更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1470614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL面试复习】什么是聚簇索引(聚集索引)和非聚簇索引(二级索引)/什么是回表?

系列文章目录 在MySQL中,如何定位慢查询? 发现了某个SQL语句执行很慢,如何进行分析? 了解过索引吗?(索引的底层原理)/B 树和B树的区别是什么? 系列文章目录什么是聚簇索引(聚集索引&#xff09…

逆向茶话会笔记

安卓逆向 用用burp设置代理或者用charles抓包 windows httpopen 类比web站点渗透测试 推荐书 飞虫 安卓大佬不怎么打ctf 喜欢在看雪和吾爱破解 提问环节 q websocket grpc抓包有什么推荐的工具? a 不太了解 游戏安全和llvm 既要逆游戏也要逆外挂 逆游戏入…

分布式知识整理

分布式锁 以商场系统超卖现象举例 超卖现象一 现象: 商品卖出数量超出了库存数量。 产生原因: 扣减库存的动作在程序中进行,在程序中计算剩余库存,在并发场景下,导致库存计算错误。 代码复现 es.shutdown(); cycl…

笔记本hp6930p安装Android-x86避坑日记

一、序言 农历癸卯年前大扫除,翻出老机hp6930p,闲来无事,便安装Android-x86玩玩,期间多次入坑,随手记之以避坑。 笔记本配置:T9600,4G内存,120G固态160G机械硬盘 二、Android-x86系统简介 官…

第二节:Vben Admin 登录逻辑梳理和对接后端准备

系列文章目录 上一节:第一节:Vben Admin介绍和初次运行 文章目录 系列文章目录前言项目路径的概述一、登录逻辑梳理loginApi接口查看Mock 二、后端程序对接准备关闭Mock 总结 前言 第一节,我们已经配置了前端环境,运行起来了我们…

vue基础操作(vue基础)

想到多少写多少把&#xff0c;其他的想起来了在写。也写了一些css的 input框的双向数据绑定 html <input value"123456" type"text" v-model"account" input"accou" class"bottom-line bottom" placeholder"请输入…

数据库安全性与完整性设计

文章标签集合[数据库安全,数据敏感,通信安全,MD5,盐加密] 1 系统设计 1.1设计目标 &#xff08;1&#xff09;确定系统中需要保护的敏感数据和通信内容&#xff1b; &#xff08;2&#xff09;设计合适的签名、加密和解密算法&#xff1b; &#xff08;3&#xff09;实现…

遗传算法(Genetic Algorithm,GA)求解不闭合多旅行商问题(提供MATLAB代码)

一、遗传算法&#xff08;GA&#xff09;介绍 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一种模拟自然界生物进化过程的优化算法。它通过模拟生物的遗传、变异和选择等机制&#xff0c;来搜索问题的最优解。 遗传算法的基本思想是通过对候选解进行编…

matlab绘制雷达图和二维FFT变换图

1、内容简介 略 49-可以交流、咨询、答疑 matlab绘制雷达图和二维FFT变换图 NMO组及NORMAL组 RNFL层、GCL层、IPL层、GCC层、ORL层做雷达图&#xff08;共10张&#xff09; 2、内容说明 略 NMO组及NORMAL组 RNFL层、GCL层、IPL层、GCC层、ORL层请分别做雷达图&#xff08…

CAS5.3使用JPA实现动态注册服务

cas同时支持cas协议和OAuth2协议,官方默认是通过扫描json文件的形式注册客户端服务,但是此种方式需要重启服务才能生效,此次我们将使用JPA来完美实现动态注册服务,如果不知道cas如何部署,可以擦看之前的文章 cas-client基于CAS协议客户端搭建-CSDN博客 cas-server5.3自定义密…

Vue 卸载eslint

卸载依赖 npm uninstall eslint --save 然后 进入package.json中&#xff0c;删除残留信息。 否则在执行卸载后&#xff0c;运行会报错。 之后再起项目。

HTTPS对HTTP的加密过程

1、HTTPS是在HTTP的基础上&#xff0c;引入了一个加密层&#xff08;SSL&#xff09;&#xff0c;对数据进行保护&#xff0c;HTTP 是明文传输的&#xff08;不安全&#xff0c;很可能会被运营商通过referer劫持&#xff0c;或者黑客通过修改链接来窃数据&#xff09; 2、加密…

Typora结合PicGo + 使用Github搭建个人免费图床

文章目录 一、国内图床比较二、使用Github搭建图床三、PicGo整合Github图床1、下载并安装PicGo2、设置图床3、整合jsDelivr具体配置介绍 4、测试5、附录 四、Typora整合PicGo实现自动上传 每次写博客时&#xff0c;我都会习惯在Typora写好&#xff0c;然后再复制粘贴到对应的网…

redis数据结构源码分析——压缩列表ziplist(I)

前面讲了跳表的源码分析&#xff0c;本篇我们来聊一聊另外一个重点结构——压缩列表 文章目录 存储结构字节数组结构节点结构 压缩编码zipEntryzlEntry ZIP_DECODE_PREVLENZIP_DECODE_LENGTH API解析ziplistNew(创建压缩列表)ziplistInsert(插入)ziplistDelete(删除)ziplistFi…

.NET Core使用NPOI导出复杂,美观的Excel详解

前言&#xff1a; 这段时间一直专注于数据报表的开发&#xff0c;当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦。客户要求要导出优雅&#xff0c;美观的Excel文档格式的来展示数据&#xff0c;当时的第一想法就是使用NPOI开源库来做数据导出Excel文档&#xf…

第四节:Vben Admin登录对接后端getUserInfo接口

系列文章目录 第一节&#xff1a;Vben Admin介绍和初次运行 第二节&#xff1a;Vben Admin 登录逻辑梳理和对接后端准备 第三节&#xff1a;Vben Admin登录对接后端login接口 第四节&#xff1a;Vben Admin登录对接后端getUserInfo接口 文章目录 系列文章目录前言一、回顾Vben…

推荐莹莹API管理系统PHP源码

莹莹API管理系统PHP源码附带两套模板,PHP版本要求为5.6至8.0之间&#xff0c;已测试通过的版本为7.4。 需要安装PHPSG11加密扩展。 已测试&#xff1a;宝塔/主机亲测成功搭建&#xff01; 演示地 址 &#xff1a; runruncode.com/php/19698.html 安装说明&#xff08;适用于宝…

【经验】J-link v8固件修复

jlink v8 重新烧录解决不识别usb&#xff0c;灯不亮的问题。参考了网上的饿jlink v8固件烧录指导。 打开JLINK后盖&#xff0c;主流的有以下两种结构&#xff1a; 擦除芯片并进入编程模式 1.使用USB线连接JLINK与PC机&#xff0c;以提供JLINK工作电源 2.短接图中ERASE(A)的两…

Excel工作表控件实现滚动按钮效果

实例需求&#xff1a;工作表中有多个Button控件&#xff08;工作表Form控件&#xff09;和一个ScrollBar控件&#xff08;工作表ActiveX控件&#xff0c;名称为ScrollBar2&#xff09;&#xff0c;需要实现如下图所示效果。点击ScrollBar控件实现按钮的滚动效果&#xff0c;实际…

STM32 4位数码管和74HC595

4位数码管 在使用一位数码管的时候&#xff0c;会用到8个IO口&#xff0c;那如果使用4位数码管&#xff0c;难道要使用32个IO口吗&#xff1f;肯定是不行的&#xff0c;太浪费了IO口了。把四个数码管全部接一起共用8个IO口&#xff0c;然后分别给他们一个片选。所以4位数码管共…