1. 因子分解机(FM)概述
在推荐系统和机器学习领域,因子分解机(Factorization Machine,简称FM)是一种强大的预测模型,它通过引入特征交叉的隐向量内积来捕捉特征间的高阶交互关系。我第一次接触FM是在2015年做一个电商推荐项目时,当时为了解决传统逻辑回归模型无法有效处理稀疏特征交互的问题,尝试了这种算法,效果令人惊喜。
FM的核心价值在于它能够:
- 在特征高度稀疏的场景下(如推荐系统中的用户-物品交互)仍保持良好表现
- 以线性时间复杂度自动学习所有特征的二阶交互
- 兼容多种预测任务(回归、分类、排序等)
- 相比矩阵分解(MF)能融入更多辅助特征
2. FM的核心原理与数学推导
2.1 模型公式解析
标准FM模型的预测公式为:
ŷ(x) = w₀ + Σwᵢxᵢ + ΣΣ<vᵢ,vⱼ>xᵢxⱼ其中:
- w₀是全局偏置项
- wᵢ表示特征i的权重(一阶特征重要性)
- vᵢ∈Rᵏ是特征i的k维隐向量
- <·,·>表示向量内积
- 双重求和遍历所有特征组合(i,j)且i<j
关键点:最后的交叉项计算可以优化为O(kn)时间复杂度,这是FM能实用的关键
2.2 隐向量的物理意义
每个特征对应的隐向量vᵢ实际上是在低维空间(通常k=8~128)中对特征的一种分布式表示。当两个特征经常共同出现并对预测产生协同影响时,它们的隐向量会通过梯度下降逐渐调整到相似的方向。
举例说明:在电影推荐场景中:
- 用户"科幻迷"的隐向量可能接近[0.9, 0.2, -0.3]
- 电影"星际穿越"的隐向量可能是[0.8, 0.1, -0.4]
- 两者内积会产生较大的正值,增强推荐分数
2.3 与相关模型的对比
| 模型 | 特征交互方式 | 稀疏性处理 | 时间复杂度 |
|---|---|---|---|
| 线性回归 | 无交互 | 差 | O(n) |
| 多项式回归 | 显式所有组合 | 极差 | O(n²) |
| 矩阵分解 | 仅用户-物品交互 | 优秀 | O(k) |
| FM | 所有特征隐式交互 | 优秀 | O(kn) |
3. FM的工程实现细节
3.1 计算优化技巧
原始的双重循环交叉项计算可以优化为:
交叉项 = 0.5 * Σ(Σvᵢxᵢ)² - Σ(vᵢxᵢ)²这种变形将复杂度从O(kn²)降到O(kn),使得FM能处理百万级特征。
我在Spark上实现时还采用了以下优化:
- 对稀疏特征采用哈希技巧(Feature Hashing)
- 对连续特征进行分桶离散化
- 使用AdaGrad自适应学习率
3.2 特征工程实践
FM虽然能自动学习特征交互,但好的特征设计仍至关重要:
类别型特征:
- 必须做One-Hot编码
- 高基数特征可先做聚类分桶
- 示例:用户ID→用户聚类分组
数值型特征:
- 标准化/归一化(特别是与类别特征交叉时)
- 非线性变换(log, binning等)
- 示例:价格→log(price), price_bin
上下文特征:
- 时间(小时/星期/节假日)
- 设备类型/地理位置
- 示例:weekend=True, mobile=False
3.3 超参数调优经验
基于多个项目实践,总结出以下调优路径:
首先确定隐向量维度k:
- 从k=8开始,按2的幂次增加
- 观察验证集AUC变化
- 通常k=32~64足够
正则化配置:
- L2正则系数λ建议范围1e-6~1e-3
- 对隐向量使用更强的正则化
- 示例:λ_w=1e-4, λ_v=1e-3
学习率选择:
- 初始学习率η=0.01~0.1
- 配合学习率衰减(如每epoch衰减5%)
- 使用早停法(patience=3~5)
4. FM在推荐系统中的应用实战
4.1 电商推荐案例
在某电商平台的"猜你喜欢"场景中,我们构建了以下特征体系:
- 用户侧:历史点击/购买/浏览,人口统计,会员等级
- 商品侧:类目/品牌/价格,30天销量,好评率
- 上下文:当前时间,地理位置,设备类型
- 交互特征:用户-商品历史交互统计
经过AB测试,FM模型相比传统逻辑回归:
- CTR提升23.7%
- 转化率提升15.2%
- 推荐多样性提高18.3%
4.2 新闻推荐中的冷启动处理
针对新用户和新文章的冷启动问题,我们设计了一套混合方案:
对新用户:
- 强化人口统计特征(年龄/性别/地域)
- 使用设备信息作为代理特征
- 结合热门内容作为初始推荐
对新文章:
- 提取文本主题特征(LDA)
- 使用封面图片的视觉特征
- 关联相似文章的特征
通过FM建模,冷启动阶段的点击率比纯规则策略提高了42%。
4.3 与其他模型的融合
在实践中,FM常与其他模型组成混合系统:
FM+深度学习:
- FM负责显式特征交互
- DNN学习隐式高阶交互
- 典型代表:DeepFM, xDeepFM
FM+GBDT:
- GBDT进行特征选择/组合
- FM对生成的特征建模
- 示例:先用GBDT产出叶子节点编号作为新特征
FM+图网络:
- 图网络学习节点表示
- FM融合节点特征与其他业务特征
- 在社交推荐中效果显著
5. 常见问题与解决方案
5.1 训练不稳定问题
症状:损失函数震荡剧烈或突然变为NaN
可能原因及解决:
- 学习率过高 → 降低学习率或使用自适应优化器
- 特征尺度差异大 → 对数值特征标准化
- 存在异常值 → 检查特征分布,进行截断
- 隐向量初始化不当 → 使用Xavier/Glorot初始化
5.2 过拟合处理
当验证集指标明显低于训练集时:
增加正则化强度
- 增大λ_w和λ_v
- 对稀疏特征使用dropout
早停法(Early Stopping)
- 监控验证集loss
- patience设为3-5个epoch
减少隐向量维度k
- 从当前k值逐步减半测试
- 直到验证指标开始下降
5.3 线上服务性能优化
FM模型在线推理的优化手段:
模型压缩:
- 对隐向量做量化(FP32→INT8)
- 剪枝去除接近0的隐向量维度
预计算:
- 对静态特征预先计算部分求和项
- 实时请求只需计算动态特征部分
并行化:
- 特征分块并行计算内积
- 利用SIMD指令加速向量运算
6. 进阶技巧与最新发展
6.1 场感知FM(FFM)
Field-aware FM引入了"场"的概念,每个特征针对不同field有不同的隐向量表示。例如在广告CTR预测中:
- 特征:用户年龄、用户性别、广告主、广告类别
- 场划分:用户场、广告场、上下文场
- 每个特征在每个场有独立的隐向量
虽然表达能力更强,但FFM的参数量是FM的O(f)倍(f为field数量),需要更多数据训练。
6.2 高阶FM扩展
标准FM只考虑二阶交互,可以通过以下方式引入高阶交互:
显式高阶项:
ŷ(x) = ... + ΣΣΣ<vᵢ,vⱼ,vₖ>xᵢxⱼxₖ但计算复杂度急剧上升
神经网络扩展:
- 将FM作为底层特征交互层
- 上层叠加DNN学习高阶交互
- 如DeepFM架构
6.3 与其他技术的结合
图神经网络:
- 用GNN学习节点表示
- 将节点embedding作为FM输入特征
- 适用于社交网络推荐
强化学习:
- FM作为基础打分模型
- RL优化长期收益而非即时CTR
- 在电商场景增加GMV
多任务学习:
- 共享隐向量表示
- 同时预测CTR、停留时长、购买转化等
- 提升特征表示质量