利用product解决特征交叉问题——PNN模型

解决痛点

传统模型: (应该指的是逻辑回归这种)挖掘特征的能力有限,比如无法挖掘到二阶特征
深度网络模型: 无法应用到大规模高维稀疏特征上。
所以提出了PNN模型,该模型先用embedding层学习到类别特征的表达形式,再用一个乘积层学习到不同特征间的交叉信息,最后用全连接层学习到更高阶的特征表达。

网络结构

利用product解决特征交叉问题——PNN模型
从一个top-to-down的视角来看:

最顶层

最上面一层是一个CTR的输出
y^=σ(W3l2+b3)\hat{y}=\sigma\left(\boldsymbol{W}_{3} \boldsymbol{l}_{2}+b_{3}\right)σ(x)=1/(1+ex)\sigma(x)=1 /\left(1+e^{-x}\right)

L2层

l2=relu(W2l1+b2)l_{2}=\operatorname{relu}\left(\boldsymbol{W}_{2} \boldsymbol{l}_{1}+\boldsymbol{b}_{2}\right)即一个**层,其中l1RD1\boldsymbol{l}_{1} \in \mathbb{R}^{D_{1}}

L1层

l1=relu(lz+lp+b1)\boldsymbol{l}_{1}=\operatorname{relu}\left(\boldsymbol{l}_{z}+\boldsymbol{l}_{p}+\boldsymbol{b}_{1}\right)其中 lz,lp,b1RD1l_{z}, l_{p} ,b_{1} \in \mathbb{R}^{D_{1}} ,该维度与l2l_2层维度相对应

这里定义tensor乘积的表达式
ABi,jAi,jBi,j\boldsymbol{A} \odot \boldsymbol{B} \triangleq \sum_{i, j} \boldsymbol{A}_{i, j} \boldsymbol{B}_{i, j}即对应位置元素相乘然后求和。

定义:
z=(z1,z2,,zN)(f1,f2,,fN)p={pi,j},i=1N,j=1N\begin{array}{l} \boldsymbol{z}=\left(\boldsymbol{z}_{1}, \boldsymbol{z}_{2}, \ldots, \boldsymbol{z}_{N}\right) \triangleq\left(\boldsymbol{f}_{1}, \boldsymbol{f}_{2}, \ldots, \boldsymbol{f}_{N}\right) \\ \boldsymbol{p}=\left\{\boldsymbol{p}_{i, j}\right\}, i=1 \ldots N, j=1 \ldots N \end{array}
lzlpl_z和l_p的计算方法如下:
lz=(lz1,lz2,,lzn,,lzD1),lzn=Wznzlp=(lp1,lp2,,lpn,,lpD1),lpn=Wpnp\begin{array}{ll} \boldsymbol{l}_{z}=\left(l_{z}^{1}, l_{z}^{2}, \ldots, l_{z}^{n}, \ldots, l_{z}^{D_{1}}\right), & l_{z}^{n}=\boldsymbol{W}_{z}^{n} \odot \boldsymbol{z} \\ \boldsymbol{l}_{p}=\left(l_{p}^{1}, l_{p}^{2}, \ldots, l_{p}^{n}, \ldots, l_{p}^{D_{1}}\right), & l_{p}^{n}=\boldsymbol{W}_{p}^{n} \odot \boldsymbol{p} \end{array}

其中:

  • fiRM\boldsymbol{f}_{i} \in \mathbb{R}^{M},表示每个filed特征的embedding向量,由结构图可以看到,输入的是不同filed下的特征,(对于每个样本而言,每个filed下只有一个特征值),每个filed都有自己对应的权证矩阵WznW_{z}^{n}WpnW_{p}^{n}
  • zz部分和输入ff是完全等价的,只有pp部分用了特征的交叉

乘积函数g(fi,fj)g\left(\boldsymbol{f}_{i}, \boldsymbol{f}_{j}\right)及其优化

根绝向量间求积的方式不同,有以下两种方式(内积和外积):

  • Inner Product-based Neural Network (IPNN)
  • Outer Product-based Neural Network(OPNN)
IPNN

对于内积而言,g(fi,fj)=<fi,fj>g\left(\boldsymbol{f}_{i}, \boldsymbol{f}_{j}\right)=<f_{i}, f_{j}>,向量对应位置相乘求和得到一个数。
lzn=Wznz=i=1Nj=1M(Wzn)i,jzi,jlpd=WpdP=i=1Nj=1N(Wpd)i,jPi,jl_{z}^{n}=\boldsymbol{W}_{z}^{n} \odot \boldsymbol{z}=\sum_{i=1}^{N} \sum_{j=1}^{M}\left(\boldsymbol{W}_{z}^{n}\right)_{i, j} \boldsymbol{z}_{i, j}\\l_{p}^{d}=\boldsymbol{W}_{p}^{d} \odot \boldsymbol{P}=\sum_{i=1}^{N} \sum_{j=1}^{N}\left(\boldsymbol{W}_{p}^{d}\right)_{i,j} \boldsymbol{P}_{i,j}
对于每个部分而言,都有ddWW矩阵,ww的维度跟ff的维度有关,注意这里每个lznl_{z}^{n}或者lpnl_{p}^{n}的计算都用到了zz或者pp的所有元素(之前有点confusion,以为是分别乘的)。

对于l1l_{1}层的计算,其空间复杂度为O(DNM+DN2)O\left(D N M+D N^{2}\right),时间复杂度为O(DNM+DN2)O\left(D N M+D N^{2}\right)D1D_{1}l1l_{1}层的维度,MM为特征的维度,为超参NN为filed的个数。

对于lpl_{p}的计算,考虑到PP是个对称矩阵(Pi,j=Pj,iP_{i,j} = P_{j,i}),WW也是对称矩阵(相当于P矩阵中元素系数,相同元素系数相同),可以将WW矩阵进行分解,Wpn=θnθnTθnRN\boldsymbol{W}_{p}^{n}=\boldsymbol{\theta}^{n} \boldsymbol{\theta}^{n T},\boldsymbol{\theta}^{n} \in \mathbb{R}^{N},那么:
Wpnp=i=1Nj=1Nθinθjnfi,fj=i=1Nδin,i=1Nδin\boldsymbol{W}_{p}^{n} \odot \boldsymbol{p}=\sum_{i=1}^{N} \sum_{j=1}^{N} \theta_{i}^{n} \theta_{j}^{n}\left\langle\boldsymbol{f}_{i}, \boldsymbol{f}_{j}\right\rangle=\left\langle\sum_{i=1}^{N} \boldsymbol{\delta}_{i}^{n}, \sum_{i=1}^{N} \boldsymbol{\delta}_{i}^{n}\right\rangleδin=θinfi\boldsymbol{\delta}_{i}^{n}=\theta_{i}^{n} \boldsymbol{f}_{i}δn=(δ1n,δ2n,,δin,,δNn)RN×M\boldsymbol{\delta}^{n}=\left(\boldsymbol{\delta}_{1}^{n}, \boldsymbol{\delta}_{2}^{n}, \ldots, \boldsymbol{\delta}_{i}^{n}, \ldots, \boldsymbol{\delta}_{N}^{n}\right) \in \mathbb{R}^{N \times M}
通过该变换,可以将原来时间和空间复杂度都降到 O(DNM)O(DNM)(在真实场景中特征filed的个数N要远大于embedding的维度M);

OPNN

外积的结果是矩阵
Pij=fifjTRMM\boldsymbol{P}_{i j}=\boldsymbol{f}_{i} \boldsymbol{f}_{j}^{T} \in \mathbb{R}^{M * M}

P=i=1Nj=1NPij=i=1Nj=1NfifjT=(j=1Nfi)(j=1Nfi)TRMM\boldsymbol{P}=\sum_{i=1}^{N} \sum_{j=1}^{N} \boldsymbol{P}_{i j}=\sum_{i=1}^{N} \sum_{j=1}^{N} \boldsymbol{f}_{i} \boldsymbol{f}_{j}^{T}=\left(\sum_{j=1}^{N} \boldsymbol{f}_{i}\right)\left(\sum_{j=1}^{N} \boldsymbol{f}_{i}\right)^{T} \in \mathbb{R}^{M * M}待研究
ps(写完代码再来完善理论)