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 显式学习“哪一对特征交互更重要”
这带来两个直接好处:
- 表达能力更强,因为不同交互可以有不同权重
- 可解释性更好,因为可以直接观察注意力分布
如果把这四个模型放在一起看,可以得到一条很清晰的演化路线:
- FNN:先用 FM 学 embedding,再送入 DNN
- DeepFM:FM 和 DNN 并联,共享 embedding,端到端训练
- NFM:先构造二阶交互向量,再用 MLP 学非线性
- AFM:在二阶交互上加入 attention,学习不同交互的重要性