推荐系统 - FM模型原理和实践

2024-02-26 05:18

本文主要是介绍推荐系统 - FM模型原理和实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文收录在推荐系统专栏,专栏系统化的整理推荐系统相关的算法和框架,并记录了相关实践经验,所有代码都已整理至推荐算法实战集合(hub-recsys)。

目录

一. FM概述

二. FM原理

2.1 模型推导

2.2 模型求解

三. FM实战


一. FM概述

FM(Factorization Machines,因子分解机),简称FM模型,由Steffen Rendle于2010年在ICDM上提出。FM模型是一种通用的预测方法,主要有以下的特点和优势,基于此在推荐系统和计算广告领域[如: CTR预估(click-through rate)]具备良好的表现。

  1. 特征组合:FM实现了二阶特征交叉,无需人工也非像MLP结构是种低效率地捕获特征组合的结构。
  2. 引入隐向量:极大地减少模型参数,增强模型泛化能力,稀疏数据可学习。
  3. 线性复杂度:通过公式的转化,实现线性计算复杂度。

二. FM原理

2.1 模型推导

在正式引入FM之前,LR模型是CTR预估领域早期最成功的模型 —“线性模型+人工特征组合引入非线性”的模式。具有简单方便易解释容易上规模等诸多好处。

实际应用的场景中,大量的特征是关联的。然而线性模型是假设特征相互独立,并没有考虑到特征与特征之间的相互关系,LR中只能依靠人工特征交叉,效率不高,能否在模型层面引入特征组合的能力?

我们采用多项式模型,用来表述特征间的相关性,在多项式模型中,特征xi与xj的组合用xixj表示。为了简单起见,我们讨论二阶多项式模型。具体的模型表达式如上所示,n表示样本的特征数量,xi表示第i个特征。然而上述的多项式模型存在以下缺点:

  • 参数规模复杂,组合部分的特征相关参数共有n(n−1)/2个。
  • 由于数据稀缺,满足xi,xj都不为0的情况非常少,这样将导致ωij无法通过训练得出。

为了解决上述的多项式模型的缺点,可以对二阶项参数施加某种限制,减少模型参数的自由度。FM 施加的限制是要求二阶项系数矩阵是低秩的,能够分解为低秩矩阵的乘积:

以上就是FM模型的表达式。k是超参数,即lantent vector的维度,可以设置较少的k值(一般设置在100以内,k<<n),就将参数个数减少到 kn,极大地减少模型参数,增强模型泛化能力。然而上式如果要计算的话,时间复杂度是O(kn2), 可以通过如下方式化简。

上式为FM的最终结果,接下来我们需要对FM的模型参数求解。

 

2.2 模型求解

在获得FM的模型方程后,根据不同的应用,FM可以采用不同的损失函数loss function来作为优化目标:

  • 如回归Regression:y^(x)直接作为预测值,损失函数可以采用least square error;
  • 二值分类Binary Classification:y^(x)需转化为二值标签,如0,1。损失函数可以采用hinge loss或logit loss;
  • 排序Rank:x可能需要转化为pair-wise的形式如(X^a,X^b),损失函数可以采用pairwise loss。

然后对模型进行训练,目前FM的学习算法主要包括以下三种:

  1. 随机梯度下降法(Stochastic Gradient Descent, SGD)
  2. 交替最小二乘法(Alternating Least Square Method,ALS)
  3. 马尔科夫链蒙特卡罗法(Markov Chain Monte Carlo,MCMC)

随机梯度下降的方法来求解,如下:

最终的模型求解和得带如下所示,主要超参数有:初始化参数、学习率、正则化稀疏

FM和MF的关系?

本质上,MF模型是FM模型的特例,MF可以被认为是只有User ID 和Item ID这两个特征Fields的FM模型,MF将这两类特征通过矩阵分解,来达到将这两类特征embedding化表达的目的。而FM则可以看作是MF模型的进一步拓展,除了User ID和Item ID这两类特征外,很多其它类型的特征,都可以进一步融入FM模型里,它将所有这些特征转化为embedding低维向量表达,并计算任意两个特征embedding的内积,就是特征组合的权重。

FM继承了MF的特征embedding化表达这个优点,同时引入了更多Side information作为特征,将更多特征及Side information embedding化融入FM模型中。所以很明显FM模型更灵活,能适应更多场合的应用范围。

 

三. FM实战

利用movieLen和基于随机梯度下降的方法来实现FM算法,梯度下降的关键代码如下所示。

def _sgd_theta_step(self, x_data_ptr, x_ind_ptr, xnnz, y):mult = 0.0w0 = self.w0w = self.wv = self.vgrad_w = self.grad_wgrad_v = self.grad_vlearning_rate = self.learning_ratereg_0 = self.reg_0reg_w = self.reg_wreg_v = self.reg_vp = self._predict_instance(x_data_ptr, x_ind_ptr, xnnz)if self.task == "regression":p = min(self.max_target, p)p = max(self.min_target, p)mult = 2 * (p - y);else:mult = y * ((1.0 / (1.0 + math.exp(-y * p))) - 1.0)# Update global biasif self.k0:grad_0 = multw0 -= learning_rate * (grad_0 + 2 * reg_0 * w0)# Update feature biasesif self.k1:for i in range(xnnz):feature = x_ind_ptr[i]grad_w[feature] = mult * x_data_ptr[i]w[feature] -= learning_rate * (grad_w[feature]+ 2 * reg_w * w[feature])# Update feature factor vectorsfor f in range(self.num_factors):for i in range(xnnz):feature = x_ind_ptr[i]grad_v[f, feature] = mult * (x_data_ptr[i] * (self.sum[f] - v[f, feature] * x_data_ptr[i]))v[f, feature] -= learning_rate * (grad_v[f, feature] + 2 * reg_v[f] * v[f, feature])

完整的实现代码:https://github.com/hxyue/hub-recsys

 

这篇关于推荐系统 - FM模型原理和实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/747795

相关文章

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并