因子分解机(Factorization Machines)算法的原理与计算过程
字数 1413 2025-10-31 18:33:05
因子分解机(Factorization Machines)算法的原理与计算过程
题目描述
因子分解机(FM)是一种结合支持向量机优势和矩阵分解技术的监督学习算法,由Steffen Rendle于2010年提出。它通过引入特征交叉的隐向量内积来建模特征间的高阶交互,特别擅长处理高维稀疏数据(如推荐系统、CTR预估等场景)。假设我们有特征向量x ∈ R^n,FM模型能够高效地计算所有特征的一阶和二阶交互项。
算法原理详解
-
模型形式化表达
- 标准线性模型:ŷ = w₀ + Σwᵢxᵢ(只能捕捉线性关系)
- 二阶多项式模型:ŷ = w₀ + Σwᵢxᵢ + ΣΣwᵢⱼxᵢxⱼ(直接计算二阶交叉需O(n²)参数)
- FM核心创新:将交叉项权重矩阵W分解为隐向量的内积形式:
ŷ = w₀ + Σwᵢxᵢ + ΣΣ〈vᵢ, vⱼ〉xᵢxⱼ(其中vᵢ ∈ R^k为特征i的k维隐向量)
-
交叉项的计算优化
- 原始二阶项计算需O(kn²),但通过数学变换可降为O(kn):
ΣΣ〈vᵢ,vⱼ〉xᵢxⱼ = ½ΣᵢΣⱼ(〈vᵢ,vⱼ〉xᵢxⱼ)
= ½ΣᵢΣⱼ(Σf vᵢf vⱼf)xᵢxⱼ
= ½Σf[ (Σᵢ vᵢf xᵢ)² - Σᵢ vᵢf² xᵢ² ] - 推导关键:利用平方和公式将双重求和转化为先求和再平方的形式,使计算复杂度与特征数n呈线性关系。
- 原始二阶项计算需O(kn²),但通过数学变换可降为O(kn):
模型训练过程
-
参数说明
- 全局偏置w₀ ∈ R,特征权重w ∈ R^n,隐向量矩阵V ∈ R^(n×k)
- 超参数k控制交叉项的表达能力(通常取4~256)
-
损失函数设计
- 回归任务:使用均方误差 L = Σ(y - ŷ)²
- 分类任务:使用交叉熵损失 L = Σ[ y lnσ(ŷ) + (1-y) ln(1-σ(ŷ)) ](σ为sigmoid函数)
-
梯度计算与参数更新
- 以回归任务为例,求损失函数对每个参数的偏导:
∂L/∂w₀ = -2(y - ŷ)
∂L/∂wᵢ = -2(y - ŷ)xᵢ
∂L/∂vᵢf = -2(y - ŷ) · xᵢ [ Σⱼ vⱼf xⱼ - vᵢf xᵢ ] - 注意:对vᵢf求导时需利用链式法则,其中Σⱼ vⱼf xⱼ可预先计算并缓存
- 以回归任务为例,求损失函数对每个参数的偏导:
-
训练流程示例
- 输入:特征向量x,标签y,学习率η,迭代次数T
- 步骤:
- 初始化参数w₀=0, w=0, V~N(0,0.01)
- for t=1 to T:
a. 计算预测值ŷ(使用优化后的O(kn)公式)
b. 计算误差δ = y - ŷ
c. 更新w₀ ← w₀ - η·δ
d. 对每个特征i:若xᵢ≠0则更新wᵢ ← wᵢ - η·δ·xᵢ
e. 对每个特征i:若xᵢ≠0:
计算辅助向量q = Σⱼ vⱼ xⱼ(维度k)
对每个隐因子f:更新vᵢf ← vᵢf - η·δ·xᵢ(q_f - vᵢf xᵢ)
算法优势分析
- 在稀疏数据中能有效估计特征交互(即使特定组合在训练集中未出现)
- 相比多项式模型参数量从O(n²)降至O(kn)
- 与矩阵分解、SVM++等模型的统一框架(可视为带特征工程的矩阵分解)
实际应用扩展
- FFM(Field-aware FM):引入字段(field)概念,为每个特征对每个字段学习独立隐向量
- DeepFM:结合FM与深度神经网络,同时捕捉低阶和高阶特征交互
- 实践技巧:对连续特征需离散化,类别特征需one-hot编码,注意特征缩放提升训练稳定性