码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 一文看懂推荐系统:排序12:xDeepFM模型,并不是对DeepFM的改进,而是对DCN的改进哦


    一文看懂推荐系统:排序12:xDeepFM模型,并不是对DeepFM的改进,而是对DCN的改进哦

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


    提示:文章目录

    文章目录

    • 一文看懂推荐系统:排序12:xDeepFM模型,并不是对DeepFM的改进,而是对DCN的改进哦
    • xDeepFM模型
      • 一、论文动机
    • 二、xDeepFM模型整体结构
    • 三、xDeepFM中CIN网络结构
    • 3.4 代码实现
    • 四、联合训练目标函数
    • 五、总结
    • 总结


    xDeepFM模型

    这篇文章是中科大、北邮和微软合作发表在KDD’18上的文章,
    从论文写作手法上来看充满了浓浓的学院风。
    言归正传,乍一看论文标题xDeepFM还以为是对DeepFM的改进,

    实际上不是,

    xDeepFM是对上一篇博客中介绍的DCN(deep&cross network)的改进【上面30】,

    这也是为什么这篇博客会介绍xDeepFM的原因。

    本篇博客将会从一下几个方面来介绍xDeepFM:

    论文动机
    xDeepFM模型整体结构
    xDeepFM中CIN网络结构
    联合训练目标函数
    总结

    在这里插入图片描述

    一、论文动机

    这篇文章diss的一个重点就是DCN网络中cross network部分,
    因此,个人强烈建议在看xDeepFM之前,请先移步去本人的上一篇博客看看DCN。

    我们先来看看xDeepFM给出的论据:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二、xDeepFM模型整体结构

    关于xDeepFM的整天网络结构,如下图所示(图片直接摘自原论文):
    在这里插入图片描述
    从上图可以看出,xDeepFM依然延续了wide&deep,

    DCN这种混合网络结构模式,
    左手画个xxx网络用于构造高阶交叉特征,
    右手画个普通DNN用于学习隐式的交叉特征,

    最终一起联合训练。

    xDeepFM这里包含三部分:
    普通的线性部分、
    CIN部分用于构造高阶交叉特征、
    普通的DNN部分用于学习隐式特征。

    这里核心部分显然在于CIN结果,本篇博客会重点讲解这个部分。

    三、xDeepFM中CIN网络结构

    CIN全称Compressed Interaction Network,我们照着论文中给出的图逐一讲解,先上图:

    在这里插入图片描述
    3.1 图(a)
    在这里插入图片描述
    老复杂了………………
    在这里插入图片描述
    3.2 图(b)
    在这里插入图片描述
    最后得到的是D宽度的向量,将m个向量做乘点积
    在这里插入图片描述
    3.3 图(c)
    在这里插入图片描述
    在这里插入图片描述

    3.4 代码实现

    paddle官方给出的cin部分的实现代码为(我增加了tensor的维度注释,方便大家理解):

        def forward(self, feat_embeddings):
            # [shape=[5, 39, 9]]
            Xs = [feat_embeddings]
            last_s = self.num_field
            # layer_sizes_cin=[128, 32]
            # cnn_layers= [Conv2D(1521, 128, kernel_size=[1, 1], data_format=NCHW), 
            # Conv2D(4992, 32, kernel_size=[1, 1], data_format=NCHW)]
            for s, _conv in zip(self.layer_sizes_cin, self.cnn_layers):
                # 做外积,对应图(a)
                # Tensor(shape=[5, 9, 39, 1])
                X_0 = paddle.reshape(
                    # shape=[5,9,39]
                    x=paddle.transpose(Xs[0], [0, 2, 1]),
                    shape=[-1, self.sparse_feature_dim, self.num_field,
                           1])  # None, embedding_size, num_field, 1
                # shape=[5, 9, 1, 39]
                X_k = paddle.reshape(
                    x=paddle.transpose(Xs[-1], [0, 2, 1]),
                    shape=[-1, self.sparse_feature_dim, 1,
                           last_s])  # None, embedding_size, 1, last_s
                # shape=[5, 9, 39, 39]
                Z_k_1 = paddle.matmul(
                    x=X_0, y=X_k)  # None, embedding_size, num_field, last_s
                # 卷积操作,对应图(b)
                # compresses Z^(k+1) to X^(k+1)
                # shape=[5, 9, 1521]
                Z_k_1 = paddle.reshape(
                    x=Z_k_1,
                    shape=[-1, self.sparse_feature_dim, last_s * self.num_field
                           ])  # None, embedding_size, last_s*num_field
                # shape=[5, 1521, 9]
                Z_k_1 = paddle.transpose(
                    Z_k_1, [0, 2, 1])  # None, s*num_field, embedding_size
                # shape=[5, 1521, 1, 9]
                Z_k_1 = paddle.reshape(
                    x=Z_k_1,
                    shape=[
                        -1, last_s * self.num_field, 1, self.sparse_feature_dim
                    ]
                )  # None, last_s*num_field, 1, embedding_size  (None, channal_in, h, w)
                # shape=[5, 128, 1, 9]
                X_k_1 = _conv(Z_k_1)
                # shape=[5, 128, 9]
                X_k_1 = paddle.reshape(
                    x=X_k_1,
                    shape=[-1, s,
                           self.sparse_feature_dim])  # None, s, embedding_size
                #X_k_1 = m(X_k_1)
                Xs.append(X_k_1)
                last_s = s
            # 池化,图(c)
            # sum pooling
            # Xs-->Tensor(shape=[5, 39, 9]), Tensor(shape=[5, 128, 9]), Tensor(shape=[5, 32, 9]]
            # shape=[5, 160, 9]
            y_cin = paddle.concat(
                x=Xs[1:], axis=1)  # None, (num_field++), embedding_size
            # shape=[5, 160]
            y_cin = paddle.sum(x=y_cin, axis=-1)  # None, (num_field++)i
            tmp_sum = sum(self.layer_sizes_cin)
            # shape=[5, 1]
            y_cin = self.cin_linear(y_cin)
            # shape=[5, 1]
            return y_cin
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    四、联合训练目标函数

    xDeepFM整体包含三部分:
    线性部分、CIN部分、DNN部分。

    论文给出了联合训练的交叉熵损失函数:
    在这里插入图片描述

    五、总结

    个人认为xDeepFM参数量较大,计算复杂度应该相对较高,
    在真实的场景下性能可能会成为一个问题。

    至于效果,在不同的数据集下与其他模型可能会呈现出不同的结果,
    例如DCN V2论文里给出的实验结果,
    xDeepFM在AUC指标上在一些数据集上效果还不如DCN。

    有兴趣的可以直接去看DCN V2这篇论文的实验比较部分,DCN V2论文地址:DCN V2。


    总结

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

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

  • 相关阅读:
    13SpringMVC中拦截器的配置(拦截规则)和多个拦截器的preHandle,postHandle执行顺序原理详解
    静态模板编译:提高Web性能的利器
    C++变量与基本类型
    Django框架的电商商城的设计与实现python语言
    Hadoop基础学习---5、MapReduce概述和WordCount实操(本地运行和集群运行)、Hadoop序列化
    BSN专网+医疗保险:MediConCen与BSN达成战略合作,提升理赔效率
    手动模拟 calico 网络
    【SpringCloud学习笔记】RabbitMQ(中)
    正则表达式
    springboot毕设项目4S店车辆管理系统4n9r4(java+VUE+Mybatis+Maven+Mysql)
  • 原文地址:https://blog.csdn.net/weixin_46838716/article/details/126560803
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号