0%

FM与深度学习模型的结合

FNN

FNN(Factorization-machine supported Neural Network)可以看作是 FM 和 MLP 结合的一个早期代表模型。它的核心想法是:

  • FM 很擅长建模二阶特征交互
  • 但 FM 本身是浅层模型,表达能力有限
  • 所以可以先用 FM 学出一层有意义的 embedding,再把它交给深层网络

设输入向量为 $x$,FM 的预测形式为:

$$
\hat y_{FM} = w_0 + \sum_{i=1}^{n} w_i x_i + \sum_{i=1}^{n}\sum_{j=i+1}^{n}\langle v_i, v_j\rangle x_i x_j
$$

其中 $v_i$ 是第 $i$ 个特征对应的隐向量。

FNN 的关键不是直接使用 FM 的预测分数,而是使用 FM 学到的一阶参数和隐向量来初始化神经网络输入层。假设一个样本激活的 field 对应特征索引为 $i_1, i_2, \ldots, i_m$,那么 FNN 的输入表示可以写成:

$$
z_0 = [w_{i_1}, v_{i_1}, w_{i_2}, v_{i_2}, \ldots, w_{i_m}, v_{i_m}]
$$

随后再送入标准 MLP:

$$
z_1 = \sigma(W_1 z_0 + b_1)
$$

$$
z_2 = \sigma(W_2 z_1 + b_2)
$$

$$
\hat y = \mathrm{sigmoid}(W_L z_{L-1} + b_L)
$$

所以 FNN 的本质是:

  • 用 FM 解决稀疏特征 embedding 初始化问题
  • 用 DNN 继续学习更高阶的非线性交互

它的优点是思路自然,但缺点也很明显:

  • FM 和 DNN 往往是分阶段训练的
  • 不是一个完全端到端的结构

DeepFM

DeepFM 是 FNN 之后非常重要的一个模型。它解决的核心问题是:

  • 能不能不再先训练 FM、再训练 DNN
  • 能不能让低阶交叉和高阶交叉共享同一套 embedding,并联合训练

DeepFM 的做法是把 FM 部分和 Deep 部分并联起来。

1. FM 部分

给定输入向量 $x$,FM 部分包含一阶项和二阶项:

$$
y_{FM} = \sum_{i=1}^{n} w_i x_i + \sum_{i=1}^{n}\sum_{j=i+1}^{n}\langle v_i, v_j\rangle x_i x_j
$$

2. Deep 部分

Deep 部分把各个 field 的 embedding 拼接起来,作为 DNN 输入:

$$
a^{(0)} = [e_1, e_2, \ldots, e_m]
$$

然后通过多层感知机:

$$
a^{(l+1)} = \sigma(W^{(l)} a^{(l)} + b^{(l)})
$$

最终得到:

$$
y_{Deep} = W^{(L)} a^{(L)} + b^{(L)}
$$

3. 最终输出

DeepFM 把两部分相加后做 sigmoid:

$$
\hat y = \mathrm{sigmoid}(y_{FM} + y_{Deep})
$$

DeepFM 最关键的一点在于:

  • FM 部分和 Deep 部分共享同一套 feature embedding

因此模型可以同时学习:

  • 低阶显式特征交叉
  • 高阶隐式非线性交叉

而且是端到端训练的。

所以和 FNN 相比,DeepFM 更自然,也更实用。可以把它理解成:

  • FM 负责记住低阶组合模式
  • DNN 负责做更强的泛化

NFM

NFM(Neural Factorization Machine)可以理解成:先保留 FM 的二阶交互结构,再对这些交互做非线性建模。

它和 DeepFM 的区别在于:

  • DeepFM 的 Deep 部分直接对 embedding 拼接后建模
  • NFM 则先显式构造二阶交互表示,再把这个交互表示送入神经网络

1. Bi-Interaction Pooling

设样本激活的特征 embedding 为:

$$
e_1, e_2, \ldots, e_m
$$

NFM 的核心是 Bi-Interaction Pooling 层,其输出为:

$$
z_{BI} = \sum_{i=1}^{m}\sum_{j=i+1}^{m} x_i x_j (e_i \odot e_j)
$$

其中 $\odot$ 表示逐元素乘法。

这个式子也可以更高效地写成:

$$
z_{BI} = \frac{1}{2}\left[\left(\sum_{i=1}^{m} x_i e_i\right)^2 - \sum_{i=1}^{m}(x_i e_i)^2\right]
$$

这里平方表示按元素平方。

2. 神经网络部分

得到二阶交互向量后,再送入 MLP:

$$
h_1 = \sigma(W_1 z_{BI} + b_1)
$$

$$
h_2 = \sigma(W_2 h_1 + b_2)
$$

$$
\hat y = \mathrm{sigmoid}(w^{\top} h_L + b)
$$

NFM 的关键点在于:

  • FM 只能线性叠加各个二阶交互
  • NFM 则让“交互本身”再经过一层非线性组合

所以它比标准 FM 更强的地方在于:

  • 不只是学习哪些特征对有交互
  • 还学习这些交互之间更复杂的组合关系

AFM

AFM(Attentional Factorization Machine)是在 FM 上加入注意力机制的模型。它想解决的问题是:

  • FM 默认所有二阶特征交互的重要性相同
  • 但真实任务里,不同交互对预测结果的贡献显然不同

所以 AFM 的核心思想是:

  • 不是把所有交互简单相加
  • 而是给每个交互分配一个可学习的重要性权重

1. 二阶交互表示

先构造所有特征对的交互向量:

$$
z_{ij} = (e_i \odot e_j)x_i x_j,\quad i < j
$$

设全部交互集合为:

$$
\mathcal{P} = {z_{ij}\ |\ i < j}
$$

2. 注意力网络

对于每个交互向量 $z_{ij}$,AFM 先通过一个小的 attention network 计算打分:

$$
a’{ij} = h^{\top}\mathrm{ReLU}(W z{ij} + b)
$$

再通过 softmax 得到注意力权重:

$$
\alpha_{ij} = \frac{\exp(a’{ij})}{\sum{(p,q)\in \mathcal{P}} \exp(a’_{pq})}
$$

3. 加权汇聚与输出

所有交互向量按权重加权求和:

$$
z_{AFM} = \sum_{(i,j)\in \mathcal{P}} \alpha_{ij} z_{ij}
$$

最后得到预测:

$$
\hat y = \mathrm{sigmoid}\left(w_0 + \sum_{i=1}^{n} w_i x_i + p^{\top} z_{AFM}\right)
$$

4. AFM 的意义

AFM 相比 FM 的最大区别是:

  • FM 假设所有交互一视同仁
  • AFM 显式学习“哪一对特征交互更重要”

这带来两个直接好处:

  1. 表达能力更强,因为不同交互可以有不同权重
  2. 可解释性更好,因为可以直接观察注意力分布

如果把这四个模型放在一起看,可以得到一条很清晰的演化路线:

  • FNN:先用 FM 学 embedding,再送入 DNN
  • DeepFM:FM 和 DNN 并联,共享 embedding,端到端训练
  • NFM:先构造二阶交互向量,再用 MLP 学非线性
  • AFM:在二阶交互上加入 attention,学习不同交互的重要性