深入浅出地理解Youtube DNN推荐模型
前言
论文:《Deep Neural Networks for YouTube Recommendations》
相信很多小伙伴已经看过相关的文章,这篇文章主要目的在于阐述一些其他人很少关注但却是极其重要的点,当然也包括很多人提到点:
- 推荐的流程
- 召回模型的本质
- 负采样的注意事项
- 为什么召回要分成离线training和在线serving?为什么在线serving可以用Faiss这样的工具来代替?
PS:我觉得这篇论文的思想简直就是深度学习应用至推荐系统的工程教科书。
推荐系统框架
这张图就很清晰地阐述整个推荐系统的流程:
- 从百万量级的视频库,根据用户的特征及上下文信息,通过召回模型,筛选出用户可能感兴趣的少量视频,称为候选集(百量级);
- 接着,再通过排序模型,将上一步的候选集,进行排序,最终呈现给用户。
这个框架不知道是不是深度学习推荐系统的鼻祖(未去验证),但只能说,直到如今,很多还是沿用着这个框架。(现在可能还会加入粗排、重排等步骤)
召回网络
首先,需要定义召回网络的目标,如下公式:U代表用户,C代表上下文信息,V代表视频
那么召回网络的目标即可以理解为预测对于一个用户,在当前的上下文场景下,观看每个视频的概率。
这就相当于转化于一个多分类问题了。
模型结构
召回模型的整体结构还是比较简单的:
- 输入层是用户观看视频序列的embedding mean pooling、搜索词的embedding mean pooling、地理位置embedding、用户特征;
- 输入层给到三层激活函数位ReLU的全连接层,然后得到用户向量;
- 最后,经过softmax层,得到每个视频的观看概率。
(这一层的offline training和online serving是非常关键的点,下文详细展开)
工程部分
下面,我列举出几个关键的工程部分:
- 模型增加视频年龄的特征
首先,YouTube发现用户偏爱于新鲜的视频;其次,视频流行度的分布是非常不平稳的:即视频在刚发布时,更受用户喜爱,随着发布时间的越发久远,受喜爱趋势就会快速下降,但baseline模型在一段时间的训练窗口内,却是表现得很平稳(该窗口内预测概率的平均)
所以为了修复这个问题,模型加入视频年龄的特征,即视频的发布时间,实验结果也证明是有效的;
- 训练样本不仅从推荐系统中抽取,还从Youtube的所有视频相关场景下获取,这样可以减少冷启动的视频;
3. 上下文和标签选择
Youtube发现用户一开始都会范围比较广地浏览各种视频,然后再专注于一个比较小的范围内。(应该是从探索到发现喜爱),这是一种不对称的浏览行为,所以,相对于从观看序列中随机抽取一个作为label(下图a),即忽略这种不对称性又缺失未来的信息,
把序列的最后一次观看作为label(下图b)会更适合
编辑切换为居中
添加图片注释,不超过 140 字(可选)
4. 负采样
上面也提到:召回网络的目标即可以理解为预测对于一个用户,在当前的上下文场景下,观看每个视频的概率。
那么,对于每个样本来说,所有视频都可能是正样本。假如有100W个视频,那么召回模型就变成一个100W分类模型了,这显然带来了很大的训练难度。
所以,就需要用到负采样了,论文这里讲得比较模糊,大概思路就是:
- 把100W分类调整为K级别的分类;
- 正样本如上述方法提取,负样本则从视频库中根据重要性抽样;
- 这里分享下个人的拙见:本人也负责过召回模型的研发,一开始为了方便排序模型的处理,就从曝光未点击的样本进行负采样,作为召回模型和排序模型的负样本。离线训练时,召回模型的指标都还挺好,但上线之后,发现推荐与用户画像根本搭不上边。所以,召回模型的负采样必须要包含从全量item抽取的部分(easy negative samples),但一般还需要包括另外一部分hard negative samples。
- 为什么呢?主要是为了与真实场景统一,很好理解,真实的召回场景本来就是从全量item库中进行推荐,而不是从小部分item(如曝光非点击的item)。并且曝光的item是由上一个版本的召回模型决定,会导致长尾效应,推荐越来越“窄”;
- 另外,hard negative samples是为了在召回模型大方向正确的前提下,能够增加模型的训练难度,增强个性化推荐能力。一般会使用推荐流曝光位置靠中的未点击item。
softmax层
这一节本来应该也属于工程部分的,但它实在是论文的精华,就单拎出来讲了。包括后面的双塔模型DSSM也是同样的套路。
到ReLU全连接层得到用户向量u这一步,都还是很清晰易懂的。
离线training部分:
- 向量u接softmax激活的全连接层,得到概率分布,多么标准的多分类输出:P = softmax(uW)
很多没真正做过召回模型的同学,包括很多文章,到这里就“点到为止”了。
- 其实这里的W,不是随便配的权重,而就是视频的向量V,怎么理解:
P = u ( 1 , d i m ) ⋅ V T ( s a m p l e , d i m ) P = u(1,dim)⋅V^T(sample,dim) P=u(1,dim)⋅VT(sample,dim)
用户向量u与每个视频向量v进行内积,就得到用户观看每个视频的概率,然后选择最大的作为模型预测输出。
在线serving部分:
- 首先,先理解为什么要拆分offline和online呢?主要原因还是工程的妥协,想象线上预测时,把所有视频都塞进模型进行计算,然后再得到概率最高的n个作为召回结果,这得消耗多大的性能,十分不合理。
那么,在线serving怎么做呢?
- 一般情况下,视频(item)不会发生什么改变,而用户则不同,他的浏览行为一直在改变,偏好可能一直在变化,所以,视频(item)向量则通过离线training之后,将其存储在数据库,而用户向量则通过模型实时计算得到;
- 得到用户向量之后,为了与离线training保持一致,仍然要与每个视频(item)向量进行内积运算,然后得到观看概率最高的n个,此时Annoy、Faiss等工具就派上用场了,它们其实就是输入用户向量,通过各种优化手段,近似得与每个视频(item)向量进行内积计算,这就是为什么在线serving时可以用Annoy&Faiss来代替的原因了。
推荐系统的向量检索工具: Annoy & Faiss
强大的向量数据库:Milvus
排序模型
论文后面还提到了排序部分,但如今排序模型已经是迭代得很厉害了,例如XDeepFM、DIN、Transformer等等,在这里就不展开讲了。
总结
再重述一下文章的几个点,如果看到这里还有不清楚的地方,可以再往上翻翻:
- 推荐的流程
- 召回模型的本质
- 负采样的注意事项
- 为什么召回要分成离线training和在线serving?为什么在线serving可以用Faiss这样的工具来代替?
深入浅出地理解Youtube DNN推荐模型相关推荐
- 谷歌最新双塔DNN召回模型——应用于YouTube大规模视频推荐场景
" 谷歌基于双塔DNN框架提出一个大规模最近邻召回系统,为降低采样偏差带来的影响,文章对batch softmax的损失函数进行了改进,同时从工程的角度介绍了大规模双塔DNN召回模型的训练. ...
- 深入浅出推荐系统之简单推荐模型
先来回答一个最关键的问题:到底什么是推荐系统? 下面从3个角度来回答: 它能做什么 它需要什么 它怎么做 先来第一个问题推荐系统能做啥? 推荐系统可以把那些最终会在用户(User)和物品(Item)之 ...
- 深入理解YouTube推荐系统算法!
之前天池-安泰杯跨境电商智能算法大赛是我初次接触推荐相关的比赛,通过比赛让我对推荐系统有了较为浅显的认识,赛后也是打算系统的学习这方面的内容,此后我也会将[推荐系统]作为一个系列板块进行更新,主打经典 ...
- 【推荐系统】深入理解YouTube推荐系统算法
去年天池-安泰杯跨境电商智能算法大赛是我初次接触推荐相关的比赛,通过比赛让我对推荐系统有了较为浅显的认识,赛后也是打算系统的学习这方面的内容,此后我也会将[推荐系统]作为一个系列板块进行更新,主打经典 ...
- YouTube DNN论文精读
文章目录 Abstract 1. Introduction 2. System Overview 3. Candidate Generation 3.1 Recommendation as class ...
- 【推荐实践】用户行为序列推荐模型
文章作者:汪剑 出门问问 算法工程师 编辑整理:Hoh Xil 导读:今天我们谈谈用户行为序列上的推荐模型.首先我们对序列推荐问题做一个定义和描述,然后主要讲述可以用在序列推荐任务中的 NN 模型,最 ...
- CF、FM、DSSM、DeepFM等这些推荐模型的原理以及使用场景是什么?
由于近些年深度学习技术的飞速发展,大力加速推动了AI在互联网以及传统各个行业的商业化落地,尤其是推荐系统.计算广告等领域.由于推荐系统与提升用户量以及商业化变现有着密不可分的联系,各大公司都放出了众多 ...
- google youtube 电影推荐算法
google youtube 电影推荐算法 在面试实习生的时候,我有个习惯,就是面试快结束的时候,会像聊天一样和面试的学生聊一下他们对某个技术方向的看法.很多时候不是期望他们能提供什么灵感,也不期望能 ...
- 深度推荐模型 - DeepFM
DeepFM 文章目录 DeepFM 之前的模型的缺点和局限 线性模型的局限性 多项式模型的问题 DNN的局限性 FM(因子分解机) FFM FNN & PNN Wide & Deep ...
最新文章
- TileList自动滚动指定单元格,可视部分
- Web 安全漏洞之 XSS 攻击,Java 开发必看!
- centOS 7设置静态IP,使用Xshell远程连接
- python基础应用_【复习】mysql+python基础应用(20190815)
- UNICODE编程资料(转贴)
- Atmel megaAVR控制器 串行引导Bootloader
- Python 使用 smtp ssl 模式 发送邮件与附件
- 基于Minio和Thumbor搭建独立图片服务
- 修改系统提供视图类的显示字体
- blogic-io.xml文件中的出力属性和output.javabean文件中的属性需要一一对应
- 【matlab】iir滤波器
- oracle年龄计算函数天 月 年,如何使用Oracle获得年龄,月份和天数的年龄
- 数据集:CIFAR-10、CIFAR-100、MNIST、SVHN、ImageNet、LSUN
- vue上传图片文件到腾讯COS
- 解决【VS/VC】中文乱码问题-5种解决办法
- C# xmind总结
- 购物栏置底 - uni-ui组件uni-goods-nav放在屏幕下方的办法
- Unity导入package简单操作流程
- 惠普服务器SPP包制作方法
- ST(StoryTest)简单了解
热门文章
- 有史以来最牛的一张程序员职业路线图!
- 如何把html5设置为桌面背景,怎么将照片设置为电脑桌面
- 浏览器如何判断是否支持 webp 格式图片
- Codeforces 444C DZY Loves Colors 线段树区间更新
- 出差攻略干货,要出差的小伙伴们点进来吧~~
- Ubuntu下wine使用windows常用软件
- ChatGPT 中文API文档
- IRF520模块的MOS管使用
- 华为云计算机玩游戏,华为云电脑到底能不能玩游戏?体验一下绝地求生游戏效果...
- 天天静听ASMR-3.2.0——各种声音治疗你的失眠