DeepFM

DeepFM是一种结合因子分解机(FM)和深度神经网络(DNN)的点击率(CTR)预测模型,旨在同时捕捉低维和高维特征交叉。FM部分通过二阶特征组合学习潜在关联,DNN部分则用于学习高维特征交互。相较于Wide&Deep模型,DeepFM不需要额外的特征工程,且在效果上更优。其优势在于能够从原始特征中直接学习特征交互,降低了计算复杂度并提升了模型性能。
摘要由CSDN通过智能技术生成

 

推荐系统

  •  一般来说常规的推荐系统当中的特征分为四个部分,第一个部分是用户特征,是关于用户的一些信息。比如是男是女,是否是高收入群体,是否是高消费群体,成为平台的用户多久了,偏好平台当中什么类目的商品等等。第二个部分是商品特征,就是关于item的一些信息,比如价格、类目、折扣、评价等等。第三个部分是上下文特征,比如当前的时间,是早上还是晚上,比如item展示的位置等等。最后一个部分是用户实时的行为,比如用户在浏览这个商品之前还看过哪些其他的商品,他登陆平台多久了,等等。
  • 显然用户是否会点击某一个item是由以上这四个部分的信息共同作用的,比如给一个高富帅推兰博基尼或者是百达翡丽就是有吸引力的,给一个连听都没听说过的屌丝推同样的内容显然就屁用没有。也就是说商品的特征和用户的特征之间是存在逻辑上的关联的,我们一般称为特征的交叉。
  • 这些交叉信息往往是隐式的,也就是我们不能直接描述和形容出来的。举个简单的例子,可能并不是所有富人都喜欢奢侈品,有些可能就喜欢电子消费品,还有些可能喜欢服装或者是旅行。人的喜好是很复杂的,我们很难用固定的规则去描述。所以这就需要模型能有这样的能力去学习这些特征之间的潜在联系,对这些潜在交叉信息把握越好的模型,一般也都拥有越好的效果。
  • 比如我们分析了主流的app store市场之后发现,在饭点的时候,用户经常会下载外卖类的app,这说明了app的类别和时间之间存在交叉关系。再比如我们发现年轻的男生往往喜欢设计类游戏,这说明了app的类别与用户的性别之间也存在交叉关系。像是这样的交叉信息还有很多,从Wide & Deep模型的经验当中我们可以学到考虑低维和高维交叉特征之后,模型的效果会更好。
  • 这里面的一个关键挑战是如何高效地对特征之间的交叉信息进行建模,其中的一些比较容易理解,也比较容易做出特征来,然而大部分的交叉信息是隐式的,难以直观理解的,比如啤酒和尿布的例子就是一个,只有大数据挖掘才能发现。即使是直观上容易理解的部分,由于涉及的数量太大,也不可能通过手工来全部处理。

 

DeepFM

DeepFM是一种可以同时提升低维和高维的特征的CTR模型,它结合了FM和神经网络模型的长处,与Wide & Deep模型相比,效果更加好,并且还免去了特征工程的部分。DeepFM主要分为FM部分与DNN部分,下面详细讲解。

\large \hat y = sigmoid(y_{FM}+y_{DNN})

 

FM

FM部分其实就是因子分解机。一般线性模型无法学习到高阶组合特征,所以会将特征进行高阶组合,这里以二阶为例(理论上,FM可以组合任意高阶,但是由于计算复杂度,实际中常用二阶,后面也主要介绍二阶组合的内容)。模型形式为

y=w_0+\sum_{i=1}^{n}{w_ix_i}+\sum_{i=0}^{n}{\sum_{j=i+1}^{n}{w_{ij}x_ix_j}}

很明显,实数矩阵W是对称的,进而可以假设是半正定矩阵,所以可以根据矩阵性质,对其进行分解,得到

\large y=w_0+\sum_{i=1}^{n}{w_ix_i}+\sum_{i=0}^{d}{\sum_{j=i+1}^{d}{<v_i,v_j>x_ix_j}}

这里的一阶特征是包含连续特征与类别特征的,类别特征也通过embeding编码,但嵌入维度是1,这跟后面的二阶特征里类别特征embedding编码不同。

这里偷偷将二阶连加符号的上限改掉了,是因为这里的二阶交叉特征通常只用类别特征,而不用连续特征(我看到的代码是这样,也不知道理解的对不对🐶),这里 v_i 可以理解为Embedding的权矩阵, x_i 是类别特征进行one-hot编码之后的向量,所以 v_ix_i 就是类别特征进行one-hot编码之后又进行embedding之后得到的向量(代码中是这样写的🐶)。

根据计算,上式可以改为embedding后,在每一嵌入维度上,求各个特征向量的和的平方-平方的和,最后沿嵌入维度 f 相加。

例:有3个类别特征,嵌入维度是4,那么此时embedding之后的矩阵维度是(B,3,4)。

# tensorflow 
square_of_sum = tf.square(tf.reduce_sum(x, axis=1, keepdims=True)) # B x 1 x 4
sum_of_square = tf.reduce_sum(x * x, axis=1, keepdims=True) # B x 1 x 4 
cross_term = square_of_sum - sum_of_square # B x 1 x 4 
cross_term = 0.5 * tf.reduce_sum(cross_term, axis=2, keepdims=False) # B x 1

 

 

DNN

Deep部分就是经典的前馈网络,用来学习特征之间的高维交叉。

这里与FM共享embedding的结果,并进行多层的前馈网络,最后使用激活函数得到DNN结果,这里又一个疑惑是,根据论文的图是没有连续特征在DNN中出现的,论文中也只写了把embedding的结果喂入DNN中,显然连续特征不需要embedding,自然也就不在DNN中了,这一点不明白为什么(🐶)。

这里要注意的一点是,在一些其他DNN做CTR预估的论文当中,会使用预训练的FM模型来进行Deep部分的向量初始化。但这里的做法略有不同,它不是使用训练好的FM来进行初始化,而是和FM模型的部分共享同样的V。这样做会有两个非常重要的好处:

  1. 它可以同时学习到低维以及高维的特征交叉信息,预训练的FM来进行向量初始化得到的embedding当中可能只包含了二维交叉的信息。

  2. 这样可以避免像是Wide & Deep那样多余的特征工程。

 

DeepFM与Wide&Deep的异同

1、相同点

  • 都包括wide和deep两部分,满足并行结构深度模型的框架

  • 两者的DNN部分模型结构相同 两者的deep部分是一致的,都是DNN层

2、不同点

  • Wide&Deep模型的wide部分是高维线性模型,DeepFM的wide部分则是FM模型。

  • Wide&Deep模型的输入向量维度很大,因为wide部分的特征包括了手工提取的pair-wise特征组合,大大提高计算复杂度。DeepFM的wide和deep部分共享相同的输入,可以提高训练效率,不需要额外的特征工程,用FM建模低阶的特征组合,用DNN建模高阶的特征组合,因此可以同时从raw feature中学习到高阶和低阶的特征交互。

  • wide&deep需要做特征工程,二阶特征交叉需要靠特征工程来实现,通过wide部分发挥作用;DeepFM完全不需要做特征工程,直接输入原始特征即可,二阶特征交叉靠FM来实现,并且FM和DNN共享embedding;

  • 从试验结果来看DeepFM效果优于wide&deep。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值