推荐模型复现(三):召回模型YoutubeDNN、DSSM

简介: DSSM(Deep Structured Semantic Model),由微软研究院提出,利用深度神经网络将文本表示为低维度的向量,应用于文本相似度匹配场景下的一个算法。不仅局限于文本,在其他可以计算相似性计算的场景,例如推荐系统中。根据用户搜索行为中query(文本搜索)和doc(要匹配的文本)的日志数据,使用深度学习网络将query和doc映射到相同维度的语义空间中,即query侧特征的embedding和doc侧特征的embedding,从而得到语句的低维语义向量表达sentence embedding,用于预测两句话的语义相似度。

1. DSSM


1.1 DSSM模型原理

DSSM(Deep Structured Semantic Model),由微软研究院提出,利用深度神经网络将文本表示为低维度的向量,应用于文本相似度匹配场景下的一个算法。不仅局限于文本,在其他可以计算相似性计算的场景,例如推荐系统中。根据用户搜索行为中query(文本搜索)和doc(要匹配的文本)的日志数据,使用深度学习网络将query和doc映射到相同维度的语义空间中,即query侧特征的embedding和doc侧特征的embedding,从而得到语句的低维语义向量表达sentence embedding,用于预测两句话的语义相似度。


1.2 DSSM结构

image.png



模型结构:user侧塔和item侧塔分别经过各自的DNN得到embedding,再计算两者之间的相似度

特点:

user和item两侧最终得到的embedding维度需要保持一致

对物料库中所有item计算相似度时,使用负采样进行近似计算

在海量的候选数据进行召回的场景下,速度很快

**缺点:**双塔的结构无法考虑两侧特征之间的交互信息,在一定程度上牺牲掉模型的部分精准性。


1.3 正负样本构建

正样本:以内容推荐为例,选“用户点击”的item为正样本。最多考虑一下用户停留时长,将“用户误点击”排除在外

负样本:user与item不匹配的样本,为负样本。


全局随机采样: 从全局候选item里面随机抽取一定数量作为召回模型的负样本,但可能会导致长尾现象。

全局随机采样+热门打压:对一些热门item进行适当的采样,减少热门对搜索的影响,提高模型对相似item的区分能力。

Hard Negative增强样本:选取一部分匹配度适中的item,增加模型在训练时的难度

Batch内随机选择:利用其他样本的正样本在batch内随机采样作为自己的负样本


1.4 DSSM的代码

class DSSM(torch.nn.Module):    
    def __init__(self, user_features, item_features, user_params, item_params, temperature=1.0):
        super().__init__()
        self.user_features = user_features
        self.item_features = item_features
        self.temperature = temperature
        self.user_dims = sum([fea.embed_dim for fea in user_features])
        self.item_dims = sum([fea.embed_dim for fea in item_features])
        self.embedding = EmbeddingLayer(user_features + item_features)
        self.user_mlp = MLP(self.user_dims, output_layer=False, **user_params)
        self.item_mlp = MLP(self.item_dims, output_layer=False, **item_params)
        self.mode = None
    def forward(self, x):
        user_embedding = self.user_tower(x)
        item_embedding = self.item_tower(x)
        if self.mode == "user":
            return user_embedding
        if self.mode == "item":
            return item_embedding
        # 计算余弦相似度
        y = torch.mul(user_embedding, item_embedding).sum(dim=1)
        return torch.sigmoid(y)
    def user_tower(self, x):
        if self.mode == "item":
            return None
        input_user = self.embedding(x, self.user_features, squeeze_dim=True)
        # user DNN
        user_embedding = self.user_mlp(input_user)
        user_embedding = F.normalize(user_embedding, p=2, dim=1)
        return user_embedding
    def item_tower(self, x):
        if self.mode == "user":
            return None
        input_item = self.embedding(x, self.item_features, squeeze_dim=True)
        # item DNN
        item_embedding = self.item_mlp(input_item)
        item_embedding = F.normalize(item_embedding, p=2, dim=1)
        return item_embedding


2. YoutubeDNN


2.1 YoutubeDNN模型原理

YoutubeDNN是Youtube用于做视频推荐的落地模型,可谓推荐系统中的经典,其大体思路为召回阶段使用多个简单模型筛除大量相关度较低的样本,排序阶段使用较为复杂的模型获取精准的推荐结果。


2.2 YoutubeDNN结构

image.png


召回部分: 主要的输入是用户的点击历史数据,输出是与该用户相关的一个候选视频集合;

精排部分: 主要方法是特征工程, 模型设计和训练方法;

线下评估:采用一些常用的评估指标,通过A/B实验观察用户真实行为;


2.2.1 YoutubeDNN召回模型

image.png


输入层是用户观看视频序列的embedding mean pooling、搜索词的embedding mean pooling、地理位置embedding、用户特征;

输入层给到三层激活函数位ReLU的全连接层,然后得到用户向量;

最后,经过softmax层,得到每个视频的观看概率。


2.2.2 训练数据选取

采样方式:负采样(类似于skip-gram的采样)

样本来源:来自于全部的YouTube用户观看记录,包含用户从其他渠道观看的视频

注意:


训练数据中对于每个用户选取相同的样本数,保证用户样本在损失函数中的权重;

避免让模型知道不该知道的信息,即信息泄露


2.2.3 Example Age特征

what:Example Age为 视频年龄的特征,即视频的发布时间

背景:由于用户对新视频的观看特点,导致视频的播放预测值期望不准确。

作用:捕捉视频的生命周期,让模型学习到用户对新颖内容的bias,消除热度偏见。

操作:在线上预测时,将example age全部设为0或一个小的负值,不依赖于各个视频的上传时间。

好处:将example age设置为常数值,在计算用户向量时只需要一次;对不同的视频,对应的example age所在范围一致,只依赖训练数据选取的时间跨度,便于归一化操作。


2.3 YoutubeDNN代码

import torch
import torch.nn.functional as F
from torch_rechub.basic.layers import MLP, EmbeddingLayer
from tqdm import tqdm
class YoutubeDNN(torch.nn.Module):
    def __init__(self, user_features, item_features, neg_item_feature, user_params, temperature=1.0):
        super().__init__()
        self.user_features = user_features
        self.item_features = item_features
        self.neg_item_feature = neg_item_feature
        self.temperature = temperature
        self.user_dims = sum([fea.embed_dim for fea in user_features])
        self.embedding = EmbeddingLayer(user_features + item_features)
        self.user_mlp = MLP(self.user_dims, output_layer=False, **user_params)
        self.mode = None
    def forward(self, x):
        user_embedding = self.user_tower(x)
        item_embedding = self.item_tower(x)
        if self.mode == "user":
            return user_embedding
        if self.mode == "item":
            return item_embedding
        # 计算相似度
        y = torch.mul(user_embedding, item_embedding).sum(dim=2)
        y = y / self.temperature
        return y
    def user_tower(self, x):
        # 用于inference_embedding阶段
        if self.mode == "item":
            return None
        input_user = self.embedding(x, self.user_features, squeeze_dim=True)
        user_embedding = self.user_mlp(input_user).unsqueeze(1)
        user_embedding = F.normalize(user_embedding, p=2, dim=2)
        if self.mode == "user":
            return user_embedding.squeeze(1)
        return user_embedding
    def item_tower(self, x):
        if self.mode == "user":
            return None
        pos_embedding = self.embedding(x, self.item_features, squeeze_dim=False)
        pos_embedding = F.normalize(pos_embedding, p=2, dim=2)
        if self.mode == "item":
            return pos_embedding.squeeze(1)
        neg_embeddings = self.embedding(x, self.neg_item_feature, squeeze_dim=False).squeeze(1)
        neg_embeddings = F.normalize(neg_embeddings, p=2, dim=2)
        return torch.cat((pos_embedding, neg_embeddings), dim=1)


3. 总结


DSSM为双塔模型,user与item分别经过的DNN得到embedding,再计算两者之间的相似度。训练样本,正样本为正确的搜索目标,负样本为全局采样+热门打击所得到的负样本。

YoutubeDNN在双塔模型基础上进行了改进,召回阶段使用多个简单模型筛除大量相关度较低的样本,排序阶段使用较为复杂的模型获取精准的推荐结果。


目录
相关文章
|
人工智能 安全 算法
基于Aidlux平台实现真章假章相似度对比训练推理测试
在互联网内容安全风控领域,AI技术的应用对于提高管理的自动化程度和准确性具有重要意义。
162 0
|
28天前
|
机器学习/深度学习 人工智能 PyTorch
使用PyTorch实现GPT-2直接偏好优化训练:DPO方法改进及其与监督微调的效果对比
本文将系统阐述DPO的工作原理、实现机制,以及其与传统RLHF和SFT方法的本质区别。
85 22
使用PyTorch实现GPT-2直接偏好优化训练:DPO方法改进及其与监督微调的效果对比
|
4月前
|
机器学习/深度学习 搜索推荐
CIKM 2024:LLM蒸馏到GNN,性能提升6.2%!Emory提出大模型蒸馏到文本图
【9月更文挑战第17天】在CIKM 2024会议上,Emory大学的研究人员提出了一种创新框架,将大型语言模型(LLM)的知识蒸馏到图神经网络(GNN)中,以克服文本图(TAGs)学习中的数据稀缺问题。该方法通过LLM生成文本推理,并训练解释器模型理解这些推理,再用学生模型模仿此过程。实验显示,在四个数据集上性能平均提升了6.2%,但依赖于LLM的质量和高性能。论文链接:https://arxiv.org/pdf/2402.12022
113 7
|
8月前
|
机器学习/深度学习 编解码 PyTorch
训练Sora模型,你可能需要这些(开源代码,模型,数据集及算力评估)
在之前的文章《复刻Sora有多难?一张图带你读懂Sora的技术路径》,《一文看Sora技术推演》我们总结了Sora模型上用到的一些核心技术和论文,今天这篇文章我们将整理和总结现有的一些开源代码、模型、数据集,以及初步训练的算力评估,希望可以帮助到国内的创业公司和个人开发者展开更深的研究。
|
6月前
|
机器学习/深度学习 人工智能
ICML 2024:Transformer究竟如何推理?基于样例还是基于规则
【7月更文挑战第12天】ICML 2024研究表明Transformer模型在解决数学问题时倾向于基于样例而非规则的推理。通过规则遵循微调(RFFT),模型被教会遵循规则,实现从1-5位到12位加法的高精度泛化,提升40%以上。论文探讨了提升AI在数学推理上的潜力。[arxiv.org/abs/2402.17709](https://arxiv.org/abs/2402.17709)**
59 2
|
8月前
|
机器学习/深度学习 自然语言处理 计算机视觉
【大模型】小样本学习的概念及其在微调 LLM 中的应用
【5月更文挑战第5天】【大模型】小样本学习的概念及其在微调 LLM 中的应用
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型与大模型的幻觉问题
大模型与大模型的幻觉问题
|
机器学习/深度学习 编解码 自然语言处理
基于EasyCV复现ViTDet:单层特征超越FPN
ViTDet其实是恺明团队MAE和ViT-based Mask R-CNN两个工作的延续。MAE提出了ViT的无监督训练方法,而ViT-based Mask R-CNN给出了用ViT作为backbone的Mask R-CNN的训练技巧,并证明了MAE预训练对下游检测任务的重要性。而ViTDet进一步改进了一些设计,证明了ViT作为backone的检测模型可以匹敌基于FPN的backbone(如SwinT和MViT)检测模型。
|
存储 算法 搜索推荐
语义检索系统:基于无监督训练SimCSE+In-batch Negatives策略有监督训练的语义索引召回
语义检索系统:基于无监督训练SimCSE+In-batch Negatives策略有监督训练的语义索引召回
语义检索系统:基于无监督训练SimCSE+In-batch Negatives策略有监督训练的语义索引召回
|
机器学习/深度学习 自然语言处理 算法
使用PyTorch构建神经网络(详细步骤讲解+注释版) 03 模型评价与准确率提升
使用PyTorch构建神经网络(详细步骤讲解+注释版) 02-数据读取与训练 本文的使用的部分类方法为前述文章定义所得,如果希望运行完整代码建议同时查看上一篇文章或文末留言发你完整代码。
使用PyTorch构建神经网络(详细步骤讲解+注释版) 03 模型评价与准确率提升