召回 DSSM、YouTubeDNN
召回 DSSM、YouTubeDNN
- 场景:召回
- 模型:DSSM、YouTubeDNN
- 数据:MovieLens-1M
DSSM 算法原理
- DSSM(Deep Structured Semantic Models,深度结构化语义模型)是微软研究院提出的一种非常经典的深度语义匹配模型。它最早主要用于解决搜索中查询(Query)和文档(Document)的匹配问题,后来也被广泛用于推荐系统、广告投放等场景。
- DSSM的核心目标是:将高维的、稀疏的文本特征(如Query和Doc)映射到一个低维的、稠密的语义空间中,并在该空间中用向量的余弦相似度来表示两者的语义相关性。
- DSSM是一个典型的双塔模型架构。它有两个结构相同(或相似)但参数独立的DNN塔,分别用来处理Query和Document。
1. 输入层:Term Vector+ Word Hashing
- 问题:输入通常是高维的one-hot向量(词袋模型),维度等于词典的大小(可能是几十万甚至百万),直接输入网络会导致参数过多且无法捕捉词之间的相似性。
- 解决方法:Word Hashing(这是DSSM的一个关键亮点,基于词的字母3-gram来压缩输入空间,解决稀疏性和词汇鸿沟问题)。
- 输出:一个相对低维的、基于字母级别的n-gram向量。
2. 表示层:多层DNN
- 这是两个结构相同的深度神经网络(DNN)。
- 输入:经过Word Hashing处理后的Query向量 和 Document向量 。
- 计算过程:数据经过若干层全连接层,每一层都使用非线性激活函数(通常是)。
- 公式:
- 输出:最终得到固定长度的低维语义向量。
假设最后一层维度为 k:
- Query塔输出: (语义向量)
- Document塔输出: (语义向量)
3. 匹配层:计算余弦相似度
- 得到Query和Document的语义向量后,在顶层计算它们的相关性分数。
- 公式:
- 这个分数 代表了Query和Document在语义空间上的匹配程度。
损失函数
- 在训练阶段,通常假设对于一个给定的Query ,我们已经知道它点击过的文档(正样本 )和没有点击过的文档(负样本 )。
- DSSM使用最大似然估计来优化参数,希望正样本的匹配分数尽可能高,负样本的匹配分数尽可能低。具体来说,它使用softmax函数将匹配分数转化为后验概率:
- 计算后验概率:
其中:
- 是一个平滑因子(通常是一个较大的数,比如5或10),用于放大相似度的影响。
- 是候选文档集合,通常包括1个正样本和 N 个随机采样的负样本。
- 损失函数:
训练的目标是最大化点击文档的后验概率,也就是最小化负对数似然:
YouTubeDNN 算法原理
- 它几乎是工业界深度学习推荐系统的教科书级范本,解决了从海量视频中召回(Candidate Generation)到精排序(Ranking)的全链路问题。
- YouTube DNN 将推荐系统明确地拆分为两个独立的阶段:
- 候选生成(Candidate Generation):也可以看作召回阶段。从海量视频库(百万级)中选出用户可能感兴趣的几百个视频。
- 排序(Ranking):对这几百个视频进行精细打分和排序,选出最终推荐给用户的几十个视频。
- 这种"漏斗形"架构已经成为工业推荐系统的标配。
1. 第一阶段:候选生成(召回)模型
这个阶段的核心是:把推荐问题转化为一个极大规模的"多分类"问题。
1.1 模型架构(也是双塔)
这个阶段的模型也是一个双塔结构,但通常被称为"Query Tower"和"Video Tower",不过在 Serving 时两者是解耦的。
- 输入特征:
- 用户侧(Query Tower):
- 历史观看视频的 embedding 向量平均(把用户看过的视频 ID 映射成向量,再取平均)。
- 搜索词(如果有点击日志)。
- 人口统计学信息(性别、年龄等)。
- Example Age(样本年龄):一个非常重要的特征,代表这个视频样本被观看的时间距离现在多久(用于模拟实时兴趣)。
- 视频侧(Video Tower):
- 视频 ID(待分类的目标)。
- 视频其他特征(频道、上传时间等)。
- 用户侧(Query Tower):
- 训练目标:Softmax 多分类
- 模型将预测用户在时刻 t 会观看哪个视频 作为分类任务。
- 公式:
-
其中:
- :是用户塔的输出向量(代表用户的兴趣)。
- :是视频 的向量。
- :是全部视频的集合(百万甚至千万级)。
-
训练难点与技巧
- 负采样(Negative Sampling):分母需要对所有视频计算 Softmax,计算量巨大。YouTube DNN 采用负采样技术,只计算一部分负样本的得分来近似全 Softmax。
- 上下文(Context):不仅看用户看了什么,还引入了搜索词作为强特征,捕捉用户当前的主动意图。
- Example Age 特征:YouTube 视频有很强的时效性(用户喜欢看新视频)。如果不做处理,模型会倾向于推荐训练数据中平均表现好的老视频。加入 Example Age 特征(在 Serving 时设为 0 或很小的负数),可以让模型学到:某个视频刚上传时(Age=0),推荐概率会变高。
1.2 召回阶段的 Serving(线上服务)
训练完成后,召回阶段的服务逻辑是最近邻搜索:
- 离线计算:把所有视频 的向量计算好,存入向量数据库(如 FAISS)。
- 线上实时:用户发起请求,实时计算用户向量 。
- ANN 检索:用 去视频向量库中做近似最近邻搜索,快速找到与 最相似的 个视频(即得分 最高的视频)。
2. 第二阶段:排序(Ranking)模型
经过召回阶段,候选视频数量从百万级降到了几百个。排序阶段的任务就是对这几百个视频进行精准的点击率预估。
2.1 模型架构
排序模型是一个标准的深度神经网络(DNN)。
- 输入特征:
- 稠密特征:用户特征(召回的 user vector)、视频特征。
- 稀疏特征:用户上次与同频道互动的频次、用户最后一次观看本视频的时间等。
- 类别特征:视频 ID、频道 ID(经过 Embedding 层处理)。
- 网络结构:
- 将上述特征拼接成一个巨大的输入向量。
- 经过若干层全连接层(ReLU 激活函数)。
- 输出层:一个神经元(用于预估点击率)。
2.2 训练目标:加权逻辑回归
与常见的二分类逻辑回归不同,YouTube 排序模型采用了一种特殊的训练方式,以适应视频观看时长的优化目标。
- 传统方法:预测点击率 。
- YouTube 方法:预测观看时长 (期望观看时长)。
- 实现技巧:
- 模型最后一层使用 逻辑回归(输出 )。
- 正样本:用户点击并观看了的视频,赋权值为观看时长(如观看 3 分钟,权重就是 3)。
- 负样本:曝光未点击的视频,赋权值为 1。
- 损失函数:使用加权逻辑回归。
- 线上预测:计算 (逻辑回归的 logits 的指数)。为什么?
- 在加权逻辑回归中,。
- 通常很小,所以 $e^{x} \approx p \times (\text{正样本平均时长} + 1) $。
- 这个输出值近似正比于预期观看时长。
- 模型最后一层使用 逻辑回归(输出 )。
2.3 排序阶段的 Serving
将线上请求的几百个视频特征输入模型,进行一次前向传播,得到每个视频的得分(预期观看时长)。按照这个得分从高到低排序,取 Top N 推荐给用户。
代码实现
直接调用
DSSM
1 | import torch |
YouTubeDNN
1 | import os |
自定义模型
DSSM
1 |
|
YouTubeDNN
1 | import torch |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 isSeymour!
评论




