分享
Youtube DNN推荐系统
输入“/”快速插入内容
Youtube DNN推荐系统
飞书用户2749
3月14日修改
1.
整体架构
整体架构是标准的先检索后精排:
2.
候选生成(检索)
把
推荐
看成一个
分类问题
。时刻
用户
在背景
下对每个视频
的观看可能建模为:
📌
这么定义显然变成类别很多(视频数量)的
分类问题
,分母计算量很大,直接优化肯定不行。作者使用了
负采样(Negative Sampling)
方法,所有类别太多,只从中选择一些作为负类(相当于对上式中的分母做了个近似)。负类基于样本分布抽取而来 ^{[10]},
每个正样本会对应抽取几千个负样本
。负采样是针对类别数很多情况下的常用方法。
📌
•
DNN
的任务是学习用户表示向量
,把它视为用户历史和背景的函数。
•
视频
的表示向量
本身就是模型训练参数。表示向量都是
256
维。
•
模型首先把用户的各种历史和背景信息抽取为向量,然后把这些向量拼接起来送进一个多层DNN,
DNN的宽度逐层减半
。
•
DNN的输出就作为此用户的向量
。
•
所以模型的关键是输入的各种信号,即用户的历史和背景信息。
模型训练后即可得到每个
视频的表示向量
,以及每个
用户的表示向量
(利用特征可提前计算好,特征不依赖于特定
item
),只要拿这个
用户向量
去
检索
最相似的 N 个视频即可,可以直接用常见的
向量检索库
,如
Faiss
等。
2.1
训练数据的选取
训练样本来自于用户在youtube各个展位的日志,不仅限于
推荐展位
。训练数据来源于用户的
隐式数据
(虽然有显式数据,但规模小好几个量级)训练模型,
用户看完了的视频作为正样本
。负样本是通过
负采样
选取的,所以训练数据中可以不包括
负样本
。
•
一个经验是训练数据中对于每个用户选取相同的样本数,保证
用户等权重
。这样可以改进
线上A/B测试
的效果。
•
另一个经验是要
避免让模型知道不该知道的信息
。一个例子是如果模型知道用户最后的行为是搜索了
“Taylor Swift”
,那模型可能会倾向于推荐搜索页面搜 “Taylor Swift” 时搜出的视频,这不是推荐模型的期望行为。解决方法是
扔掉时序信息
,使用
无序的搜索
tokens
来表示搜索
queries
(直接平均)。
📌
基于这个例子就把时序信息扔掉理由挺勉强的,解决这种特殊场景的信息泄露会有更针对性的方法,比如把搜索query与搜索结果行为绑定让它们不可分。Google后面是有时序建模相关的工作的
2.2
模型输入特征
DNN的好处是可以把各种离散和连续的特征都输入进去。论文中提到检索模型中使用到的特征:
📌
•
用户的观看历史:使用用户最近的
50
次观看历史。视频数量为
1 Million
。观看历史中的视频向量(
256
维)被直接平均后输入到模型中。
•
用户的搜索历史:使用用户最近的
50
次搜索历史。每个query被分解为unigram和bigram,然后所有这些token对应的向量(
256
维)被直接平均后输入到模型中。token数量为
1 Million
。
•
用户的人口统计特征:对新用户的推荐会比较有帮助。