今天开始了推荐系统的第三个模型DeepFM的学习,这是华为诺亚方舟实验室在2017年发表的论文。它将FM和DNN进行了有机结合,既兼顾到了低阶特征的学习,又能够兼顾到高阶泛化的能力。具体的论文地址在此:https://arxiv.org/pdf/1703.04247.pdf
DeepFM的网络结构如下所示:
从网络结构图来看,DeepFM的结构和Wide&Deep的结构有异曲同工之妙,因为本质它们的结构都可以分为左右两大主要部分,一边是低阶特征的表示(FM或LR),另一边是高阶特征的抽取(DNN)。但是,DeepFM有自己独特之处,用FM代替了简单的Wide部分,它不仅利用了一阶特征表示,同时也利用了二阶特征。其实,DeepFM并非第一个将FM层融入到深度学习网络中去的,在2016年的时候,有FNN和PNN,具体的结构如下:
FNN是将预训练好的FM层作为模型的输入,在上面叠加多层隐藏层,经过激活函数和最后的sigmoid函数变换,映射到最终的目标值概率上去的。由于FNN是将FM和DNN进行了串行叠加,FNN对于低阶特征的学习程度是不够充分的。
PNN是在FNN的基础上面,增加了一层product层,具体的是将embedding做相关的inner product/outer product来增加低阶特征的表达,同时,也省去了FNN需要预训练FM层的问题。然而,PNN也和FNN有类似网络结构的同样问题,对于低阶特征的表达不够充分。
DeepFM将FM层和DNN做了并行的网络结构设计,使得其能够更好地利用FM对低阶特征的抽取,以及DNN的深层特征的提取。具体地,该网络结构有两大部分:
FM部分:就是Factorization Machine,它利用了特征的一阶特征(➕),和二阶特征(✖️),能够帮助较高效地提取交叉特征。当数据集中的交叉特征出现地较为稀疏时,FM的优势体现出来了,它将特征用隐变量表示,因此,无论两个特征的具体取值是否存在在数据集合中,它都可以用它们的内积来表示两个特征的交叉效应。
DNN部分:和Wide&Deep的Deep部分类似,就是将Sparse特征分域提取为Dense Embedding,来达到降维和特征有效表达的目的。同时,在上层构建全链接的隐藏层,使得特征可以得到高阶的提取。最终和FM层的输出进行结合,经过sigmoid函数,得到最终的目标值映射。需要注意的是,Sparse特征的黄色点表示特征one-hot表达时为1的具体位置,而灰色点表示one-hot表达时为0的其余位置。
针对四方面特性(高阶特征提取、低阶特征提取、是否需要模型预训练,和是否需要特征工程),原文论文对各个模型进行了总结,值得一看。从综合的比较上看,DeepFM是较为优秀的。(高阶特征提取、低阶特征提取、是否无需模型预训练,和是否无需特征工程)
FNN T、F、F、F
PNN T、F、T、F
Wide&Deep T、T、T、F
DeepFM T、T、T、T
具体代码:
仔细看,发现get_dnn_logits和get_linear_logits部分和wide&deep本质是一样的,区别在于增加了get_fm_logits的二阶特征表达。
如果对于FM采用随机梯度下降SGD训练模型参数,请写出模型各个参数的梯度和FM参数训练的复杂度?
参考资料:
1. DeepFM论文
2. datawhale学习资料