本人才疏学浅,不足之处欢迎大家指出和交流。
今天要分享的是极深因子分解机模型(XDeepFM)。未闻其声先见其名:
可能我们现在有两个问题,一是为何它叫极深因子分解机(深在哪),二是和DeepFM有何关系?下面我们一起走进模型细节来看看吧。
原文:《xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems》
1、背景
数据特点就不再说明了,有兴趣的同学翻下专栏前面的文章。首先看到XDeepFM这个名字很容易联想到17年华为提出的DeepFM。但正如上一篇所提到的,这篇论文其实是针对DCN进行改进的,感兴趣的同学可以先看下上一篇介绍DCN的文章。
DCN中我们可以看到,它的Cross层接在Embedding层之后,虽然可以显示自动构造高阶特征,但特征交互是发生在元素级(bit-wise)而非特征向量级(vector-wise)。这里先简单介绍下bit-wise与vector-wise;显式特征交互和隐式特征交互两组概念:
bit-wise与vector-wise:假设隐向量的维度为3维,如果两个特征对应的向量分别为(a1,b1,c1)和(a2,b2,c2)的话,在进行交互时,交互的形式类似于f(w1∗a1∗a2,w2∗b1∗b2,w3∗c1∗c2) 的话,此时我们认为特征交互是发生在元素级(bit-wise)上。如果特征交互形式类似于f(w∗(a1∗a2,b1∗b2,c1∗c2)) 的话,那么我们认为特征交互是发生在特征向量级(vector-wise)。
显式的特征交互和隐式的特征交互:以两个特征为例xi和xj,在经过一系列变换后,我们可以表示成 wij∗(xi∗xj) 的形式,就可以认为是显式特征交互,否则的话,是隐式的特征交互。
例如,Age Field对应嵌入向量
2、XDeepFM
2.1、DCN的不足
xDeepFM主要是针对DCN的改进,论文中指出了DCN的缺点(为何我们前面说DCN的特征交叉是元素级别的呢,下面给出说明),提出了更有效的解决办法,作者称之为CIN结构。
我们来回顾下DCN的结构如下:
◆ 首先将数据进行embedding和stacking,输入到Cross网络和Deep网络中;然后将两个网络的输出融合得到输出。
◆ DCN中对Cross网络的设置有如下公式:
◆ 简化这个公式,去掉偏置项,可以得到:
◆ 对于x1,有如下公式:
◆ 合并可得到:
◆ 其中 实际上是关于 X₀ 的一个线性回归函数,也就是得到的一个标量,不断递推到Xi+1有:
实际上,a(i+1)仍是一个标量,就相当于让 X₀ 不断乘上一个数。
这一步我们就可以明显地看出了:DCN的特征交互是发生在元素级(bit-wise)而不是特征向量之间(vector-wise),这一点违背了因子分解机的初衷。
2.2、提出CIN(Compressed Interaction Network)
于是,论文中提出了一种叫做CIN的结构,CIN应用向量维度,而不再是之前DCN模型的标量。如上图所示,CIN层的输入来自Embedding层,假设有m个field,每个field的embedding vector维度为D,则输入可表示为矩阵X₀(m*D);
具体的来说,CIN的第K层的每个vector的计算公式为:
其中W矩阵表示第K层的第h个vector的权重矩阵,○ 表示哈达玛乘积,即逐元素乘,例如
这样一看其实这种计算方式还是挺简单的,论文中还给出了从CNN角度来给出了分析:
(3) 图(c)给出了CIN的整体结构,中间部分相当于是不同深度的图(b),对于生成的每个feature map都进行sum pooling,求和会将特征进行叠加。 从而实现输出单元可以得到不同阶数的特征交互模式。CIN的结构与RNN是很类似的,即每一层的状态是由前一层隐层的值与一个额外的输入数据计算所得。
2.3、为何是CIN
2.4、复杂度分析:
假设CIN和DNN每层神经元/向量个数都为H,网络深度为T 。那么CIN的参数空间复杂度为O(mTH²),普通的DNN为O(mDH+TH²),CIN的空间复杂度与输入维度 D 无关。
CIN的时间复杂度显然更高,按照上面分析的计算方式为O(mDTH²),而DNN为O(mDH+TH²),时间复杂度会是CIN的一个主要弱点。
3、总结(具体的对比实验和实现细节等请参阅原论文)
xDeepFM将基于Field的vector-wise思想引入Cross,并且保留了Cross的优势,实验效果也提升明显。极深的意义就在于xDeepFm就真正做到了FM高阶交叉后的”Deep” Factorization Machine。
xDeepFM的时间复杂度较高,未来能持续改进它的性能,才能被应用在大规模计算任务中(工业界落地)。
实现XDeepFM的源码,请参考原论文作者开源的代码:github