码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 一文看懂推荐系统:经典双塔模型:微软DSSM模型(Deep Structured Semantic Models),无特征交互,后来美团改进了


    一文看懂推荐系统:经典双塔模型:微软DSSM模型(Deep Structured Semantic Models),无特征交互,后来美团改进了

    提示:最近系统性地学习推荐系统的课程。我们以小红书的场景为例,讲工业界的推荐系统。
    我只讲工业界实际有用的技术。说实话,工业界的技术远远领先学术界,在公开渠道看到的书、论文跟工业界的实践有很大的gap,
    看书学不到推荐系统的关键技术。
    看书学不到推荐系统的关键技术。
    看书学不到推荐系统的关键技术。

    王树森娓娓道来**《小红书的推荐系统》**
    GitHub资料连接:http://wangshusen.github.io/
    B站视频合集:https://space.bilibili.com/1369507485/channel/seriesdetail?sid=2249610

    基础知识:
    【1】一文看懂推荐系统:概要01:推荐系统的基本概念
    【2】一文看懂推荐系统:概要02:推荐系统的链路,从召回粗排,到精排,到重排,最终推荐展示给用户
    【3】一文看懂推荐系统:召回01:基于物品的协同过滤(ItemCF),item-based Collaboration Filter的核心思想与推荐过程
    【4】一文看懂推荐系统:召回02:Swing 模型,和itemCF很相似,区别在于计算相似度的方法不一样
    【5】一文看懂推荐系统:召回03:基于用户的协同过滤(UserCF),要计算用户之间的相似度
    【6】一文看懂推荐系统:召回04:离散特征处理,one-hot编码和embedding特征嵌入
    【7】一文看懂推荐系统:召回05:矩阵补充、最近邻查找,工业界基本不用了,但是有助于理解双塔模型
    【8】一文看懂推荐系统:召回06:双塔模型——模型结构、训练方法,召回模型是后期融合特征,排序模型是前期融合特征
    【9】一文看懂推荐系统:召回07:双塔模型——正负样本的选择,召回的目的是区分感兴趣和不感兴趣的,精排是区分感兴趣和非常感兴趣的
    【10】一文看懂推荐系统:召回08:双塔模型——线上服务需要离线存物品向量、模型更新分为全量更新和增量更新
    【11】一文看懂推荐系统:召回09:地理位置召回、作者召回、缓存召回
    【12】一文看懂推荐系统:排序01:多目标模型
    【13】一文看懂推荐系统:排序02:Multi-gate Mixture-of-Experts (MMoE)
    【14】一文看懂推荐系统:排序03:预估分数融合
    【15】一文看懂推荐系统:排序04:视频播放建模
    【16】一文看懂推荐系统:排序05:排序模型的特征
    【17】一文看懂推荐系统:排序06:粗排三塔模型,性能介于双塔模型和精排模型之间
    【18】一文看懂推荐系统:特征交叉01:Factorized Machine (FM) 因式分解机
    【19】一文看懂推荐系统:物品冷启01:优化目标 & 评价指标
    【20】一文看懂推荐系统:物品冷启02:简单的召回通道
    【21】一文看懂推荐系统:物品冷启03:聚类召回
    【22】一文看懂推荐系统:物品冷启04:Look-Alike 召回,Look-Alike人群扩散
    【23】一文看懂推荐系统:物品冷启05:流量调控
    【24】一文看懂推荐系统:物品冷启06:冷启的AB测试
    【25】推荐系统最经典的 排序模型 有哪些?你了解多少?
    【26】一文看懂推荐系统:排序07:GBDT+LR模型
    【27】一文看懂推荐系统:排序08:Factorization Machines(FM)因子分解机,一个特殊的案例就是MF,矩阵分解为uv的乘积
    【28】一文看懂推荐系统:排序09:Field-aware Factorization Machines(FFM),从FM改进来的,效果不咋地
    【29】一文看懂推荐系统:排序10:wide&deep模型,wide就是LR负责记忆,deep负责高阶特征交叉而泛化
    【30】一文看懂推荐系统:排序11:Deep & Cross Network(DCN)
    【31】一文看懂推荐系统:排序12:xDeepFM模型,并不是对DeepFM的改进,而是对DCN的改进哦
    【32】一文看懂推荐系统:排序13:FNN模型(FM+MLP=FNN),与PNN同属上海交大张楠的作品

    【33】一文看懂推荐系统:排序14:PNN模型(Product-based Neural Networks),和FNN一个作者,干掉FM,加上LR+Product
    【34】一文看懂推荐系统:排序15:DeepFM模型(Factorization-Machine),xDeepFM可不是对DeepFM的改编哦,而是对DCN的改编


    提示:文章目录

    文章目录

    • 一文看懂推荐系统:经典双塔模型:微软DSSM模型(Deep Structured Semantic Models),无特征交互,后来美团改进了
    • 前言
    • 一、推荐中DSSM双塔模型结构
    • 二、DSSM用于召回
      • 2.1、DSSM召回离线训练
      • 曝光未点击数据【适用于排序】
    • 全局随机选择负例【适用于召回】
      • Batch内随机选择负例【很少】
    • 曝光数据随机选择负例【困难负样本了】
      • 基于Popularity随机选择负例
      • 基于Hard选择负例【排序】
    • 2.2、 DSSM召回在线infer
    • 三、DSSM用于粗排
    • 四、总结
    • 总结


    前言

    写在前面:这是一篇和原论文关系不大的博客
    (大家如果有兴趣看原始论文,可以先看完原始论文后,再来看本博客),

    基本上是基于个人在工作实践中的经验以及思考写成的一篇关于DSSM的博客,

    先定基调:DSSM主要用在召回和粗排阶段。

    DSSM全称Deep Structured Semantic Models,
    是伊利诺伊大学厄巴纳-香槟分校(UIUC)与微软于2013年发表在CIKM上的,
    盲猜是一作在微软实习时的工作,所以基本上是微软的成果。

    DSSM在业界搜广推的影响力目前来说是超过前面介绍的任何一个模型,
    基本上统治了召回/粗排阶段。

    值得一提的是我厂(百度)同样在2013年(那个年头的百度还处在如日中天的状态)
    搞了个双塔模型simnet,不过并没有发表相应的论文,

    具体可以参见:百度NLP | 神经网络语义匹配技术,这也符合百度一向喜欢掖着藏着的风格。

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

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

    就是典型的双塔模型呗,我之前花费了太多心思将双塔模型的
    看上面文章【0】–【10】


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

    这里直接上一个我画的图,相比较原始论文,
    这个图更能表示在推荐领域中的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召回、语义向量召回等,

    可参见我关于推荐系统的第博客:【1】–【10】

    DSSM召回也是语义向量召回(双塔模型)的一种,先来看离线部分如何训练DSSM模型。

    2.1、DSSM召回离线训练

    DSSM离线训练和普通的DNN训练并没有什么大的区别,
    只是需要把特征分为user侧特征和item侧特征,
    并且无法使用user-item的交叉特征。

    在之前博客里,我曾提到过:
    如果精排是特征的艺术,那么召回就是样本的艺术。

    对于DSSM召回的样本,正样本没什么好说的,就是用户点击的item,
    那么对于负样本呢?

    对于没什么经验的算法工程师,最常见的错误就是负样本直接用曝光未点击的item。
    这会直接导致SSB问题,即样本选择偏差问题(sample selection bias),
    原因很简单,召回在线的时候是从全量候选item中召回,而不是从有曝光的item中召回。
    【这块的知识我已经在博客【9】里面透彻想过这个问题的,你不妨去看看】

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

    曝光未点击数据【适用于排序】

    导致Sample Selection Bias问题的原因。
    我们的经验是,这个数据还是需要的,只是要和其它类型的负例选择方法,
    按照一定比例进行混合,来缓解Sample Selection Bias问题。
    当然,有些结论貌似是不用这个数据,所以用还是不用,可能跟应用场景有关。

    全局随机选择负例【适用于召回】

    就是说在原始的全局物料库里,随机抽取做为召回或者粗排的负例。
    这也是一种做法,Youtube DNN双塔模型就是这么做的。

    从道理上讲,这个肯定是完全符合输入数据的分布一致性的,
    但是,一般这么选择的负例,因为和正例差异太大,导致模型太好区分正例和负例,
    所以模型能学到多少知识是成问题的。

    Batch内随机选择负例【很少】

    训练的时候,在Batch内,选择除了正例之外的其它Item,做为负例。
    这个本质上是:给定用户,在所有其它用户的正例里进行随机选择,构造负例。
    它在一定程度上,也可以解决Sample Selection Bias问题。
    比如Google的双塔召回模型,就是用的这种负例方法。

    曝光数据随机选择负例【困难负样本了】

    在给所有用户曝光的数据里,随机选择做为负例。这个我们测试过,在某些场景下是有效的。

    基于Popularity随机选择负例

    全局随机选择,但是越是流行的Item,越大概率会被选择作为负例。【避免过热的东西影响】
    目前不少研究证明了,负例采取Popularity-based方法,对于效果有明显的正面影响。
    它隐含的假设是:如果一个例子越流行,那么它没有被用户点过看过,
    说明更大概率,对当前的用户来说,它是一个真实的负例。
    同时,这种方法还会打压流行Item,增加模型个性化程度。

    基于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等,【最近邻我在上面的博客里面也说过,你看看【7】】
    Facebook开源了ANN库FAISS,国内很多公司在用,百度则有自己的一套ANN检索框架。

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

    三、DSSM用于粗排

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

    在线infer时候选集不同: 召回时是整个item池子,粗排时则是多路召回后的候选item。

    训练样本不一样: 为了发扬精排干啥粗排干啥的精神,
    在我们自己的实践中,负样本用的和精排一样,都是曝光未点击的item。

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

    四、总结

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

    user侧和item侧特征无法交叉,有一些工作尝试了一些解决方案,
    比如:新浪微博张俊林尝试了SENet,
    美团发表了论文 A Dual Augmented Two-tower Model for Online Large-scale Recommendation
    【下一篇博客我可以考虑讲一下它】

    我们自己在实践中发现,DSSM召回的内容单一性比较严重,大多数都是同类别的,
    不知道有没有其他小伙伴遇到,可以贴出解决方案。


    总结

    提示:如何系统地学习推荐系统,本系列文章可以帮到你

    (1)找工作投简历的话,你要将招聘单位的岗位需求和你的研究方向和工作内容对应起来,这样才能契合公司招聘需求,否则它直接把简历给你挂了
    (2)你到底是要进公司做推荐系统方向?还是纯cv方向?还是NLP方向?还是语音方向?还是深度学习机器学习技术中台?还是硬件?还是前端开发?后端开发?测试开发?产品?人力?行政?这些你不可能啥都会,你需要找准一个方向,自己有积累,才能去投递,否则面试官跟你聊什么呢?
    (3)今日推荐系统学习经验:典型的双塔模型

  • 相关阅读:
    10.11 校招 实习 内推 面经
    LVDS转换芯片,GM8284C数据手册!!!!
    CentOS 常见命令详解
    idea注释代码三种方式
    list-watch集群调度
    中英文说明书丨艾美捷Actin聚合检测试剂盒的原理和应用
    css预处理是什么?作用是什么?
    Werkzeug的Map
    中国石油大学(北京)-《 油层物理》第三阶段在线作业
    YOLO-NAS详细教程-实现图像分割
  • 原文地址:https://blog.csdn.net/weixin_46838716/article/details/126566077
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号