【每周一文】Factorization Machines
2016-02-16 23:48
127 查看
概述
在使用线性模型,例如LR模型时,特征工程是很大一块工作,有时为了产生较好的效果需要人工进行一些特征的二维或者三维交叉。FM(Factorization machines)提供了一种思路可以自动进行特征交叉,同时能够处理非常稀疏数据,线性时间复杂度,计算简单。由于FM实现简单效果非常好,而且应用范围非常广,FM是近期非常火的技术,在比赛或者大公司都非常常见。
FM
FM优势
在正式介绍FM之前,首先介绍一下FM能够解决问题以及优点:1. FM能够解决分类和回归问题
2. FM能够代替SVD、SVD++等进行矩阵分解
3. FM可以处理非常稀疏数据,此时SVM等模型会失效
4. FM线性时间复杂度,计算简单
5. FM可表示性较强,FM将模型参数表示为K维向量,向量之间可以交叉运算,即使两个交叉特征没有对应训练数据,也能表示出权重。
2维-FM模型
模型表示
对于2次特征交叉的FM模型可以表示为y(x)=w0+∑i=1n(wixi)+∑i=1n∑j=i+1n(<vi,vj>xixj)y(x)=w_0+\sum_{i=1} ^n(w_i x_i)+\sum_{i=1}^n \sum_{j=i+1}^n(x_ix_j)其中模型参数有w0w_0为截距,wiw_i为一维特征权重,viv_i为每一维度特征的分布式表示。其中特征交叉权重计算为<vi,vj>=∑f=1kvi,fvj,f=\sum_{f=1}^k v_{i,f}v_{j,f}
模型计算优化
在整个模型中,计算复杂度比较高的是最后一项,优化如下∑i=1n∑j=i+1n(<vi,vj>xixj)=12∑i=1n∑j=1n(<vi,vj>xixj)−12∑i=1n<vi,vi>xixi=12(∑i=1n∑j=1n∑f=1k(vi,fvjfxixj)−∑i=1n∑f=1k(vi,fvi,fxixi))=12∑f=1k((∑i=1nvi,fxi)(∑j=1nvj,fxj)−∑i=1nv2i,fx2i)=12∑f=1k((∑i=1nvi,fxi)2−∑i=1nv2i,fx2i)\begin{align}
\sum_{i=1}^n \sum_{j=i+1}^n(x_ix_j) &= \frac12 \sum_{i=1}^n \sum_{j=1}^n(x_ix_j) - \frac12 \sum_{i=1}^nx_ix_i\\
& =\frac12(\sum_{i=1}^n \sum_{j=1}^n\sum_{f=1}^k(v_{i,f}v_{j_f}x_ix_j)-\sum_{i=1}^n\sum_{f=1}^k(v_{i,f}v_{i,f}x_ix_i)) \\
& = \frac12\sum_{f=1}^k((\sum_{i=1}^nv_{i,f}x_i)(\sum_{j=1}^nv_{j,f}x_j)-\sum_{i=1}^nv_{i,f}^2x_i^2) \\
& = \frac12\sum_{f=1}^k((\sum_{i=1}^nv_{i,f}x_i)^2-\sum_{i=1}^nv_{i,f}^2x_i^2)
\end{align}
相当于特征分布式表示中每一维度和特征进行求和平方和平方求和相减。
模型计算
采用SGD进行模型计算∂∂θy(x)=⎧⎩⎨⎪⎪1,xi,xi∑nj=1vj,fxj−vi,fx2i,if θ is w_0if θ is w_iif θ is vi,f\frac {\partial}{\partial \theta} y(x) =
\begin{cases}
1, & \text{if $\theta$ is w_0} \\
x_i, & \text{if $\theta$ is w_i} \\
x_i\sum_{j=1}^nv_{j,f}x_j-v_{i,f}x_i^2, & \text{if $\theta$ is $v_{i,f}$}
\end{cases}
d-way FM
FM 还可以进行扩展d维特征交叉,计算相对比较复杂,而且多维交叉应用比较少。FM应用
在很多应用中,FM可以取代常用模型并且能够取得不错效果,例如1. FM - SVM,能够处理稀疏特征
2. FM - MF
3. FM - SVD++
4. FM - PITF
5. FM - FPMC
具体可以参考论文介绍。
总结
通过该论文学习,能够了解FM模型的基本形式以及FM能够解决那些问题。相关文章推荐
- eclipse里怎么用命令行输入args
- 使用SwipeRefreshLayout实现下拉刷新与上拉加载更多
- 《程序设计与算法》专项课程中止学习
- 【每周一文】Supervised Sequence Labelling with Recurrent Neural Networks
- UVA 839
- https详解
- 【每周一文】Natural Language Processing (almost) From Scratch
- 从头认识Spring-2.6 在注解中使用表达式@Value(2)-使用表达式注入其他对象的值
- [mvc]记一次“项目”的历程
- /etc/host 配置主机名字
- asp.net mvc 如何调用微信jssdk接口:分享到微信朋友(圈)| 分享到qq空间
- web过滤器
- 【每周一文】A Few Usefull Things to know about Machine Learning
- socket超时设置详解(connect/read/write)
- 梯度下降实现案例(含python代码)
- java如何将一个序列化对象添加到压缩文件中
- parse()与stringify()
- Java学习之静态修饰符:static
- 一道有趣的题目
- [HDOJ1394]Minimum Inversion Number(线段树,逆序数)