Task03 召回模型:YoutubeDNN、DSSM

一、DSSM(双塔模型----召回模型)

  • DSSM-Learning Deep Structured Semantic Models for Web Search using Clickthrough Data

  • DSSM(Deep Structured Semantic Models ,深度语义模型)是2013年微软发表的一篇论文,本用于语义匹配,后被移植到推荐系统等各个场景,成为经典的双塔模型。

  • 原理:

  • DSSM双塔结构,两侧分别输入user特征和ad特征,经过DNN变换后分别产出user向量和ad向量。DSSM最大的特点是user侧和ad侧是独立的两个子网络,可以离线产出user embedding和ad embedding,召回时只需要计算二者的相似度。

  • 代码实现:

    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_featuresself.item_features = item_featuresself.temperature = temperatureself.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 = Nonedef forward(self, x):user_embedding = self.user_tower(x)item_embedding = self.item_tower(x)if self.mode == "user":return user_embeddingif 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 Noneinput_user = self.embedding(x, self.user_features, squeeze_dim=True)# user DNNuser_embedding = self.user_mlp(input_user)user_embedding = F.normalize(user_embedding, p=2, dim=1)return user_embeddingdef item_tower(self, x):if self.mode == "user":return Noneinput_item = self.embedding(x, self.item_features, squeeze_dim=True)# item DNNitem_embedding = self.item_mlp(input_item)item_embedding = F.normalize(item_embedding, p=2, dim=1)return item_embedding
    

Youtube DNN

  • [Deep Neural Networks for YouTube Recommendations](Deep Neural Networks for YouTube Recommendations)

  • 原理:

  • YouTubeDNN推荐系统架构主要是两大部分组成: 召回和排序。召回的目的是根据用户部分特征,从海量物品库中快速找到小部分用户潜在感兴趣的物品进行排序,排序模块主要是融入更多特征,使用复杂模型来做个性化推荐。

  • 当然,随着时间的发展, 可能数据量非常非常大了, 此时召回结果规模精排依然无法处理,所以现在一般还会在召回和精排之间,加一个粗排进一步筛选作为过渡, 而随着场景越来越复杂, 精排产生的结果也不是直接给到用户,而是会再后面加一个重排后处理下。

  • YouTubeDNN 召回模块:

    • 在YouTubeDNN召回模块输入的主要是用户侧信息,包括用户观看的历史video序列, 用户搜索的历史tokens, 人文特征,比如地理位置, 性别,年龄等。
    • 用户观看的历史video序列Embedding之后进行了Average Pooling**(论文中作者这里说是通过Word2Vec方法计算,但是当前主流做法是直接通过学习Embedding层),**论文里面使用了用户最近的50次观看历史,向量维度是256维。使用了用户最近50次shuffle之后搜索历史Token,打乱的目的是为了防止模型知道最后的搜索行为,从而倾向于推荐某个Token的搜索视频。
    • 在上面的YouTubeDNN召回模型图中可以看到用户侧的向量是动态可变的,图中通过将组合用户观看的历史、用户搜索tokens的历史、人文特征等的向入DNN并将输出的结果作为用户的embedding,由此可见当用户的观看历史后者搜索历史发生变化的时候用户向量也会随之改变。
    • 在上面的YouTubeDNN召回模型图中对Video侧的向量并没有太多的介绍,只是在YouTubeDNN召回模块图中的右上角说明了训练使用的是Softmax,YouTubeDNN对于Video侧向量使用的是Word2Vec即提前离线使用Word2Vec算法获取到了Video向量,在YouTubeDNN召回训练的时候直接使用,即当前Video向量与用户向量做内积然后除以所有Video向量与用户向量的内积直接累积和(这里还要按照此方式计算其他所有视频概率),如上图所示。但是由于视频的数量级过大如果每次计算都涉及到所有的Video向量就会导致训练效率低下,这种问题类似未优化的Word2Vec中问题,因此论文提出通过利用负采样的方式来提高训练效率**(这里的负采样相比Word2Vec中的负采用实现细节上有区别)。另外除了使用Word2Vec的方式获取item向量之外,还可以直接使用Embedding Layer的方式,这时YouTubeDNN模型结构就变成了双塔,因为此时的user侧item的结构一样,Embedding Layer优势在于可以引入item额外对特征信息,都是将DNN的输出结果作为最终的向量。**
  • 代码实现:

    import torch
    import torch.nn.functional as F
    from torch_rechub.basic.layers import MLP, EmbeddingLayer
    from tqdm import tqdmclass 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_featuresself.item_features = item_featuresself.neg_item_feature = neg_item_featureself.temperature = temperatureself.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 = Nonedef forward(self, x):user_embedding = self.user_tower(x)item_embedding = self.item_tower(x)if self.mode == "user":return user_embeddingif self.mode == "item":return item_embedding# 计算相似度y = torch.mul(user_embedding, item_embedding).sum(dim=2)y = y / self.temperaturereturn ydef user_tower(self, x):# 用于inference_embedding阶段if self.mode == "item":return Noneinput_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_embeddingdef item_tower(self, x):if self.mode == "user":return Nonepos_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)
    
  • 参考资料
    RecHub Wiki
    大佬笔记

Task03 召回模型:YoutubeDNN、DSSM相关推荐

  1. 推荐算法之召回模型:DSSM、YoutubeDNN

    1. DSSM 1.1 DSSM模型原理 DSSM(Deep Structured Semantic Model),由微软研究院提出,利用深度神经网络将文本表示为低维度的向量,应用于文本相似度匹配场景 ...

  2. 召回模型:DSSM双塔模型

    文章目录 DSSM(2013) DNN for Computing Semantic Features Word Hashing Youtube双塔模型(2019) Modeling Framewor ...

  3. 【推荐系统召回模型 DSSM, YoutubeDNN】

    推荐系统组队学习 Task3 召回模型 DSSM, YoutubeDNN 学习内容: 提示:这里是根据开源学习组织DataWhale提供的torch-rechub组队学习相关资料整理的,再次感谢组织和 ...

  4. 推荐系统实战4——EasyRec 搭建DSSM召回模型实现CTR点击平台

    推荐系统实战4--EasyRec 搭建DSSM召回模型实现CTR点击平台 学习前言 EasyRec仓库地址 DSSM实现思路 一.DSSM整体结构解析 二.网络结构解析 1.Embedding层的构建 ...

  5. 推荐系统-模型(一):召回模型【协同过滤类: ItemCF/UserCF】【Embedding类】【Dssm/双塔/word2vec】【图类召回算法 (Deepwalk、EGES)】

    推荐系统-召回模型:[协同过滤类: ItemCF/UserCF][Embedding类][Dssm/双塔/word2vec][图类召回算法 (Deepwalk.EGES)]

  6. 推荐系统——召回模型

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

  7. 推荐系统总结之深度召回模型(上)

    作者:一块小蛋糕 地址:https://zhuanlan.zhihu.com/p/267263561 整理:深度传送门 最近读完了李航.何向南的<Deep learning for matchi ...

  8. 推荐系统[二]:召回算法超详细讲解[召回模型演化过程、召回模型主流常见算法(DeepMF/TDM/Airbnb Embedding/Item2vec等)、召回路径简介、多路召回融合]

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排).系统架构.常见问题.算法项目实战总结.技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排 ...

  9. 【datawhale202206】pyTorch推荐系统:召回模型 DSSMYoutubeDNN

    小结 本次所涉及的模型用于推荐系统中的召回环节,该环节主要是一个embedding和筛选,本次所涉及的模型主要用于embedding过程. DSSM双塔模型是指,user和item的embedding ...

最新文章

  1. 通过实例理解 RabbitMQ 的基本概念
  2. MySQL引擎:MyIsam和Innodb的区别
  3. 图解用MySQL创建进销存数据库
  4. 爱奇艺android投屏,手机爱奇艺APP怎么将视频投屏上笔记本电脑?
  5. linux apache 2.2下载,Linux下的Apache 2.2.* SSL证书安装
  6. 触发器是不是不能喝外键同时存在_数字电路--RS触发器
  7. 打造 通用的 支持多数据库 操作的 DBHelper
  8. java问题,(x.equals(y) == true)有相同的hashCode 应该是不一定
  9. Thinking in AJAX(二) —— 基于AJAX的WEB设计
  10. 安全运维 - Linux系统攻击应急响应
  11. ssm(spring + spring-mvc + mybatis)整合
  12. javascript html coffee 编辑器,CoffeeCup HTML Editor (html编辑器)
  13. MySQL高级进阶(三)、InnoDB存储引擎详解
  14. 通过PCA算法对iris数据集进行降维处理
  15. 用AI打电话骗走22万,Python编写的软件,克隆你的语音只需5秒!
  16. CC2530——点对点通信
  17. php 输出七芒星,SongNet:硬格式控制下的文本生成
  18. AI的艺术创造力超越人类?绝不是痴人说梦
  19. 今日头条搜索排名seo怎么做?今天头条网站优化规则揭秘!
  20. MySQL--新手必备SQL基础知识、事务ACID及隔离级别

热门文章

  1. SystemVerilog 接口之采样竞争
  2. 30岁中国男人对婚姻的思考
  3. 刘泉承的程序设计笔记 第一篇 11月11日
  4. 百度笔记代发小红书引流
  5. 宋城演艺业绩同比下滑两倍:受花房科技拖累,计提超10亿元减值
  6. Java网络爬虫小案例(详细版)
  7. sed -i 单引号中嵌套双引号_【linux】Shell 单引号#x27;#x27; 双引号quot;quot; 反引号`` 和$()的区别和用法...
  8. 尝试Houdini的Maya插件
  9. [css] 使用css画文件夹icon和话筒icon
  10. 「全民k歌」有什么秘密?网站数据分析之数据获取