一文看懂推荐系统:排序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)


提示:文章目录


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

四、联合训练目标函数

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

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

五、总结

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

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

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


总结

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值