暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

经典深度推荐模型:PNN

南极Python 2021-11-03
2629

之前介绍的NeuralCF使用神经网络代替了协同过滤中的点积操作,并取得了一定的进步。但是,它只使用了用户-物品的共现矩阵进行建模,而忽略了其它特征,比如用户的性别、年龄等。

本文将要介绍PNN在模型中加入了更多的特征,并设计了更为精细的特征交叉方式。

PNN简介

PNN,全称是Product-based Neural Networks,这里的Product特指PNN中的Product层。如果将Product层所做操作替换成简单的拼接(concat),那么就变成了我们之前介绍的Deep Crossing。因此,PNN最大的创新就在于Product层。

PNN总体结构

PNN的结构如下图所示:

从下往上看。

Input Layer:Input层的输入是一些类别特征,它们一般是One-Hot编码的形式,比如第一个特征域Field1表示性别,如果当前输入样本性别为男,则Field1对应特征的值是"10",若是女则为"01",其余特征域同理。

举个栗子,假设共2个类别变量,分别为'性别,星期几',那么对于如下样本:

男,星期2

复制

输入网络的数字为:

100100000

复制

最开始的10表示男,后面的0100000表示星期2。

Embedding Layer:每个特征域所含元素数量可能不同,比如性别只有男女,因此对应的维度是2,而代表星期几的特征域中的特征对应的维度则是7。对于每个特征域对应的特征,独立进行Embedding,就能够将不同维度的One-hot编码转换为维度一致的Embedding编码了,也就是图中的Feature 1, Feature 2, ..., Feature N。

Product Layer:将Embedding后的向量输入到Product层,Product层会做两件事。

其一,线性操作,生成左侧的向量;

其二,乘积操作,生成右侧的向量。

具体如何做,稍后将详细解释。

Hidden Layer1/2:将生成的, 拼接在一起,输入到全连接层,最终得到预测结果。

详解Product Layer

在此之前,先来定义张量之间的内积操作。

两个向量求内积,就是将两个向量对应位置元素相乘,然后把乘出来的结果统统加起来,得到一个数。

张量内积同理,也是对应位置元素先相乘,最后再把所有乘积统统相加:

线性操作

现在来看Product Layer的左半部分:由Embedding向量生成

是一个长度为的向量,其中是Hidden Layer1的维度,因为稍后会将Producet层的结果输入到Hidden Layer1。

中的第个元素是一个数,它是的内积。

其中,N*M
的,是总的特征域个数,是Embedding后得到的向量的维度。这里假设每一个Embedding后的向量都与1进行交互,结果不变。或者换个角度理解,就是Embedding层输出的N*M
的矩阵。

是相应权重,维度和一致,也是N*M

求内积,就得到了

同理可计算得到

乘积操作

接下来介绍Product Later的右半部分:由Embedding向量生成

和上面的求解公式是一样的(都是张量内积操作),各个维度的含义也相同,的维度也和相同,不同之处在于

具体地,是由Embedding后的特征两两交互得到的,按照特征交互方式的不同,可以有两种方式得到

第一种,特征之间求内积,此时的PNN也被称为IPNN(Inner Product-based Neural Network)。

此时,是由Embedding后的第i个特征和第j个特征之间求内积得到的,因此是一个数。由于总共有N个特征域,因此Embediding后得到N个特征,每个特征的维度是M,可以将其表示为一个N*M
的矩阵,该矩阵的每一行都是一个长度为M的特征,该矩阵与自身的转置进行矩阵乘法,便得到了两两特征之间的内积组成的N*N
的矩阵,这就是

由于是相应的参数,因此其维度也是N*N
的,两者之间求内积,便得到了,同理可求得

第二种,特征之间求外积,此时的PNN也被称为OPNN(Outer Product-based Neural Network)。

上面介绍的是一个数,它是由Embedding后的第i个特征和第j个特征之间求内积得到的。

而这里的则是一个M*M
的矩阵,它是由Embedding后的第i个特征和第j个特征之间求外积得到的。

所以,这里的的维度是N*N*(M*M)
,相应的权重也是N*N*(M*M)
的。

两者之间求内积,就得到了,同理可求得

以上就是关于PNN的介绍。

最后补充一点,那就是在上面的PNN中,输入的都是类别变量,那数值型变量呢?

其实,数值型变量不需要以上的操作(数值型特征是连续的,不需要One-hot编码,更何谈Embedding),一种处理方法是直接将其拼接在经过Product Layer的输出结果后面,一起输入到Hidden Layer1

参考:

  • [1] https://arxiv.org/pdf/1611.00144.pdf
  • [2] https://blog.csdn.net/wuzhongqiang/article/details/108985457
  • [3] 王喆-《深度学习推荐系统》

南极Python交流群已成立,长按下方二维码添加我的微信,备注加群即可,欢迎进群学习交流(划水

文章转载自南极Python,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论