前言
现在推荐系统,网络搜索和在线广告的数据大多是分类的,并包含多个字段,有一个典型的方法将他们转化成高维稀疏二进制特征表示就是通过one-hot编码。对于这些高维稀疏的特征,传统模型可能会限制它们从数据中挖掘浅层模式的能力,即低阶组合特征,另一方面,像深度神经网络这样的深度模型由于巨大的特征空间而不能直接应用于高维输入。所以本文提出了PNN这个模型,其中的embedding层学习种类特征的分布式表示,product层捕获种类特征之间的交互特征(学习filed之间的交互特征),全连接层捕获高阶交互特征。
本文提到的相关论文: 1、 Deep learning over multi-field categorical data: A case study on user response prediction(FNN) 2、 A convolutional click prediction model(CCPM) 3、 Sequential click prediction for sponsored search with recurrent neural networks
Introduction
信息检索领域(IR,Information Retrieval)包括:推荐系统、web search、线上广告。其核心是User Response Prediction,是指给出用户关于一个预先定义好的行为的概率。这些行为包括:clicks、purchases。预测的概率代表了用户对特定物品感兴趣的程度,物品包括:新闻、商品、广告。而这会影响商家对于展示文档的排序,广告投标等。IR问题最大的数据特点就是multi-field categorical,举例来说:对于[Weekday=Tuesday, Gender=Male, City=London],通过one-hot编码转化高纬度稀疏的数据:
。在传统的机器学习模型中,例如像LR,GBDT依旧非常依赖人工特征工程,FM则缺少对高阶组合特征的建模,仅仅对特定阶的组合特征建模。
随着DNN在图像处理、语音识别、自然语言处理领域大放异彩,将DNN应用于CTR预估或者推荐系统的研究逐渐多了起来。DNN的输入往往是dense real vector 但是multi-field类别型特征起初是高维且稀疏的。常见的做法是通过加入Embedding Layer将输入映射到低维度的Embedding空间中。FNN使用FM初始化embedding vector,同时也受限于FM;CCPM利用CNN卷积来学习组合特征,但是只在相邻的特征间卷积,没有考虑到非相邻的特征的组合。
在神经网络的各神经元中,加法操作无法发现种类特征之间的交互特征,所以采用乘法操作,来发现不同field的交互特征。这也是PNN的由来。
PNN模型介绍
网络结构图:
Input:
一个类别型特征就是一个Field。比如用户信息包括:性别、职业等,这里的性别是一个Field,职业是另一个Field。上图中的Input是one-hot之后的,而且只给出了类别型特征。所以每个Field i都是一个向量,向量的大小就是类别型特征one-hot之后的维度。所以不同Field的维度是不同的。
Embedding Layer:
Embedding是Field-wisely Connected,就是每个Field只管自己的嵌入,Field之间网络的权重毫无关系,自己学习自己的。而且只有权重,没有bias。不同的Field之间没有关系。一个Field经过嵌入后,得到一个Feature,也就是对应的Embedding Vector嵌入向量。其维度一般是预先设定好的定值,论文中采用的是10。也就说是不同Feature的维度经过embedding后都是一样的。
Product Layer:
代码语言:javascript复制Product Layer中z中每个圈都是一个向量,向量大小为Embedding Vector大小,向量个数 = Field个数 = Embedding向量的个数。
Product Layer中如果是内积,p中每个圈都是一个值;如果是外积,p中每个圆圈都是一个二维矩阵。
对于Embedding Vector有两种处理策略:
代码语言:javascript复制直接和内积或外积结果拼接,输入到神经网络。(未经过线性变换的Z和P拼接)
先进行一次线性变换,再和内积或外积结果拼接,输入到神经网络。(经过线性变换的Z和P拼接)
图上Embedding Layer中的那个1,其实就是直接把Embedding Vector拿来用并没有进行线性变换。这样做处理起来很简单,但是也有个缺点。Embedding Vector和内积项或外积项的数值分布差异交大,没有进行线性变换,导致分布不稳定不利于训练。
图中Product层包括Z和P两部分:
代码语言:javascript复制Z:在数据流中,假设Field个数为N,那么经过Embedding后的Field得到了N个Feature,将这N个Feature拿过来并排,没有经过线性变换,就得到Z(参考Embedding Vector有两种处理策略)。这部分代表的是对低维度特征,或者说原始特征的建模。加入这一部分训练会变得稳定。
P:经过Embedding后得到的N个Feature两两组合进行Product操作,把结果放到一起就得到了p。N个向量两两组合,会产生N(N-1)/2对组合。其中Product操作包括内积运算和外积运算,内积运算:每个神经元就是一个实数值,外积运算:每个神经元就是一个二维矩阵。
其中fi是field i经过Embedding后得到的Feature。 Pi,j = g(fi, fj)定义为Feature之间两两组合,PNN中操作方式的不同,g函数会不同。
Hidden Layer:
把z和p直接拼接起来,就得到了第一个隐层的输入。经过多个隐藏层最后给出CTR预测值。图中包括两个隐藏层L1和L2。
Wzn与 Wpn为Product层的权重。
输出:
根据Product Layer的操作不同,PNN有三种变体:IPNN、OPNN、PNN*
Inner Product-based Neural Network(IPNN)
P中每个神经元都是一个实数值,和Z中的嵌入向量拼接起来,喂给神经网络就行了。
Outer Product-based Neural Network(OPNN)
外积得到的是一个矩阵,所以p中的每个神经元都是一个矩阵。针对两个M维的嵌入向量e1和e2. 它们外积得到的是M M 的二维矩阵。一共有N个嵌入向量,那么矩阵就有N(N-1)/2个。那么一个二维矩阵怎么输入到神经网络中去?针对外积产生的每一个二维矩阵,我们都通过另外一个矩阵W,大小为M M。这两个矩阵对应位置相乘,再相加,就得到了最终的结果。也就是说,最终外积产生的二维矩阵,通过和另外一个需要学习的参数矩阵,对应位置相乘,再相加,得到了一个标量,一个实数值。
逻辑上如下图所示:
PNN*
如果Product Layer同时使用内积 外积,把内积和外积的结果拼接起来,就得到PNN*。
总结
PNN从FM和FNN的角度出发,提出利用内积或者外积来学习高阶的非线性特征
代码语言:javascript复制PNN中如果采用内积操作,那么嵌入向量两两组合每对组合都得到一个实数值。如果后面隐藏层的权重矩阵W全是1的话,那么PNN就变成了FM。
PNN使用外积操作得到的是一个二维矩阵,需要学得一个与之对应的二维矩阵,通过和一个矩阵对应位置相乘在相加,就把这些二维外积矩阵转换成了一个实数值。
OPNN的实现代码中利用了公式进行了转换,稍微降低了复杂度。
假设两个嵌入向量,列向量U,V。UV的外积结果为二维矩阵。外积与参数矩阵W相乘,相当于对u经过w矩阵投影,在投影空间中与v计算内积。