xDeepFM模型

  • 目标:
  • 引言:
  • xDeepFM模型介绍:
    • Compressed Interaction Network(CIN)
    • xDeepFM
    • 复杂度分析
    • Experiment
  • 产出:
  • Conclusion
  • 参考资料:

目标:

学习模型xDeepFM模型,包含我个人的一些理解。深入理解模型。结合卷积神经网络CNN理解模型原理。昨晚想了一晚上才想通,都失眠了。
微软亚洲研究院2018年提出xDeepFM模型,可以理解为对DeepFM和DCN升级版。

  • 相对于DeepFM,升级为自动构建高阶交叉特征
  • 相对于DCN,从bit级别的交叉升级vector级别的交叉特征。

缺点:

  • 计算量(时间复杂度)比前两者高。

引言:

xDeepFM模型,论文地址为:https://arxiv.org/abs/1803.05170

预测性系统,特征工程至关重要。特征工程中,挖掘交叉特征是至关重要的。交叉特征指的是两个或多个原始特征之间的交叉组合。例如,在新闻推荐场景中,一个三阶交叉特征为AND(user_organization=msra,item_category=deeplearning,time=monday_morning),它表示当前用户的工作单位为微软亚洲研究院,当前文章的类别是与深度学习相关的,并且推送时间是周一上午。

传统的推荐系统中,挖掘交叉特征主要依靠人工提取,这种做法主要有以下三种缺点:

  • 1)重要的特征都是与应用场景息息相关的,针对每一种应用场景,工程师们都需要首先花费大量时间和精力深入了解数据的规律之后才能设计、提取出高效的高阶交叉特征,因此人力成本高昂;
  • 2)原始数据中往往包含大量稀疏的特征,例如用户和物品的ID,交叉特征的维度空间是原始特征维度的乘积,因此很容易带来维度灾难的问题;–embeding技术不可少。
    3)人工提取的交叉特征无法泛化到未曾在训练样本中出现过的模式中。–不自动化。

因此自动学习特征间的交互关系是十分有意义的。目前大部分相关的研究工作是基于因子分解机的框架,利用多层全连接神经网络去自动学习特征间的高阶交互关系,例如FNN、PNN和DeepFM等。其缺点是模型学习出的是隐式的交互特征,其形式是未知的、不可控的;同时它们的特征交互是发生在元素级(bit-wise)而不是特征向量之间(vector-wise),这一点违背了因子分解机的初衷。
来自Google的团队在KDD 2017 AdKDD&TargetAD研讨会上提出了DCN模型,旨在显式(explicitly)地学习高阶特征交互,其优点是模型非常轻巧高效,但缺点是最终模型的表现形式是一种很特殊的向量扩张,同时特征交互依旧是发生在元素级(bit-wise)上。
我们用下图来回顾一下DCN的实现:


元素级(bit-wise)和特征向量(vector-wise)的意思

  • bit-wise VS vector-wise
    假设隐向量的维度为3维,如果两个特征(对应的向量分别为X1=[a1,b1,c1]X 1=[a1,b1,c1]X1=[a1,b1,c1]X2=[a2,b2,c2]X2=[a2,b2,c2]X2=[a2,b2,c2]的话)在进行交互时:

    • bit-wise 的交互,比如DCN,基本上就是把X1,X2X 1,X2X1X2直接展平,拼接层一个一维的更长的向量,具体就是[a1,b1,c1,a2,b2,c2][a1,b1,c1,a2,b2,c2][a1,b1,c1,a2,b2,c2],然后再进行特征的高阶交互时,也是基于[a1,b1,c1,a2,b2,c2][a1,b1,c1,a2,b2,c2][a1,b1,c1,a2,b2,c2]这个长向量进行的。所以叫基于位的高阶交互。
    • vector-wises是以向量为单位进行的交互,比如DeepFm就是人为的把X1,X2X 1,X2X1X2进行点积,产生如下的效果[X1T,X2T]=[[a1,b1,c1],[a2,b2,c2]][X1 ^{T},X2 ^{T}]=[[a1,b1,c1], [a2,b2,c2]][X1T,X2T]=[[a1,b1,c1],[a2,b2,c2]]
      , 如果特征交互形式类似于 f(w1∗a1∗a2,w2∗b1∗b2,w3∗c1∗c2)f(w_{1} * a_{1} * a_{2},w_{2} * b_{1} * b_{2} ,w_{3} * c_{1} * c_{2})f(w1a1a2,w2b1b2,w3c1c2)这样的效果,那么我们认为特征交互是发生在特征向量级(vector-wise)。

explicitly VS implicitly

  • 显式的特征交互和隐式的特征交互。以两个特征为例xix_{i}xixjx_{j}xj,在经过一系列变换后,我们可以表示成wi,j∗(xi∗xj)w_{i,j} * (x_{i} * x_{j})wi,j(xixj)的形式,就可以认为是显式特征交互,否则的话,是隐式的特征交互。

微软亚洲研究院社会计算组2018年提出了一种极深因子分解机模型(xDeepFM),不仅能同时以显式和隐式的方式自动学习高阶的特征交互,使特征交互发生在向量级,还兼具记忆与泛化的学习能力。是对Wide&Deep模型的升级。

xDeepFM模型介绍:

Compressed Interaction Network(CIN)

为了实现自动学习显式的高阶特征交互,同时使得交互发生在向量(vector)级上,文中首先提出了一种新的名为压缩交互网络(Compressed Interaction Network,简称CIN)的神经模型。在CIN中,隐向量是一个单元对象,因此我们将输入的原特征和神经网络中的隐层都分别组织成一个矩阵,记为X0X_{0}X0XkX_{k}Xk 。CIN中每一层的神经元都是根据前一层的隐层以及原特征向量推算而来,其计算公式如下:

其中点乘的部分计算如下:

怎么理解这个公式,特别是X0X_{0}X0的作用是啥?这里的X0X_{0}X0再乘以wHiw_{Hi}wHi得到的wHi∗X0w_{Hi}*X_{0}wHiX0可以看做是一个D∗1D*1D1维的卷积核,类比CNN模型中,我们一般采用2X2的卷积核,分别对图片进行扫描,这里也可以类似的理解。
看下卷积升级网络的操作:

类比:

这里详细详细展示了,用wHi∗X0w_{Hi}*X_{0}wHiX0当卷积核,产生最后的高阶向量。其中,X0X_{0}X0的每一列和Xk−1X_{k-1}Xk1的每一列相乘,都采用了不同的权重wHi,mw_{Hi,m}wHim,所以权重向量还是比较大的,这个可以考虑类似于CNN卷积神经网络的共享权重,进行简化好,后续在探究。
作者原文中画的图太难看懂了,这里就不贴了,还是这个哥们帮忙理解的。

CIN的宏观框架可以总结为下图:


可以看出,它的特点是:

  • 最终学习出的特征交互的阶数是由网络的层数决定的。因为每一层都是和X0X_{0}X0做卷积,所以每增加一层,就相当于X0X_{0}X0的阶数增加1。
  • 每一层隐层都通过一个池化操作连接到输出层,从而保证了输出单元可以见到不同阶数的特征交互模式。
  • 同时不难看出,CIN的结构与循环神经网络RNN是很类似的,即每一层的状态是由前一层隐层的值与一个额外的输入数据计算所得。不同的是,CIN中不同层的参数是不一样的,而在RNN中是相同的;RNN中每次额外的输入数据是不一样的,而CIN中额外的输入数据是固定的,始终是X0X_{0}X0。----RNN也能帮忙理解。

可以看到,**CIN是通过(vector-wise)**来学习特征之间的交互的,还有一个问题,就是它为什么是显式的进行学习?我们先从X1X_{1}X1 来开始看,X1X_{1}X1 的第hhh个神经元向量xh1x_{h}^{1}xh1可以表示成 :


X1X_{1}X1 可以看成是X0X_{0}X0自己跟自己做卷积。然后把mmm个向量的乘积全部相加。
进一步,X2X_{2}X2 的第hhh个神经元向量可以表示成:

最后,第k层的第h个神经元向量可以表示成:
因此,我们能够通过上面的式子对特征交互的形式进行一个很好的表示,它是显式的学习特征交叉。即对每个特征都进行了高阶的相互组合再乘积。

xDeepFM

将CIN与线性回归单元、全连接神经网络单元组合在一起,得到最终的模型并命名为极深因子分解机xDeepFM,其结构如下图:

  • 集成的CIN和DNN两个模块能够帮助模型同时以显式和隐式的方式学习高阶的特征交互
  • 集成的线性模块LR和深度神经模块DN也让模型兼具记忆与泛化的学习能力。

值得一提的是,为了提高模型的通用性,xDeepFM中不同的模块共享相同的输入数据,这点在DCN模型中已经有过讨论。至少Wide变种模型和Deep模型输入相同,可以提升模型的学习速度。
而在具体的应用场景下,其他模块可以接入各自不同的输入数据,例如,线性模块中依旧可以接入很多根据先验知识提取的交叉特征来提高记忆能力,而在CIN或者DNN中,为了减少模型的计算复杂度,可以只导入一部分非稀疏的数值特征。


复杂度分析

假设CIN和DNN每层神经元/向量个数都为HHH ,网络深度为TTT。那么CIN的参数空间复杂度为O(mTH2)O(mTH^2)O(mTH2),普通的DNN为 O(mDH+TH2)O(mDH+TH^2)O(mDH+TH2) ,CIN的空间复杂度与输入维度DDD无关,此外,如果有必要,CIN还可以对权重矩阵WWW进行 LLL 阶的矩阵分解,从而能降低空间复杂度。

CIN的时间复杂度就不容乐观了,按照上面介绍的计算方式为 O(mH2DT)O(mH^2DT)O(mH2DT) ,而DNN为 O(mDH+TH2)O(mDH+TH^2)O(mDH+TH2)时间复杂度会是CIN的一个主要痛点。

Experiment

数据集原文

  • 公开数据集 Criteo 与 微软数据集 BingNews
  • DianPing 从大众点评网整理的相关数据,收集6个月的user check-in 餐厅poi的记录,从check-in餐厅周围3km内,按照poi受欢迎度抽取餐厅poi作为负例。根据user属性、poi属性,以及user之前3家check-in的poi,预测用户check-in一家给定poi的概率。

产出:

充分理解XDeepFM模型的原理,他的近亲是:DeepFM和DCN升级版
升级:
1、 思想上,采用了DCN(Deep&Cross)模型的特征自动交叉的,得到高阶特征。
2、特征交叉方式采用了DeepFM中FM的处理方式,不再是DCN中以位为单位,进行交叉,而是以向量为单位进行交叉。
3、 模型最后还添加了一个线性模型。

Conclusion

    1. xDeepFM将基于Field的vector-wise思想引入Cross,并且保留了Cross的优势,模型结构也很elegant,实验效果也提升明显。如果说DeepFM只是“Deep & FM”,那么xDeepFm就真正做到了”Deep” Factorization Machine。
    1. xDeepFM的时间复杂度会是其工业落地的一个主要性能瓶颈,需要重点优化

参考资料:

https://www.jianshu.com/p/b4128bc79df0
https://zhuanlan.zhihu.com/p/57162373

推荐系统XDeepFM模型--DeepFM和DCN升级版相关推荐

  1. 推荐系统遇上深度学习(二十二):DeepFM升级版XDeepFM模型强势来袭!

    今天我们要学习的模型是xDeepFM模型,论文地址为:https://arxiv.org/abs/1803.05170.文中包含我个人的一些理解,如有不对的地方,欢迎大家指正!废话不多说,我们进入正题 ...

  2. 【CTR预估】 xDeepFM模型

    xDeepFM 模型看作者邮箱应该中科大.北邮.微软合作发表的,发表在kdd2018 . 看这个模型的原因是因为最近在写Deep Cross Network的时候感觉总是怪怪的,因为DCN对同一个特征 ...

  3. 【推荐实践】推荐系统中模型训练及使用流程的标准化

    文章作者:梁超 腾讯 高级工程师 编辑整理:Hoh Xil 内容来源:DataFun AI Talk 导读:本次分享的主题为推荐系统中模型训练及使用流程的标准化.在整个推荐系统中,点击率 ( CTR ...

  4. 深度学习推荐模型-DeepFM

    深度学习推荐模型-DeepFM 本文参考链接,仅供个人学习: https://github.com/datawhalechina/team-learning-rs/tree/master/DeepRe ...

  5. 推荐系统笔记(模型融合)

    思维导图: 推荐系统在技术实现上一般划分三个阶段:挖掘.召回.排序. 模型融合: 挖掘的工作就是对用户和物品做非常深入的结构化分析,对各个角度的特征都被呈现出来,并且建好索引,供召回阶段使用,大部分挖 ...

  6. 推荐系统8---FNN、DeepFM与NFM(FM在深度学习中的身影重现)

    1,前言 Wide&Deep模型开启深度学习时代的组合模型之后,后面的模型都是在Wide&Deep的基础上进行各种方式的模型组合,以应对不同的模型任务.从大的角度看,模型的改进方向主要 ...

  7. 【王喆-推荐系统】模型篇-(task7)DeepFM处理交叉特征

    学习总结 (1)DeepFM 模型在解决特征交叉问题上非常有优势,它会使用一个独特的 FM 层来专门处理特征之间的交叉问题.具体来说,就是使用点积.元素积等操作让不同特征之间进行两两组合,再把组合后的 ...

  8. [推荐系统] 手撕DeepFM模型

    一.模型总体架构图 设计动机 在Wide & Deep模型中,Wide部分是一个简单的线性模型,交叉特征需要根据经验人工去挑选组合,而FM模型,可以自动学习交叉特征,所以自然而然想到,可以用F ...

  9. XDeepFM 模型,字节跳动短视频内容理解和推荐系统

    向AI转型的程序员都关注了这个号

最新文章

  1. 你还以为,除了你自己就没有人懂你女朋友吗?
  2. SQL Server数据库大型应用解决方案总结(转载)
  3. U盘的RUNAUTO..文件的删除
  4. CentOS7下MySQL5.7的安装
  5. 【C#】CsvHelper 使用手册
  6. 使用php语言 统计字符串,php如何查询字符串长度
  7. 【chrome】插件开发-教程00(如何开发插件)
  8. memcache的安装和使用
  9. Go语言安装与环境配置(基于Windows)
  10. Metasploit Framework —— Exploit
  11. Firefox 插件 FlashGot 创建 Axel 下载任务
  12. H264和MPEG4区别
  13. Download Oracle Forms 6i
  14. 19.0~19.11 Dates, Calendars, and Events 日历事件的处理
  15. 【Java】从Java代码到网络编程,三次握手又该如何理解
  16. 功能安全之故障(fault),错误(error),失效(failure)
  17. SR、JK、T、D触发器图形逻辑符号、真值表及特性方程
  18. 利用ASP显示当前在线人数
  19. python turtle风轮绘制
  20. 1225:金银岛——贪心

热门文章

  1. mysql5.7.12 my.ini文件_MySQL5.7缺少my.ini文件的解决方法
  2. php 取出多重数组中的一列_PHP获取数组中指定的一列实例
  3. 文件存取方式是哪两种python_常用的Python存储方式有哪些?
  4. QLineEdit的readonly、disable属性的区别
  5. HTML与CSS基础之兄弟元素(六)
  6. 查看git当前tag_同学,也该学着用Git了......
  7. iOS-raywenderlich翻译-AFNetworking速成教程
  8. cfree是c语言程序的什么,用C-FREE编写的C语言程序
  9. A problem while linking c++ to python
  10. NSubstitute完全手册(一)入门基础