深度排序模型概述(二)PNN/NFM/AFM
在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包括三层: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中p的计算方式如下,即使用内积来代表pij:
$$
g(f_i,f_j) = <f_i,f_j>
$$
所以,$p_{ij}$其实是一个数,得到一个$p_{ij}$的时间复杂度为M,p的大小为$NN$,因此计算得到p的时间复杂度为$NNM$。而再由p得到$l_p$的时间复杂度是$NND1$。因此 对于IPNN来说,总的时间复杂度为$NN(D1+M)$。文章对这一结构进行了优化,可以看到,我们的$p$是一个对称矩阵,因此我们的权重也可以是一个对称矩阵,对称矩阵就可以进行如下的分解:
$$
W_p^n = \theta ^ n {\theta ^ n} ^T
$$
最终,我们的权重只需要$D1 N$就可以了,时间复杂度也变为了$D1M*N$。
OPNN
OPNN的示意图如下:
OPNN中p的计算方式如下:
$$
p_{i,j} = g(f_i,f_j) = f_i {f_j}^T
$$
此时$p_{ij}$为$MM$的矩阵,计算一个$p_{ij}$的时间复杂度为$MM$,而p是$NNMM$的矩阵,因此计算p的事件复杂度为$NNMM$。从而计算$l_p$的时间复杂度变为$D1 NNMM$。这个显然代价很高的。为了减少负责度,论文使用了叠加的思想,它重新定义了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)$是用来建模特征之间交互关系的多层前馈神经网络模块,架构图如下所示:
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相同,后面的一项经由如下的网络得到:
图中的前三部分: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可以达到更好的结果。