博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
推荐系统学习笔记之四 Factorization Machines 因子分解机 + Field-aware Factorization Machine(FFM) 场感知分解机
阅读量:2288 次
发布时间:2019-05-09

本文共 4156 字,大约阅读时间需要 13 分钟。

前言

Factorization Machines(FM) 因子分解机是Steffen Rendle于2010年提出,而Field-aware Factorization Machine (FFM) 场感知分解机最初的概念来自于Yu-Chin Juan与其比赛队员,它们借鉴了辣子Michael Jahrer的论文中field概念,提出了FM的升级版模型。

FM的paper中主要对比对象是SVM支持向量机,与SVM相比,有如下几个优势

  • FM可以实现对于输入数据是非常稀疏(比如自动推荐系统),而SVM会效果很差,因为训出的SVM模型会面临较高的bias。
  • FMs拥有线性的复杂度, 可以通过 primal 来优化而不依赖于像SVM的支持向量机。

在推荐系统和计算广告领域,点击率CTR(click-through rate)和转化率CVR(conversion rate)是衡量广告流量的两个关键指标。准确的估计CTR、CVR对于提高流量的价值,增加广告收入有重要的指导作用。FM和FFM近年来表现突出,分别在由Criteo和Avazu举办的CTR预测竞赛中夺得冠军。

Factorization Machines 因子分解机

假如在某个电影播放网站有这么一组实时数据:

MoviesClass Actor Director MoviesIsPlay?
Action A AA 1
Romantic B BB 0
Action A BB 1

其中MoviesIsPlay?是label,MoviesClass 、UserType、Actor、Director是特征。以上这四种特征都是categorical类型的,需要经过独热编码(One-Hot Encoding)转换成数值型特征。

MoviesClass = Action MoviesClass = Romantic Actor = A Actor = B Director = AA Director = BB MoviesIsPlay = 1 MoviesIsPlay = 0
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 0 1 1 0

从该独热编码表可以看出矩阵许多值都为0,数据十分稀疏,而且会导致数据维度增大,数量级从 n 增大到

n2

而我们的目的是从该矩阵中获取到特征的某些关联,比如MovieClass=action 与 actor=A 关联比较大,电影播放量可很客观,从而对用户进行推荐。

先从线性回归和多项式回归开始建模,这里我们以二阶多项式模型(degree = 2时)为例:

xixj 表示特征xi和xj的组合,当 xi xj 都非零时,组合特征 xixj 才有意义。

y^(x):=w0+i=1nwixi线+i=1nj=i+1nwijxixj
其中,n 代表样本的特征数量,
xi
是第 i 个特征的值,
w0wiwij
是模型参数。

从此公式可以看出组合特征一共有n(n-1)/2个,如果特征n上百个,组合特征上万个,就是任意两个 wij 相互独立,样本数据很稀疏, xixj 为非零的项会非常的少,导致训练样本的不足,很容易导致参数 wij 不准确,最终将严重影响模型的性能和稳定性。

那么如何解决这些问题呢?上一篇的矩阵分解提供了思路。在一个rating矩阵可以分解为user矩阵和item矩阵,每个user和item都可以采用一个隐向量表示,两个向量的点积就是矩阵中user对item的打分。

类似地,所有二次项参数 wij 可以组成一个对称阵 W ,可以分解为

W=VTV
V 的第 j 列便是第 j 维特征的隐向量,也就是说每个参数
wij=vi,vj
,这就是FM模型的核心思想(不讨论高阶形式)。所以可以得到:

y^(x):=w0+i=1nwixi+i=1nj=i+1nvi,vjxixj
其中<>表示两个向量的点积
vi,vj:=f=1kvi,fvj,f
直观上看,FM的复杂度是 O(kn2) 。但是,通过下列等式,FM的二次项可以化简,其复杂度可以优化到 O(kn) 。由此可见,FM可以在线性时间对新样本作出预测。
i=1nj=i+1nvi,vjxixj=12f=1k(i=1nvi,fxi)2i=1nv2i,fx2i
下面给出详细证明过程:

====i=1nj=i+1nvi,vjxixj(1)12i=1nj=1nvi,vjxixj12i=1nvi,vixixi(2)12i=1nj=1nf=1kvi,fvj,fxixji=1nf=1kvi,fvi,fxixi(3)12f=1k(i=1nvi,fxi)j=1nvj,fxji=1nv2i,fx2i(4)12f=1k(i=1nvi,fxi)2i=1nv2i,fx2i(5)
其中第(1)步到第(2)步,这里用AA表示系数矩阵VV的上三角元素,BB表示对角线上的交叉项系数。由于系数矩阵VV是一个对称阵,所以下三角与上三角相等,有下式成立:
A=12(2A+B)12B.A=i=1nj=i+1nvi,vjxixj;B=12i=1nvi,vixixi

之后采用随机梯度下降SGD(Stochastic Gradient Descent)训练模型参数。那么,模型各个参数的梯度如下:

θy(x)=1,xixij=1nvj,fxjvi,fx2i,ifθisw0()ifθiswi(线)ifθisvi,f()
其中, vj,f 是隐向量 vj 的第 f 个元素。由于 nj=1vj,fxj 只与 f 有关,而与 i 无关,在每次迭代过程中,只需计算一次所有 f 的 nj=1vj,fxj 就能够方便地得到所有 vi,f 的梯度。因此,FM参数训练的复杂度也是 O(kn)。

FM总结

首先是为什么使用向量的点积可以解决以上问题呢?

  • 参数的数量大幅度缩减,从n×(n−1)/2降低到nk
  • 隐向量的点积可以表示原本两个毫无相关的参数之间的关系
  • 而稀疏数据下学习不充分的问题也能得到充分解决。比如原本的多项式回归的参数 w12 的学习只能依赖于特征 x1 x2 ;而对参数 v1,v2 而言就完全不一样了,它由 v1 v2 组成。而对于每个向量可以通过多个交叉组合特征学习得到,比如可以由 x1x2,x1x3,.. 学习获得,这样可供学习的非零样本就大大增加了。

其次FM与矩阵分解MF与SVM有什么差别呢?

  • FM是一种比较灵活的模型,通过合适的特征变换方式,FM可以模拟二阶多项式核的SVM模型、MF模型、SVD++模型等。

  • 相比SVM的二阶多项式核而言,FM在样本稀疏的情况下是有优势的;而且,FM的训练/预测复杂度是线性的,而二项多项式核SVM需要计算核矩阵,核矩阵复杂度就是N平方。

  • 相比MF而言,我们把MF中每一项的rating分改写为 ruiβu+γi+xTuyi ,从此公式中可以看出,这相当于只有两类特征 β γ 的FM模型。对于FM而言,我们可以加任意多的特征,比如user的历史购买平均值,item的历史购买平均值等,但是MF只能局限在两类特征。SVD++与MF类似,在特征的扩展性上都不如FM。

Field-aware Factorization Machine(FFM) 场感知分解机

场感知说白了可以理解为分类。通过引入field的概念,FFM把相同性质的特征归于同一个field。比如, “MovieClass = romantic”、“MovieClass = action”这2个特征值都是代表电影分类的,可以放到同一个field中。简单来说,同一个类别的特征经过One-Hot编码生成的数值特征都可以放到同一个field。在FFM中,每一维特征 xi ,针对其它特征的每一种field fj ,都会学习一个隐向量 vi,fj 因此,隐向量不仅与特征相关,也与field相关。也就是说,“MovieClass”这个特征与“UserRate”特征和“PlayTimes”特征进行关联的时候使用不同的隐向量,也是FFM中“field-aware”的由来。

通过修改FM的公式,我们可以得出:

y^(x):=w0+i=1nwixi+i=1nj=i+1nvi,fj,vj,fixixj
其中, fj 是第j个特征所属的field。如果隐向量的长度为k,那么FFM的二交叉项参数就有 nfk 个,远多于FM模型的 nk 个。此外,由于隐向量与field相关,FFM的交叉项并不能够像FM那样做化简,其预测复杂度为 O(kn2)

为了使用FFM方法,所有的特征必须转换成“field_id:feat_id:value”格式,field_id代表特征所属field的编号,feat_id是特征编号,value是特征的值。数值型的特征比较容易处理,只需分配单独的field编号,如用户评论得分、商品的历史CTR/CVR等。categorical特征需要经过One-Hot编码成数值型,编码产生的所有特征同属于一个field,而特征的值只能是0或1,如用户的性别、年龄段,商品的品类id等。

除此之外,还有第三类特征,如用户浏览/购买品类,有多个品类id且用一个数值衡量用户浏览或购买每个品类商品的数量。这类特征按照categorical特征处理,不同的只是特征的值不是0或1,而是代表用户浏览或购买数量的数值。按前述方法得到field_id之后,再对转换后特征顺序编号,得到feat_id,特征的值也可以按照之前的方法获得。

参考文献

  1. FFM C++实现

转载地址:http://pcfnb.baihongyu.com/

你可能感兴趣的文章
一线互联网大厂面经分享:阿里三面+头条四面+腾讯二面+美团四面
查看>>
快手三面(Java岗),意向已拿,盘点一下面试官都问了些啥?
查看>>
“刚刚”顺丰校招二面+美团社招三面面经,分享给准备冲刺金三银四的你
查看>>
多位阿里专家整理总结多线程与高并发实战开发手册,你都具备了?
查看>>
4面字节跳动,终于“跳进去”了 分享一波字节的面经
查看>>
阿里、字节等大厂Java面试汇总:心态准备+简历+50道高频面试题+面试经验总结
查看>>
阿里架构师吐血整理:从源码到架构的Spring全系列笔记,已全部分享
查看>>
2021年最新京东技术岗现场三面:jvm调优+高并发+算法+网络+数据库+设计模式
查看>>
有了阿里P8大牛手写的720页Java高级面试手册,offer稳了
查看>>
面试官都爱问的Spring源码:Spring与Mybatis高级整合
查看>>
好文推荐:微服务架构下的分布式事务基础入门
查看>>
Spring 异步实现原理与实战分享
查看>>
JVM源码分析之jstat工具原理完全解读
查看>>
面经分享:如何一招破解 Java 集合类面试题?
查看>>
Java注解是如何玩转的,面试官和我聊了半个小时
查看>>
一位阿里P7的面试题经验分享,希望能帮助到你
查看>>
一文Get所有 Redis 性能问题分析手段
查看>>
什么是架构?架构的本质和作用!
查看>>
Java总结:Java多线程
查看>>
从Java码农到年薪八十万的架构师
查看>>