PNN网络(Product-based Neural Network)

1. 概述

PNN(Product-based Neural Network)是在2016年提出的用于计算CTR问题的深度神经网络模型,PNN的网络结构对传统的FNN(Feedforward Neural Network)网络结构做了一些优化,使得其能够更适合处理CTR问题。在PNN网络模型中,主要的优化点为:

  1. 通过Embedding层处理离散特征。Embedding层现在已经成为DNN模型处理CTR问题的标配;
  2. 增加Product层,在Product Layer中,通过显式构造特征交叉,在不同的特征域之间进行特征组合,在实际的实施过程中,会有不同的product计算方法,在参考文献[1]中,提到了两种不同的product计算方法,分别为inner producr和outer product。

2. 算法原理

2.1. PNN的网络结构

PNN的网络结构如下图所示:

在这里插入图片描述

从网络结构上看,整个网络分成四层,第一层为特征Embedding层,第二层为Product层(PNN最为核心的部分), 第三层与第四层是传统的全连接网络层,最后模型的输出层。其网络结构与传统的DNN网络结构基本一致,不同的就是比传统DNN网络结构增加了Product层,与传统DNN的网络结构对比如下图所示:

在这里插入图片描述

2.2. PNN网络的计算过程

从上到下最上层上PNN的输出层,PNN网络的输出为

y^=σ(W3l2+b3)\hat{y}=\sigma \left (\mathbf{W}_3\mathbf{l}_2+b_3\right )

其中,W3R1×D2\mathbf{W}_3\in \mathbb{R}^{1\times D_2}b3Rb_3\in \mathbb{R}是L2层到输出层的参数,l2RD2\mathbf{l}_2\in \mathbb{R}^{D_2}是L2层的输出,D2D_2为隐层L2层输出向量的维度,σ\sigma为输出层的激活函数,且是CTR计算中通常使用的激活函数,此处便不在赘述。L2层的输出l2\mathbf{l}_2为:

l2=relu(W2l1+b2)\mathbf{l}_2=relu\left ( \mathbf{W}_2\mathbf{l}_1+\mathbf{b}_2 \right )

其中,W2RD2×D1\mathbf{W}_2\in \mathbb{R}^{D_2\times D_1}b2RD2\mathbf{b}_2\in \mathbb{R}^{D_2}为L1层到L2层的参数,l1RD1\mathbf{l}_1\in \mathbb{R}^{D_1}是L1层的输出,D1D_1为隐层L1层输出向量的维度,relurelu为L2层的激活函数。L1层的输出l1\mathbf{l}_1为:

l1=relu(lz+lp+b1)\mathbf{l}_1=relu\left ( \mathbf{l}_z+\mathbf{l}_p+\mathbf{b}_1 \right )

其中,b1RD1\mathbf{b}_1\in \mathbb{R}^{D_1}为Product层到L1层的参数。lzRD1\mathbf{l}_z\in \mathbb{R}^{D_1}为Product的线形部分,lpRD1\mathbf{l}_p\in \mathbb{R}^{D_1} 为Product的特征交叉部分。lz\mathbf{l}_zlp\mathbf{l}_p分别为:

lz=(lz1,lz2,,lzn,,lzD1),  lzn=Wznz\mathbf{l}_z=\left ( l_z^1,l_z^2,\cdots ,l_z^n,\cdots ,l_z^{D_1} \right ),\; l_z^n=\mathbf{W}_z^n\odot \mathbf{z}

lp=(lp1,lp2,,lpn,,lpD1),  lpn=Wpnp\mathbf{l}_p=\left ( l_p^1,l_p^2,\cdots ,l_p^n,\cdots ,l_p^{D_1} \right ),\; l_p^n=\mathbf{W}_p^n\odot \mathbf{p}

其中,Wzn\mathbf{W}_z^nWpn\mathbf{W}_p^n是Embedding层到Product层的参数,z\mathbf{z}为线型特征部分,p\mathbf{p}为交叉特征部分,且z\mathbf{z}为:

z=(z1,z2,,zN)=(f1,f2,,fN)\mathbf{z}=\left ( \mathbf{z}_1,\mathbf{z}_2,\cdots ,\mathbf{z}_N \right )\overset{\underset{\triangle }{}}{=}\left ( \mathbf{f}_1,\mathbf{f}_2,\cdots ,\mathbf{f}_N\right )

其中,fiRM\mathbf{f}_i\in \mathbb{R}^M为第ii个Embedding特征。交叉特征p\mathbf{p}为:

p={pi,j},i=1N,j=1N\mathbf{p}=\left\{\mathbf{p}_{i,j} \right\}, i=1\cdots N,j=1\cdots N

其中,pi,j=g(fi,fj)\mathbf{p}_{i,j}=g\left ( \mathbf{f}_i,\mathbf{f}_j \right )gg表示不同的特征交叉函数。Embedding特征fi\mathbf{f}_i为:

fi=W0ixi[starti:endi]\mathbf{f}_i=\mathbf{W}_0^i\: \mathbf{x}_i\left [ start_{i} : end_{i} \right ]

而对于Product层的函数gg,在参考文献[1]中提到了两种方法,分别为Inner Product和Outer Product。

2.2.1. Inner Product

在Inner Product中,函数gg为:

g(fi,fj)=fi,fjg\left ( \mathbf{f}_i,\mathbf{f}_j \right )=\left \langle \mathbf{f}_i,\mathbf{f}_j \right \rangle

其中,<fi,fj>\left<\mathbf{f}_i,\mathbf{f}_j \right>表示的是向量fi\mathbf{f}_i和向量fj\mathbf{f}_j的内积。基于Inner Product的PNN模型又可以称为IPNN(Inner Product-based Neural Network)。此时lznl_z^nlpnl_p^n分别为:

lzn=Wznz=i=1N(Wz)izi=i=1N(Wz)ifil_z^n=\mathbf{W}_z^n\odot \mathbf{z}=\sum_{i=1}^{N}\left ( \mathbf{W}_z \right )_{i}\mathbf{z}_i=\sum_{i=1}^{N}\left ( \mathbf{W}_z \right )_{i}\mathbf{f}_i

lpn=Wpnp=i=1Nj=1N(Wpn)i,jpi,j=i=1Nj=1N(Wpn)i,j<fi,fj>l_p^n=\mathbf{W}_p^n\odot \mathbf{p}=\sum_{i=1}^{N}\sum_{j=1}^{N}\left ( \mathbf{W}_p^n \right )_{i,j}\mathbf{p}_{i,j}=\sum_{i=1}^{N}\sum_{j=1}^{N}\left ( \mathbf{W}_p^n \right )_{i,j}\left<\mathbf{f}_i,\mathbf{f}_j \right>

如何去分析Product层的计算复杂度?已知,fiRM\mathbf{f}_i\in \mathbb{R}^M,特征的个数为NN,因此,lznl_z^n的时间复杂度为O(NM)O\left ( NM \right )lpnl_p^n的时间复杂度O(N2M)O\left ( N^2M \right ),由lpnl_p^nlp\mathbf{l}_p的时间复杂度为O(N2D1)O\left ( N^2D_1 \right )。因此,线型部分lz\mathbf{l}_z的时间复杂度为O(D1NM)O\left ( D_1NM \right ),交叉部分lp\mathbf{l}_p的时间复杂度为O(N2(M+D1))O\left ( N^2\left ( M+D_1 \right ) \right )

受FM算法中参数矩阵分解的启发,参考文献[1]中提出使用矩阵分解的方式来降低时间复杂度。其中要注意pi,j\mathbf{p}_{i,j}Wpn\mathbf{W}_p^n都是对称矩阵,所以可以使用一阶矩阵分解。假设Wpn=θnθnT\mathbf{W}_p^n=\mathbf{\theta }^n\mathbf{\theta }^{nT},其中θnRN\mathbf{\theta }^n\in \mathbb{R}^Nlpnl_p^n可以表示为:

lpn=Wpnp=i=1Nj=1N(Wpn)i,j<fi,fj>=i=1Nj=1Nθinθjn<fi,fj>=i=1Nj=1N<θinfi,θjnfj>=<i=1Nθinfi,j=1Nθjnfj>=i=1Nδin2\begin{aligned} l_p^n&=\mathbf{W}_p^n\odot \mathbf{p}=\sum_{i=1}^{N}\sum_{j=1}^{N}\left ( \mathbf{W}_p^n \right )_{i,j}\left<\mathbf{f}_i,\mathbf{f}_j \right> \\ &=\sum_{i=1}^{N}\sum_{j=1}^{N}\theta _i^n\theta _j^n\left<\mathbf{f}_i,\mathbf{f}_j \right> \\ &=\sum_{i=1}^{N}\sum_{j=1}^{N}\left<\theta _i^n\mathbf{f}_i,\theta _j^n\mathbf{f}_j \right> \\ &=\left<\sum_{i=1}^{N}\theta _i^n\mathbf{f}_i,\sum_{j=1}^{N}\theta _j^n\mathbf{f}_j \right> \\ &= \left\| \sum_{i=1}^{N}\delta _i^n\right\|^2 \end{aligned}

其中,δin=θinfi\delta _i^n=\theta _i^n\mathbf{f}_i,则lp\mathbf{l}_p为:

lp=(i=1Nδi12,,i=1Nδin2,,i=1NδiD12)\mathbf{l}_p=\left ( \left\| \sum_{i=1}^{N}\delta _i^1\right\|^2,\cdots ,\left\| \sum_{i=1}^{N}\delta _i^n\right\|^2,\cdots ,\left\| \sum_{i=1}^{N}\delta _i^{D_1}\right\|^2 \right )

时间复杂度为O(D1NM)O\left ( D_1NM \right )

2.2.2. Outer Product

在Outer Product中,函数gg为:

g(fi,fj)=fifjTg\left ( \mathbf{f}_i,\mathbf{f}_j \right )=\mathbf{f}_i\mathbf{f}_j^T

此时,由于fiRM\mathbf{f}_i\in \mathbb{R}^M,因此pi,jRM×M\mathbf{p}_{i,j}\in \mathbb{R}^{M\times M}是一个方阵。基于Outer Product的PNN模型又可以称为OPNN(Outer Product-based Neural Network)。此时lpnl_p^n为:

lpn=Wpnp=i=1Nj=1N(Wpn)i,jpi,j=i=1Nj=1N(Wpn)i,jfifjTl_p^n=\mathbf{W}_p^n\odot \mathbf{p}=\sum_{i=1}^{N}\sum_{j=1}^{N}\left ( \mathbf{W}_p^n \right )_{i,j}p_{i,j}=\sum_{i=1}^{N}\sum_{j=1}^{N}\left ( \mathbf{W}_p^n \right )_{i,j}\mathbf{f}_i\mathbf{f}_j^T

对于Outer Product,此时的pi,j\mathbf{p}_{i,j}M×MM \times M的矩阵,而p\mathbf{p}N×N×M×MN \times N \times M \times M的矩阵,因此p\mathbf{p}的计算时间复杂度为O(M2N2)O\left ( M^2N^2 \right )lp\mathbf{l}_p的计算时间复杂度为O(D1M2N2)O\left ( D_1M^2N^2 \right )。参考文献[1]使用了叠加(superposition)的思想,重新定义了p\mathbf{p}矩阵:

p=i=1Nj=1NfifjT=f(f)T,  f=i=1Nfi\mathbf{p}=\sum_{i=1}^{N}\sum_{j=1}^{N}\mathbf{f}_i\mathbf{f}_j^T=\mathbf{f}_{\sum }\left ( \mathbf{f}_{\sum } \right )^T,\; \mathbf{f}_{\sum }=\sum_{i=1}^{N}\mathbf{f}_i

此时, pRM×M\mathbf{p}\in \mathbb{R}^{M\times M},通过上述分析,最终lp\mathbf{l}_p的计算时间复杂度为O(D1M(M+N))O\left ( D_1M\left ( M+N \right ) \right )

3. 总结

PNN网络结构在传统的DNN中增加了Product层,从而实现了特征的交叉,在具体的实现过程中,提出了两种Product的计算,分别为Inner Product和Outer Product。在具体的数据中,两种Product的表现并不一致,需要根据具体的数据选择合适的Product计算方法,相比较传统的DNN,从实验结果来看,效果上PNN得到了较大提升。

参考文献

[1] Qu Y , Han C , Kan R , et al. Product-Based Neural Networks for User Response Prediction[C]// 2016 IEEE 16th International Conference on Data Mining (ICDM). IEEE, 2016.