深度推荐模型 -NFM
NFM
文章目录
- NFM
- 提出背景 & 与其他模型的关系
- FM回顾
- NFM公式
- NFM网络总体结构
- 网络各层的详细解释
- Input层和Embedding层
- Bi-Interaction Pooling layer
- 隐藏层
- 预测层
- 小结
参考 推荐系统遇上深度学习(七)–NFM模型理论和实践
提出背景 & 与其他模型的关系
NFM这个模型是在FM的基础上提出的,是为了改进FM模型只能表达特征之间两两组合之间的关系,无法建模两个特征之间深层次的关系或者说多个特征之间的交互关系,同时为了建模更高阶的特征而提出的。NFM是串行结构中一种较为简单的网络模型。
NFM(Neural Factorization Machines)是2017年由新加坡国立大学的何向南教授等人在SIGIR会议上提出的一个模型,**传统的FM模型仅局限于线性表达和二阶交互, 无法胜任生活中各种具有复杂结构和规律性的真实数据。**针对FM的这点不足,作者提出了一种将FM融合进DNN的策略,通过引进了一个特征交叉池化层的结构,使得FM与DNN进行了完美衔接,这样就组合了FM的建模低阶特征交互能力和DNN学习高阶特征交互和非线性的能力,形成了深度学习时代的神经FM模型(NFM)。
结构 | 描述 | 常见模型 |
---|---|---|
并行结构 | FM部分和DNN部分分开计算,只在输出层进行一次融合得到结果 | DeepFM,DCN,Wide&Deep |
串行结构 | 将FM的一次项和二次项结果(或其中之一)作为DNN部分的输入,经DNN得到最终结果 | PNN,NFM,AFM |
FM回顾
FM模型用n个隐变量来刻画特征之间的交互关系。这里要强调的一点是,n是特征的总数,是one-hot展开之后的,比如有三组特征,两个连续特征,一个离散特征有5个取值,那么n=7而不是n=3.
y^(X)=ω0+∑i=1nωixi+∑i=1n−1∑j=i+1n<vi,vj>xixj\hat{y}(X) = \omega_{0}+\sum_{i=1}^{n}{\omega_{i}x_{i}}+\sum_{i=1}^{n-1}{\sum_{j=i+1}^{n} \color{red}{<v_{i},v_{j}>x_{i}x_{j}}}y^(X)=ω0+∑i=1nωixi+∑i=1n−1∑j=i+1n<vi,vj>xixj
<vi,vj>=∑f=1kvi,f⋅vj,f<v_{i},v_{j}> = \sum_{f=1}^{k}{v_{i,f}\cdot v_{j,f}}<vi,vj>=∑f=1kvi,f⋅vj,f
FM的化简公式也很重要:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \sum_{i=1}^{n-…
- vi,fv_{i,f}vi,f 是一个具体的值;
- 第1个等号:对称矩阵 WWW 对角线上半部分;
- 第2个等号:把向量内积 viv_{i}vi,vjv_{j}vj 展开成累加和的形式;
- 第3个等号:提出公共部分;
- 第4个等号: iii 和 jjj 相当于是一样的,表示成平方过程。
不考虑最外层的求和时,我们可以得到一个K维的向量。
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)
对比FM,发现变化的是第三项,前两项还是原来的。因为FM的一个问题,就是只能到二阶交叉,且是线性模型。作者在这里改进的思路就是用一个表达能力更强的函数来替代原FM中二阶隐向量内积的部分。这个能力够强的函数就是神经网络,因为神经网络理论上可以拟合任何复杂的函数。
NFM网络总体结构
这个结构和PNN非常像,只不过那里是一个product_layer, 而这里换成了Bi-Interaction Pooling了, 这个也是NFM的核心结构了。注意,这里忽略了一阶部分,只可视化出来了f(x)f(x)f(x).
网络各层的详细解释
Input层和Embedding层
输入层的特征, 文章指定了稀疏离散特征居多, 这种特征我们也知道一般是先one-hot, 然后会通过embedding,处理成稠密低维的。 所以这两层还是和之前一样,假设vi∈Rk\mathbf{v}_{\mathbf{i}} \in \mathbb{R}^{k}vi∈Rk为第iii个特征的embedding向量, 那么Vx={x1v1,…,xnvn}\mathcal{V}_{x}=\left\{x_{1} \mathbf{v}_{1}, \ldots, x_{n} \mathbf{v}_{n}\right\}Vx={x1v1,…,xnvn}表示的下一层的输入特征。这里带上了xix_ixi是因为很多xix_ixi转成了One-hot之后,出现很多为0的, 这里的{xivi}\{x_iv_i\}{xivi}是xix_ixi不等于0的那些特征向量。
Bi-Interaction Pooling layer
在Embedding层和神经网络之间加入了特征交叉池化层是本网络的核心创新了,**正是因为这个结构,实现了FM与DNN的无缝连接,组成了一个大的端到端网络,且能够正常的反向传播。**假设Vx\mathcal{V}_{x}Vx是所有特征embedding的集合, 那么在特征交叉池化层的操作:
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=1n∑j=i+1nxivi⊙xjvj
⊙\odot⊙表示两个向量的元素积操作,即两个向量对应维度相乘得到的元素积向量(可不是点乘呀),其中第kkk维的操作:
(vi⊙vj)k=vikvjk\left(v_{i} \odot v_{j}\right)_{k}=\boldsymbol{v}_{i k} \boldsymbol{v}_{j k}(vi⊙vj)k=vikvjk
这便定义了在embedding空间特征的二阶交互,这个不仔细看会和感觉FM的最后一项很像,但是不一样,要注意这个地方不是两个隐向量的内积,而是元素积,也就是这一个交叉完了之后k个维度不求和,最后会得到一个kkk维向量,而FM那里内积的话最后得到一个数,在进行两两Embedding元素积之后,对交叉特征向量取和,得到该层的输出向量,很显然,输出是一个kkk维的向量。
加入特征池化层之后,把二阶交互的信息合并,且上面接了一个DNN网络,这样就能够增强FM的表达能力了,因为FM只能到二阶,而这里的DNN可以进行多阶且非线性,只要FM把二阶的学习好了,DNN学习来会更加容易。作者在论文中也说明了这一点,且通过后面的实验证实了这个观点。
如果不加DNN,NFM就退化成了FM(还是有区别的吧,毕竟FM特征交叉时使用的是内积),所以改进的关键就在于加了一个BI-interaction Pooling层,组合了一下二阶交叉的信息,然后又给了DNN进行高阶交叉的学习,成了一种“加强版”的FM。
Bi-Interaction层不需要额外的模型学习参数,更重要的是它在一个线性的时间内完成计算,和FM一致的,即时间复杂度为O(kNx)O\left(k N_{x}\right)O(kNx),NxN_xNx为embedding向量的数量。参考FM,可以将上式转化为:
fBI(Vx)=12[(∑i=1nxivi)2−∑i=1n(xivi)2]f_{B I}\left(\mathcal{V}_{x}\right)=\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)=21⎣⎡(i=1∑nxivi)2−i=1∑n(xivi)2⎦⎤
后面代码复现NFM就是用的这个公式直接计算。
隐藏层
这一层就是全连接的神经网络, DNN在进行特征的高层非线性交互上有着天然的学习优势,公式如下:
z1=σ1(W1fBI(Vx)+b1)z2=σ2(W2z1+b2)……zL=σL(WLzL−1+bL)\begin{aligned} \mathbf{z}_{1}=&\sigma_{1}\left(\mathbf{W}_{1} f_{B I} \left(\mathcal{V}_{x}\right)+\mathbf{b}_{1}\right) \\ \mathbf{z}_{2}=& \sigma_{2}\left(\mathbf{W}_{2} \mathbf{z}_{1}+\mathbf{b}_{2}\right) \\ \ldots \ldots \\ \mathbf{z}_{L}=& \sigma_{L}\left(\mathbf{W}_{L} \mathbf{z}_{L-1}+\mathbf{b}_{L}\right) \end{aligned} z1=z2=……zL=σ1(W1fBI(Vx)+b1)σ2(W2z1+b2)σL(WLzL−1+bL)
这里的σi\sigma_iσi是第iii层的激活函数,可不要理解成sigmoid激活函数。
预测层
f(x)=hTzLf(\mathbf{x})=\mathbf{h}^{T} \mathbf{z}_{L}f(x)=hTzL
注意由于这里是回归问题,没有加sigmoid激活。
小结
NFM模型的前向传播过程总结如下:
y^NFM(x)=w0+∑i=1nwixi+hTσL(WL(…σ1(W1fBI(Vx)+b1)…)+bL)\begin{aligned} \hat{y}_{N F M}(\mathbf{x}) &=w_{0}+\sum_{i=1}^{n} w_{i} x_{i} \\ &+\mathbf{h}^{T} \sigma_{L}\left(\mathbf{W}_{L}\left(\ldots \sigma_{1}\left(\mathbf{W}_{1} f_{B I}\left(\mathcal{V}_{x}\right)+\mathbf{b}_{1}\right) \ldots\right)+\mathbf{b}_{L}\right) \end{aligned} y^NFM(x)=w0+i=1∑nwixi+hTσL(WL(…σ1(W1fBI(Vx)+b1)…)+bL)
这就是NFM模型的全貌,NFM相比较于其他模型的核心创新点是特征交叉池化层,基于它,实现了FM和DNN的无缝连接,使得DNN可以在底层就学习到包含更多信息的组合特征,这时候,就会减少DNN的很多负担,只需要很少的隐藏层就可以学习到高阶特征信息。NFM相比之前的DNN, 模型结构更浅,更简单,但是性能更好,训练和调参更容易。集合FM二阶交叉线性和DNN高阶交叉非线性的优势,非常适合处理稀疏数据的场景任务。在对NFM的真实训练过程中,也会用到像Dropout和BatchNormalization这样的技术来缓解过拟合和在过大的改变数据分布。
总体的结构图如下:
深度推荐模型 -NFM相关推荐
- 深度推荐模型-NFM
一.动机 传统的FM模型仅局限于线性表达和二阶交互,无法胜任生活中各种具有复杂结构和规律性的真实数据,针对这点不足,作者提出了一种将FM融合进DNN的策略,通过引进一个特征交叉池化层的结构,使得FM与 ...
- 深度学习推荐模型-NFM
深度学习推荐模型-NFM 本文参考链接,仅供个人学习: https://github.com/datawhalechina/team-learning-rs/tree/master/DeepRecom ...
- 手搭深度推荐模型(四) NFM
本文是笔者参与datawhale组织的深度推荐模型组队学习的分享,学习内容见本链接 ,本文中所指的教程即该链接中的相应文件. 一.概念 为了在稀疏条件下有更好的预测性能,2017年何向南教授等人在SI ...
- 深度推荐模型之NFM模型
NFM 背景 今天学习深度推荐模型中的NFM(Neural Factorization Machines)模型,该模型是由2017年在SIGIR会议上提出的.CTR预估中,为了解决稀疏特征的问题,学者 ...
- 【组队学习】【23期】Datawhale深度推荐模型
深度推荐模型 开源内容:https://github.com/datawhalechina/team-learning-rs/tree/master/DeepRecommendationModel 基 ...
- 谷歌引入自动网络设计,高效解决大规模深度推荐模型的特征嵌入问题
来源 | 深度传送门(ID:gh_5faae7b50fc5) 导读:本文主要介绍Google在大规模深度推荐模型上关于特征嵌入的最新论文. 一.背景 大部分的深度学习模型主要包含如下的两大模块:输入模 ...
- Google最新论文:大规模深度推荐模型的特征嵌入问题有解了!
转载自深度传送门(ID: gh_5faae7b50fc5) 导读:本文主要介绍下Google在大规模深度推荐模型上关于特征嵌入的最新论文. 一.背景 大部分的深度学习模型主要包含如下的两大模块:输入模 ...
- 深度推荐模型(EDRMs):面向Web级应用的基于二进制码的Hash Embedding
猜你喜欢 0.如果你想参与进元宇宙,究竟应该采取怎样的策略?1.如何搭建一套个性化推荐系统?2.从零开始搭建创业公司后台技术栈3.全民K歌推荐系统架构.算法及后台设计4.微博推荐算法实践与机器学习平台 ...
- RS笔记:深度推荐模型之多任务学习PLE模型 [RecSys 2020 最佳论文 腾讯]
RS笔记:深度推荐模型之多任务学习ESMM模型(多目标优化模型,同时优化CTR和CVR) [SIGIR 2018 阿里妈妈] RS笔记:深度推荐模型之多任务学习MMoE模型 [KDD 2018 谷歌] ...
最新文章
- linux core文件的打开和分析
- 目标检测方法系列——R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD
- 黑马程序员—多线程,单线程
- Postman使用总结(1)——Postman 自动化测试小结
- 通信服务器系统安装,pxe网络安装操作系统
- CSRF漏洞原理/防御
- HackFifteen 移除背景以提升Activity启动速度
- Learning Efficient Single-stage Pedestrian Detectors by Asymptotic Localization Fitting
- spring 动态代理_Spring中的两种动态代理
- 华为手机root的最简单方法教程!附专用root工具!详细
- [Java FX 2] Stage with rounded corners and background image
- DM8更换产品授权,更换KEY
- unreal无损音乐百度云_Roxette女主唱Marie Fredriksson - Den Standiga Resan 个人瑞典语专辑 [APE]...
- 七月集训(22,23)字典树,有序集合
- 2.16VINETIC需要解决的问题
- Optimizing Bloom Filter: Challenges, Solutions, and Comparisons论文总结
- 算法还是算力?周志华微博引爆深度学习的“鸡生蛋,蛋生鸡”问题
- NHibernate基础
- python虚拟环境管理 —— 以 workon 切换虚拟环境
- PalmOS开发教程-1