今天的博客主要参考了2019年KDD会议上的paper《Pairwise Multi-Layer Nets for Learning Distributed Representation of Multi-field Categorical Data》。这篇paper主要针对输入源数据为多个领域的类别特征(且每个领域的特征都有多种取值),设计了一种巧妙的提取特征之间交互信息的结构,并在正式训练任务之前提出了一种预训练模型的方式。这篇paper提出的模型属于结构并不复杂,但是思想确很巧妙的类型,还是很值得学习的。
首先,整个模型的架构图如下所示:

可以看到和一般的神经网络不一样,该网络以特征之间pairwise的方式进行输入特征Embedding之间全部的两两交叉组合,文中作者给出了3种交叉方式:1 fsum(ci,cj)=ci+cjf^{sum}(c_i,c_j)=c_i+c_jfsum(ci,cj)=ci+cj;2 fmul(ci,cj)=ci⨀cjf^{mul}(c_i,c_j)=c_i \bigodot c_jfmul(ci,cj)=ci⨀cj; 3 fhighway(ci,cj)=τ⨀g(WH(ci+cj)+bH)+(1−τ)⨀(ci+cj)f^{highway}(c_i,c_j)=\tau \bigodot g(W_H(c_i+c_j)+b_H)+(1-\tau) \bigodot (c_i+c_j)fhighway(ci,cj)=τ⨀g(WH(ci+cj)+bH)+(1−τ)⨀(ci+cj),τ=σ(Wτ(ci+cj)+bτ)\tau=\sigma (W_\tau (c_i+c_j)+b_\tau)τ=σ(Wτ(ci+cj)+bτ)。假设输入特征的field个数为n,那么交叉之后的交叉field Embedding个数则为n∗(n−1)2\frac{n*(n-1)}{2}2n∗(n−1),接下来就是k-max pooling操作,从这些交叉field Embedding中选出模最大的k个,然后输入到下一层。从图中可以看出,每一层都经历了相同的操作,最后接到了输出层,这样多层的变换,使模型可以提取到更高阶的交互信息。由于是pairwise的方式进行训练,其中共现性的思想和Aprior思想又不谋而合,到这里其实整个模型的操作流程已经讲完了。
下面要重点讲一下作者巧妙设计的无监督预训练策略,如下图所示:

模型的训练目标是预测当前样本是真样本还是随机生成的样本,那么如何随机生成Fake sample呢?其实很简单,就是随机的去把某一个或某几个field的值替换成其他值,比方说有一个真样本(a1,b2,c3,d4)(a_1,b_2,c_3,d_4)(a1,b2,c3,d4),如果把第一维a1a_1a1和第二维b2b_2b2随机替换掉,就变成了(a3,b1,c3,d4)(a_3,b_1,c_3,d_4)(a3,b1,c3,d4),那么这个被随机替换了的就是负样本。这样先采用生成一些负样本,和原来数据中的正样本进行输入field Embedding的预训练过程,然后再把预训练后的模型参数针对目标下游任务进行fine-tuning。
作者在多个推荐数据集上进行了验证,和直接把输入field Embedding 向量拼接以及对输入field 向量sum-pooling操作进行比较,证明了这种结构的有效性。同时作者发现多层次的变换,更有利于模型提取到特征之间的高阶交叉信息,对最终效果的提升帮助是很大的。
13万+

被折叠的 条评论
为什么被折叠?



