因子分解机模型简介

  Steffen Rendle于2010年提出Factorization Machines(下面简称FM),并发布开源工具libFM。

一、与其他模型的对比

  与SVM相比,FM对特征之间的依赖关系用factorized parameters来表示。对于输入数据是非常稀疏(比如自动推荐系统),FM搞的定,而SVM搞不定,因为训出的SVM模型会面临较高的bias。还有一点,通常对带非线性核函数的SVM,需要在对偶问题上进行求解;而FM可以不用转为对偶问题,直接进行优化。

  目前还有很多不同的factorization models,比如matrix factorization和一些特殊的模型SVD++, PITF, FPMC。这些模型的一个缺点是它们只适用于某些特定的输入数据,优化算法也需要根据问题专门设计。而经过一些变换,可以看出FM囊括了这些方法。

二、模型简介

  2-way FM(degree = 2)是FM中具有代表性,且比较简单的一种。就以其为例展开介绍。其对输出值是如下建模:

  公式说明:

  (1) 模型的参数包括:

  (2) n是特征维度;

  (3) k是定义factorization维度的超参数,是正整数。

  (4) 在FM中,如何对特征之间的依赖关系建模?首先用k维向量去描述每个维度,然后对2个维度所对应的vi和vj求点积,以此来刻画2个特征之间的特征关系。如果需要刻画x(x>2)个特征之间的关系,可以用x-way FM模型。

  (5) 表面上看式子的第3项的计算复杂度为O(kn2),但其实可以经过简单的数学处理,计算复杂度降为O(kn)。

三、模型分析

  他的思想应该是从推荐系统中经典的SVD模型(因子分解模型)得到的,经典的SVD模型当中相当于只有两种类型的feature,一类feature是user,一类feature是item,而libFM是把这个模型推广到了多类feature的情况。为简单起见,考虑因子维数为1的情况,SVD模型用a∗ba∗b来作为对打分的预测。而libFM要面对的是多类feature,假设是3类,那么就用a∗b+b∗c+c∗aa∗b+b∗c+c∗a来作为对结果的预测。这时候就要问了,如果feature很多,这不就有平方量级的乘法次数了么?当然不是,libFM的文章中提到,他利用((a+b+c)2−a2−b2−c2)/2((a+b+c)2−a2−b2−c2)/2来计算刚才的式子,但是你可以看到,他们其实是相等的,不同的是,这样的计算量只是线性复杂度的。当然libFM也同时支持bias项,这和经典SVD模型类似。
  以上就是libFM的创新之处,其实如果很了解SVD模型,那这个改进并不难理解。
论文中还提到,经典的SVD++模型等对于SVD模型的改进,也只是libFM的一个子集而已。只要合适的去添加feature即可。比如SVD++模型就相当于对每个item增加一个feature,来描述用户是否也给这个item打过分即可。所以有了libFM以后,最需要人工解决的问题就是添加合适的feature了。
另外再说明一下推荐系统的数据如何转化成libFM接受的形式。假设User ID范围是[0,99],Item ID范围是[0,199],则定义feature 0到feature 99对应于User,feature 100到feature 299对应于Item,假设第一条打分记录是User 4对Item 9的打分,则feature 4和feature 109的取值为1,其余feature取值都是0。由于数据文件是稀疏格式的,所以取值为0的feature都不用写,这样文件不会太大。其余对经典SVD模型的改进就需要增加一些对应feature。他的代码中,每条记录是使用map存储feature的,可以随机存取任意一个feature的值(但是可能用链表就可以了?因为一般都是顺序访问的)。

  FM可以用于多种预测问题,包括回归、分类和排序。对不同的预测问题,可以选择合适的loss term和regularization term。另外,FM的梯度也很容易求。

时间: 2024-08-15 16:07:24

因子分解机模型简介的相关文章

因子分解机FM原理及SGD训练

1.背景 Steffen Rendle于2010年提出Factorization Machines(下面简称FM),并发布开源工具libFM.FM的提出主要对比对象是SVM,与SVM相比,有如下几个优势 (1)对于输入数据是非常稀疏(比如自动推荐系统),FM可以,而SVM会效果很差,因为训出的SVM模型会面临较高的bias. (2)FMs拥有线性的复杂度, 可以通过 primal 来优化而不依赖于像SVM的支持向量机. 2.模型 2-way FM(degree = 2)是FM中具有代表性,且比较

简单易学的机器学习算法——因子分解机(Factorization Machine)

一.因子分解机FM的模型 因子分解机(Factorization Machine, FM)是由Steffen Rendle提出的一种基于矩阵分解的机器学习算法. 1.因子分解机FM的优势 对于因子分解机FM来说,最大的特点是对于稀疏的数据具有很好的学习能力.现实中稀疏的数据很多,例如作者所举的推荐系统的例子便是一个很直观的具有稀疏特点的例子. 2.因子分解机FM的模型 对于度为2的因子分解机FM的模型为: 其中,参数,,.表示的是两个大小为的向量和向量的点积: 其中,表示的是系数矩阵的第维向量,

论文研读1.0 基于神经网络与因子分解机的点击率预估应用研究(陈检)

基于神经网络与因子分解机的点击率预估应用研究(陈检) 摘要 长久以来广告点击预估率问题属于用户行为预测研究问题,其主要解决是特征工程问题. 深度神经网络主要提取高阶特征,因子分解机提取二阶以下特征 注改:因子分解机实际应用中受限于计算复杂度,一般只考虑到2阶交叉特征(FM预测时间复杂度O(kn),FFM预测时间复杂度O(kn^2),FM提取低阶组合特征,Deep提取低阶组合特征,同时学习低阶和高阶的组合特征. FM与Deep共享同样的输入. 通过对比试验发现:基于深度神经网络和因子分解机的组合模

Linux网络I/O模型简介

一.I/O基础入门 java1.4之前的早期版本,java对I/O的支持并不完善,开发人员在开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要问题如下. 1.没用数据缓冲区,I/O性能存在问题: 2.没有C或者C++中的Channel概念,只有输入和输出流: 3.同步阻塞式I/O通信(BIO),通常会导致通信线程被长时间阻塞: 4.支持字符集有限,硬件可移植性不好. 二.Linux网络I/O模型简介 Linux的内核讲所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供

Factorization Machine因子分解机

隐因子分解机Factorization Machine[http://www. w2bc. com/article/113916] https://my.oschina.net/keyven/blog/648747 http://www.cnblogs.com/hxsyl/p/5255427.html http://blog.csdn.net/google19890102/article/details/45532745/

MVC模型 简介

MVC (Modal View Controler)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.比如一批统计数据你可以分别用柱状图.饼图来表示.C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新. 模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用.最近几年被推荐为Sun公司J2EE平

ORM模型简介

ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 业务对象时,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法即可. 2>ORM 两种最常见的实现方式是 ActiveRecord 和 DataMapper, ActiveRecord(非常流行) 中模型与数据表一一对应, DataMapper 中模型与数据表是完全分离的. 3>

药品盘点机的简介及分类,药店盘点机

药品盘点机又叫药店盘点器.药厂盘点器,主要应用于药厂,零售药店盘点. 通过激光头读取商品条码或手工录入商品码来实现货物盘点的手持设备.盘点机体积小.重量轻.高性能.机动性强.盘点机内程序可以个性化定制开发. 申明:以上文字为"武汉汉码科技有限公司"原创,转载时务必注明出处. 技术分享,沟通你我,共同进步!www.hanma-scan.com 药品盘点机的简介及分类,药店盘点机

简单的堡垒机模型

刚学python,写了一个简单的堡垒机模型,功能自己添加 #!/usr/bin/env python #coding:utf-8 import MySQLdb import paramiko #connect mysql conn = MySQLdb.connect("218.197.119.18","zhangpan","845896787","baoleiji") cur = conn.cursor() sqlUser =