【推荐算法】FM模型:Factorization Machines

2023-11-14

1、线性回归

在介绍FM之前,我们先简单回顾以下线性回归。

回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。通常使用曲线/直线来拟合数据点,目标是使曲线到数据点的距离差异最小。

线性回归是回归问题中的一种,线性回归假设目标值与特征之间线性相关,即满足一个多元一次方程。通过构建损失函数,来求解损失函数最小时的参数w和b。通常我们可以表达成如下公式:

\widehat{y}为预测值,自变量x和因变量y是已知的,而我们想实现的是预测新增一个x,其对应的y是多少。因此,为了构建这个函数关系,目标是通过已知数据点,求解线性模型中w和b两个参数。

求解最佳参数,需要一个标准来对结果进行衡量,为此我们需要定量化一个目标函数式,使得计算机可以在求解过程中不断地优化。针对任何模型求解问题,都是最终都是可以得到一组预测值\widehat{y},对比已有的真实值y,数据行数为n,可以将损失函数定义如下:

即预测值与真实值之间的平均的平方距离,统计中一般称其为MAE(mean square error)均方误差。把之前的函数公式代入损失函数,并且将需要求解的参数w和b看做是函数L的自变量,可得:

现在的任务是求解最小化L时w和b的值,因此核心目标优化式转化为:

该问题的求解方式有两种:

  • 最小二乘法(least square method)

求解w和b是使损失函数最小化的过程,在统计中,称为线性回归模型的最小二乘“参数估计”(parameter estimation)。我们可以将L(w,b)分别对w和b求导,得到:

令上述两式为0,可得到w和b最优解的闭式(closed-form)解:

  • 梯度下降(gradient descent)

梯度下降核心内容是对自变量进行不断的更新(针对w和b求偏导),使得目标函数不断逼近最小值的过程:

这里多说一下线性回归与逻辑回归,逻辑回归是在线性回归的基础上多了一个sigmoid变换,具体的判别模型如下:


2、FM模型

FM算法是一种基于矩阵分解的机器学习算法,是为了解决大规模稀疏数据中的特征组合问题

在传统的线性模型如LR中,每个特征都是独立的,如果需要考虑特征与特征之间的交互作用,可能需要人工对特征进行交叉组合;非线性SVM可以对特征进行kernel映射,但是在特征高度稀疏的情况下,并不能很好地进行学习;现在也有很多分解模型Factorization Model如矩阵分解MF、SVD++等,这些模型可以学习到特征之间的交互隐藏关系,但基本上每个模型都只适用于特定的输入和场景。

为此,在高度稀疏的数据场景下如推荐系统,FM(因子分解机)出现了。

FM考虑了特征之间的交互作用,并对特征进行了交叉组合。FM在线性模型的基础上添加了一个多项式,用于描述特征之间的二阶交叉(FM也支持多阶,本文以二阶FM为例)。

对于一个给定的特征向量\mathbf{x}=(x_{1}, x_{2}, ... , x_{n})^{T}线性回归的模型函数为:

其中,w_{0}\mathbf{w}=(w_{1}, w_{2}, ... , w_{n})^{T}为模型参数,特征分量x_{i}x_{j}之间是相互独立的,即\widehat{y}(\mathbf{x})中仅考虑了单个的特征分量,而没有考虑特征分量之间的关系。为了表述特征之间的相互关系,在线性模型的基础上添加一个多项式,特征x_{i}x_{j}的组合用x_{i}x_{j}表示,这里以二阶多项式模型为例,将\widehat{y}(\mathbf{x})改写为:

其中,n表示一个样本的特征的个数,两两交互可得到\frac{n*(n-1)}{2}个交叉项,即C_{n}^{2}种;w_{ij}是特征组合对应的权重,用于表征这对特征组合的重要性,多项式要学习的参数即为n*(n-1)/2个w系数

这种直接在x_{i}x_{j}前面配上一个系数w_{ij}的方式在稀疏数据中有一个很大的缺陷,即参数w_{ij}学习困难,因为对w_{ij}进行更新时,求得的梯度对应为x_{i}x_{j},当且仅当\mathbf{x}_{i}\mathbf{x}_{j}都非0时参数才会得到更新。在高度稀疏的数据场景中,由于数据量不足,样本中出现未交互的特征分量是很普遍的,也就是说能够保证\mathbf{x}_{i}\mathbf{x}_{j}都非0的组合较少,导致大部分参数w_{ij}难以得到充分训练。

为了解决这个问题,FM算法对每个特征分量xi引入了一个k维(k<<n)的辅助向量(n个特征一共n个辅助向量)

\mathbf{\mathbf{}V}_{i} = (v_{i1}, v_{i2}, ..., v_{ik})^{T} \epsilon \mathbb{R}^{k}, i = 1, 2, ... ,n

FM对每个特征学习一个大小为k的一维向量,两个特征x_{i}x_{j}的特征组合的权重值,可以通过特征对应的向量v_{i}v_{j}内积来表示。这样就可以利用向量内积v_{i}v_{j}^{T}w_{ij}求解:

于是,函数\widehat{y}(\mathbf{x})可以改写为(本文将下面的公式称为FM的计算公式):

这样要学习的参数从\frac{n*(n-1)}{2}w_{ij}系数变成了元素个数为n*k的V矩阵,因为k<<n, 所以该做法降低了训练复杂度。

将vi按行拼成一个矩阵:

这里写图片描述

 那么w_{ij}组成的交互矩阵可表示为W=V\cdot V^{T},这个表达式对应了一种矩阵分解:

这里写图片描述

这里简单解释下为什么FM的泛化能相比于SVM更强?参考下图进行说明:即使在训练数据里两个特征并未同时在训练实例里见到过,意味着\mathbf{x}_{i}\mathbf{x}_{j}一起出现的次数为0,如果换做SVM的模式,是无法学会这个特征组合的权重的。但是因为FM是学习单个特征的embedding,并不依赖某个特定的特征组合是否出现过,所以只要特征\mathbf{x}_{i}和其它任意特征组合出现过,那么就可以学习自己对应的embedding向量。于是,尽管\mathbf{x}_{i}\mathbf{x}_{j}这个特征组合没有看到过,但是在预测的时候,如果看到这个新的特征组合,因为\mathbf{x}_{i}\mathbf{x}_{j}都能学到自己对应的embedding,所以可以通过内积计算出这个新特征组合的权重。这也是FM模型泛化能力强的根本原因。

FM模型在做二阶特征组合的时候,对于每个二阶组合特征的权重,是根据对应两个特征的embedding向量内积,来作为这个组合特征重要性的指示。当训练好FM模型后,每个特征都可以学会一个特征embedding向量。

FM算法流程图(网上转载的一个Python版本的流程图)


3、FM模型复杂度分析

FM模型需要估计的参数包括:w_{0} \epsilon Rw \epsilon R^{n}V \epsilon R^{n*k},共有1+n+nk个模型参数,其中w_{0}为整体的偏置量,w为特征分量的各个分量的强度进行建模,V对特征向量中任意两个分量之间的关系进行建模。

直观上看FM的计算公式的计算复杂度为O(k*n^2):

\left \{ n + (n-1) \right \} + \left \{ \frac{n(n-1)}{2}\left [ k+(k-1)+2 \right ] + \frac{n(n-1)}{2} - 1 \right \} +2 = o(kn^{2}),其中第一个花括号对应\sum_{i=1}^{n}w_{i}x_{i}的加法和乘法操作数,第二个花括号对应\sum_{i=1}^{n-1}\sum_{j=i-1}^{n}(V_{i}^{T}V_{j})x_{i}x_{j}的加法和乘法操作数。

通过数学公式的巧妙转化一下,就可以变成O(k*n)了。转化公式如下所示,其实就是利用了2xy = (x+y)^2 – x^2 – y^2的思路。

转换之后的FM计算公式可表示为:

转换之后的计算复杂度变为:

k\left \{ \left [ n+(n-1)+1 \right ] + \left [ 3n+(n-1) \right ] + 1\right \} + (k-1) +1 = O(kn)

在高度稀疏的数据场景中,特征向量\mathbf{x}中绝大部分分量都为零,而转化后的计算公式关于i的求和只需在非0元素上进行,这样FM计算公式的复杂度就有O(k*n^2)变成了O(k*n),其中n是特征数量,k是特征的embedding size,这样就将FM模型改成了和LR类似和特征数量n成线性规模的时间复杂度了。

这样,优化之后的FM模型为:


4、FM学习算法

目前,FM的学习算法主要包括以下三种,本文只对随机梯度下降法进行简要介绍:

  • 随机梯度下降法SGD
  • 交替最小二乘法ALS
  • 马尔科夫链蒙特卡罗法MCMC

假设\Theta表示FM的所有模型参数:

对于任意的\theta \epsilon \Theta,存在两个与\theta的取值无关的函数g_{\theta }(\mathbf{x})h_{\theta}(\mathbf{x})^{*},使得下面的等式成立:

  • \theta = w_{0}时,

\widehat{y}(\mathbf{x}) ={\color{Red} \sum_{i=1}^{n}w_{i}x_{i} + \sum_{i=1}^{n-1}\sum_{j=i+1}^{n}(\mathbf{V}_{i}^{T}\mathbf{V}_{j})x_{i}x_{j}} + w_{0}*{\color{Blue} \mathbf{1}},其中红色部分为g_{\theta }(\mathbf{x}),蓝色部分为h_{\theta}(\mathbf{x})

  • \theta = w_{l} (l=1,2,...,n)时,

\widehat{y}(\mathbf{x}) = {\color{Red} w_{0} + { \sum_{i=1,i\neq l}^{n}w_{i}x_{i} + \sum_{i=1}^{n-1}\sum_{j=i+1}^{n}(\mathbf{V}_{i}^{T}\mathbf{V}_{j})x_{i}x_{j}}} + w_{l}*{\color{Blue} \mathbf{}x_{l}}

  • \theta = w_{lm}时,

在实际推导中,通常只计算h_{\theta}(\mathbf{x}),而gh_{\theta}(\mathbf{x})则利用\widehat{y}(\mathbf{x})-\theta h_{\theta }(\mathbf{x})来计算。

计算\widehat{y}(\mathbf{x})关于\theta的偏导数:

由上式可知,v_{i,f}的训练只需要样本的x_{i}特征非0即可,适合于稀疏数据。在使用SGD训练模型时,在每次迭代中,只需计算一次所有f\sum_{j=1}^{n}v_{i,f}x_{j}

FM的优化目标是整体损失函数:

对应不同的问题,比如分类、回归、排序等,这个loss函数通常有不同的选择方式,但这并不影响FM的最优化问题:

引入L2正则项,最优化问题变成,其中\lambda _{\theta }表示参数\theta的正则化系数:

SGD训练FM模型的算法流程:


5、FM总结

FM算法的优点:

  1. 将二阶交叉特征考虑进来,提高模型的表达能力;
  2. 引入隐向量,缓解了数据稀疏带来的参数难训练问题;
  3. 模型复杂度保持为线性,并且改进为高阶特征组合时,仍为线性复杂度,有利于上线应用。

FM算法的缺点:

  1. 虽然考虑了特征的交叉,但是表达能力仍然有限,不及深度模型;
  2. 同一特征xi与不同特征组合使用的都是同一隐向量vi,违反了特征与不同特征组合可发挥不同重要性的事实。

FM与SVM的区别:

FM和SVM的主要区别在于,SVM的二元特征交叉参数是独立的,如w_{ij},而FM的二元特征交叉参数是两个k维的向量vi、vj,这样子的话,<vi,vj>和<vi,vk>就不是独立的,而是相互影响的。

为什么线性SVM在和多项式SVM在稀疏条件下效果会比较差呢?线性svm只有一维特征,不能挖掘深层次的组合特征在实际预测中并没有很好的表现;而多项式svn正如前面提到的,交叉的多个特征需要在训练集上共现才能被学习到,否则该对应的参数就为0,这样对于测试集上的case而言这样的特征就失去了意义,因此在稀疏条件下,SVM表现并不能让人满意。而FM不一样,通过向量化的交叉,可以学习到不同特征之间的交互,进行提取到更深层次的抽象意义。

此外,FM和SVM的区别还体现在:

  1. FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行;
  2. FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量。

6、FFM模型简介

FFM的全称是Field-aware FM,直观翻译过来,就是能够意识到特征域(Field)的存在的FM模型。

FFM是FM的一个特例,它更细致地刻画了这个特征。首先它做了任意两个特征组合,但是区别在于,怎么刻划这个特征?FM只有一个向量,但FFM现在有两个向量,也就意味着同一个特征,要和不同的fields进行组合的时候,会用不同的embedding去组合,它的参数量更多。对于一个特征来说,原先是一个vector,现在会拓成F个vector,F是特征fields的个数,只要有跟其它特征的任意组合,就有一个vector来代表,这就是FFM的基本思想。

对于FFM的某个特征来说,会构造F个vector,来和任意其他的fields组合的时候,各自用各自的。假设模型具有n个特征,那么FM模型的参数量是n*k(暂时忽略掉一阶特征的参数),其中k是特征向量大小。而FFM模型的参数量呢?因为每个特征具有(F-1)个k维特征向量,所以它的模型参数量是(F-1)*n*k,也就是说参数量比FM模型扩充了(F-1)倍。FFM相对FM来说,参数量扩大了(F-1)倍,效果比FM好,但是要真的想把它用到现实场景中,存在着参数量太大这个问题。FFM中每个特征由FM模型的一个k维特征embedding,拓展成了(F-1)个k维特征embedding。之所以是F-1,而不是F,是因为特征不和自己组合。FM每个特征只有一个共享的embedding向量,而对于FFM的一个特征,则有(F-1)个特征embedding向量,用于和不同的特征域特征组合时使用。


7、参考博文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【推荐算法】FM模型:Factorization Machines 的相关文章

随机推荐

  • 计算机网络知识点汇总

    主要内容 基本概念 物理层 数据链路层 网络层 传输层 应用层 一 基本概念 计算机网络 按照某种协议进行数据通信 实现硬件资源和软件资源的共享 分类 分布范围 使用者 交换技术 拓扑结构 传输技术 计算机网络的体系结构 ISO OSI参考
  • @RequestParam、@PathVariable、@RequestBody、@ResponseBody注解辨析

    RequestParam RequestParam 将请求参数绑定到你控制器的方法参数上 是springmvc中接收普通参数的注解 例如 defaultValue为给name设定默认值 RequestParam中的value值必须跟http
  • UML笔记

    UML笔记 枫叶云笔记
  • GLSL-TBN矩阵

    TBN矩阵 一 简述 1 1 TBN矩阵作用 我们研究一个矩阵的时候通常需要了解一个矩阵是从哪一个空间或者说矩阵而来的 如果搜索一下TBN矩阵运算公式可以发现其决定于物体坐标系下的顶点和纹理坐标系下的纹理坐标 想到这里我们需要明确TBN运算
  • 数据库服务版本升级

    数据库版本升级方法 第一种方法 本地升级 数据库服务5 6 5 7 8 0 停库 第二种方法 迁移升级 数据库服务数据迁移到另一台新的数据库服务中 旧版数据库服务地址 10 0 0 51 网络停止 新版数据库服务地址 10 0 0 51 8
  • AR回归模型详解

    转 http geodesy blog sohu com 273714573 html 1 自回归模型的定义 自回归模型 Autoregressive Model 是用自身做回归变量的过程 即利用前期若干时刻的随机变量的线性组合来描述以后某
  • JavaJDK实现无钥签名根证书与沙箱安全机制

    1 起因 接到项目经理的需求 项目有涉及文件的上传 需要把上传的文件进行数字签名 简称无钥签名 然后对签名后的文件进行无钥验证 对于从来没有听过无钥签名的我感觉很懵 后面就去上网查数字签名是java的哪一块 得到以下结果 Java里其实有两
  • 9.1 Linux配置网络服务

    9 1 1 配置网络参数 9 1 2 创建网络会话 9 1 3 绑定两块网卡 第1步 第2步 第3步 第4步 9 1 1 配置网络参数 在 Linux 系统上配置服务 在此之前 必须先保证主机之间能够顺畅地通信 如果网络不通 即便服务部署得
  • 朱嘉明:区块链成为经济转型、形成产业新业态的技术手段

    文章来自巴比特https www 8btc com live 14 在港珠澳大桥开通 以及粤港澳大湾区规划发展的效应下 珠海和澳门的城市发展进入到一个里程碑式的协同新阶段 尤其是拥有中央战略定位加持的国家级新区 横琴 早已吹响创新发展的号角
  • 第二章:恶意软件动态分析基础

    文章目录 前言 动态分析的局限 前言 静态分析侧重的是恶意软件在文件形式中的表现 动态分析则在一个安全 受控的环境中运行恶意软件以查看其行为方式 通过动态分析 我们可以绕过常见的静态分析障碍 例如加壳 混淆 以更直观地了解给定恶意软件样本的
  • Java 中数据结构LinkedList的用法

    LinkList 链表 Linked list 是一种常见的基础数据结构 是一种线性表 但是并不会按线性的顺序存储数据 而是在每一个节点里存到下一个节点的地址 链表可分为单向链表和双向链表 一个单向链表包含两个值 当前节点的值和一个指向下一
  • IDEA创建父项目和子项目

    一 创建父项目 1 首先在IDEA中使用Spring Initializr的方式创建一个Springboot的工程 点击File gt New gt Project gt Spring Initializr gt Next 2 Projec
  • 首期 OSCHINA 季度软件评选活动正式开启,快来投票吧!

    gt https www oschina net project 2020 q1 project 上周我们发出了 OSCHINA 开源软件趋势榜 即将上线的通知 并收到不少软件推荐 首先要感谢大家的热情参与 若有对此还不了解的朋友 OSCH
  • CSS 滑动门

    先来体会下现实中的滑动门 或者你可以叫做推拉门 滑动门出现的背景 制作网页时 为了美观 常常需要为网页元素设置特殊形状的背景 比如微信导航栏 有凸起和凹下去的感觉 最大的问题是里面的字数不一样多 咋办 为了使各种特殊形状的背景能够自适应元素
  • TypeScript 基础 — Null 和 Undefined

    null 和 undefined 都有各自的类型名称 这些类型本身没有用处 因为我们只能将 null 和 undefined 赋值给定义为 null 或 undefined 类型的变量 let u undefined undefined u
  • Mac os系统下使用python3与Django进行网站搭建-2

    后台管理 站点分为内容发布和公共访问两部分 内容发布的部分是由网站的管理员负责查看 添加 修改 删除数据 开发这些重复的功能是一件繁琐的工作 所以Django能够根据定义的模型类自动地生成管理模块 使用Django的管理模块 需要按照如下步
  • 智能随访系统:提升患者综合服务能力和就医体验,提高医院品牌价值与服务质量

    随着互联网技术的不断发展以及 全民健康 全生命周期管理 概念的深化落实 随访作为医疗过程中的闭环环节 医院传统的人工电话随访方式已不能适应需求 将逐渐被智能化随访系统替代 智能化随访是指结合互联网等主流技术 以专业的随访知识库为基础 提供以
  • uni-app微信小程序开发自定义select下拉多选内容篇

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 技术框架公司的选型 uni app uni ui vue3 vite4 ts 需求分析 微信小程序 uni ui内容 1 创建一个自定义的下拉
  • 基于个人开发的C++MySQL插件使用UE4蓝图连接MySQL数据库

    关于UE4连接数据库 其实很简单 本质上就是使用c 来建立DB操作 再通过封装成蓝图可调用的函数即可 当然一般网络游戏是不需要在蓝图中连接数据库的 因为db操作放在客户端来做是不安全 也是不合理的 试想一下 我如果把你的游戏客户端破解了 是
  • 【推荐算法】FM模型:Factorization Machines

    1 线性回归 在介绍FM之前 我们先简单回顾以下线性回归 回归分析是一种预测性的建模技术 它研究的是因变量 目标 和自变量 预测器 之间的关系 这种技术通常用于预测分析 时间序列模型以及发现变量之间的因果关系 通常使用曲线 直线来拟合数据点