第 32 题:FFM(Field-aware FM)的field划分策略,内存爆炸的缓解方案?
题目
FFM(Field-aware FM)的field划分策略,内存爆炸的缓解方案?
完整讲解
一、FFM 的 field 划分策略
在 FFM(Field-aware Factorization Machines)里,每个特征不仅有一个 id,还属于一个 field(域)。例如「年龄」「性别」「城市」分别是三个 field;同一 field 内可能有多维 one-hot 或一个标量。划分原则通常有两条:
- 业务语义:同一语义单元划为一个 field(如「用户画像」「物品属性」「上下文」各成 field),这样同一 field 内特征共享「域内」的隐向量空间,不同 field 之间用「域对」专属的隐向量建模交互,更细粒度。
- 离散/连续与基数:有时会把高基数 categorical 单独成 field、低基数或连续特征合并或单独成 field,在参数量与表达能力之间做折中。
形式上,FFM 的二阶项写成:特征 $i$ 属于 field $f_i$,特征 $j$ 属于 field $f_j$ 时,用与 field 对 $(f_i, f_j)$ 相关的隐向量 $\boldsymbol{v}{i,f_j}$ 和 $\boldsymbol{v}{j,f_i}$ 做内积:
\(\phi^{(2)} = \sum_{i=1}^{n}\sum_{j=i+1}^{n} \langle \boldsymbol{v}_{i,f_j}, \boldsymbol{v}_{j,f_i} \rangle x_i x_j.\)
也就是说,每个特征在「与不同 field 交互」时使用不同的隐向量,所以参数量从 FM 的 $n \cdot k$ 变成 $n \cdot F \cdot k$($F$ 为 field 个数)。
二、为什么容易「内存爆炸」
- 参数量:$n$ 个特征 × $F$ 个 field × $k$ 维 ≈ $n F k$。当 field 数 $F$ 较大(例如几十个)、特征数 $n$ 也大时,参数量会远大于 FM 的 $nk$,显存与模型体积都容易爆。
- 计算量:要枚举所有 $(i,j)$ 并查 $\boldsymbol{v}{i,f_j}$、$\boldsymbol{v}{j,f_i}$,实现上通常也按二阶展开写,和参数量同量级地放大。
三、缓解方案
- 控制 field 数量:不要过细拆分,把语义相近的 feature 合并到同一 field,使 $F$ 从几十降到十几或更少。
- 降低隐向量维度 $k$:FFM 里 $k$ 往往比 FM 设得小(如 4~8),用较小 $k$ 换更多 field 感知能力。
- 共享部分 field 隐向量:对部分 field 对不单独学 $\boldsymbol{v}_{i,f_j}$,而是复用 FM 式的单向量 $\boldsymbol{v}_i$,做成 FFM 与 FM 的混合,减少 $n F k$。
- 用 FFM 做离线/蒸馏、线上用 FM 或更小模型:训练用 FFM 学细粒度交互,线上用 FM、DeepFM 等少参数模型做推理,缓解部署侧内存与延迟。
- 正则与早停:FFM 易过拟合,强 L2 或 early stopping 可控制有效参数量,间接缓解「大模型」带来的内存与过拟合问题。
面试要点
- 能说清 FFM 的 field 含义:按业务语义或特征类型划分,同一 field 内特征共享「与某域交互」的隐向量。
- 能写出 FFM 二阶形式 $\langle \boldsymbol{v}{i,f_j}, \boldsymbol{v}{j,f_i} \rangle$,并说明参数量为 $n \cdot F \cdot k$,相对 FM 的 $nk$ 易爆炸。
- 能列举 2~3 种缓解方式:减少 field 数、减小 $k$、部分共享隐向量、离线 FFM+线上轻量模型、正则/早停。
记忆要点
- FFM:按 field 划分;$w_{ij}$ 用 $\boldsymbol{v}{i,f_j}$ 与 $\boldsymbol{v}{j,f_i}$,参数量 $nFk$。
- 内存爆炸主因:$F$、$n$ 大导致 $nFk$ 远大于 FM。
- 缓解:减 field、减 $k$、部分共享、离线 FFM 线上轻量、强正则/早停。