DeepFM

文章目录

  • DeepFM
    • 之前的模型的缺点和局限
      • 线性模型的局限性
      • 多项式模型的问题
      • DNN的局限性
      • FM(因子分解机)
      • FFM
      • FNN & PNN
      • Wide & Deep
    • DeepFM 的结构和原理
      • FM Layer
      • Deep
    • Deep FM模型的优点
    • 思考题
      • 如果对于FM采用随机梯度下降SGD训练模型参数,请写出模型各个参数的梯度和FM参数训练的复杂度。
      • 对于下图所示,根据你的理解Sparse Feature中的不同颜色节点分别表示什么意思
      • SVM与FM的区别

参考:
论文原文
FM、FFM、DeepFM学习笔记
CTR论文精读(七)–DeepFM
FM系列算法解读(FM+FFM+DeepFM)

CTR预估是目前推荐系统的核心技术,其目标是预估用户点击推荐内容的概率。在CTR预估任务中,用户行为的隐式low-order和high-order特征都起到十分重要。有些特征是易于理解的,可以通过领域专家进行人工特征工程抽取特征。但是对于不易于理解的特征,如“啤酒和尿布”,则只能通过机器学习的方法得到。同样的对于需要特别巨量特征的模型,人工特征工程也是难以接受的。所以特征的自动学习显的十分重要。

CTR预估数据特点:

  1. 输入中包含类别型和连续型数据。类别型数据需要one-hot,连续型数据可以先离散化再one-hot,也可以直接保留原值
  2. 维度非常高
  3. 数据非常稀疏
  4. 特征按照Field分组

之前的模型的缺点和局限

线性模型的局限性

线性模型的优点是简单、方便、易于求解,但缺点在于线性模型中假设不同特征之间是独立的,特征之间不会相互影响。

对于CTR问题,被证明的最有效的提升任务表现的策略是特征组合(Feature Interaction), 在CTR问题的探究历史上来看就是如何更好地学习特征组合,进而更加精确地描述数据的特点。可以说这是基础推荐模型到深度学习推荐模型遵循的一个主要的思想。而组合特征大牛们研究过组合二阶特征,三阶甚至更高阶,但是面临一个问题就是随着阶数的提升,复杂度就成几何倍的升高。这样即使模型的表现更好了,但是推荐系统在实时性的要求也不能满足了。所以很多模型的出现都是为了解决另外一个更加深入的问题:如何更高效的学习特征组合?

多项式模型的问题

为了解决简单线性模型无法学得特征间交叉影响的问题,SVM通过引入核函数来实现特征的交叉,实际上和多项式模型是一样的,这里以只考虑两个特征交叉的二阶多项式模型为例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uJCNpSPv-1616221167091)(media/16161447753552/v2-aad7a160bc93e9c413002b25a9184555_1440w.jpg.png)]
多项式模型的问题在于二阶项的参数过多,设特征维数为n,那么二阶项的参数数目为n(n+1)/2n(n+1)/2n(n+1)/2。对于广告点击率预估问题,由于存在大量id特征,导致n可能为10710^7107维,这样一来,模型参数的量级为101410^{14}1014,这比样本量4∗1074*10^74107多得多!这导致只有极少数的二阶组合模式才能在样本中找到,而绝大多数模式在样本中找不到,因而模型无法学出对应的权重,参数学习失败。也正是这个缘故,我们实际使用SVM时所用到的核函数都是预先定义好的,而非在训练过程中学习得到。

而且组合后的特征不会都有效,实际上大部分都是无效的。

DNN的局限性

当我们使用DNN网络解决推荐问题的时候存在网络参数过于庞大的问题,这是因为在进行特征处理的时候我们需要使用one-hot编码来处理离散特征,这会导致输入的维度猛增。为了解决DNN参数量过大的局限性,可以采用非常经典的Field思想,将OneHot特征转换为Dense Vector,此时通过增加全连接层就可以实现高阶的特征组合。但是仍然缺少低阶的特征组合。

为了解决上述问题,出现了FM(Factorization Machines,因子分解机)和FFM来优化。并且在这个时候科学家们已经发现了DNN在特征组合方面的优势。结合FM和DNN,有并行和串行两种方式。在DeepFM之前所以出现了FNN和PNN等使用深度网络的模型,虽然在影响力上可能并不如DeepFM.

FM(因子分解机)

FM(Factorization Machine)主要是为了解决数据稀疏的情况下,特征怎样组合的问题。FM于2010年被提出,想法是对wijw_{ij}wij解耦,通过学习得到每一个特征的隐向量因子。这样,在需要特征组合时,可以拿出各自的隐因子向量做点积,即可得到两个特征向量的组合特征的权重了。

为了降低上述模型中习得参数的难度,我们很容易想到,可以对二阶项参数施加某种限制,减少模型参数的自由度。FM 施加的限制是要求二阶项系数矩阵是低秩的,能够分解为低秩矩阵的乘积:

以上所讨论的都是只考虑两个特征交叉的情况,若扩展到考虑三个特征交叉的情况,则FM模型方程的第三项变为:

目前FM的学习算法主要包括以下三种:

  • 随机梯度下降法(Stochastic Gradient Descent, SGD)
  • 交替最小二乘法(Alternating Least Square Method,ALS)
  • 马尔科夫链蒙特卡罗法(Markov Chain Monte Carlo,MCMC)

FM模型不单可以建模1阶特征,还可以通过隐向量点积的方法高效的获得2阶特征表示,即使交叉特征在数据集中非常稀疏甚至是从来没出现过。这也是FM的优势所在。

从上式可以看出二项式的参数数量由原来的n(n−1)/2n(n−1)/2n(n1)/2个减少为nk个,远少于多项式模型的参数数量。另外,参数因子化使得xhxix_h x_ixhxi的参数和xhxjx_h x_jxhxj的参数不再相互独立,因为有了xhx_hxh特征关联。因此我们可以在样本系数的情况下相对合理地估计FM的二次项参数。具体来说,xhxix_h x_ixhxixhxjx_h x_jxhxj的系数分别为<vh,vi><v_h,v_i><vh,vi>, <vh,vj><v_h,v_j><vh,vj>, 它们之间的共同项viv_ivi,因此所有包含xix_ixi的非零组合特征的样本都可以用来学习隐向量viv_ivi,很大程度上避免了数据稀疏性造成的影响。

FFM

FFM(Field Factorization Machine)是在FM的基础上引入了“场(Field)”(可以理解成类别)的概念而形成的新模型。它的提出是为了解决在CTR预估中,通常会遇到的one-hot类型的变量导致的数据特征的稀疏。将同一个field的特征单独进行one-hot(可以理解成把一组one-hot变量划为一个field),因此在FFM中,每一维特征都会针对其他特征的每个field,分别学习一个隐变量,该隐变量不仅与特征相关,也与field相关。

在FM中计算特征xix_ixi与其他特征的交叉影响时,使用的都是同一个隐向量ViV_iVi。而FFM将特征按照事先的规则分为多个场(Field),特征xix_ixi属于某个特定的场f。每个特征将被映射为多个隐向量Vi,f1,Vi,f2,⋯,Vi,ff,V_{i,f_1},V_{i,f_2},\cdots,V_{i,f_f},Vi,f1,Vi,f2,,Vi,ff,,每个隐向量对应一个场。当两个特征xixjx_i x_jxixj组合时,用对方对应的场对应的隐向量做内积。

假设样本的n个特征属于f个field,那么FFM的二次项有nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。FM可以看做FFM的特例,把所有特征都归属到一个field的FFM模型。其模型方程为:
y(X)=w0+∑i=1nwixi+∑i=1n∑j=i+1n<Vi,fj,Vj,fi>xixjy(X) = w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n <V_{i,f_j},V_{j,f_i}> x_i x_jy(X)=w0+i=1nwixi+i=1nj=i+1n<Vi,fj,Vj,fi>xixj

如果隐向量的长度为k,那么FFM的二次参数有nfk个,远多于FM模型的nk个。
FFM 由于引入了场,使得每两组特征交叉的隐向量都是独立的,可以取得更好的组合效果, FM 可以看做只有一个场的FFM。

FNN & PNN

FNN是使用预训练好的FM模块,得到隐向量,然后把隐向量作为DNN的输入,但是经过实验进一步发现,在Embedding layer和hidden layer1之间增加一个product层(如上图所示)可以提高模型的表现,所以提出了PNN,使用product layer替换FM预训练层。

Wide & Deep

FNN和PNN模型仍然有一个比较明显的尚未解决的缺点:对于低阶组合特征学习到的比较少,这一点主要是由于FM和DNN的串行方式导致的,也就是虽然FM学到了低阶特征组合,但是DNN的全连接结构导致低阶特征并不能在DNN的输出端较好的表现。看来我们已经找到问题了,将串行方式改进为并行方式能比较好的解决这个问题。于是Google提出了Wide&Deep模型。

仍存在的问题:

  1. 但是在实际的使用中Wide Module中的部分需要较为精巧的特征工程,换句话说人工处理对于模型的效果具有比较大的影响;
  2. 在输出阶段直接将低阶和高阶特征进行组合,很容易让模型最终偏向学习到低阶或者高阶的特征,而不能做到很好的结合。

DeepFM 的结构和原理

前面的Field和Embedding处理是和前面的方法是相同的,如上图中的绿色部分;Deep FM将Wide部分替换为了FM layer,如上图中的蓝色部分。

可以看到,整个模型大体分为两部分:FM(左边)和DNN(右边)。模型大概的流程如下:

  1. 首先利用embedding得到Dense Embeddings的输出。
  2. 将Dense Embeddings的结果作为左边FM模块和右边DNN模块的输入。通过一定方式组合后,模型左边FM模块的输出完全模拟出了FM的效果,而右边的DNN模块则学到了比FM模块更加高阶的特征交叉。
  3. 最后将DNN和FM的结果组合后激活输出。

FM Layer

FM Layer是由一阶特征和二阶特征Concatenate到一起在经过一个Sigmoid得到logits,所以在实现的时候需要单独考虑linear部分和FM交叉特征部分。
y^FM(x)=w0+∑i=1Nwixi+∑i=1N∑j=i+1NviTvjxixj\hat{y}_{FM}(x) = w_0+\sum_{i=1}^N w_ix_i + \sum_{i=1}^N \sum_{j=i+1}^N v_i^T v_j x_ix_j y^FM(x)=w0+i=1Nwixi+i=1Nj=i+1NviTvjxixj

注意在FM Layer中有内积操作,一般来讲内积衡量的是两个向量的相似度。

Deep

Deep Module是为了学习高阶的特征组合,在上图中使用用全连接的方式将Dense Embedding输入到Hidden Layer,这里面Dense Embeddings就是为了解决DNN中的参数爆炸问题,这也是推荐模型中常用的处理方法。Embedding层的输出是将所有id类特征对应的embedding向量concat到到一起输入到DNN中。

Deep FM模型的优点

Deep FM模型包含FM和DNN两部分,FM模型可以抽取low-order特征,DNN可以抽取high-order特征。

  1. 无需Wide&Deep模型人工特征工程。
  2. 由于输入仅为原始特征,而且FM和DNN共享输入向量特征,DeepFM模型训练速度很快。
  3. 在Benchmark数据集和商业数据集上,DeepFM效果超过目前所有模型。

思考题

如果对于FM采用随机梯度下降SGD训练模型参数,请写出模型各个参数的梯度和FM参数训练的复杂度。

参考FM系列算法解读(FM+FFM+DeepFM)

FM的时间复杂度为O(kn2)O(kn^2)O(kn2),通过上述等式,FM的二次项化简为只与vi,fv_{i,f}vi,f有关的等式。因此,FM可以在线性时间对新样本做出预测,复杂度和LR模型一样,且效果提升不少。

在训练FM时,加入使用SGD来优化模型,训练时各个参数的梯度如下:

∑j=1nvj,fxj\sum_{j=1}^nv_{j,f}x_jj=1nvj,fxj只与f有关,只要求出一次所有的f元素,就能够计算出所有vi,fv_{i,f}vi,f的梯度,而f是矩阵V中的元素,计算复杂度为O(kn)。当已知∑j=1nvj,fxj\sum_{j=1}^nv_{j,f}x_jj=1nvj,fxj时计算每个参数梯度的复杂度是O(1),更新每个参数的复杂度为O(1),因此训练FM模型的复杂度也是O(kn).

对于下图所示,根据你的理解Sparse Feature中的不同颜色节点分别表示什么意思

从论文原文的解释来看:

  • 蓝色节点是经过one-hot后为0的节点;
  • 橘色节点是经过one-hot后为1的节点。
    这里的每个field的存在就是为了处理one-hot特征的,one-hot特征当然表示在每个field里只有一个数值1,其余均为数值0.

SVM与FM的区别

  • SVM的二元特征交叉参数是独立的,而FM的二元特征交叉参数是两个k维的向量vi、vj,交叉参数就不是独立的,而是相互影响的。
  • FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行
  • FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量

为什么线性SVM在和多项式SVM在稀疏条件下效果会比较差呢?

  • 线性svm只有一维特征,不能挖掘深层次的组合特征在实际预测中并没有很好的表现;
  • 多项式svn正如前面提到的,交叉的多个特征需要在训练集上共现才能被学习到,否则该对应的参数就为0,这样对于测试集上的case而言这样的特征就失去了意义,因此在稀疏条件下,SVM表现并不能让人满意;
  • 而FM不一样,通过向量化的交叉,可以学习到不同特征之间的交互,进行提取到更深层次的抽象意义。

深度推荐模型 - DeepFM相关推荐

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

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

  2. 【组队学习】【23期】Datawhale深度推荐模型

    深度推荐模型 开源内容:https://github.com/datawhalechina/team-learning-rs/tree/master/DeepRecommendationModel 基 ...

  3. 手搭深度推荐模型(四) NFM

    本文是笔者参与datawhale组织的深度推荐模型组队学习的分享,学习内容见本链接 ,本文中所指的教程即该链接中的相应文件. 一.概念 为了在稀疏条件下有更好的预测性能,2017年何向南教授等人在SI ...

  4. 深度推荐模型之NFM模型

    NFM 背景 今天学习深度推荐模型中的NFM(Neural Factorization Machines)模型,该模型是由2017年在SIGIR会议上提出的.CTR预估中,为了解决稀疏特征的问题,学者 ...

  5. 谷歌引入自动网络设计,高效解决大规模深度推荐模型的特征嵌入问题

    来源 | 深度传送门(ID:gh_5faae7b50fc5) 导读:本文主要介绍Google在大规模深度推荐模型上关于特征嵌入的最新论文. 一.背景 大部分的深度学习模型主要包含如下的两大模块:输入模 ...

  6. Google最新论文:大规模深度推荐模型的特征嵌入问题有解了!

    转载自深度传送门(ID: gh_5faae7b50fc5) 导读:本文主要介绍下Google在大规模深度推荐模型上关于特征嵌入的最新论文. 一.背景 大部分的深度学习模型主要包含如下的两大模块:输入模 ...

  7. 深度推荐模型(EDRMs):面向Web级应用的基于二进制码的Hash Embedding

    猜你喜欢 0.如果你想参与进元宇宙,究竟应该采取怎样的策略?1.如何搭建一套个性化推荐系统?2.从零开始搭建创业公司后台技术栈3.全民K歌推荐系统架构.算法及后台设计4.微博推荐算法实践与机器学习平台 ...

  8. RS笔记:深度推荐模型之多任务学习PLE模型 [RecSys 2020 最佳论文 腾讯]

    RS笔记:深度推荐模型之多任务学习ESMM模型(多目标优化模型,同时优化CTR和CVR) [SIGIR 2018 阿里妈妈] RS笔记:深度推荐模型之多任务学习MMoE模型 [KDD 2018 谷歌] ...

  9. 深度推荐模型-DIN

    DIN 1.背景     Deep Interest Network(DIIN)是2018年阿里巴巴提出来的模型,该模型基于业务的观察,从实际应用的角度进行改进,相比于之前很多"学术风&qu ...

最新文章

  1. SSL剥离工具sslstrip
  2. Tensorflow【实战Google深度学习框架】—TensorBoard
  3. c语言100以内加减乘除,一百以内的加减乘除法游戏....
  4. 计算机优化英语,英语对计算机专业的重要性及如何提高英语水平
  5. ffmpeg 命令_Qt音视频开发11-ffmpeg常用命令
  6. 5G同步信号(PSS/SSS)及其时频资源
  7. java wait 参数_Java Object wait()方法
  8. Python用20行代码实现完整邮件功能 [完整代码+建议收藏]
  9. 安卓获取res下的资源文件:string字符串、color颜色、dimen尺寸、array数组、drawable图片和xml、anim/animator动画、raw媒体、assets资源
  10. 关于Ext checkboxfiled 获取值为 on的解决办法
  11. nodejs项目实例医生预约平台宠物医院预约挂号网
  12. 微信jssdk开发 java_Java微信公众平台开发(十一)--微信JSSDK中Config配置
  13. android 用gridview,Android GridView的使用
  14. 那些精贵的文献资源下载网址经验总结
  15. 【二】网络空间安全综述
  16. SVG格式转json文件
  17. Struts2的学习 主要是知识点和基础知识
  18. 云原生究竟怎么落地?
  19. 在JavaScript实现基于原型的继承
  20. 李宏毅——一天搞懂深度学习PPT学习笔记

热门文章

  1. 封装API的一种方式,和解决跨越问题
  2. android脚本删除app,安卓删除系统垃圾软件,无需Root
  3. Python - 爬虫 - Xpath定位之starts-with()和string()函数的简单使用
  4. 网格布局中 justify-items 和 align-litems
  5. ######好好好######职场新人,如何快速学习并做好PPT?
  6. 一个靠摆地摊为生的女博客
  7. 【hihocoder 1628】K-Dimensional Foil(线性代数)
  8. AI智慧工地视频融合平台EasyCVR视频调阅模块一键播放功能优化
  9. java facets_按ggplot(facets)中的因子绘制的多个图
  10. java 孩子节点所有_树的孩子-兄弟结点存储之Java实现