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

  在计算广告中,CTR是非常重要的一环。对于特征组合来说,业界通用的做法主要有两大类:FM系列和Tree系列。这里我们来介绍一下FM系列。
  在传统的线性模型中,每个特征都是独立的,如果需要考虑特征与特征之间的相互作用,可能需要人工对特征进行交叉组合。非线性SVM可以对特征进行核变换,但是在特征高度稀疏的情况下,并不能很好的进行学习。现在有很多分解模型可以学习到特征之间的交互隐藏关系,基本上每个模型都只适用于特定的输入和场景。推荐系统是一个高度系数的数据场景,由此产生了FM系列算法。
  本文主要涉及三种FM系列算法:FM,FFM,DeepFM

一、FM算法(Factorization Machines)

背景

FM(Factorization Machine)主要是为了解决数据稀疏的情况下,特征怎样组合的问题。已一个广告分类的问题为例,根据用户与广告位的一些特征,来预测用户是否会点击广告。数据如下:


这里写图片描述

对于ctr点击的分类预测中,有些特征是分类变量,一般进行one-hot编码,以下是对组合特征的one-hot:


这里写图片描述

one-hot会带来数据的稀疏性,使得特征空间变大。

另外,对于普通的线性模型,我们将各个特征独立考虑,并没有考虑特征与特征之间的关系,因此有很多方法对特征进行组合,数据模型上表达特征xi,xj的组合用xixj表示,即所说的多项式模型,通常情况下只考虑两阶多项式模型,也就是特征两两组合的问题,模型表达如下:

y=w0+i=1nwixi+i=1n1j=i+1nwijxixjy=w0+∑i=1nwixi+∑i=1n−1∑j=i+1nwijxixj

其中n表示样本的特征数量,这里的特征是离散化后的特征。与线性模型相比,FM的模型多了后面的特征组合的部分。

FM求解

Wij求解的思路是通过矩阵分解的方法,为了求解Wij,我们队每一个特征分量xi引入辅助向量Vi=(vi1,vi2,...,vik)Vi=(vi1,vi2,...,vik)


这里写图片描述

然后用vivTjvivjT进行求解


这里写图片描述

从上式可以看出二项式的参数数量由原来的n(n1)2n(n−1)2求出交叉项,具体过程如下:


这里写图片描述

FM的复杂度为O(kn2)O(kn2)有关的等式。因此,FM可以在线性时间对新样本做出预测,复杂度和LR模型一样,且效果提升不少。
在训练FM是,加入使用SGD来优化模型,训练时各个参数的梯度如下:


这里写图片描述

nj=1vj,fxj∑j=1nvj,fxj时计算每个参数梯度的复杂度是O(1),更新每个参数的复杂度为O(1),因此训练FM模型的复杂度也是O(kn)

扩展到多维,模型表达式为:


这里写图片描述

FM vs SVM

SVM和FM的主要区别在于:

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

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

参考:
1. https://blog.csdn.net/jiangjiang_jian/article/details/80631180
2. https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf
3.https://www.csie.ntu.edu.tw/~b97053/paper/Factorization%20Machines%20with%20libFM.pdf
3. https://blog.csdn.net/tiangcs/article/details/76601643?locationNum=9&fps=1
4. https://www.cnblogs.com/AndyJee/p/7879765.html

二、FFM算法(Field-aware Factorization Machine)

在CTR预估中,通常会遇到one-hot类型的变量,会导致数据特征的稀疏。未解决这个问题,FFM在FM的基础上进一步改进,在模型中引入类别的概念,即field。将同一个field的特征单独进行one-hot,因此在FFM中,每一维特征都会针对其他特征的每个field,分别学习一个隐变量,该隐变量不仅与特征相关,也与field相关。
假设样本的n个特征属于f个field,那么FFM的二次项有nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。FM可以看做FFM的特例,把所有特征都归属到一个field的FFM模型。其模型方程为:

y(X)=w0+i=1nwixi+i=1nj=i+1n<Vi,fj,Vj,fi>xixjy(X)=w0+∑i=1nwixi+∑i=1n∑j=i+1n<Vi,fj,Vj,fi>xixj

如果隐向量的长度为k,那么FFM的二次参数有nfk个,远多于FM模型的nk个。

FFM实现

  • 损失函数
    FFM将问题定义为分类问题,使用的是logistic loss,同时加入正则项

    minwi=1Llog(1+exp(yiϕ(w,xi)))+λ2||w||2minw∑i=1Llog(1+exp(−yiϕ(w,xi)))+λ2||w||2

  • 梯度下降
    梯度下降方法有很多种,根据为提高效率分别衍生了批量梯度下降,随机梯度下降及小批量梯度下降,根据需求选择即可

FFM应用

在DSP或者推荐场景中,FFM主要用来评估站内的CTR和CVR,即一个用户对一个商品的潜在点击率和点击后的转化率。
CTR和CVR预估模型都是在线下训练,然后线上预测。两个模型采用的特征大同小异,主要分三类:

  • 用户相关的特征
    年龄、性别、职业、兴趣、品类偏好、浏览/购买品类等基本信息,以及用户近期点击量/购买量/消费额等统计信息

  • 商品相关的特征
    商品所属品类、销量、价格、评分、历史CTR/CVR等信息

  • 用户-商品匹配特征
    浏览/购买品类匹配、浏览/购买商家匹配、兴趣偏好匹配等

为了使用FFM方法,所有的特征必须转换成“field_id:feat_id:value”格式,field_id代表特征所属field的编号,feat_id是特征编号,value是特征的值。数值型的特征比较容易处理,只需分配单独的field编号,如用户评论得分、商品的历史CTR/CVR等。categorical特征需要经过One-Hot编码成数值型,编码产生的所有特征同属于一个field,而特征的值只能是0或1,如用户的性别、年龄段,商品的品类id等。除此之外,还有第三类特征,如用户浏览/购买品类,有多个品类id且用一个数值衡量用户浏览或购买每个品类商品的数量。这类特征按照categorical特征处理,不同的只是特征的值不是0或1,而是代表用户浏览或购买数量的数值。按前述方法得到field_id之后,再对转换后特征顺序编号,得到feat_id,特征的值也可以按照之前的方法获得。
【举例说明】

- 原始数据:


这里写图片描述

  • 特征编号:


    这里写图片描述

  • 特征组合:


    这里写图片描述

在训练FFM的过程中,有许多小细节值得特别关注。

  • 样本归一化:FFM默认是进行样本数据的归一化,即 为真;若此参数设置为假,很容易造成数据inf溢出,进而引起梯度计算的nan错误。因此,样本层面的数据是推荐进行归一化的。
  • 特征归一化:CTR/CVR模型采用了多种类型的源特征,包括数值型和categorical类型等。但是,categorical类编码后的特征取值只有0或1,较大的数值型特征会造成样本归一化后categorical类生成特征的值非常小,没有区分性。例如,一条用户-商品记录,用户为“男”性,商品的销量是5000个(假设其它特征的值为零),那么归一化后特征“sex=male”(性别为男)的值略小于0.0002,而“volume”(销量)的值近似为1。特征“sex=male”在这个样本中的作用几乎可以忽略不计,这是相当不合理的。因此,将源数值型特征的值归一化到 是非常必要的。
  • 省略零值特征:从FFM模型的表达式可以看出,零值特征对模型完全没有贡献。包含零值特征的一次项和组合项均为零,对于训练模型参数或者目标值预估是没有作用的。因此,可以省去零值特征,提高FFM模型训练和预测的速度,这也是稀疏样本采用FFM的显著优势。

参考:
1. https://www.jianshu.com/p/781cde3d5f3d
2. https://blog.csdn.net/u012102306/article/details/51322194

三、DeepFM

FM通过对于每一位特征的隐变量内积来提取特征组合,最后的结果也不错,虽然理论上FM可以对高阶特征组合进行建模,但实际上因为计算复杂度原因,一般都只用到了二阶特征组合。对于告诫特征组合来说,我们很自然想到多层神经网络DNN。

FM的结构


这里写图片描述

DNN结构


这里写图片描述

DeepFM结构

FM和DNN的特征结合


这里写图片描述

DeepFM目的是同时学习低阶和高阶的特征交叉,主要由FM和DNN两部分组成,底部共享同样的输入。模型可以表示为:

y^=sigmoid(yFM+yDNN)y^=sigmoid(yFM+yDNN)

FM部分
原理如上,数学表达为

yFM=<w,x>+i=1dj=i+1d<Vi,Vj>xixjyFM=<w,x>+∑i=1d∑j=i+1d<Vi,Vj>xi⋅xj

Deep部分
深度部分是一个前馈神经网络,与图像或语音类的输入不同,CTR的输入一般是极其稀疏的,因此需要重新设计网络结构。在第一层隐藏层之前,引入一个嵌入层来完成输入向量压缩到低位稠密向量:


这里写图片描述

嵌入层的结构如上图所示,有两个有趣的特性:
1) 尽管不同field的输入长度不同,但是embedding之后向量的长度均为k
2) 在FM中得到的隐变量VikVik现在作为嵌入层网络的权重

嵌入层的输出为a(0)=[e1,e2,...,em]a(0)=[e1,e2,...,em]
|H|为隐藏层层数

模型对比

有学者将DeepFM与当前流行的应用于CTR的神经网络做了对比


这里写图片描述

从预训练,特征维度以及特征工程的角度进行对比,发现


这里写图片描述

从实验效果来看,DeepFM的效果较好


这里写图片描述

参考:
1. https://arxiv.org/pdf/1703.04247.pdf
2. https://www.jianshu.com/p/6f1c2643d31b
3. https://blog.csdn.net/zynash2/article/details/79348540
4. https://blog.csdn.net/zynash2/article/details/79360195

实践参考:https://blog.csdn.net/john_xyz/article/details/78933253

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树层序遍历

层序遍历序列为&#xff1a;ABCDEFG 思路&#xff1a;栈是先进后出的数据结构&#xff0c;而队列是先进先出的数据结构。 我们层序遍历&#xff0c;很明显&#xff0c;先遇到的节点先打印&#xff0c;不同于前中后序遍历&#xff0c;我们采用队列结构。 具体执行过程如下&…

深度学习(01)-- 基础学习

文章目录目录1. 深度学习基础1.1 深度学习总览1.2 深度网络训练过程1.2.1 传统神经网络的训练方法为什么不能用在深度神经网络1.2.2 deep learning训练过程1.3 数学知识&#xff1a;2. 九种深度学习模型2.1 受限玻尔兹曼机RBM2.2 自编码器AE&#xff08;降维&#xff09;2.3 深…

MachineLearning(1)-激活函数sigmoid、损失函数MSE、CrossEntropyLoss

损失函数1.激活函数2.损失函数2.1均方误差损失函数2.2交叉熵损失函数2.3 NLLLoss()2.4 BCELoss()1.激活函数 全连接网络又叫多层感知器&#xff0c;多层感知器的基本单元神经元是模仿人类神经元兴奋与抑制机制&#xff0c;对其输入进行加权求和&#xff0c;若超过某一阈值则该…

Java的IO总结

非流式文件类--File类 从定义看&#xff0c;File类是Object的直接子类&#xff0c;同时它继承了Comparable接口可以进行数组的排序。 File类的操作包括文件的创建、删除、重命名、得到路径、创建时间等&#xff0c;以下是文件操作常用的函数。 File类是对文件系统中文件以及文…

深度学习(02)-- ANN学习

文章目录目录1.神经网络知识概览1.1深度学习顶会1.2相关比赛1.3神经网络知识概览1.4神经网络编程一般实现过程2.简单神经网络ANN2.1 数据集&#xff1a;2.2 网络结构&#xff1a;2.3 代码实现2.3.1 读取数据&#xff0c;并做处理2.3.2 构建网络结构2.3.3 训练网络目录 1.神经网…

python(11)-if语句,断言assert

分支语句if1.if基本语法2 if语句的嵌套3 比较运算符号4 逻辑运算符&#xff1a;5 整数随机数初应用6 tip7.断言assert1.if基本语法 if语句开发中的应用场景&#xff1a;如果条件成立做一件事情&#xff0c;如果条件不成立做另外一件事情。有了if语句&#xff0c;程序有了分支.…

深度学习(03)-- CNN学习

文章目录目录1.CNN学习2.Keras深度学习框架目录 1.CNN学习 卷积神经网络CNN总结 从神经网络到卷积神经网络&#xff08;CNN&#xff09;我们知道神经网络的结构是这样的&#xff1a; 那卷积神经网络跟它是什么关系呢&#xff1f;其实卷积神经网络依旧是层级网络&#xff0c;…

PaperNotes(1)-Modeling the World from Internet Photo Collections

从网络图片集对世界进行建模AbstractIntroduction2 Previous Work2.1特征匹配2.2 稀疏重建2.3 基于图像建模2.4 基于图像的渲染2.5 图像浏览&#xff0c;检索和注释3 Overview概述4 Reconstructing Cameras and Sparse Geometry&#xff08;相机标定与稀疏重建&#xff09;4.1K…

深度学习(04)-- 典型CNN结构(LeNet5 ,AlexNet)

LeNet5 LeNet5可以说是最早的卷积神经网络了&#xff0c;它发表于1998年&#xff0c;论文原文Gradient-Based Learning Applied to Doucment Recognition作者是Yann Le Cun等。下面对LeNet5网络架构进行简单的说明&#xff0c;有兴趣的同学可以去参考原文&#xff0c;论文原文…

CNN的几种经典模型

本文主要介绍一下CNN的几种经典模型比较。之前自己也用过AlexNet和GoogleNet&#xff0c;网络上关于各种模型的介绍更是形形色色&#xff0c;自己就想着整理一下&#xff0c;以备自己以后查阅方便 LeNet5 先放一张图&#xff0c;我感觉凡是对深度学习有涉猎的人&#xff0c;对…

PaperNotes(2)-Generative Adversarial Net-代码实现资料

Generative Adversarial Nets-生成对抗网络Abstract1.Introduction2.Related work3.Adversarial nets4.Theoretical Results4.1全局最优 pgpdatap_gp_{data}pg​pdata​4.2算法1的收敛性质5.Experiments6.Advantagesa and disadvantages7.Conclusions and future work8.GAN-代码…

深度学习(05)--典型CNN结构(VGG13,16,19)

文章目录目录1.VGG结构2.VGG结构解释3.3*3卷积核的优点4.VGG的muti-scale方法5.VGG的应用目录 1.VGG结构  LeNet5用大的卷积核来获取图像的相似特征  AlexNet用99、1111的滤波器  VGG 巨大的进展是通过依次采用多个 33 卷积&#xff0c;模仿出更大的感受野&#xff08;r…

redis——发布和订阅

频道的订阅和退订 当一个客户端执行 SUBSCRIBE 命令&#xff0c; 订阅某个或某些频道的时候&#xff0c; 这个客户端与被订阅频道之间就建立起了一种订阅关系。 Redis 将所有频道的订阅关系都保存在服务器状态的 pubsub_channels 字典里面&#xff0c; 这个字典的键是某个被订…

redis——事务

Redis 事务可以一次执行多个命令&#xff0c; 并且带有以下三个重要的保证&#xff1a; 批量操作在发送 EXEC 命令前被放入队列缓存。收到 EXEC 命令后进入事务执行&#xff0c;事务中任意命令执行失败&#xff0c;其余的命令依然被执行。在事务执行过程&#xff0c;其他客户端…

深度学习(06)-- Network in Network(NIN)

文章目录目录1.NIN 结构2.MLP卷积3.全局均值池化4.总体网络架构5.NIN补充5.1 广义线性模型&#xff08;GLM&#xff09;的局限性5.2 CCCP层5.3 1*1卷积核作用&#xff08;补充&#xff09;6.手势识别RGB图像--NIN结构目录 1.NIN 结构 2.MLP卷积 传统CNN的局部感受野窗口的运算…

Pytorch(2)-tensor常用操作

tensor常用数学操作1. 随机数1.1 torch.rand() - 均匀分布数字1.2 torch.randn() - 正态分布数字2. 求和2.1 torch.sum(data, dim)2.2 numpy.sum(data, axis)3. 求积3.1 点乘--对应位置相乘3.2 矩阵乘法4. 均值、方差4.1 torch tensor.mean() .std()4.2 numpy array.mean() .st…

深度学习(07)-- 经典CNN网络结构(Inception (v1-v4))

文章目录目录1.Inception介绍1.1 Inception结构1.2 Inception V1(GoogleNet)1.3 Inception V2(Batch Norm)1.4 Inception V3&#xff08;Factorization&#xff09;1.5 Inception V4&#xff08;ResNet&#xff09;1.5 Inception v1~v4 总结1.6 Inception进阶2.Inception实现目…

Python(13)-函数,lambda语句

函数1 函数定义2 函数调用3 函数注释文档4 函数参数4.1 参数列表,默认参数,任意参数4.1.1 无缺省值参数4.1.2&#xff08;部分&#xff09;缺省值参数4.1.3 数量不定形参数4.2 可变对象和不可变对象4.3 作用域4.3.1 globals()函数4.3.2 global 声明变量为全局变量5 函数返回值5…

深度学习(08)-- Residual Network (ResNet)

文章目录目录1.残差网络基础1.1基本概念1.2VGG19、ResNet34结构图1.3 梯度弥散和网络退化1.4 残差块变体1.5 ResNet模型变体1.6 Residual Network补充1.7 1*1卷积核&#xff08;补充&#xff09;2.残差网络介绍&#xff08;何凯明&#xff09;3.ResNet-50(Ng)3.1 非常深的神经网…

redis——命令请求的执行过程

发送命令请求 当用户在客户端中键入一个命令请求时&#xff0c; 客户端会将这个命令请求转换成协议格式&#xff0c; 然后通过连接到服务器的套接字&#xff0c; 将协议格式的命令请求发送给服务器。 读取命令请求 当客户端与服务器之间的连接套接字因为客户端的写入而变得可…