FM和FFM的知识总结(特征组合、公式化简、FM与FFM之间的联系与区别)

本文深入探讨了FM(Factorization Machine)和FFM(Field-aware Factorization Machine)模型,旨在解决稀疏数据的特征组合问题。FM通过分解特征组合参数为隐向量的内积,降低模型复杂度,而FFM则引入域概念,让隐向量与特征所属域相关,进一步优化特征交互。内容涵盖了模型公式、优缺点以及FFM在处理样本归一化和零值特征方面的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FM


参考链接:

点击率预估算法:FM与FFM

读论文:FFM

FM–2010–论文

FFM–2014–论文

FM在特征组合中的应用

FFM原理及公式推导


是2010年Stedden Rendle提出的,目的是解决稀疏数据的特征组合问题。

逻辑回归

公式1
y = w 0 + ∑ i = 1 n w i x i y=w_{0}+\sum_{i=1}^{n} w_{i} x_{i} y=w0+i=1nwixi
w 0 , w i w_{0},w_{i} w0,wi 是参数, n n n表示数据总量, x i x_{i} xi表示某条数据。

二阶多项式模型(Poly2模型)

公式2
y ^ ( x ) = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n w i j x i x j \hat{y}(\mathbf{x})=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n} w_{i j} x_{i} x_{j} y^(x)=w0+i=1nwixi+i=1nj=i+1nwijxixj
一次项有 n + 1 n+1 n+1个,二次项(即组合特征的参数)共有
d ( d − 1 ) 2 \frac{d(d-1)}{2} 2d(d1),而参数与参数之间彼此独立,在稀疏场景下,二次项的训练是很困难的。因为要训练 w i j w_{ij} wij,需要大量的 x i x_{i} xi x j x_{j} xj都非0的样本(只有非0组合才有意义)。而样本本身是稀疏的,满 x i x j ≠ 0 x_{i} x_{j} \neq 0 xixj̸=0的样本会非常少,那么样本少就难以估计参数 w i j w_{ij} wij,训练出来的模型容易过拟合。

为了缓解上述问题,Rendle在2010提出了FM模型,它可以缓解公式2,特定如下:

  • FM模型可以在非常稀疏的情况下进行参数估计
  • FM模型是线性时间复杂度的,可以直接使用原问题进行求解,而且不用像SVM一样依赖支持向量。
  • FM模型是一个通用的模型,其训练数据的特征取值可以是任意实数。
    ###对参数 W i j W_{ij} Wij进行分解

公式3
y ^ ( x ) = w 0 + ∑ i = 1 d w i x i + ∑ i = 1 d ∑ j = i + 1 d ( v i ⋅ v j ) x i x j \hat{y}(\mathbf{x})=w_{0}+\sum_{i=1}^{d} w_{i} x_{i}+\sum_{i=1}^{d} \sum_{j=i+1}^{d}\left(\mathbf{v}_{i} \cdot \mathbf{v}_{j}\right) x_{i} x_{j} y^(x)=w0+i=1dwixi+i=1dj=i+1d(vivj)xixj
其中 v i v_{i} vi是第 i i i维特征的隐向量,其长度为 k ( k &lt; &lt; n ) k(k&lt;&lt;n) k(k<<n) , ( v i ⋅ v j ) \left(\mathbf{v}_{i} \cdot \mathbf{v}_{j}\right) (vivj) 为内积,其乘积为原来 w i j w_{ij} wij, 也就是
w ^ i j = ( v i ⋅ v j ) = ∑ f = 1 k v i , f ⋅ v j , f \hat{w}_{i j}=\left(\mathbf{v}_{i} \cdot\mathbf{v}_{j}\right)=\sum_{f=1}^{k} v_{i, f} \cdot v_{j, f} w^ij=(vivj)=f=1kvi,fvj,f

w i j w_{ij} wij进行分解,使得不同的特征对不再是完全独立的,而它们的关联性可以用隐式因子表示,这将使得有更多的数据可以用于模型参数的学习。比如 x i x_i xi, x j x_j xj x i x_i xi, x k x_k xk 的参数分别为: ⟨ v i , v j ⟩ ⟨v_i,v_j⟩ vi,vj ⟨ v i , v k ⟩ ⟨v_i,v_k⟩ vi,vk,它们都可以用来学习 v i v_i vi,更一般的,包含 x i x j ≠ 0 &amp; i ≠ j x_{i} x_{j} \neq 0 \&amp; i \neq j xixj̸=0&i̸=j的所有样本都能用来学习 v i v_i vi,很大程度上避免了数据稀疏性的影响。

时间复杂度O( k d 2 kd^2 kd2)—>O( k d kd kd</

### FFM 中特征融合模块的实现原理 FFM(Field-aware Factorization Machine)的核心在于其引入了 **领域感知机制** 来改进传统 FM 的不足。具体来说,在 FFM 中,每个特征不仅其对应的向量有关,还依赖于它所属的字段以及另一个参交互的字段。 #### 1. 基础概念 在 FFM 模型中,假设输入数据由多个字段组成,例如用户的性别、年龄、职业等属于不同的字段。对于每一个特征 \( (i, j) \),其中 \( i \) 表示该特征本身,\( j \) 表示当前正在计算交叉项的目标字段,则会为其分配一个特定的嵌入向量 \( v_{ij} \)[^1]。这意味着同一特征在其他不同字段交互时可以有不同的表示形式。 #### 2. 数学表达式 FFM 的预测值可以通过如下公式描述: \[ y(x) = w_0 + \sum_{i=1}^{n}{w_i x_i} + \sum_{i=1}^{n}\sum_{j=i+1}^{m}{<v_{(f(i), f(j))}, v_{(f(j), f(i))}>x_ix_j} \] 这里, - \( n \): 输入样本中的总特征数; - \( m \): 字段总数; - \( f(k) \): 返回第 k 个特征所在的字段编号; - \( <., .> \): 向量内积运算; 上述公式的第三部分即代表了两个特征之间基于它们各自所在字段的不同而产生的个性化交互效果[^3]。 #### 3. 特征融合过程详解 当构建 FFM 模型时,特征融合发生在以下几个阶段: - **初始化阶段**: 对于每一对可能发生的跨字段交互组合 (\(f(i)\), \(f(j)\)), 初始化一组独立的学习参数作为对应位置上的潜在空间表示。 - **训练阶段**: 使用梯度下降法或其他优化方法调整这些权重使得损失函数最小化。由于每个交互都有专属的一套参数集,因此能更精确地拟合复杂模式下的非线性关系。 - **推理阶段**: 给定新的测试实例后,按照前述公式逐项累加得到最终输出得分。 这种设计允许模型更加灵活地处理来自不同类型源的数据,并且理论上可以获得比标准版 FM 更优的表现因为考虑到更多维度的信息差异性[^2]。 ```python import numpy as np class FieldAwareFactorizationMachine: def __init__(self, num_features, num_fields, embedding_dim): self.num_features = num_features self.num_fields = num_fields self.embedding_dim = embedding_dim # Initialize embeddings per field pair interaction. self.embeddings = { (fi,fj):np.random.randn(embedding_dim) for fi in range(num_fields) for fj in range(num_fields)} def predict(self,X): predictions=[] for xi in X: pred_sum=0 for idx_fi,(feature_value,field_idx)in enumerate(xi.items()): for feature_prime,value_prime,field_prime in list(xi.items())[idx_fi:]: if feature_value !=0 and value_prime!=0 : vi=self.embeddings[(field_idx,field_prime)] vj=self.embeddings[(field_prime,field_idx)] pred_sum+=vi@vj*feature_value*value_prime predictions.append(pred_sum) return np.array(predictions) # Example usage omitted due to complexity of dataset setup required here... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值