Factorization Machines with libF
2018-11-05 本文已影响0人
xiiatuuo
前记
上一篇文章描述了spark中实现的基于隐式反馈的协同过滤,不过很遗憾:
目前基本上基于矩阵分解的方法都被FM取代了。
https://tracholar.github.io/machine-learning/2017/03/10/factorization-machine.html
那我们必须来看看FM是什么。
libFM
说到FM,不能不提LibFM,可以说是创始人的杰作,论文地址 http://www.libfm.org/#publications。
2010年,日本大阪大学(Osaka University)的 Steffen Rendle 在矩阵分解(MF)、SVD++ 、PITF 、FPMC 等基础之上,归纳出针对高维稀疏数据的因子机(Factorization Machine, FM)模型 。因子机模型可以将上述模型全部纳入一个统一的框架进行分析。并且,Steffen Rendle 实现了一个单机多线程版本的 libFM
论文组成部分
- FM是什么
- 怎么来学习FM
- FM和其他矩阵分解模型的关系
- FM的一些应用
和上一篇一样,在这里不重点说前两个部分(主要是数据公式还没看太懂,后续有时间再补上),重点就说FM和其他矩阵分解的关系以及FM的一些应用。不过,有一点提一下,就是LIBFM实现了SGD、ALS、MCMC三种学习的方法,其中MCMC作者一直强调非常简单好用,因为要调整的超参数非常少。
FM和其他矩阵分解模型的关系
- MF
- 如果把user和item分别进行one-hot编码feed给FM,MF就变成了一个biased的FM模型
- Pairwise Interation Tensor Factorization
- 如果把user、item和Tags进行one-hot编码feed给FM,那么PITF和FM的区别就是FM含有低阶的交互关系并且共享了一个变量V
- 这个感觉有点像FFM?(TODO)
- SVD++ and FPMC
- 如果将user、item分别one-hot,再将隐式的行为编码feed给FM,那FM跟SVD++几乎一样,只是加上了一个interactions(交互)
- 如果将user、item分别one-hot,再将序列的数据编码feed给FM,那FM跟FPMC非常类似。
- BPTF and TimeSVD++
- 不解释(差不多)
- Nearest Neighbor Models
- 不解释(差不多)
- Attribute-Aware Models
- 这个比较重要,因为将user、item进行one-hot,同时还将user的属性特征、item的属性特征feed给FM的话,FM就基本上是一个feature-based的分解模型,只不过在user属性和item属性间加上了一些interactions。
- SVDfeature
- 优点:在限制条件下的情况可以有更高效的优化算法
- 缺点:SVDfeature有限制只能对两个类别型的特征进行分解;只有SGD算法来优化,MCMC更好用
- FM与polynamial Regression的关系
- 对于两两的关系FM用分解来实现,但是polynomial用的是完全独立的参数来描述,这样计算量非常大,而且拟合效果也不好,可以说FM是对二元关系的MF
使用注意事项
- 建议一开始就使用MCMC,而且用比较低的维度(比如k=8),同时加上-init_stdev来进行初始化,加快MCMC的迭代
- init_stdev需要进行调参选择(0.1,0.2,0.5,1.0),这样早期的迭代就能知道训练误差了
- 等这个参数确定好之后,MCMC就可以跑更多的迭代轮数以及更高的特征维度
- MCMC的有点就是没有啥超参数需要调整的,ALS和SGD有一堆。
实验
- Ranking Prediction
- 对比了MF的原始实现和不同优化策略的libFM,发现libFM的MCMC效果最好
- Nearest Neighbor Models
- LibFM跟KNN和KNN++差不多达到了近似的效果
- 上下文相关的推荐
- Multiverse Recommendation比赛获得最优,这是个什么比赛为什么用RMSE来作为衡量标准?(TODO)
- 标签推荐
- 在ECML Discovery Challenge2009获得最好效果
- 值得一提的是,这些不同的应用场景基本上只需要自己按照libFM的数据格式准备好就可以直接用了,也足以说明FM方法的强大
总结
FM给矩阵分解合并了易用的特征工程,作者说还有三个未来优化的方向:
- 应用到更多预测的问题上
- 效率有优化的空间
- libFM可能扩展为更高阶的interactions(d>=3)
不过后来FFM居上,下回分解。