分解机(Factorization Machine, FM)模型简介以及如何使用SGD、ALS和MCMC求解分解机

标签:#ALS##MCMC##SGD##分解机##推荐系统# 时间:2017/11/04 09:27:24 作者:小木

因子分解法在很多预测问题上都有很好的准确性。但是分解模型运用在一个新的问题上并不是一个简单的事情。目前有很多的分解模型,最流行的应该是矩阵分解(Matrix Factorization, MF)。这是预测两个分类变量之间关系的模型。类似的,张量分解(Tensor Factorization,TF)是矩阵分解的扩展,它可以预测多个分类变量之间的关系,张量分解有很多例子,如Tucker Decomposition,Parallel Factor Analysis以及Pairwise Interaction Tensor Factorization等。除了分类变量,还有如SVD++、STE、FPMC、BPTF等等可以用来处理非分类的变量(这些模型都可以去原文找到对应的,基本上做矩阵分解的人应该都知道类似的原理大约是什么样子的)。作者列举了这么多方法的原因就是想说明,针对新的问题,我们总是需要设计新的模型来求解,这是很耗费时间的。因此,作者提出了一个新的模型,即分解机模型(Factorization Machine, FM),这是一个通用的方法,它可以通过特征工程来模仿大多数分解模型。据此,作者还提出了一个和LIBSVM很相似的通用的工具——LIBFM来帮助大家解决因子分解法的模型的应用。

[TOC]

一、FM提出的原因

首先我们解释一下作者提出FM的初衷。在现实情况下,所有的特征对象一般都是使用一些向量来表示的,简单表示这些特征的方式就是独热模型(One-hot)。举个简单的例子,假使总共有5个商品,那么每一个商品都可以用一个5维的向量表示:

维度1 维度2 维度3 维度4 维度5
商品1 0 0 0 0 1
商品2 0 0 0 1 0
商品3 0 0 1 0 0
商品4 0 1 0 0 0
商品5 1 0 0 0 0

因此,一个推荐问题可以用下图来表示:

每一条购买记录都可以使用一个向量表示,上图中x_1x_2x_3都是代表了同一个用户,但是看了三个不同的电影,后面还有些其他特征等等。最后每一个记录有个对应的类标签y。但是这样的数据表示很稀疏,现实中电影太多了,用户也很多,这么大的一个稀疏矩阵不是很容易求解,即使求出来参数,由于非零数太少,结果一般也不够准确。而且特征之间很有可能有关联,所以在实际建模中还要考虑特征之间的交互(关于交互项可以花个三分钟参见:回归模型中的交互项简介(Interactions in Regression))。交互项一般用一个新的权重w和项目之间的乘积表示,以二阶交互为例,需要两个交互项都是非零的情况下才能产生一个非零的交互项。这就导致了数据更加稀疏。
为了解决稀疏性,可以借助矩阵分解的思想。矩阵分解会讲一个巨大的稀疏矩阵分解成两个隐矩阵,通常隐矩阵的维度要远小于原来矩阵的维度,因此可以有效的降低稀疏性。

二、FM模型

FM提出来的与原来的方法最大的不同就是将交互项的系数用一个分解出来的矩阵(向量)乘积表示。以2阶交互为例,原来大家的回归模型是:

\hat{y}(x) = w_0 +\sum_{i=1}^n w_i x_i + \sum_{i=1}^n\sum_{j=i+1}^n w_{ij}x_ix_j

FM的思想是将w_{ij}变成两个向量的乘积:

\hat{y}(x) = w_0 +\sum_{i=1}^n w_i x_i + \sum_{i=1}^n\sum_{j=i+1}^n x_ix_j \sum_{k=1}^Kv_{ik}v_{jk}

这里的k就是我们在矩阵分解中常见的隐向量的维度。这个式子可以改写成:

\hat{y}(x) = w_0 +\sum_{i=1}^n w_i x_i + \frac{1}{2} \sum_{k=1}^K \big[ (\sum_{i=1}^nv_{ik}x_i)^2 - \sum_{i=k}^n v_{if}^2x_i^2 \big]

FM的参数是:

\Theta = \{ w_0, w_1, \cdots, w_n, v_{1,1}, v_{1,2} \cdots, v_{n,k} \}

总共有1+n+nk个参数。从这些我们可以看出,FM有一些很好的特性,主要是线性特性。这点使得模型很容易求解。

三、FM模型的求解

在这里,我们主要列举一下FM模型的求解目标以及概率表达形式,有了这些使用SGD、ALS和MCMC等很容易求出结果。

3.1、FM优化的目标

我们使用\textbf{x}表示输入数据,\Theta表示待求参数,y表示训练集中的已知标签。那么,FM的损失函数(或者说是优化目标函数)就是:

\text{OPT}(S) := \text{argmin}_{\Theta} \sum_{(\textbf{x},y) \in S} l(\hat{y}(\textbf{x}|\Theta),y)

因此,对于回归模型,最小二乘法的损失函数是:

(y_1-y_2)^2

对于,二分类标签来说,其损失函数是:

-\ln \sigma(y_1,y_2)

其中\sigma是sigmoid/logistic函数。

注意,由于这里的参数其实不少,那么容易出现过拟合,所以一般需要使用L2正则项:

\text{OPT}(S) := \text{argmin}_{\Theta} \bigg ( \sum_{(\textbf{x},y) \in S} l(\hat{y}(\textbf{x}|\Theta),y) +\sum_{\theta \in \Theta}\lambda_\theta \theta^2 \bigg )

也就是说,每个参数都要跟着一个正则项。

3.2、FM的概率形式

最小二乘法可以假设目标y是一个高斯分布,我们主要是为了预测这个分布的均值:

y|\textbf{x},\Theta \sim N(\hat{y}(\textbf{x},\Theta),1/\alpha)

如果是二分类问题,我们可以假设目标是Bernoulli分布:

y|\textbf{x},\Theta \sim \text{Bernoulli}( b(\hat{y}(\textbf{x},\Theta)))

这里的b是连接函数,一般可以是逻辑回归函数或者是标准正态分布的累积密度函数。

L2正则项则可以理解成是模型参数的高斯先验:

\theta|\mu_\theta,\lambda_\theta \sim N(\mu_\theta, 1/\lambda_\theta)

好了,关于FM的介绍就结束了。后续有机会我们教大家实际使用程序编写FM的方法。

欢迎大家关注DataLearner官方微信,接受最新的AI技术推送