《推荐系统》-PNN模型
1、原理
PNN,全称为Product-based Neural Network,认为在embedding输入到MLP之后学习的交叉特征表达并不充分,提出了一种product layer的思想,既基于乘法的运算来体现体征交叉的DNN网络结构,如下图:
图1、Product-based Neural Network Architecture
按照论文的思路,我们也从上往下来看这个网络结构:
输出层
输出层很简单,将上一层的网络输出通过一个全链接层,经过sigmoid函数转换后映射到(0,1)的区间中,得到我们的点击率的预测值:
y
^
=
σ
(
W
3
l
2
+
b
3
)
\hat{y} = \sigma (W_{3} l_{2} + b_{3} )
y^=σ(W3l2+b3)
l2层
根据l1层的输出,经一个全链接层 ,并使用relu进行**,得到我们l2的输出结果:
l
2
=
r
e
l
u
(
W
2
l
1
+
b
2
)
l_{2} = relu(W_{2} l_{1} + b_{2} )
l2=relu(W2l1+b2)
l1层
l1层的输出由如下的公式计算:
l
1
=
r
e
l
u
(
l
z
+
l
p
+
b
1
)
l_{1} = relu(l_{z} +l_{p} + b_{1} )
l1=relu(lz+lp+b1)
重点马上就要来了,我们可以看到在得到l1层输出时,我们输入了三部分,分别是lz,lp 和 b1,b1是我们的偏置项,这里可以先不管。lz和lp的计算就是PNN的精华所在了。我们慢慢道来:
Product Layer
product思想来源于,在ctr预估中,认为特征之间的关系更多是一种and“且”的关系,而非add"加”的关系。例如,性别为男且喜欢游戏的人群,比起性别男和喜欢游戏的人群,前者的组合比后者更能体现特征交叉的意义。
product layer可以分成两个部分,一部分是线性部分lz,一部分是非线性部分lp。二者的形式如下:
l
z
=
(
l
z
1
,
l
z
2
.
.
.
l
z
n
.
.
.
l
z
D
1
)
,
l
z
n
=
W
z
n
⊙
z
l_{z} = (l_{z}^1 ,l_{z}^2 ...l_{z}^n ...l_{z}^{D1} ) , l_{z}^n = W_{z}^n \odot z
lz=(lz1,lz2...lzn...lzD1),lzn=Wzn⊙z
l p = ( l p 1 , l p 2 . . . l p n . . . l p D 1 ) , l p n = W p n ⊙ z l_{p} = (l_{p}^1 ,l_{p}^2 ...l_{p}^n ...l_{p}^{D1} ) , l_{p}^n = W_{p}^n \odot z lp=(lp1,lp2...lpn...lpD1),lpn=Wpn⊙z
在这里,我们要使用到论文中所定义的一种运算方式,其实就是矩阵的点乘啦:
A
⊙
B
=
∑
A
i
,
j
B
i
,
j
A\odot B = \sum\nolimits A_{i,j} B_{i,j}
A⊙B=∑Ai,jBi,j
Embedding Layer
Embedding Layer跟DeepFM中相同,将每一个field的特征转换成同样长度的向量,这里用f来表示。
(
f
1
,
f
1
.
.
.
f
N
)
(f_{1} ,f_{1} ...f_{N} )
(f1,f1...fN)
损失函数
使用和逻辑回归同样的损失函数,如下:
L
(
y
,
y
^
)
=
−
y
l
o
g
y
^
−
(
1
−
y
)
l
o
g
(
1
−
y
^
)
L(y,\hat{y} )=-y log \hat{y} -(1-y)log(1-\hat{y} )
L(y,y^)=−ylogy^−(1−y)log(1−y^)
2、Product Layer详细介绍
前面提到了,product layer可以分成两个部分,一部分是线性部分lz,一部分是非线性部分lp。看product layer的公式,我们首先需要知道z和p,这都是由我们的embedding层得到的,其中z是线性信号向量,因此我们直接用embedding层得到:
z
=
(
z
1
,
z
2
.
.
.
z
N
)
≐
(
f
1
,
f
2
.
.
.
f
N
)
z = (z_{1} ,z_{2} ...z_{N} )\doteq (f_{1} ,f_{2} ...f_{N} )
z=(z1,z2...zN)≐(f1,f2...fN)
论文中使用的等号加一个三角形,其实就是相等的意思,你可以认为z就是embedding层的复制。
对于p来说,这里需要一个公式进行映射:
p
=
p
i
,
j
,
i
=
1...
N
,
j
=
1...
N
p={p_{i,j} } , i =1...N,j=1...N
p=pi,j,i=1...N,j=1...N
p i , j = g ( f i , f j ) p_{i,j} = g(f_{i} ,f_{j} ) pi,j=g(fi,fj)
不同的g的选择使得我们有了两种PNN的计算方法,一种叫做Inner PNN,简称IPNN,一种叫做Outer PNN,简称OPNN。
接下来,我们分别来具体介绍这两种形式的PNN模型,由于涉及到复杂度的分析,所以我们这里先定义Embedding的大小为M,field的大小为N,而lz和lp的长度为D1。
2.1 IPNN
IPNN的示意图如下:图2、IPNN
IPNN中p的计算方式如下,即使用内积来代表p_{i,j} :
g
(
f
i
,
f
j
)
=
<
f
i
,
f
j
>
g(f_{i} ,f_{j} ) = <f_{i} ,f_{j} >
g(fi,fj)=<fi,fj>
所以,p_{i,j} 其实是一个数,得到一个p_{i,j} 的时间复杂度为M,p的大小为NN,因此计算得到p的时间复杂度为NNM。而再由p得到lp的时间复杂度是NND1。因此 对于IPNN来说,总的时间复杂度为NN(D1+M)。文章对这一结构进行了优化,可以看到,我们的p是一个对称矩阵,因此我们的权重也可以是一个对称矩阵,对称矩阵就可以进行如下的分解:
W
p
n
=
θ
n
θ
n
T
W_{p}^n = \theta ^n \theta ^{nT}
Wpn=θnθnT
因此:
l
p
n
=
W
p
n
⊙
p
=
∑
i
=
1
n
∑
j
=
1
n
<
f
i
,
f
j
>
=
<
∑
i
=
1
n
δ
i
n
,
∑
i
=
1
n
δ
i
n
>
l_{p}^n =W_{p}^n \odot p = \sum_{i=1}^n \sum_{j=1}^n <f_{i} ,f_{j} > = <\sum_{i=1}^n \delta_i^n, \sum_{i=1}^n \delta_i^n>
lpn=Wpn⊙p=∑i=1n∑j=1n<fi,fj>=<∑i=1nδin,∑i=1nδin>
δ i n = θ i n f i \delta _{i}^n = \theta _{i}^n f_{i} δin=θinfi
因此:
δ
n
=
(
δ
1
n
,
δ
2
n
.
.
.
δ
i
n
.
.
.
δ
N
n
)
∈
R
N
×
M
\delta _{n} = (\delta _{1}^n, \delta _{2}^n...\delta _{i}^n...\delta _{N}^n ) \in R^{N\times M}
δn=(δ1n,δ2n...δin...δNn)∈RN×M
从而得到:
l
p
=
(
∣
∣
∑
i
δ
i
1
∣
∣
.
.
.
∣
∣
∑
i
δ
i
n
∣
∣
.
.
.
∣
∣
∑
i
δ
i
D
1
∣
∣
)
l_{p} = (||\sum_{i} \delta_{i}^1 ||...||\sum_{i} \delta_{i}^n ||...||\sum_{i} \delta_{i}^{D1} ||)
lp=(∣∣∑iδi1∣∣...∣∣∑iδin∣∣...∣∣∑iδiD1∣∣)
可以看到,我们的权重只需要D1 * N就可以了,时间复杂度也变为了D1MN。
2.2OPNN
OPNN的示意图如下:
图3、OPNN
OPNN中p的计算方式如下:
p
i
,
j
=
g
(
f
i
,
f
j
)
=
f
i
f
j
T
p_{i,j} =g(f_{i} ,f_{j} ) =f_{i}f_{j}^T
pi,j=g(fi,fj)=fifjT
此时
p
i
,
j
p_{i,j}
pi,j 为MM的矩阵,计算一个
p
i
,
j
p_{i,j}
pi,j 的时间复杂度为MM,而p是NNMM的矩阵,因此计算p的事件复杂度为NNMM。从而计算lp的时间复杂度变为D1 * NNM*M。这个显然代价很高的。为了减少负责度,论文使用了叠加的思想,它重新定义了p矩阵:
p
=
∑
i
=
1
N
∑
j
=
1
N
f
i
f
j
T
=
f
∑
(
f
∑
)
T
,
f
∑
=
∑
i
=
1
N
f
i
p = \sum_{i=1}^N \sum_{j=1}^N f_{i} f_{j}^T = f_{\sum\nolimits} (f_{\sum\nolimits} )^T,f_{\sum\nolimits} =\sum_{i=1}^N f_{i}
p=∑i=1N∑j=1NfifjT=f∑(f∑)T,f∑=∑i=1Nfi
这里计算p的时间复杂度变为了D1M(M+N)
参考文献:
论文:Product-based Neural Networks for User Response Prediction
推荐系统中使用ctr排序的f(x)的设计-dnn篇之PNN模型
推荐好文: 深度学习在CTR预估中的应用