FM &FFM:深入理解FM与FFM「建议收藏」

FM &FFM:深入理解FM与FFM「建议收藏」0.引言针对类别变量进行oner-hot编码后的高维稀疏矩阵M,可以表示如下:可以看出,经过One-Hot编码之后,大部分样本数据特征是比较稀疏的,One-Hot编码的另一个特点就是导致特征空间大。例如,电影品类有550维特征,一个categorical特征转换为550维数值特征,特征空间剧增。同时通过观察大量的样本数据可以发现,某些特征经过关联之后,与label之间的相关…

大家好,又见面了,我是你们的朋友全栈君。

0.引言

针对类别变量进行oner-hot编码后的高维稀疏矩阵M,可以表示如下:

FM &FFM:深入理解FM与FFM「建议收藏」

可以看出,经过One-Hot编码之后,大部分样本数据特征是比较稀疏的, One-Hot编码的另一个特点就是导致特征空间大。例如,电影品类有550维特征,一个categorical特征转换为550维数值特征,特征空间剧增。

同时通过观察大量的样本数据可以发现,某些特征经过关联之后,与label之间的相关性就会提高。例如,“USA”与“Thanksgiving”、“China”与“Chinese New Year”这样的关联特征,对用户的点击有着正向的影响。换句话说,来自“China”的用户很可能会在“Chinese New Year”有大量的浏览、购买行为,而在“Thanksgiving”却不会有特别的消费行为。这种关联特征与label的正向相关性在实际问题中是普遍存在的,如“化妆品”类商品与“女”性,“球类运动配件”的商品与“男”性,“电影票”的商品与“电影”品类偏好等。因此,引入两个特征的组合是非常有意义的。

多项式模型是包含特征组合的最直观的模型。在多项式模型中,特征 x_i和 x_j的组合采用 x_i_j表示,即x_ix_j都非零时,组合特征  x_i_j才有意义。从对比的角度,讨论二阶多项式模型。模型的表达式如下:

FM &FFM:深入理解FM与FFM「建议收藏」

其中,n 代表样本的特征数量,x_i是第i个特征的值,w_0,w_i,w_i_j 是模型参数。从公式可以看出,组合特征的参数一共有 C_{n}^{2} = n(n-1)/2 个,任意两个参数都是独立。然而,在数据稀疏性普遍存在的实际应用场景中,二次项参数的训练是很困难的。其原因是,每个参数 w_i_j的训练需要大量 x_ix_j 都非零的样本;由于样本数据本来就比较稀疏,满足“x_ix_j 都非零”的样本将会非常少。训练样本的不足,很容易导致参数 w_i_j不准确,最终将严重影响模型的性能。

 

一、FM模型推导

 

1. 对于普通的线性模型,引入二次交叉项后:

FM &FFM:深入理解FM与FFM「建议收藏」

其中,w_0\in R,W\in R^n,V\in R^{n\times k}k为隐向量的维度,则两个向量的内积满足:

FM &FFM:深入理解FM与FFM「建议收藏」

该模型需要学习的参数包括:

  • w_0:模型整体的偏置;

  • w_i:一阶线性权重;

  • i和特征j交互权重

 针对等式(1)右端最后一项化简得:

FM &FFM:深入理解FM与FFM「建议收藏」

FM &FFM:深入理解FM与FFM「建议收藏」

FM &FFM:深入理解FM与FFM「建议收藏」

FM &FFM:深入理解FM与FFM「建议收藏」

所以公式(1)可以化简为:

FM &FFM:深入理解FM与FFM「建议收藏」

针对上式,利用SGD训练模型其参数的梯度下降表达式为:

FM &FFM:深入理解FM与FFM「建议收藏」

其中,FM &FFM:深入理解FM与FFM「建议收藏」是隐向量 FM &FFM:深入理解FM与FFM「建议收藏」的第 FM &FFM:深入理解FM与FFM「建议收藏」个元素。由于FM &FFM:深入理解FM与FFM「建议收藏」 只与FM &FFM:深入理解FM与FFM「建议收藏」有关,而与 j 无关,在每次迭代过程中,只需计算一次所有 FM &FFM:深入理解FM与FFM「建议收藏」FM &FFM:深入理解FM与FFM「建议收藏」,就能够方便地得到所有 FM &FFM:深入理解FM与FFM「建议收藏」的梯度。显然,计算所有 FM &FFM:深入理解FM与FFM「建议收藏」FM &FFM:深入理解FM与FFM「建议收藏」 的复杂度是 O(kn);已知FM &FFM:深入理解FM与FFM「建议收藏」时,计算每个参数梯度的复杂度是 O(1);得到梯度后,更新每个参数的复杂度是 O(1);模型参数一共有 nk+n+1 个。因此,FM参数训练的复杂度也是 O(kn)。综上可知,FM可以在线性时间训练和预测,是一种非常高效的模型。

 

2. FM & SVM讨论

  • 线性核SVM

FM &FFM:深入理解FM与FFM「建议收藏」

  可以看出等价于d=1时的FM。

  • 多项式核 SVM 

      非线性映射函数d=2

 

FM &FFM:深入理解FM与FFM「建议收藏」

       SVM的表达式为:

 

FM &FFM:深入理解FM与FFM「建议收藏」

        可以看出,SVM的二元特征交叉参数是独立的,而FM的二元特征交叉参数是两个k维的向量v_iv_j,交叉参数就不是独立的,而是相互影响的;

 

SUMMARY

  • 对于大型稀疏矩阵,SVM无法估计高阶交互特征的参数,因为对于特征对(i,j)的参数w_{ij}必须有足够的非零样本即FM &FFM:深入理解FM与FFM「建议收藏」只要存在某一个特征FM &FFM:深入理解FM与FFM「建议收藏」则wij参数估计失败,因此在大型稀疏样本情况下,SVM表现很差,而FM对大型稀疏数据非常有用。

  • FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行;

  • FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量;

FM参数初始化

FM &FFM:深入理解FM与FFM「建议收藏」

FM &FFM:深入理解FM与FFM「建议收藏」

可以看出:常数项和一次项初始化为零,二次项按照均值为0,方差为0.01的正态分布初始化。

 

FM数据格式

 

 

FM &FFM:深入理解FM与FFM「建议收藏」

  • For classification(binary/multiclass), <label> is an integer indicating the class label.

  • For regression, <label> is the target value which can be any real number.

  • Labels in the test file are only used to calculate accuracy or errors. If they are unknown, you can just fill the first column with any number.

FM &FFM:深入理解FM与FFM「建议收藏」

 

二、FFM

 假设一个广告分类的问题,根据用户和广告位相关的特征,预测用户是否点击了广告。源数据如下:
 

FM &FFM:深入理解FM与FFM「建议收藏」

“Clicked?“是label,Country、Day、Ad_type是特征。由于三种特征都是categorical类型的,需要经过独热编码(One-Hot Encoding)转换成数值型特征。

 

FM &FFM:深入理解FM与FFM「建议收藏」

         FFM(Field-aware Factorization Machine)最初的概念来自Yu-Chin Juan(阮毓钦,毕业于中国台湾大学,现在美国Criteo工作)与其比赛队员,是他们借鉴了来自Michael Jahrer的论文中的field概念提出了FM的升级版模型。
通过引入field的概念,FFM把相同性质的特征归于同一个field。以上面的广告分类为例,“Day=26/11/15”、“Day=1/7/14”、“Day=19/2/15”这三个特征都是代表日期的,可以放到同一个field中。同理,商品的末级品类编码生成了550个特征,这550个特征都是说明商品所属的品类,因此它们也可以放到同一个field中。简单来说,
同一个
cat
egorical特征经过One-Hot编码生成的数值特征都可以放到同一个field,包括用户性别、职业、品类偏好等。在FFM中,每一维特征
FM &FFM:深入理解FM与FFM「建议收藏」,针对其它特征的每一种
field f
j,都会学习一个隐向量
FM &FFM:深入理解FM与FFM「建议收藏」。因此,隐向量不仅与特征相关,也与field相关。也就是说,“Day=26/11/15”这个特征与“Country”特征和“Ad_type”特征进行关联的时候使用不同的隐向量,这与“Country”和“Ad_type”的内在差异相符,也是FFM中“field-aware”的由来。

 
        假设样本的 
n个特征属于 
f个field,那么FFM的二次项有 nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。FM可以看作FFM的特例,是把所有特征都归属到一个field时的FFM模型。根据FFM的field敏感特性,可以导出其模型方程。
 

FM &FFM:深入理解FM与FFM「建议收藏」

 
        其中,fj是第 
j个特征所属的field。如果隐向量的长度为
k,那么FFM的二次参数有 nfk 个,远多于FM模型的
 nk个。此外,由于隐向量与field相关,
FFM二次项并不能够化简,其预测复杂度是 O(
kn
2
)
 
 
 
下面以一个例子简单说明FFM的特征组合方式。输入记录如下
 

FM &FFM:深入理解FM与FFM「建议收藏」

 
这条记录可以编码成5个特征,其中“Genre=Comedy”和“Genre=Drama”属于同一个field,“Price”是数值型,不用One-Hot编码转换。为了方便说明FFM的样本格式,我们将所有的特征和对应的field映射成整数编号。
 
 

FM &FFM:深入理解FM与FFM「建议收藏」

那么,FFM的组合特征有10项:
 

FM &FFM:深入理解FM与FFM「建议收藏」

 
 
FFM数据格式
 

FM &FFM:深入理解FM与FFM「建议收藏」

FM &FFM:深入理解FM与FFM「建议收藏」

 
在训练FFM的过程中,有许多小细节值得特别关注。
  • 样本归一化。FFM默认是进行样本数据的归一化,即 pa.normpa.norm 为真;若此参数设置为假,很容易造成数据inf溢出,进而引起梯度计算的nan错误。因此,样本层面的数据是推荐进行归一化的。
  • 特征归一化。CTR/CVR模型采用了多种类型的源特征,包括数值型和categorical类型等。但是,categorical类编码后的特征取值只有0或1,较大的数值型特征会造成样本归一化后categorical类生成特征的值非常小,没有区分性。例如,一条用户-商品记录,用户为“男”性,商品的销量是5000个(假设其它特征的值为零),那么归一化后特征“sex=male”(性别为男)的值略小于0.0002,而“volume”(销量)的值近似为1。特征“sex=male”在这个样本中的作用几乎可以忽略不计,这是相当不合理的。因此,将源数值型特征的值归一化到 [0,1]是非常必要的。
  • 省略零值特征。从FFM模型的表达式可以看出,零值特征对模型完全没有贡献。包含零值特征的一次项和组合项均为零,对于训练模型参数或者目标值预估是没有作用的。因此,可以省去零值特征,提高FFM模型训练和预测的速度,这也是稀疏样本采用FFM的显著优势。
 

 

 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136696.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharm 模板_pycharm基础代码

    pycharm 模板_pycharm基础代码在Pycharm中编码时,当我们输入main再按下Tab键,编辑器会自动出现如下代码块:if__name__==’__main__’:类似地,如果我们有一大段代码要经常重复使用,可以将这段代码设置成一个模版,通过自定义的指令+Tab键直接导入代码。比如我们有如下一段代码:fromPyQt5.Qtimport*classWindow(QWidget):def__init__(self):super().__init__()

  • MongoDB(六)—-MongoDB索引的额外属性

    MongoDB(六)—-MongoDB索引的额外属性

    2020年11月12日
  • 程序人生-感受湖光景色随笔

    开头聊几句1、首先在说明下,我不是大佬,我是渣飞,这个“渣”是技术方面,不要想多,虽然我现在渣,但是我希望不断努力朝大佬的方向靠近2、今天是周四,我司的周四特定上线日,每月总有那么几天,在公司待待很晚。公司楼下有个湖,最近几次上线,有空都会去下面走走3、从公司上线完后,趁着验证功能的时间,写下此篇4、今天闲踱湖边,想写点东西,记录下,写完估计验证也完了,就回家了5、本文非技术文章,是一篇记录自己生活的随笔,我定义自己的程序人生。喜欢看技术文的伙伴可以忽略开头之前文章说过,这是我的一个小

  • 内核杂谈——关于platform device 创建

    内核杂谈——关于platform device 创建当拿到driver,不能用起来的时候需要去检查device了。虽说device和bus通常都是系统中带的,但也不要想当然的认为这个系统是帮你建好的。通常busdevicedriver三者中,bus基本不用干预,device干预的少,driver干预的多。从设备树中生成device从设备树中识别device的入口为arch_initcall_sync(of_platform_default_populate_init);staticint__initof_platform_defa

  • KETTLE教程-初探

    KETTLE教程-初探KETTLE概念、学习指南

  • datagrip2021.7.15 最新激活码(注册激活)

    (datagrip2021.7.15 最新激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~ML…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号