Factorization Machines——因式分解机

早就想总结一下这篇2010年的论文《Factorization Machines》,与其说这篇论文提出了一种新的模型不如说这篇论文提出了一种新的建模思想,适用于所有形式类似于 Y = T ( W 1 ∗ X + W i j ∗ X i ∗ X j + W i j k ∗ X i ∗ X j ∗ X K + . . . . ) Y=T(W_1*X+W_{ij}*X_i*X_j+W_{ijk}*X_i*X_j*X_K+....) Y=T(W1X+WijXiXj+WijkXiXjXK+....)的机器学习模型(X是特征, X i ∗ X j X_i*X_j XiXj值的是二阶的特征交互, W i ∗ X j ∗ X K W_i*X_j*X_K WiXjXK指的是三阶的特征交互,后面的省略号表示这里的特征交互可能会涉及到多阶,W是系数,T是激活函数(可以是线性或者非线性),如果Y的取值是离散值那么就是分类问题,如果Y的取值是连续值那么就是回归问题)。

这篇论文的最大贡献在于解决了样本特征的稀疏性问题,特别是对于二阶以上交互特征的系数来说,很可能在预测集中的有些非0交互在训练集中从来都没有出现过,这样就会对最终模型精度产生较大的影响。为了更好的解决这一问题,这里采用了一种因式分解的方式,也称之为Factorization machines。和原来的方式不同,以二阶交互特征为例,原来直接是用一个实数 W i j W_{ij} Wij来表征特性 X i X_i Xi X j X_j Xj的交互权重,在Factorization machines中,这个交互权重是由两个向量相乘做内积得到的,而这两个向量分别表示了特征 X i X_i Xi和特征 X j X_j Xj的本质属性,同样的思路,每一维属性对会拥有表征其本质信息的向量。显而易见,通过这样的方式,原来由一个实数 W i j W_{ij} Wij所表征的信息现在扩展到了两个向量,这样的好处就是即使在预测集中遇到了两个从未在训练集中出现的特征交互,但是这两个特征所对应的向量通过训练集中其他的交互得到了充分的学习,因此该问题带来的影响会被大大地消除。

还是以二阶交互特征为例,从数学角度来看,特征交互矩阵 W = V . V T W=V.V^T W=V.VT,这里的矩阵 V V V中每一列都是每一维特征所对应的属性向量。在这里有一个明显的问题就是,是不是每一个句子 W W W都可以写成是两个矩阵相乘的结果呢?这里就用到了一个数学方面的定理,只要矩阵 V V V中每个向量的维度k足够大的时候这样,那么总能够找到这样的矩阵V。

那么包含了二阶特征交互的回归模型形式为: y = w 0 + ∑ i = 1 n w i . x i + ∑ i = 1 n − 1 ∑ j = i + 1 n < v i , v j > x i x j y=w_0+\sum_{i=1}^{n}w_i.x_i+\sum_{i=1}^{n-1}\sum_{j=i+1}^n<v_i,v_j>x_ix_j y=w0+i=1nwi.xi+i=1n1j=i+1n<vi,vj>xixj,这里的 < v i , v j > <v_i,v_j> <vi,vj>表示的是内积操作。
推广到s阶的交叉项就是(设s阶属性向量维度为 k l k_l kl): ∏ i = 1 s x i ∑ f = 1 k l ∏ i = 1 s v i , f \prod_{i=1}^sx_i\sum_{f=1}^{k_l}\prod_{i=1}^{s}v_{i,f} i=1sxif=1kli=1svi,f

同样在求解的时候,采用随机梯度下降算法进行优化。整体来看FM算法并不复杂,而且是一个比较“老”的算法了,但是它其中蕴含的核心思想确十分有借鉴价值,那就是它的“因式分解”思想。在机器学习领域,如果遇到了样本稀疏的问题,我们可以尝试着对这些样本属性进行分解,把一个大部分分解为一系列小的基本单元,在上述场景中就是把特征之间的交互权重看成是大的部分,交互的权重就被分解为两个属性所对应向量的乘积,属性向量就作为了基本单元。

### 因式分解概述 因式分解Factorization Machine, FM)是一种用于预测稀疏数据集上交互效应的机器学习模型。该模型可以看作是对线性回归和支持向量的一种扩展,特别适用于处理高维稀疏特征的数据。 FM的核心在于其能够有效地捕捉不同特征之间的二阶组合关系,并且在计算这些组合项时保持较低的时间复杂度。具体来说,在给定输入变量 \( x_1, x_2, ..., x_n \) 的情况下,FM会引入隐含因子表示每个特征维度上的潜在属性\[v_j\] ,并通过内积运算来衡量任意两个特征间的相互作用强度[^4]。 #### 数学表达式 设有一个样本\(x=(x_1,x_2,...,x_f)\),其中f代表特征数量,则FM模型的一般形式如下: \[y(x)=w_0+\sum_{i=1}^{n}{w_ix_i}+\sum_{i=1}^{n}\sum_{j=i+1}^{n}<v_i,v_j>x_ix_j\] 这里, - \( w_0 \) 是全局偏置; - \( w_i \) 表示第 i 个特征对应的权重系数; - \( v_i \) 和 \( v_j \) 分别对应于第 i 和 j 特征的学习到的隐向量; 最后一部分即为所有可能配对之间交叉项之和,而<vi,vj>则指这两个向量间按元素相乘后的累加值。 #### 训练过程中的优化技巧 为了提高效率并减少过拟合风险,通常会对上述公式应用一些额外的技术手段: - **正则化**:通过对参数施加重力惩罚以防止过度拟合。 - **随梯度下降(SGD)** :利用SGD方法迭代更新权值直至收敛。 - **矩阵分解初始化**:采用预训练好的低秩近似作为初始猜测值有助于加速收敛速度。 ```python from sklearn.model_selection import train_test_split import numpy as np from fastFM import als def prepare_data(X, y): X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42) return X_train, X_test, y_train, y_test if __name__ == "__main__": # 假设有这样的X,y 数据集 X = ... y = ... fm = als.FMRegression(n_iter=1000, rank=2) X_train, X_test, y_train, y_test = prepare_data(X, y) fm.fit(X_train, y_train) predictions = fm.predict(X_test) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值