FM模型

FM(因子分解机)是一种适用于特征稀疏情况的预测方法,尤其在推荐系统和广告领域表现出色。与线性模型不同,FM考虑特征间的交叉,通过隐向量表示来建模特征交互。模型可以通过随机梯度下降进行优化,时间复杂度较低。应用包括二分类、回归和排名任务。
摘要由CSDN通过智能技术生成

  FM(Factorization Machines,因子分解机),它是一种通用的预测方法,在即使数据非常稀疏的情况下,依然能估计出可靠的参数进行预测。与传统的简单线性模型不同的是,因子分解机考虑了特征间的交叉,对所有嵌套变量交互进行建模(类似于SVM中的核函数),因此在推荐系统和计算广告领域关注的点击率CTR(click-through rate)和转化率CVR(conversion rate)两项指标上有着良好的表现。此外,FM的模型还具有可以用线性时间来计算,以及能够与许多先进的协同过滤方法(如Bias MF、svd++等)相融合等优点。

线性模型

y = w 0 + ∑ i = 1 n w i x i y = w_0 + \sum_{i=1}^nw_ix_i y=w0+i=1nwixi

  线性回归模型假设:

1.特征之间是相互独立不相关的

2.特征之间的作用是可以相互叠加的

  但现实世界中的特征难以满足这独立不相关这一点要求,比如在模型的预测中,我们需要将有的特征进行one-hot编码,比如男(0,1),女(1,0),如果特征不相关那么可能出现(1,1)这种情况,但性别没有第三种啊!

  线性模型的表现能力偏弱,无法表示非线性的模型,这使得模型只能使用在一些极为简单的场合,极大的限制了模型的使用范围。为了改进这一点,我们可以引入非线性的交叉项,这一点可以看做逻辑回归中认为的构造特征的延伸。如果我们将模型改为二阶的多项式模型

二阶多项式模型

y = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = 1 n w i , j x i x j y = w_0 + \sum_{i=1}^nw_ix_i+\sum_{i=1}^n\sum_{j=1}^nw_{i,j}x_ix_j y=w0+i=1nwixi+i=1nj=1nwi,jxixj (1)

  同时 x i x j x_ix_j xixj x j x i x_jx_i xjxi的系数是一样的,乘方项不考虑,可以简化为

y = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n 2 w i , j x i x j y = w_0 + \sum_{i=1}^nw_ix_i+\sum_{i=1}^n\sum_{j=i+1}^n2w_{i,j}x_ix_j y=w0+i=1nwixi+i=1nj=i+1n2wi,jxixj (2)

  但此时的高阶项有 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1)项,但是如果 x i x j x_ix_j xixj值为0,那么模型无法学习到其权重。

FM模型

公式推导

  考虑到任何一个实对称矩阵可以分解为两个向量内积的形式,同时 x i x j x_ix_j xixj x j x i x_jx_i xjxi的系数是一样的, w i w_i wi是一个实对称矩阵的元素。

w i , j = < v i , v j > w_{i,j}=<v_i,v_j>

DeepFM模型是一种结合了深度学习和传统的因子分解机(Factorization Machines, FMs)的推荐系统模型。它通过深度神经网络来学习特征的高阶交叉组合,同时保留了FM的线性部分,以此来捕捉特征的低阶交互。保存DeepFM模型通常包括保存模型的参数、结构以及训练过程中的状态信息,以便之后能够进行模型的加载和预测。在实际操作中,可以使用各种深度学习框架(例如TensorFlow或PyTorch)提供的模型保存和加载机制来实现这一点。 以TensorFlow为例,你可以使用`tf.train.Checkpoint`和`tf.train.CheckpointManager`来保存和管理模型的训练状态。以下是一个简单的保存流程示例: 1. 导入需要的模块: ```python import tensorflow as tf ``` 2. 定义模型结构: ```python class DeepFMModel(tf.keras.Model): # 定义DeepFM模型的结构 pass ``` 3. 创建模型实例和Checkpoint: ```python model = DeepFMModel(...) ckpt = tf.train.Checkpoint(step=tf.Variable(1), optimizer=model.optimizer, net=model) manager = tf.train.CheckpointManager(ckpt, './tf_ckpts', max_to_keep=3) ``` 4. 训练模型,并在适当的时候保存状态: ```python for example in data_loader: loss = model.train_step(example) ckpt.step.assign_add(1) if int(ckpt.step) % save_every == 0: save_path = manager.save() print(f'Saved checkpoint for step {int(ckpt.step)}: {save_path}') ``` 加载模型时,可以使用以下代码: ```python restored_model = DeepFMModel(...) ckpt.restore(manager.latest_checkpoint) if manager.latest_checkpoint: print(f'Restored from {manager.latest_checkpoint}') else: print('Initializing from scratch.') ``` 确保在保存和加载模型时,模型的结构、输入数据的预处理方式等都保持一致,以保证模型的正确加载和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值