推荐系统遇上深度学习(七)--NFM模型理论和实践

2023-07-04 10:32:00 学习 系统 推荐 深度 遇上

1、引言

在CTR预估中,为了解决稀疏特征的问题,学者们提出了FM模型来建模特征之间的交互关系。但是FM模型只能表达特征之间两两组合之间的关系,无法建模两个特征之间深层次的关系或者说多个特征之间的交互关系,因此学者们通过Deep Network来建模更高阶的特征之间的关系。

因此 FM和深度网络DNN的结合也就成为了CTR预估问题中主流的方法。有关FM和DNN的结合有两种主流的方法,并行结构和串行结构。两种结构的理解以及实现如下表所示:

结构描述常见模型
并行结构FM部分和DNN部分分开计算,只在输出层进行一次融合得到结果DeepFM,DCN,Wide&Deep
串行结构将FM的一次项和二次项结果(或其中之一)作为DNN部分的输入,经DNN得到终结果PNN,NFM,AFM

今天介绍的NFM模型(Neural Factorization Machine),便是串行结构中一种较为简单的网络模型。

2、NFM模型介绍

我们首先来回顾一下FM模型,FM模型用n个隐变量来刻画特征之间的交互关系。这里要强调的一点是,n是特征的总数,是one-hot展开之后的,比如有三组特征,两个连续特征,一个离散特征有5个取值,那么n=7而不是n=3.



顺便回顾一下化简过程:



可以看到,不考虑外层的求和,我们可以得到一个K维的向量。

对于NFM模型,目标值的预测公式变为:



其中,f(x)是用来建模特征之间交互关系的多层前馈神经网络模块,架构图如下所示:



Embedding Layer和我们之间几个网络是一样的,embedding 得到的vector其实就是我们在FM中要学习的隐变量v。

Bi-Interaction Layer名字挺高大上的,其实它就是计算FM中的二次项的过程,因此得到的向量维度就是我们的Embedding的维度。终的结果是:



Hidden Layers就是我们的DNN部分,将Bi-Interaction Layer得到的结果接入多层的神经网络进行训练,从而捕捉到特征之间复杂的非线性关系。

在进行多层训练之后,将后一层的输出求和同时加上一次项和偏置项,就得到了我们的预测输出:



是不是很简单呢,哈哈。

3、代码实战

终于到了激动人心的代码实战环节了,本文的代码有不对的的地方或者改进之处还望大家多多指正。

本文的github地址为:
https://github.com/princewen/tensorflow_practice/tree/master/recommendation/Basic-NFM-Demo

本文的代码根据之前DeepFM的代码进行改进,我们只介绍模型的实现部分,其他数据处理的细节大家可以参考我的github上的代码.

模型输入

模型的输入主要有下面几个部分:

self.feat_index = tf.placeholder(tf.int32,
                                 shape=[None,None],
                                 name='feat_index')
self.feat_value = tf.placeholder(tf.float32,
                               shape=[None,None],
                               name='feat_value')

self.label = tf.placeholder(tf.float32,shape=[None,1],name='label')
self.dropout_keep_deep = tf.placeholder(tf.float32,shape=[None],name='dropout_deep_deep')

相关文章