推荐系统实战(一)——FM原理

本文介绍了推荐系统中用于CTR预估的FM(因子分解机)算法,讲解了FM的原理,包括正向传播、时间复杂度优化和反向传播,并简述了其Python实现。

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

在推荐系统及广告系统中,ctr预估是极其重要的一部分,解决该问题的经典模型分别为:LR、gbdt、xgboost、FM、wide&deep、deepFM、DCN、xdeepFM、DIN、DIEN、DISN。本文先介绍FM(因子分解机)算法。

一、 FM原理:

除了特征的线性组合,FM主要是引入了二阶特征交叉,通过将特征映射为隐向量,求两个特征对应的隐向量的内积完成二阶特征交叉,无需做人工的特征工程。

正向传播:

                                                 \hat{y}:=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n-1} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j}

                                                 y_{pred} = \sigma (\hat{y})

                                                 loss = -log(\sigma (y_{true}\hat{y}))

        其中,\mathbf{v}_{j}为第j个特征对应的隐向量,loss公式的解释为:sigmoid函数的loss的计算方式

时间复杂度优化:

 

### 召回 FM 算法实现与优化 #### FM算法的核心原理及其在召回中的作用 因子分解机(Factorization Machine, FM)是种高效的机器学习模型,能够在处理大规模稀疏数据时表现出色[^1]。它的核心优势在于通过引入隐向量来捕捉特征之间的交互关系,从而有效降低时间复杂度并提升预测性能。 具体来说,FM通过对二阶特征组合进行建模,利用低维嵌入空间表示特征间的相互作用[^4]。这种设计使得即使面对海量的稀疏输入数据,也能显著减少计算开销。因此,在推荐系统的召回阶段,FM可以作为种强大的工具,用于生成高质量的候选集[^5]。 --- #### 二、FM算法在召回场景下的实现流程 为了更好地理解FM如何应用于召回任务,以下是其实现的关键步骤: 1. **实时用户特征提取** 当有新的用户请求到来时,系统会动态获取该用户的上下文信息(如历史行为记录、地理位置等),并将这些信息转化为结构化的数值型特征。 2. **查询预训练好的FM模型** 借助事先训练完成的FM模型参数表,检索出对应于上述每项用户属性所关联的组潜变量权重向量。随后把这些单独得到的结果汇总起来构成最终代表当前访问者整体偏好的综合表达形式——即所谓的“用户兴趣向量”。 3. **离线物品特征准备** 对待选商品库里的每个条目预先做好相似操作:依据各自描述字段构建起相应的多维度编码体系;再经由同套机制映射至固定大小的空间坐标系里去形成各自的“物品向量”。 4. **快速匹配筛选过程** 利用矢量运算规则高效评估两者间亲密度水平,并据此排出优先顺序列表供后续进步精炼考量之需。 ```python import numpy as np def compute_user_vector(user_features, fm_model_embeddings): """ 计算用户兴趣向量 U。 参数: user_features (list): 用户特征列表。 fm_model_embeddings (dict): 预先训练好的 FM 模型 embedding 字典。 返回: ndarray: 用户兴趣向量 U。 """ u = sum(fm_model_embeddings.get(feature, np.zeros(len(list(fm_model_embeddings.values())[0]))) for feature in user_features) return u def score_items(item_vectors, user_interest_vector): """ 批量打分函数。 参数: item_vectors (ndarray): 物品向量矩阵。 user_interest_vector (ndarray): 用户兴趣向量。 返回: list: 得分 Top-K 的物品 ID 列表。 """ scores = np.dot(item_vectors, user_interest_vector.T).flatten() top_k_indices = np.argsort(-scores)[:K] return [item_ids[i] for i in top_k_indices] # 示例调用 user_features = ['feature1', 'feature2'] fm_model_embeddings = {'feature1': np.array([0.1, 0.2]), 'feature2': np.array([-0.1, 0.3])} u = compute_user_vector(user_features, fm_model_embeddings) items_matrix = np.random.rand(100, 2) # 假设存在 100 个物品 top_k_results = score_items(items_matrix, u) print(top_k_results[:10]) ``` --- #### 三、FM算法的优化策略 尽管FM本身已经具备较高的效率和灵活性,但在实际部署过程中仍可通过多种手段对其进行改进以满足更高层次的需求: - **降维技术的应用** 使用奇异值分解(SVD)或其他压缩方法对原始特征空间加以简化,既能保留重要信息又能加速后续处理速度。 - **分布式架构支持** 将整个流水线划分成多个独立模块分别运行于不同节点之上,借助集群资源共同承担负载压力的同时保持良好的扩展能力[^3]。 - **缓存机制引入** 定期更新热门项目的静态评分结果存储下来以便即时响应高频次重复查询请求,进而缓解在线服务端的压力负担。 - **混合框架搭建** 结合其他先进理念比如深度神经网络(DNNs), 构筑更加复杂的联合体方案兼顾短期效应捕捉长期趋势变化规律等方面的优势互补特性。 --- #### 四、总结 综上所述,FM不仅理论基础扎实而且实战表现优异,特别适合解决那些涉及大量零散分布样本点的问题领域。只要合理规划好各个环节细节安排再加上持续迭代完善措施跟进落实到位的话,则完全可以胜任各类个性化定制化需求场合下的精准推送使命^。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值