深入浅出 Factorization Machines (FM) 算法详解

6 阅读2分钟

深入浅出 Factorization Machines (FM) 算法详解

前言:在计算广告和推荐系统领域,如何处理海量稀疏数据的特征交叉(Feature Interaction)一直是个核心命题。从早期的逻辑回归(LR)到暴力的 Poly2,再到优雅的 FM(因子分解机),每一次进化都是对数据理解的一次飞跃。

本文将带你深入 FM 的底层逻辑,不仅让你看懂公式,更让你理解其背后的工程美学。


一、 起点:为什么 LR 不够用了?

在推荐系统的早期,逻辑回归 (Logistic Regression, LR) 是绝对的主力。它的公式简单直接:

y=σ(wTx+b)y = \sigma(w^T x + b)

1. LR 的“线性”局限

LR 最大的问题在于它假设特征是相互独立的。

  • 它能学到“男性用户(A)的权重”和“化妆品(B)的权重”。
  • 但它无法捕捉“男性用户 点击化妆品”这种强关联的组合信号。

如果要让 LR 学会组合特征,工程师必须人工做特征交叉(Feature Engineering),这非常耗时且难以穷尽。

2. 暴力美学的失败:Poly2 模型

为了解决这个问题,人们想出了最直接的办法:把所有特征两两相乘,作为新特征扔进模型。这就是 Poly2 模型:

y=b+wixi+wijxixjy = b + \sum w_i x_i + \sum \sum w_{ij} x_i x_j

虽然引入了 wijw_{ij} 来表示组合特征的权重,但这种方法在工业界遇到了三大“死穴”:

  1. 参数爆炸:参数量高达 O(n2)O(n^2)。亿级特征下,内存直接溢出。
  2. 稀疏特征难训练:这是最致命的。要训练 wijw_{ij},必须要有样本同时包含特征 ii 和特征 jj。在稀疏数据中,这种共现样本极少,导致 wijw_{ij} 几乎全是 0。
  3. 泛化能力差:对于没见过的特征组合,模型束手无策(权重为0)。就像图片中提到的“火锅”例子,模型无法利用“重庆人爱吃辣”的共性去推断新样本。

二、 破局:FM 的“电子词典”哲学

Factorization Machines (FM) 的横空出世,彻底解决了 Poly2 的困境。如果说 LR/Poly2 是只会死记硬背的“复读机”,那么 FM 就是一本具备推理能力的“电子词典”。

1. 核心思想:隐向量 (Latent Vector)

FM 不再直接学习一个独立的权重 wijw_{ij},而是为每个特征 ii 学习一个隐向量 ViV_i(即 Embedding)。

两个特征 iijj 交叉时的权重,由它们向量的内积决定:

wij=Vi,Vj=f=1kvi,fvj,fw_{ij} = \langle V_i, V_j \rangle = \sum_{f=1}^{k} v_{i,f} \cdot v_{j,f}

公式随之进化为:

y=b+i=1nwixi线性部分+i=1nj=i+1nVi,Vjxixj交叉部分y = b + \underbrace{\sum_{i=1}^{n} w_i x_i}_{\text{线性部分}} + \underbrace{\sum_{i=1}^{n} \sum_{j=i+1}^{n} \langle V_i, V_j \rangle x_i x_j}_{\text{交叉部分}}

2. 引入隐向量的两大优势

  • 参数量急剧下降:从 O(n2)O(n^2) 降为 O(kn)O(kn)。其中 kk 是向量维度(通常仅为几十),对于大规模稀疏数据,这是数量级的优化。

  • 解决稀疏性与泛化问题:这是 FM 的灵魂。

    • 即便训练集中从未出现过“男性+兰蔻”的组合,但只要“男性”和其他特征出现过(学到了 VV_{\text{男}}),“兰蔻”和其他特征出现过(学到了 V兰蔻V_{\text{兰蔻}}),我们就能通过 V,V兰蔻\langle V_{\text{男}}, V_{\text{兰蔻}} \rangle 计算出一个合理的权重。
    • 这利用了向量的传递性,极大避免了数据稀疏带来的影响。

三、 面试硬核:如何在 O(n)O(n) 时间内完成计算?

原始的 FM 公式中包含双重循环 ij>i\sum_{i} \sum_{j>i},理论复杂度看似是 O(kn2)O(kn^2)。如果真是这样,FM 根本无法在线上实时推理。

FM 最精彩的地方在于通过数学变换,将复杂度降到了 线性时间 O(kn)O(kn)

1. 数学推导 (The Magic Trick)

我们利用代数恒等式:ab+ac+bc=12[(a+b+c)2(a2+b2+c2)]ab+ac+bc = \frac{1}{2}[(a+b+c)^2 - (a^2+b^2+c^2)]

将交叉项展开并重写:

i=1nj=i+1nVi,Vjxixj=12f=1k[(i=1nvi,fxi)2i=1nvi,f2xi2]\sum_{i=1}^{n} \sum_{j=i+1}^{n} \langle V_i, V_j \rangle x_i x_j = \frac{1}{2} \sum_{f=1}^{k} \left[ \left( \sum_{i=1}^{n} v_{i,f} x_i \right)^2 - \sum_{i=1}^{n} v_{i,f}^2 x_i^2 \right]

2. 复杂度分析

仔细看公式右边:

  • i=1nvi,fxi\sum_{i=1}^{n} v_{i,f} x_i:只需要遍历一次所有非零特征。
  • i=1nvi,f2xi2\sum_{i=1}^{n} v_{i,f}^2 x_i^2:同样只需要遍历一次。
  • 外层还有一个 kk 的循环。

因此,总复杂度为 O(k×n)O(k \times n)。这个优化使得 FM 能够轻松应对亿级维度的特征。


四、 进阶:从 FM 到 FFM (Field-aware FM)

FM 虽然强大,但也并非完美。针对 FM 的局限性,后继者 FFM 诞生了。

1. FM 的局限

FM 对每个特征只学习一个隐向量。这导致特征缺乏“语境感”。

  • 例子:特征“ESPN”在与“Nike”(广告主)交叉时,应该表现出体育属性;但在与“USA”(地区)交叉时,应该表现出媒体属性。
  • FM 无法区分这种细微差别。

2. FFM 的改进:引入“域 (Field)”

FFM 提出:一个特征针对不同的“域”,应该有不同的隐向量。

wij=Vi,fj,Vj,fiw_{ij} = \langle V_{i, f_j}, V_{j, f_i} \rangle

  • 特征 ii 在遇到属于域 fjf_j 的特征 jj 时,使用专用向量 Vi,fjV_{i, f_j}

3. FFM 的代价 (Trade-off)

天下没有免费的午餐,FFM 虽然精度更高,但付出了巨大的代价:

  1. 时间复杂度回退:FFM 的复杂度回归到了 O(kn2)O(kn^2)

    • 原因:在 FFM 中,当 xix_i 和不同特征交叉时,前面的系数(向量)是变化的。这导致我们无法像 FM 那样提取公因式,数学优化失效。
  2. 容易过拟合:参数量扩大了 FF 倍(FF 为域的数量)。在数据稀疏场景下,过多的参数容易导致模型“学偏”,即对本质的欠拟合。


五、 总结

FM 算法是推荐系统发展史上的一个里程碑。它巧妙地结合了 SVM 的优点(处理稀疏数据)和 Factorization 模型(隐向量)的泛化能力。

  • 它通过 Embedding 化 解决了稀疏特征组合难题。
  • 它通过 数学技巧 解决了计算性能瓶颈。

即使在深度学习(Deep Learning)横行的今天,FM 的思想依然通过 DeepFM、Wide&Deep 等模型在工业界发光发热。理解 FM,就是理解现代推荐系统的基石。