推荐系统(十七)双塔模型:微软DSSM模型(Deep Structured Semantic Models)

推荐系统系列博客:

  1. 推荐系统(一)推荐系统整体概览
  2. 推荐系统(二)GBDT+LR模型
  3. 推荐系统(三)Factorization Machines(FM)
  4. 推荐系统(四)Field-aware Factorization Machines(FFM)
  5. 推荐系统(五)wide&deep
  6. 推荐系统(六)Deep & Cross Network(DCN)
  7. 推荐系统(七)xDeepFM模型
  8. 推荐系统(八)FNN模型(FM+MLP=FNN)
  9. 推荐系统(九)PNN模型(Product-based Neural Networks)
  10. 推荐系统(十)DeepFM模型
  11. 推荐系统(十一)阿里深度兴趣网络(一):DIN模型(Deep Interest Network)
  12. 推荐系统(十二)阿里深度兴趣网络(二):DIEN模型(Deep Interest Evolution Network)
  13. 推荐系统(十三)阿里深度兴趣网络(三):DSIN模型(Deep Session Interest Network)
  14. 推荐系统(十四)多任务学习:阿里ESMM(完整空间多任务模型)
  15. 推荐系统(十五)多任务学习:谷歌MMoE(Multi-gate Mixture-of-Experts )
  16. 推荐系统(十六)多任务学习:腾讯PLE模型(Progressive Layered Extraction model)

写在前面:这是一篇和原论文关系不大的博客(大家如果有兴趣看原始论文,可以先看完原始论文后,再来看本博客),基本上是基于个人在工作实践中的经验以及思考写成的一篇关于DSSM的博客,先定基调:DSSM主要用在召回和粗排阶段。

DSSM全称Deep Structured Semantic Models,是伊利诺伊大学厄巴纳-香槟分校(UIUC)与微软于2013年发表在CIKM上的,盲猜是一作在微软实习时的工作,所以基本上是微软的成果。DSSM在业界搜广推的影响力目前来说是超过前面介绍的任何一个模型,基本上统治了召回/粗排阶段。值得一提的是我厂(百度)同样在2013年(那个年头的百度还处在如日中天的状态)搞了个双塔模型simnet,不过并没有发表相应的论文,具体可以参见:百度NLP | 神经网络语义匹配技术,这也符合百度一向喜欢掖着藏着的风格。

这篇博客将会从以下几个方面进行介绍DSSM:

  1. 推荐中DSSM双塔模型结构
  2. DSSM用于召回
    2.1. DSSM召回离线训练
    2.2. DSSM召回在线infer
  3. DSSM用于粗排
  4. 总结

一、推荐中DSSM双塔模型结构

这里直接上一个我画的图,相比较原始论文,这个图更能表示在推荐领域中的DSSM结构,如下图所示:

图1. 推荐领域常用DSSM模型结构

模型结果非常简单,主要包括两部分:user侧一个塔,item侧一个塔。user侧特征和item侧特征分别经过各自的DNN(一般情况下,两个DNN结构是一样的,当然也可以不一样)后得到user embedding和item embedding,这里需要注意的是如果你的user dnn和item dnn结构不一样,请无比保证输出维度一样,也就是最后一层全连接层隐藏单元个数相同,需要保证user embedding和item embedding的维度相同,因为下一步要做相似度计算(常用内积或者cosine)。损失函数部分则是常用的二分类交叉熵损失,y_true为真实label 0或者1,y_pred为相似度结果。

对于有经验的常年沉溺于挖特征(99%推荐/广告算法工程师的现状)的老司机,应该可以一年就看出DSSM模型的缺点:无法使用user#item的交叉特征。 这个问题我们在后面再探讨。

二、DSSM用于召回

现在工业界的推荐系统的召回阶段基本上多路召回,比如CF召回、CB召回、语义向量召回等,可参见我关于推荐系统的第一篇博客:推荐系统(一)推荐系统整体概览,DSSM召回也是语义向量召回的一种,先来看离线部分如何训练DSSM模型。

2.1、DSSM召回离线训练

DSSM离线训练和普通的DNN训练并没有什么大的区别,只是需要把特征分为user侧特征和item侧特征,并且无法使用user-item的交叉特征。 在之前博客里,我曾提到过:如果精排是特征的艺术,那么召回就是样本的艺术。对于DSSM召回的样本,正样本没什么好说的,就是用户点击的item,那么对于负样本呢?对于没什么经验的算法工程师,最常见的错误就是负样本直接用曝光未点击的item。这会直接导致SSB问题,即样本选择偏差问题(sample selection bias),原因很简单,召回在线的时候是从全量候选item中召回,而不是从有曝光的item中召回。 这里,就引申出了一个学问非常大的topic:负样本为王,如何构造负样本?

先说DSSM原始论文里的做法,只有正样本,记为D+D^+D+,对于用户u1u_1u1,其正样本就是其点击过的item,负样本则是随机从D+D^+D+(不包含u1u_1u1点击过的item)中随机选择4个item作为负样本。

召回负样本构造是一门学问,常见的负样本构造方法有(摘自张俊林大佬文章,SENet双塔模型:在推荐领域召回粗排的应用及其它,关于负样本构造方法总结的非常棒):

  1. 曝光未点击数据
    导致Sample Selection Bias问题的原因。我们的经验是,这个数据还是需要的,只是要和其它类型的负例选择方法,按照一定比例进行混合,来缓解Sample Selection Bias问题。当然,有些结论貌似是不用这个数据,所以用还是不用,可能跟应用场景有关。
  2. 全局随机选择负例
    就是说在原始的全局物料库里,随机抽取做为召回或者粗排的负例。这也是一种做法,Youtube DNN双塔模型就是这么做的。从道理上讲,这个肯定是完全符合输入数据的分布一致性的,但是,一般这么选择的负例,因为和正例差异太大,导致模型太好区分正例和负例,所以模型能学到多少知识是成问题的。
  3. Batch内随机选择负例
    训练的时候,在Batch内,选择除了正例之外的其它Item,做为负例。这个本质上是:给定用户,在所有其它用户的正例里进行随机选择,构造负例。它在一定程度上,也可以解决Sample Selection Bias问题。比如Google的双塔召回模型,就是用的这种负例方法。
  4. 曝光数据随机选择负例
    在给所有用户曝光的数据里,随机选择做为负例。这个我们测试过,在某些场景下是有效的。
  5. 基于Popularity随机选择负例
    全局随机选择,但是越是流行的Item,越大概率会被选择作为负例。目前不少研究证明了,负例采取Popularity-based方法,对于效果有明显的正面影响。它隐含的假设是:如果一个例子越流行,那么它没有被用户点过看过,说明更大概率,对当前的用户来说,它是一个真实的负例。同时,这种方法还会打压流行Item,增加模型个性化程度。
  6. 基于Hard选择负例
    它是选择那些比较难的例子,做为负例。因为难区分的例子,很明显给模型带来的loss和信息含量比价多,所以从道理上讲是很合理的。但是怎样算是难的例子,可能有不同的做法,有些还跟应用有关。比如Airbnb,还有不少工作,都是在想办法筛选Hard负例上。

他在新浪微博的实践经验(直接copy大佬原话):以上是几种常见的在召回和粗排阶段选择负例的做法。我们在模型召回阶段的经验是:比如在19年年中左右,我们尝试过选择1+选择3的混合方法,就是一定比例的“曝光未点击”和一定比例的类似Batch内随机的方法构造负例,当时在FM召回取得了明显的效果提升。但是在后面做双塔模型的时候,貌似这种方法又未能做出明显效果。

2.2、 DSSM召回在线infer

提到召回必然面对一个问题:如何在全量候选item中选出用户最喜欢的topX个,也就必然涉及到效率问题。离线训练尚可不太考虑效率问题,当然训练时间越短模型更新越及时,则更好,但对训练时间的容忍度相对较高。但在线infer时对耗时有着严格的要求,效率就必须是首先要面对的问题。DSSM之所以能够在工业界这么流行,就是因为其双塔结构能够做到非常好的解耦,即训练好后user侧塔和item侧塔完全没关系,没有依赖关系。

因为百度在AI算法这一块还是有不错的技术积累,因此有一套非常成熟好用的基建,从日志收集传输、特征抽取框架、模型训练部署框架、embedding向量存储、在线infer等非常齐全。所以我们在线部署DSSM的时候选择了比较奢侈的方法:item侧塔和user侧塔都部署到线上,有个server会每间隔几个小时就请求item塔,计算出全量item的embedding向量,然后存储更新。当每个用户请求到达时,会请求user塔计算出user的embedding向量,然后拿着这个user向量去做item库里做ANN检索选出相似度最大的topX个ietm。关于ANN检索技术比较有很多,比如:kd树、Annoy、HNSW等,Facebook开源了ANN库FAISS,国内很多公司在用,百度则有自己的一套ANN检索框架。

看到这里,你应该已经明白为什么DSSM无法使用user#item的交叉特征了。

三、DSSM用于粗排

DSSM也可以用于粗排,整体上和召回差不多。区别点有以下几个方面:

  1. 在线infer时候选集不同: 召回时是整个item池子,粗排时则是多路召回后的候选item。
  2. 训练样本不一样: 为了发扬精排干啥粗排干啥的精神,在我们自己的实践中,负样本用的和精排一样,都是曝光未点击的item。

如果召回的DSSM模型和粗排的DSSM模型,在特征、样本都一样的情况下,则DSSM召回的item大部分都会被粗排排出去,注意这里是大部分,从我们的实践中大概有一半的会被排出去,至于为什么没有全部都被排出去,原因应该是数据中存在multi-view,即使特征、样本、网络结构都一样,只要参数初始化是随机的,网络最终也会学到不同的view。

四、总结

DSSM因为其双塔能够解耦的特点迅速在业界得到了广泛的应用,当然其也存在一些缺点,比如:

  1. user侧和item侧特征无法交叉,有一些工作尝试了一些解决方案,比如:新浪微博张俊林尝试了SENet,美团发表了论文 A Dual Augmented Two-tower Model for Online Large-scale
    Recommendation
  2. 我们自己在实践中发现,DSSM召回的内容单一性比较严重,大多数都是同类别的,不知道有没有其他小伙伴遇到,可以贴出解决方案。

参考文献

[1]: Huang P S , He X , Gao J , et al. Learning deep structured semantic models for web search using clickthrough data[C]// Proceedings of the 22nd ACM international conference on Conference on information & knowledge management. ACM, 2013.

推荐系统(十七)双塔模型:微软DSSM模型(Deep Structured Semantic Models)相关推荐

  1. DSSM(DEEP STRUCTURED SEMANTIC MODELS)

    Huang, Po-Sen, et al. "Learning deep structured semantic models for web search using clickthrou ...

  2. DSSMs: Deep Structured Semantic Models

    Attention! 我的Dr.Sure项目正式上线了,主旨在分享学习Tensorflow以及DeepLearning中的一些想法.期间随时更新我的论文心得以及想法. Github地址:https:/ ...

  3. 论文翻译1-----DSSM:Deep Structured Semantic Models

    说明: 论文全部名称:Learning Deep Structured Semantic Models for Web Search using Clickthrough Data 论文中文全称:使用 ...

  4. Learning Deep Structured Semantic Models for Web Search using Clickthrough Data (DSSM)

    主要研究问题: 给定一个查询(query)和一组文档(document),返回一个排序(ranking),系统根据查询所对应文档的契合度高低排序. 论文主要结构: 一.Abstract 1.基于关键词 ...

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

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

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

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

  7. 【深度学习】DSSM模型介绍(1)

    DSSM (Deep Structured Semantic Models)用于文本相似度匹配场景,是为了平衡搜索的关键词,和被点击的文本标题之间的相关性. 论文地址:https://www.micr ...

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

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

  9. 推荐系统的发展演进历史和模型的目标及优缺点

    推荐系统发展历程 梳理推荐系统的模型进化历程,明白模型改进了什么,有什么缺点.做到心中有一副big picture,才能明白未来模型的趋势. 文章目录 推荐系统发展历程 前言 一.模型进化历程 二.常 ...

最新文章

  1. 【Qt】Qt5在ubuntu16.04无法输入中文解决方式
  2. 软考数据流图设计大观
  3. hash table(开放寻址法-线性探查实现的哈希表)
  4. 【教程分享】Jmeter入门教程
  5. Java 并发(生产者/消费者 模式)
  6. 【转】21世纪律师办公自动化的一个调查
  7. SpringBoot--实战开发--整合SSL
  8. CentOS7与CentOS6区别及特点
  9. 2022谷粒学院BUG记录
  10. 有MIMIC数据却不知道从何开始?从DIAGNOSES_ICD表开始(五)
  11. ApacheCN 活动汇总 2019.8.16
  12. 教你用GoldWave进行基础的混音准备
  13. html5 边框效果图,图片边框border-image的用法
  14. arm板配置ssh服务
  15. matlab的死区环节,基于SIMULINK对非线性系统死区环节进行仿真
  16. AI作画的人机战争走向何方?
  17. dockerexec 的使用-it操作
  18. Studing Git
  19. 基金入门-基金的分类
  20. //多线程龟兔赛跑问题,乌龟和兔子比赛跑200米的距离,//名叫兔子的线程每执行一次兔子就向前跑5米,每跑50米休息10毫秒,//名叫乌龟的线程每执行一次乌龟就向前跑1米,乌龟会一直跑不休息/

热门文章

  1. CentOS系统命令自动补全方法
  2. Ubuntu安装docker报错:Package ‘docker-ce‘ has no installation candidate
  3. Tomcat环境变量的配置
  4. 【2021牛客寒假第五场】C-比武招亲(下)欧拉降幂+多项式求逆预处理伯努利数计算等幂求和
  5. 为什么你要做国外调查问卷?
  6. [UE]初学入门1——灯光切换、烟雾显示切换、循环打印、For循环、While循环、为Array数组添加变量、宏、接触物体产生爆炸、
  7. c语言整数间以1个空格隔开,C语言:用for循环语句编程输出1—20之间的所有整数,两数之间以空格分隔...
  8. 下载安装Spring
  9. 1046-最小时间差
  10. mysql时间戳diff函数_「timestampdiff」MySQL函数---TIMESTAMPDIFF - seo实验室