在CTR预估中,为了解决稀疏特征的问题,学者们提出了FM模型来建模特征之间的交互关系。但是FM模型只能表达特征之间两两组合之间的关系,无法建模两个特征之间深层次的关系或者说多个特征之间的交互关系,因此学者们通过Deep Network来建模更高阶的特征之间的关系。
因此,FM和深度网络DNN的结合也就成为了CTR预估问题中主流的方法。有关FM和DNN的结合有两种主流的方法,并行结构和串行结构。两种结构的理解以及实现如下表所示:

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

PNN

PNN,全称为Product-based Neural Network,认为在embedding输入到MLP之后学习的交叉特征表达并不充分,提出了一种product layer的思想,即基于乘法的运算来体现体征交叉的DNN网络结构,如下图:

PNN网络结构

PNN包括三层:Embedding Layer、Product Layer、Full-connect Layer。
按照论文的思路,我们也从上往下来看这个网络结构:

  • 输出层
    输出层很简单,将上一层的网络输出通过一个全链接层,经过sigmoid函数转换后映射到(0,1)的区间中,得到我们的点击率的预测值:
\[
\hat y=\sigma(W_3 l_2+b_3)
\]
  • l2层
    根据l1层的输出,经一个全链接层 ,并使用relu进行激活,得到我们l2的输出结果:
\[
l2 = relu(W_2 l_1 + b_2)
\]
  • l1层
    l1层的输出由如下的公式计算:
\[
l1 = relu(l_z + l_p + b_1)
\]

其中,b1是偏置项,l_z,l_p由Product Layer计算得来

  • Product Layer
    product思想来源于,在ctr预估中,认为特征之间的关系更多是一种and“且”的关系,而非add"加”的关系。例如,性别为男且喜欢游戏的人群,比起性别男和喜欢游戏的人群,前者的组合比后者更能体现特征交叉的意义。
    product layer可以分成两个部分,一部分是线性部分lz,一部分是非线性部分lp。
\[
l_z^n = W_z^n \bigodot z \\
l_p^i = W_p^n \bigodot p
\]

其中,z是线性信号向量,可以认为z就是embedding层的复制。对于p来说,这里需要一个公式进行映射:

\[
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ p = \{ p_{i,j} \},\ \ \ i=1...N,j=1...N \\
p_{i,j} = g(f_i,f_j)
\]

不同的g的选择使得我们有了两种PNN的计算方法,一种叫做Inner PNN,简称IPNN,一种叫做Outer PNN,简称OPNN。

  • Embedding Layer
    Embedding Layer跟DeepFM中相同,将每一个field的特征转换成同样长度的向量

  • 损失函数
    使用和逻辑回归同样的损失函数,如下:

\[
L(y,\hat y) = -y \log \hat y - (1-y)log(1-\hat y)
\]

接下来,我们分别来具体介绍IPNN和OPNN,由于涉及到复杂度的分析,所以我们这里先定义Embedding的大小为M,field的大小为N,而lz和lp的长度为D1。

IPNN

IPNN的示意图如下:

IPNN网络结构

IPNN中p的计算方式如下,即使用内积来代表pij:

\[
g(f_i,f_j) = <f_i,f_j>
\]

所以,$p_$其实是一个数,得到一个$p_$的时间复杂度为M,p的大小为$NN$,因此计算得到p的时间复杂度为$NNM$。而再由p得到$l_p$的时间复杂度是$NND1$。因此 对于IPNN来说,总的时间复杂度为$NN(D1+M)$。文章对这一结构进行了优化,可以看到,我们的$p$是一个对称矩阵,因此我们的权重也可以是一个对称矩阵,对称矩阵就可以进行如下的分解:

\[
W_p^n = \theta ^ n {\theta ^ n} ^T
\]

最终,我们的权重只需要$D1 * N$就可以了,时间复杂度也变为了$D1MN$。

OPNN

OPNN的示意图如下:
OPNN网络结构

OPNN中p的计算方式如下:

\[
p_{i,j} = g(f_i,f_j) = f_i {f_j}^T
\]

此时$p_$为$MM$的矩阵,计算一个$p_$的时间复杂度为$MM$,而p是$NNMM$的矩阵,因此计算p的事件复杂度为$NNMM$。从而计算$l_p$的时间复杂度变为$D1 * NNM*M$。这个显然代价很高的。为了减少负责度,论文使用了叠加的思想,它重新定义了p矩阵:

\[
p = \sum_{i=1}^N \sum_{j=1}^N f_i f_j^T = f_{\sum} (f_{\sum})^T,\ \ f_{\sum}=\sum_{i=1}^N f_i
\]

这里计算p的时间复杂度变为了$D1M(M+N)$

NFM

NFM模型(Neural Factorization Machine),是串行结构中一种较为简单的网络模型。
首先来回顾一下FM模型,FM模型用n个隐变量来刻画特征之间的交互关系。这里要强调的一点是,n是特征的总数,是one-hot展开之后的,比如有三组特征,两个连续特征,一个离散特征有5个取值,那么n=7而不是n=3。

FM模型表达式:

\[
\hat y_{FM}(x) = w_0+\sum_{i=1}^n w_i x_i +\sum_{i=1}^n \sum_{j=i+1}^n ⟨v_i,v_j⟩ x_i x_j
\]

顺便回顾一下化简过程:

\[
\begin{aligned} & \sum_{i=1}^{n} \sum_{j=i+1}^{n} {\langle \mathbf{v}_i, \mathbf{v}_j \rangle} x_i x_j \qquad\qquad\qquad\qquad\qquad\qquad(1)\\ = & \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} {\langle \mathbf{v}_i, \mathbf{v}_j \rangle} x_i x_j - \frac{1}{2} \sum_{i=1}^{n} {\langle \mathbf{v}_i, \mathbf{v}_i \rangle} x_i x_i \qquad\qquad\;\;(2)\\ = & \frac{1}{2} \left(\sum_{i=1}^{n} \sum_{j=1}^{n} \sum_{f=1}^{k} v_{i,f} v_{j,f} x_i x_j - \sum_{i=1}^{n} \sum_{f=1}^{k} v_{i,f} v_{i,f} x_i x_i \right) \qquad\,(3) \\ = & \frac{1}{2} \sum_{f=1}^{k} {\left \lgroup \left(\sum_{i=1}^{n} v_{i,f} x_i \right) \cdot \left(\sum_{j=1}^{n} v_{j,f} x_j \right) - \sum_{i=1}^{n} v_{i,f}^2 x_i^2 \right \rgroup} \quad\;\;\,(4) \\ = & \frac{1}{2} \sum_{f=1}^{k} {\left \lgroup \left(\sum_{i=1}^{n} v_{i,f} x_i \right)^2 - \sum_{i=1}^{n} v_{i,f}^2 x_i^2\right \rgroup} \qquad\qquad\qquad\;\;(5) \end{aligned}
\]

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

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

\[
\hat y_{NFM}(x) = w_0 + \sum_{i=1} ^n w_i x_i +f(x)
\]

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

NFM网络结构

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

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

\[
f_{BI}(v_x) = \frac{1}{2}[(\sum_{i=1}^n x_i v_i)^2 - \sum_{i=1}^n (x_i v_i)^2]
\]

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

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

\[
\hat y_{NFM}(x) = w_0 + \sum_{i=1} ^n w_i x_i + h^T \sigma_L(W_L(...\sigma_1(W_1 f_{BI}(V_x)+b_1)...)+b_L)
\]

NFM模型将FM与神经网络结合以提升FM捕捉特征间多阶交互信息的能力。根据论文中实验结果,NFM的预测准确度相较FM有明显提升,并且与现有的并行神经网络模型相比,复杂度更低。

NFM本质上还是基于FM,FM会让一个特征固定一个特定的向量,当这个特征与其他特征做交叉时,都是用同样的向量去做计算。这个是很不合理的,因为不同的特征之间的交叉,重要程度是不一样的。因此,学者们提出了AFM模型(Attentional factorization machines),将attention机制加入到我们的模型中。

AFM

AFM只是在FM的基础上添加了attention的机制。关于什么是attention model?本文不打算详细赘述,我们这里只需要知道的是,attention机制相当于一个加权平均,attention的值就是其中权重,判断不同特征之间交互的重要性。
attention相等于加权的过程,因此我们的预测公式变为:

\[
\hat y_{AFM}(x) = w_0+\sum_{i=1}^n w_i x_i +p^T \sum_{i=1}^n \sum_{j=i+1}^n a_{ij} (v_i \bigodot v_j) x_i x_j
\]

圆圈中有个点的符号代表的含义是element-wise product,即:

\[
(x_{1,1},x_{1,2}...) \bigodot (x_{2,1},x_{2,2}...) = (x_{1,1} x_{2,1},x_{1,2} x_{2,2},...)
\]

因此,我们在求和之后得到的是一个K维的向量,还需要跟一个向量p相乘,得到一个具体的数值。

可以看到,AFM的前两部分和FM相同,后面的一项经由如下的网络得到:
AFM网络结构

图中的前三部分:sparse iput,embedding layer,pair-wise interaction layer,都和FM是一样的。而后面的两部分,则是AFM的创新所在,也就是我们的Attention net。Attention背后的数学公式如下:

\[
a_{ij}^{'} = h^T Relu(W(v_i \bigodot v_j)x_i x_j+b) \\
a_{ij} = \frac{\exp(a_{ij}^{'})}{\sum_{i,j} \exp(a_{ij}^{'}) }
\]

总结一下,不难看出AFM只是在FM的基础上添加了attention的机制,但是实际上,由于最后的加权累加,二次项并没有进行更深的网络去学习非线性交叉特征,所以AFM并没有发挥出DNN的优势,也许结合DNN可以达到更好的结果。

深度排序模型概述(二)PNN/NFM/AFM的更多相关文章

  1. 深度排序模型概述(一)Wide&Deep/xDeepFM

    本文记录几个在广告和推荐里面rank阶段常用的模型.广告领域机器学习问题的输入其实很大程度了影响了模型的选择,因为输入一般维度非常高,稀疏,同时包含连续性特征和离散型特征.模型即使到现在DeepFM类 ...

  2. 深度召回模型在QQ看点推荐中的应用实践

    本文由云+社区发表 作者:腾讯技术工程 导语:最近几年来,深度学习在推荐系统领域中取得了不少成果,相比传统的推荐方法,深度学习有着自己独到的优势.我们团队在QQ看点的图文推荐中也尝试了一些深度学习方法 ...

  3. django模型——数据库(二)

    模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...

  4. Django中模型(二)

    Django中模型(二) 三.定义模型 1.模型.属性.表.字段间的关系: 一个模型类在数据库中对应一张表:在模型类中定义的属性,对应该模型对照表中的字段. 2.定义属性 A.概述 ·django根据 ...

  5. PyTorch如何构建深度学习模型?

    简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观.Pytorch就是这样一个库. 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易.Pyto ...

  6. CSS 盒子模型概述

    一.简介   CSS 盒子模型(元素框)由元素内容(content).内边距(padding).边框(border).外边距(margin)组成.     盒子模型,最里面的部分是实际内容:直接包围内 ...

  7. C++二级指针第二种内存模型(二维数组)

    C++二级指针第二种内存模型(二维数组) 二维数组 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”. 定义 类型说明符 数组名[常量表达式][常量表达式] 例如: float a[3][4 ...

  8. 权限系统与RBAC模型概述

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3793894.html ...

  9. DL4NLP——词表示模型(二)基于神经网络的模型:NPLM;word2vec(CBOW/Skip-gram)

    本文简述了以下内容: 神经概率语言模型NPLM,训练语言模型并同时得到词表示 word2vec:CBOW / Skip-gram,直接以得到词表示为目标的模型 (一)原始CBOW(Continuous ...

随机推荐

  1. js中的正则表达式小结1

    正则表达式总结 创建正则对象:var regex=new RegExp(/\d/); 一般都用直接量,写法更简洁:var regex=/\d/; test()方法用来验证字符串是否符合规则,返回tru ...

  2. Odoo 13 released..

    origin https://medium.com/@jc_57445/odoo-13-is-fantastic-f2b421696b49 Most striking changes The most ...

  3. CentOS7安装MySQL 密码方面

    1.为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log. 可通 ...

  4. 模型预测控制 MPC

    使用MPC的原因:

  5. hadoop(二MapReduce)

    hadoop(二MapReduce) 介绍 MapReduce:其实就是把数据分开处理后再将数据合在一起. Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理.可以进行拆分的前提是这 ...

  6. Python解Leetcode: 725. Split Linked List in Parts

    题目描述:给定一个单链表,写一个函数把它分成k个单链表.分割成的k个单链表中,两两之间长度差不超过1,允许为空.分成的k个链表中,顺序要和原先的保持一致,比如说每个单链表有3个结点,则第一个单链表的结 ...

  7. adb shell dumpsys [options]的使用

    adb shell dumpsys [options]该命令用于打印出当前系统信息,默认打印出设备中所有service的信息.由于service比较多,这里选几个用的比较多的service来进行讲解: ...

  8. Django的URLconf

    URL 概要 我们要在Django项目中为应用程序设计URL,我们可以创建一个名为URLconf(通常为urls.py)的Python模块.这个模块是纯Python代码,是一个简单的正则表达式到Pyt ...

  9. Java String类源码

    String类的签名(JDK 8): public final class String implements java.io.Serializable, Comparable<String&g ...

  10. Tomcat的架构

    Tomcat 7.0---Servlet API 3.0---JSP API 2.2---JDK 1.6 一个Tomcat实例,或者服务器(server),是Tomcat容器层次结构中的顶级组件. 只 ...