本文是笔者参与datawhale组织的深度推荐模型组队学习的分享,学习内容见本链接 ,本文中所指的教程即该链接中的相应文件。

一、概念

为了在稀疏条件下有更好的预测性能,2017年何向南教授等人在SIGIR会议上提出了NFM(Neural Factorization Machines)模型。传统的FM及其改进的FFM本质是一个二阶特征交叉模型,尽管其处理稀疏向量的能力很好,但是由于FM的特征交叉是一种暴力组合,无法扩展到更高阶,因此限制了FM的表达能力。因此作者尝试使用非线性表达能力强的MLP部分代替了原FM中的二阶隐向量内积的部分,使其有更强的表达能力。
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
NFM表达式
y^NFM(x)=w0+∑i=1nwixi+f(x)\hat{y}_{N F M}(\mathbf{x})=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+f(\mathbf{x}) y^NFM(x)=w0+i=1nwixi+f(x)
另外,NFM也借鉴了Wide&Deep模型的思想,分成了wide和deep两部分,NFM对其deep部分作出了改进,整体的网络结构如图所示(图片转自datawhale)。

其中,作者改进了Deep部分,主要是创造了一个Bi-Interaction Pooling层来将FM的M×K的矩阵(M为稀疏特征数量,K为稀疏特征Embedding之后的尺寸)对接到MLP模块,交给MLP模块进行高阶非线性的交叉。改进的Deep部分如图所示。

为了将FM的输出与MLP层相连,使整个网络能够正常前向传播、后向传播,NFM在Bi-Interaction Pooling中使用了如下函数
fBI(Vx)=∑i=1n∑j=i+1nxivi⊙xjvjf_{B I}\left(\mathcal{V}_{x}\right)=\sum_{i=1}^{n} \sum_{j=i+1}^{n} x_{i} \mathbf{v}_{i} \odot x_{j} \mathbf{v}_{j} fBI(Vx)=i=1nj=i+1nxivixjvj
其中⊙\odot表示两个向量点对点的元素积操作。其他层的操作与其他网络相比没有改变,不做特别说明。

二、NFM相对于其他模型的改进

1. FM视角

FM本身就是处理稀疏特征非常好的模型,但由于计算量的限制不易表达三阶及以上的交叉特征,因此仍有提升空间。从FM视角看NFM的改进,主要在于FM的输出是一个标量,而NFM的Bi-Interaction Pooling层的输出不是标量,因为NFM使用了元素积而没有用点积,因此其输出的矩阵可以继续被MLP层学习。

2. Wide&Deep视角

Wide&Deep模型的提出使推荐系统能够兼顾泛化能力与记忆能力。前面所提到的DeepFM通过在Wide部分结合了FM,加强了浅层网络部分的特征组合的能力。而本文的NFM模型则是将FM应用在了Deep层,使Deep层对于稀疏向量的处理有了更好的表达。

3. Embedding + MLP视角

从DeepCrossing模型开始,embedding+mlp就成了深度推荐系统的标配,但是通常的MLP层的输入都是一阶特征,特征交叉是交给MLP来做的,而NFM则是预先做好了二阶的交叉,再交给MLP,使MLP的输入端有了更高阶的特征,一定程度为MLP减负。不过作者在这里也提到,他们做了实验,MLP为0层(即原始的FM)到4层,可以看出在论文中比对的两个数据集中,单个隐层效果较好,这既说明了NFM可以比FM更有效,也说明不易让MLP对特征进行过于复杂的交叉。

三、代码复现

代码

这里使用了采样了200个样本的Criteo数据集,我没有实现完整的NFM,只实现了Deep部分,因为NFM改进了wide&deep的deep部分。
Bi-Interaction Pooling层的实现借鉴了公式
fBI(Vx)=∑i=1n∑j=i+1nxivi⊙xjvj=12[(∑i=1nxivi)2−∑i=1n(xivi)2]f_{B I}\left(\mathcal{V}_{x}\right)=\sum_{i=1}^{n} \sum_{j=i+1}^{n} x_{i} \mathbf{v}_{i} \odot x_{j} \mathbf{v}_{j}=\frac{1}{2}\left[\left(\sum_{i=1}^{n} x_{i} \mathbf{v}_{i}\right)^{2}-\sum_{i=1}^{n}\left(x_{i} \mathbf{v}_{i}\right)^{2}\right] fBI(Vx)=i=1nj=i+1nxivixjvj=21(i=1nxivi)2i=1n(xivi)2

class bi_interaction_pooling(Layer):def __init__(self):super(bi_interaction_pooling, self).__init__()def call(self, inputs):x = inputs# 和的平方 - 平方的和x = 0.5 * (tf.square(tf.reduce_sum(x, axis=1)) - tf.reduce_sum(tf.square(x), axis=1))return xdef NFM(sparse_fea,embedding_size=32,num_hidden_layers=1,if_bn=False,if_dropout=True,dropout_factor=[0.5]):inputs_dict = {}for fea in sparse_fea:inputs_dict[fea] = Input(shape=(1,), name=fea)embedded = []for fea in inputs_dict:embedded.append(Embedding(sparse_fea[fea], embedding_size)(inputs_dict[fea]))x = Concatenate(axis=1)(embedded)x = bi_interaction_pooling()(x)if if_bn:x = BatchNormalization()(x)for i in range(num_hidden_layers):x = Dense(32, activation='relu')(x)if if_dropout:x = Dropout(dropout_factor[i])(x)output = Dense(1, activation='sigmoid')(x)return Model(inputs_dict.values(), output)

keras绘制deep部分的模型:

实验

由于样本量只有200,使用BatchNormalization的时候效果不好,实验时发现过拟合情况比较严重,因此设置了较高的Dropout比例(0.5),分别在hidden unit=0,1,2,3时实验,hidden unit=0时即为FM。下图为TensorBoard的训练过程图,橘色为训练集的AUC,蓝色曲线为验证集的AUC

hidden unit = 0

hidden unit = 1

hidden unit = 2

hidden unit = 3

四、思考

Q1. NFM中的特征交叉与FM中的特征交叉有何异同,分别从原理和代码实现上进行对比分析
原理
相同点: NFM和FM都生成了M×K(M为特征数量,K为矩阵分解的维度,也即单个特征Embedding后的维度)的矩阵,而且生成矩阵都使用了梯度下降来求解。
不同点: FM生成矩阵后对其求和,故其输出是一个标量。而NFM只作元素积,不求和,故其输出是矩阵,继续交给MLP层训练。另外,FM训练时用类似矩阵分解的方法,只训练自己的特征矩阵,是独立的。而NFM的权重随整个网络更新。
代码
这里对比教程中DeepFM模型的FM实现部分和NFM的Bi-Interaction Pooling部分,可以看出NFM相对于FM的区别。
FM的实现如图所示:

class FM_Layer(Layer):def __init__(self):super(FM_Layer, self).__init__()def call(self, inputs):# 优化后的公式为: 0.5 * 求和(和的平方-平方的和)  =>> B x 1concated_embeds_value = inputs # B x n x ksquare_of_sum = tf.square(tf.reduce_sum(concated_embeds_value, axis=1, keepdims=True)) # B x 1 x ksum_of_square = tf.reduce_sum(concated_embeds_value * concated_embeds_value, axis=1, keepdims=True) # B x1 xkcross_term = square_of_sum - sum_of_square # B x 1 x kcross_term = 0.5 * tf.reduce_sum(cross_term, axis=2, keepdims=False) # B x 1return cross_termdef compute_output_shape(self, input_shape):return (None, 1)

NFM的实现如图所示:

class BiInteractionPooling(Layer):def __init__(self):super(BiInteractionPooling, self).__init__()def call(self, inputs):# 优化后的公式为: 0.5 * (和的平方-平方的和)  =>> B x kconcated_embeds_value = inputs # B x n x ksquare_of_sum = tf.square(tf.reduce_sum(concated_embeds_value, axis=1, keepdims=False)) # B x ksum_of_square = tf.reduce_sum(concated_embeds_value * concated_embeds_value, axis=1, keepdims=False) # B x kcross_term = 0.5 * (square_of_sum - sum_of_square) # B x kreturn cross_termdef compute_output_shape(self, input_shape):return (None, input_shape[2])

可以看出,FM多了如下一行:

cross_term = 0.5 * tf.reduce_sum(cross_term, axis=2, keepdims=False) # B x 1

NFM的Bi-Interaction Pooling层这里的输出是Batchsize × 1,而FM里的输出是Batchsize × K,因此验证了前面所说的,FM会将输出求和,因为求和之后要用梯度更新FM的参数,而NFM则是将输出交给MLP,因此不必求和。

Q2.在学习了NFM之后我还有一个疑惑,我认为NFM的主要改进就是原本MLP层的输入都是一阶特征,而NFM则是给了MLP二阶特征作为输入。我的疑惑是,MLP本身也具有很好的非线性高阶拟合能力,为什么NFM让FM来代替MLP来做二阶特征交叉效果会更好呢,是在通用情况下FM的二阶特征交叉能力都强于MLP,还是说仅在某些情况下?欢迎各位留言为我解惑~

五、参考文献

  • NFM论文
  • FunRec
  • 王喆 - 《深度学习推荐系统》

手搭深度推荐模型(四) NFM相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 深度推荐模型-DIN

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

  8. 深度推荐模型 - DIN

    DIN 文章目录 DIN 提出背景 DIN模型的数据集和特征表示 基线模型 Embedding layer Pooling layer and Concat layer 损失函数 base模型存在的问 ...

  9. 深度推荐模型 - DeepFM

    DeepFM 文章目录 DeepFM 之前的模型的缺点和局限 线性模型的局限性 多项式模型的问题 DNN的局限性 FM(因子分解机) FFM FNN & PNN Wide & Deep ...

最新文章

  1. Android深度探索与驱动开发(一)
  2. ubuntu16.04 sudo apt-get update解决Hash sum错误
  3. ES6 学习笔记(基础)
  4. python tkinter_Python+tkinter开发一个电子宠物(2 按钮)
  5. 重写AgileEAS.NET SOA 中间件平台账号密码的加密算法
  6. 在WPF的TreeView中实现右键选定
  7. 需求分析之UML用例图学习
  8. Java防止用户同一时间重复登录(包括异地登录)
  9. hdu 4496 D-City 并查集
  10. Eclipse Java EE的tomcat使用小结
  11. 总结几个与模块相关的命令
  12. 项目常用工具类整理(一)--时间工具类DateUtil.java
  13. 打印出现:You've implemented -[UIApplicationDelegate application:didReceiveRemoteNotification:...
  14. selenium 接管浏览器
  15. Docker-day1-安装+使用+常用镜像命令
  16. c语言处理文本断句空格,c语言怎么断句
  17. qcc 蓝牙耳机 TWS与TWS plus的区别
  18. pg_stat_database的字段tup_returned,tup_fetched含义
  19. Javaweb回炉简要学习笔记
  20. 如何证明函数有界_科技界正在抓住机会来证明不平等

热门文章

  1. VNC桌面无法打开终端:Failed to execute default Terminal Emulator. Input/output error.
  2. Topaz DeNoise AI for Mac(AI智能图像降噪工具)
  3. IE浏览器控制台空白
  4. Java_08 快速入门 Java常用类库
  5. 数字图像处理第三章part2
  6. iOS图像渲染 + 动画探索
  7. python实现微信机器人: 登录微信、消息接收、自动回复
  8. 计算机网络网卡作用是什么,什么是网卡?它的作用是什么?
  9. 计算机视觉基础——3D空间坐标点的重建(三角测量)
  10. WARNING: Ignoring invalid distribution -ip (d:\python\lib\site-packages)