推荐系统中特征交叉模型之——DeepWide/DeepFM/NFM

前言

上篇文章中我们引入了推荐系统中特征交叉的概念,以及介绍了一些常见的特征交叉方法,这篇文章我们将详细地讨论一下推荐系统中特征交叉地模型,他们的特点,以及他们为什么会这样。本文中介绍的模型有Wide & Deep,deepFM,NFM,以及AFM和相应地拓展。

Wide & Deep
在这里插入图片描述
首先附上Wide&deep的模型结构,看起来很简单,左边时一个线性模型,右边时一个DNN模型。该模型采用线性部分提升模型的记忆能力,同时采用DNN部分提升模型的泛化能力。

与DNN部分相比,Wide部分更是这个模型的核心。它是一个使用L1正则化的FTLR模型,该模型之前被广泛地应用于推荐系统中,主要的一个特点就是稀疏化,模型的特征都是0,1。同时采用L1正则化训练,可以将最后参数W中0的取值尽可能地多(关于逻辑回归中L1正则,L2正则中w参数地变化大家应该都了解吧)。第二个特点就是特征高度交叉,交叉的方式与我上篇文章中第一种交叉方式相同。
与wide部分的结构相比,wide部分采用的特征也十分重要,谷歌在这篇论文中wide部分的特征是怎么选取的呢?下面这张图片是谷歌在他们系统中使用的模型(以谷歌商店APP推荐为例):在这里插入图片描述
左边是DNN部分,其中**User Installed App(用户已经安装APP)Impression App(曝光APP)**产生的Cross Product Transformation就是wide部分(这里其实还是有点误导,大家可以认为曝光APP其实就是我们常说的target app(即目标item)。在训练过程中,如果target后来被安装了,那么label为1,没有被安装则label为0)。Cross Product Transformation其实就是将用户已经安装的app和待预测的app进行交叉。由于app的数量很多,交叉起来会直接爆炸,因此采用了FTLR来过滤一些稀疏特征。

为了防止大家对交叉和训练的方式有疑惑,我这里详细介绍一下:
假如FTLR中只有app交叉特征,app总数量为26个(用A-Z表示),那么FTLR中W的维度为676(26x26)。如果某个用户已经安装的app为(A,B),待预测的app为(E),那么交叉得到的特征为(A&E,B&E)两个特征,这时候我们找出这两个特征对应的w进行梯度下降。模型训练完成后我们只需要保存每个特征(676维)和对应的w值。线上通过特征交叉我们可以得分相应的特征,直接取w进行相加就可以得到wide侧的值了(或许再加上一个sigmoid)。

总结与展望:wide&deep在DNN的基础上引入了wide侧进行联合优化,在DNN的高拟合基础上增加了模型的记忆能力。wide侧的模型是一个使用L1正则化的FTLR模型,主要用于记忆用户已安装app和target app之间的关联。

看完这个wide侧之后,我想了又想,虎躯一震,觉得将FTLR变为DNN不就是YoutubeDNN的核心部分吗,都是通过挖掘用户已经产生行为的item和target Item之间的关联来优化目标,只是者采用了相对古老的FTLR,一种采用了相对比较新的embedding。

DeepFM

如果说选择一个深度模型做推荐的话,DeepFM真的就是强烈推荐了。话不多说,我们直接看DeepFM的模型结构。
在这里插入图片描述
模型左侧是FM,模型右侧是DNN。FM模型的结构很简单,我在之前的文章也介绍过了,大家感兴趣的话可以看:。除了这个模型优美的结构之外,还有一些有意思的地方。
我之前在脉脉上看到一个问题:**deepFM和wide&deep模型中DNN模块有什么不一样的地方。**这个问题看的我虎躯一震。之前根本没有注意到这个问题。其实就我的感觉其实这里涉及一个DNN模型的转化,目前推荐模型中现在很少会直接将连续值输入到模型中(直接category类的一直是one-hot)。
上图的wide&deep模型将用户的年纪,安装的App数量等特征直接输入到了模型之中(可能经过归一化),但是DeepFM模型中所有Field都进行了embedding,目前我所接触到的推荐模型中,也全都是将数值型进行了embedding。举个例子,用户年龄0-100,我们可以划为[0-7,7-14,14-19,19-25,25-35,35-50,50-60,60-75,75-10,其余]9个区间再加一个填充值(防止用户年龄缺失)。如果某个用户的年纪是22,那么我们可以将该用户进行embedding,结果是[0,0,0,1,0,0,0,0,0,0]。然后按照下面的方法就可以直接得到用户在年龄这个Field的embedding。但是更常见的做法是,将年龄为22的用户该特征的映射为4,年龄为10岁映射为1,然后直接查表进行embedding。
在这里插入图片描述至于为什么大家现在都全部embedding,而不输入数值,我没有找到具体的解释,如果有大佬了解的话可以介绍下。

总结:DeepFM模型是将全部的特征分别进行FM和DNN,并且两边模型中的特征embedding都是共享的。不过在我看来,没必要将所有的特征都输入到FM和DNN中,两者如果可以进行特征分配可能会好一些,让更需要交叉的特征输入放入FM侧。

NFM

FM终究是一阶的交叉,如果要进行二阶三阶甚至更高阶的交叉的话是无法做到的。如果可以放入DNN中进行更高阶的交叉可能会有更好的效果。NFM就是一个这样的模型。
在这里插入图片描述
从上图中好像并没有看到FM的结构,只是有个奇怪的Bi-interaction Pooling。这是一个什么东西呢?

fBi(Vx)=∑i=1n∑j=i+1nxivi∗xjvjf_{Bi}(V_x)=\sum_{i=1}^{n}\sum_{j=i+1}^{n}x_iv_i*x_jv_jfBi(Vx)=i=1n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值