之前记录了FM,大概在座的各位已经想到后面会聊DeepFM,纵然FM到DeepFM中间隔了众多经典算法,为了照顾直觉上的感受,还是说下DeepFM。

DeepFM也是一种wide&deep形式的模型,模型同时考虑低阶和高阶的特征组合,FM部分负责低阶的特征组合,deep部分负责高阶特征组合。

1.总结构

来自原论文

相信这个图你也看吐了,于是我们还是重新画一下吧..

这样看起来有没有很清晰~~简直清晰到家了~~~非常稀疏的高纬特征$x$输入到模型,Embedding层他们处理成稠密的低纬特征$D$,之后送入FM部分和Deep部分,这样FM部分输出的结果: 

$$out_{FM} = FM(D)$$

Deep部分的输出:

$$out_{Deep} = Deep(D)$$

模型最终的输出

$$out = out_{FM} + out_{Deep}$$

整个模型的参数,包括Embedding层的weights是一起更新,大概因为Embedding层不光得考虑底阶的特征组合,还得考虑高阶的,所以会有更好的特征表达。

2.输入层+Embedding层

输入层是onehot的特征,每个颜色表示一个field,这个field中的每维数据只跟上面Embedding层的对应field的神经元链接,全链接操作。这样,每个field都会embedding到一个固定长度的向量,这个向量的长度在FM中标记为$k$。

绿色的特征只跟绿色的神经元链接~绿色神经元输出的4个值就是绿色这个field的Embedding向量。

我们看下这个神经元的操作:

这绿色,还真是生机盎然的颜色~ 绿油油的,深绿色那个是1,其他浅绿色都是0,所以这个神经元只有$w_6$留下了,之后其他三个绿色神经元也只有他们的$w_6$留下。

按照这个思路实际上,每个field中只有一个为1的参与实际运算,其他都是打酱油的,于是我们很多model的Input到Embedding代码实现,是直接使用框架的Lookup Table,比如[pytorch的Embedding层]。

如果使用torch.nn.Embedding来实现,还节省了将类别特征onehot的操作,框架直接随机生成$\text{field_length} \times k$的矩阵,这个矩阵可以可以看作是embedding层$k$个绿色的神经元所有weights组成的矩阵。打个比方,城市有600纬,我们希望Embedding到5纬的稠密向量,直接会生成$600 \times 5$的weights矩阵,如果北京的编号是1那就直接返回weights的第一列向量,这个向量就是北京的向量表达。在之后的FM层和Deep层,北京这个城市特征就以5维的向量参与运算。

3.FM层

FM层的实现上篇文章聊过了,特征都被onehot过了,每个field都变成了一个$k$纬的向量,上图中就是每个field对应的$k$个神经元,这$k$个神经元输出的就是当前的$V_i$,因为特征值本身就是1,所以$\left \langle V_i, V_j \right \rangle x_ix_j$,就只有向量内积部分了。所以特征到FM的过程可以简述如下:

从每个field对应的lookup table里,找到样本中每个field对应的那一列,组成一个矩阵,这个矩阵就是FM中的$V \in R^{\text{fl}\times k}$,其中$\text{fl}$是多少个field,之后执行FM的二阶组合部分的操作。简化之后的操作流程是对矩阵$V$按行加和平方,减去对矩阵$V$平方加和,FM层的数学表达:

$$y_{FM} = \left \langle w,x \right \rangle + \sum_{j_1=1}^{d}\sum_{j_2=j_1+1}^{d} \left \langle V_i, V_j \right \rangle x_{j1}x_{j2}$$

4.Deep层

Deep层是一个比较简单的潜亏神经网络,用来学习高阶的特征组合,从embedding出来的$\text{field_length} \times k$个神经元直接链接到后续的Deep层。但是这$\text{field_length} \times k$个神经元其实是隶属于不同的fields,进入后续Deep Network阶段后,隶属于同一个field的多个神经元彼此间也会参与特征组合,直觉上看这是很不合理的,18年微软提出的xDeepFM对这一部分进行了修改。

原文说这里有两个比较好玩的地方:

  1. while the lengths of different input field vectors can be different, their embeddings are of the same size (k);
  2. the latent feature vectors ($V$) in FM now server as network weights which are learned and used to compress the input field vectors to the embedding vectors.

不同field都被embedding到相同长度的向量中,这样做的好处是模型结构比较统一,各层链接没有复杂的机构,但是也限制了field的表达。FM的隐特征向量$V$是从网络里直接学到的,它也负责将输入的超级稀疏的高纬特征变成稠密的向量(embedding)。

5.总结(熟读并背诵)

DeepFM trains a deep component and an FM component jointly. It gains performance improvement from these advantages: 1) it does not need any pre-training;2) it learns both high- and low-order feature interactions; 3) it introduces a sharing strategy of feature embedding to avoid feature engineering. 

按照原论文的说法,DeepFM的优势是可以实现end-to-end的训练,不用对特征进行额外处理。而且,FM部分和Deep部分共享输入,可以更有效的训练,但是为什么就有效了呢?这大概还是因为Embedding层学习的好,对特征的表达更靠谱。

就因为同时从原始特征里面获取高阶低阶的特征组合,就更有效了?还真是,在原文实验部分给出了不共享输入的情况,把wide & deep的LR换成了FM,从给定的效果看,共享输入确实要更好,直接用FM替换LR的wide&deep模型效果还不如不替换的好,下图中FM&DNN就是刚才说不共享输入的情况。

参考文献:Huifeng Guo, Ruiming Tang, et al. 2017. DeepFM: A Factorization-Machine based Neural Network for CTR Prediction. In Proceedings of the 26th International Joint Conference on Artificial Intelligence. 1725–1731.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注