论文引用: Guo, Huifeng, et al. “DeepFM: a factorization-machine based neural network for CTR prediction.” arXiv preprint arXiv:1703.04247 (2017).
DeepFM 是华为诺亚实验室受 FM 和 wide & deep 模型启发,发表在 IJCAI 2017 的一个 CTR 预估模型,从国内企业的实践分享来看,其效果受到了广泛的认可。它的核心思想是将 wide & deep 网络中的 wide 层用 FM 层代替,增加了特征的二阶自动交叉能力,并且在实现上天然可以将 FM 层的 embedding 与 deep 层共享。
DeepFM 架构
随着深度网络的兴起,DNN 尤其是 MLP 的结构往往被用作非线性的特征提取器,并且取得了比较好的效果。然而文章指出,只保留特征的高阶非线性组合并不如同时保留特征的低阶组合和高阶组合效果好。这也是文章核心的出发点之一。但是 wide & deep 模型中只有特征的一阶和高阶组合,因此一些有效的的二阶/三阶组合只能靠工程师人工挖掘组合出来,放到 wide 层。这个时候 FM 模型又出场了,用它来代替 wide 层,既能保留原始特征,又能自动做原始特征的二阶组合,这样就能节省很多人工特征交叉的工作。当然对于三阶及以上特征的显式组合,还是只能靠人工做一些工作,或者用前面讲的 DCN 中的 cross 等结构去捕获。
DeepFM 的模型架构如下图所示,首先将所有的特征转成长度相同的 embedding,然后依照 FM 模型构建 FM 层,再将所有 embedding 拼接后,送到 MLP 层,最后在顶层进行拼接后,送到 LR 层,计算二分类损失。

从架构来看,DeepFM 没有什么创新的子结构,主要还是在当时提出了一个比较好的思路。下面再聊一聊模型中的一些细节处理。
特征处理
由于诺亚在应用市场推荐场景中没有使用连续特征,因此该模型也没有考虑连续特征的处理。但是实际上 FM 本身是支持连续特征的,所以如果有连续特征,应该也是需要将每一维连续特征转成一个 embedding。
对于多值的离散特征,这里有两种处理方案。一种是只考虑 field 之间的特征交叉,这种思路下,我们在生成多值离散特征的 embedding 时可以使用某种 pooling 策略,建议使用 sum pooling,因为这种情况下相当于是每个取值都与另外一维特征做了交叉;另一种是考虑所有特征取值的交叉,这种思路下,就需要将多值特征每个取值的 embedding 进行 concat,再送到 FM 层和 MLP 层。
效果测试
我测试了一下 DeepFM 每个子结构的性能(使用 pooling 策略),以只使用线性部分作为基线的话,只使用 FM 的交叉部分能够提升 $4.91\%$,只使用 MLP 部分能够提升 $9.30\%$,全部使用能够提升 $9.38\%$,从数据来看,FM 层的确能带来少量的提升。
从 DeepFM 到 DeepFFM
最后有一个小问题值得思考和讨论一下,DeepFM 使用 FM 层代替 wide 层,那能不能使用 FFM 来代替 wide 层呢?或者有没有什么类似的思路,让每个特征与其他 field 特征进行交叉的时候能够有不同的表征?
最直接的方案就是将 embedding 层进行扩展(称为 NeuralFFM $^{[1]}$),即将原来每个 field 对应一个二维的 embedding matrix,扩展为每个 field 对应一个三维的 embedding matrix,使得每个特征都对应于一个二维的 embedding matrix,在交叉时同时根据 source/target field ID 来 lookup 相应的 embedding vector,如图 2 所示。假设 field 的数量为 $m$,这种方案实际上是将 embedding 的参数量增加为原来的 $m$ 倍。这种方案貌似最早是南大在比赛中使用过,效果还不错。但是由于 embedding 层本来就已经贡献了整个模型主要的参数量,这种方案无论是在 train、store 还是 serving 都十分吃资源。

还有一种思路是使用 self-attention 的思路 $^{[2]}$,将每个 field 与其他 field 计算 attention 值,作为其他 field 对该 field 相关的权重,然后再计算加权的 pooling,作为该 field 与其他所有 field 特征的交互结果。这个方案我们在 后续介绍 AutoInt 时会再详细说明。
张俊林等人则同时采用了这两种思路,提出了 FAT-DeepFFM $^{[3]}$,即 embedding 层使用 FFM 的扩展,在交互层使用 attention 机制,如下所示。但是张俊林自己在分享中都表示这种思路尝试一下就好了 $^{[4]}$,所以这里就学习一下这种思路,不详细介绍了,大家在生产环境中还是谨慎使用。

参考文献
[1] Yang, Yi, et al.. “Neural field-aware factorization machine.” https://cs.nju.edu.cn/31/60/c1654a209248/page.htm. 2017.
[2] Song, Weiping, et al. “Autoint: Automatic feature interaction learning via self-attentive neural networks.” Proceedings of the 28th ACM International Conference on Information and Knowledge Management. 2019.
[3] Zhang, Junlin, Tongwen Huang, and Zhiqi Zhang. “FAT-DeepFFM: Field Attentive Deep Field-aware Factorization Machine.” arXiv preprint arXiv:1905.06336 (2019).
[4] 张俊林. “FFM及DeepFFM模型在推荐系统的探索.” https://zhuanlan.zhihu.com/p/67795161. 2019.