推荐算法-因式分解机FM

Factorization Machines

参考

1. 刘建平的博客: https://www.cnblogs.com/pinard/p/6370127.html

2. Tracholar的博客: https://tracholar.github.io/machine-learning/2017/03/10/factorization-machine.html

3. 知乎小孩不笨的文章: https://zhuanlan.zhihu.com/p/50426292

1 准备

通常,我们的机器学习模型是学习一个映射函数
f()Tf(\cdot) \rightarrow T

该函数使我们输入的n维实值特征向量 xRnx \in R^n 映射到一个目标域TT,例如对与回归问题,这个目标域T=RT = R,而对于分类问题,T={C1,C2,...,Cn}T = \{C1, C2, ..., C_n\}。在常见的有监督学习任务中,我们的训练样本数据通常还带有一个标签yy,数据格式如:

D={(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}D = \{(x^{(1)},y^{(1)}), (x^{(2)},y^{(2)}), ..., (x^{(m)},y^{(m)})\}

其中x(i)Rnx^{(i)} \in R^n为输入数据,对应样本的特征向量,y(i)y^{(i)}对应该样本的标签,mm为样本的数目。

在现实世界中,许多应用问题(如文本分析、推荐系统等)会产生高度稀疏的(特征)数据,即特征向量x(i)x^{(i)}中几乎所有的分量都为0

这里,我们以电影评分系统为例,给出一个关于高度稀疏数据的实例:

推荐算法-因式分解机FM
关于这个数据各部分含义这里不再解释。

在上面的例子中,特征向量x的实际维度为U+I+I+1+I=U+3I+1|U|+|I|+|I|+1+|I| = |U|+3|I|+1,真实场景中,用户数目U|U|与电影数目I|I|都非常大,而每个用户对电影的评分数目非常有限。以此可知我们的特征向量x将会多么的稀疏,用Nz(X)N_z(X)来表示一条样本数据/特征向量x的非0分量个数,并记:

Nz(X)=1NimNz(x(i))\overline{N_z}(X) = \frac{1}{N} \sum_i^m N_z(x^{(i)})

Nz(X)\overline{N_z}(X)表示训练集D中所有特征向量中非零分量数的平均数,显然,对于稀疏数据Nz(X)<<m\overline{N_z}(X) << m

2 FM二阶模型方程

对于上面提到的样本数据D,我们先回顾一下线性回归的做法:

y^=w0+w1x1+...+wnxn\hat{y} = w_0 + w_1x_1 + ... + w_nx_n

=w0+i=1nwixi= w_0 + \sum_{i=1}^n w_i x_i

如果我们采用单一的线性模型来学习用户的点击,打分习惯,各特征分量是相互独立的,没有考虑特征分量之间的相互关系,我们很容易忽略特征中潜在的组合关系,比方说“男性用户”喜欢看“漫威电影”,买“奶粉”的用户也常常买“尿不湿”等等。

为了学习特征间的交叉,SVM通过多项式核函数来实现特征的交叉,实际上和多项式模型是一样的,问题在于二阶项的参数过多,设特征维数为n,那么二阶项的参数数目为n(n+1)2\frac{n(n+1)}{2},对于广告点击率预估问题,由于存在大量id特征,导致 n 可能为 10710^7维,这样一来,模型参数的量级为101410^{14},这导致只有极少数的二阶组合模式才能在样本中找到, 而绝大多数模式在样本中找不到,因而模型无法学出对应的权重。例如,对于某个wijw_{ij},样本中找不到xi=1,xj=1x_i=1,x_j=1 (这里假定所有的特征都是离散的特征,只取0和1两个值)这种样本,那么wij的梯度恒为0,从而导致参数学习失败!

很容易想到,可以对二阶项参数施加某种限制,减少模型参数的*度。FM 施加的限制是要求二阶项系数矩阵是低秩的,能够分解为低秩矩阵的乘积。

下面我们做改进:

y^=w0+i=1nwixi+i=1n1j=i+1nwijxixj\hat{y} = w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^{n-1} \sum_{j=i+1}^{n}w_{ij} x_i x_j

上式将任意两个互异的分量之间的关系也考虑进来了。接下来对二阶项参数wijw_{ij}进行改进。针对每个维度的特征xix_i,引入辅助向量(相当于给每个特征一个隐向量)viv_i,(注意是对每一个特征,xix_i是一个特征分量,引入一个向量),从而将wijw_{ij}表示为vivjv_i与v_j内积的形式。其中:

vi=(vi1,vi2,...,vik)Rk,i=1,2,..,nv_i = (v_{i1},v_{i2},...,v_{ik}) \in R^k, i = 1, 2,..,n

这里的nn对应一条样本数据中的特征数目nnkk对应每个特征要表示为k维的辅助向量(隐向量),是一个可调节的超参数。则wijw_{ij}应表示为:

w^ij=viTvj:=lkvilvjl\hat{w}_{ij} = v_i^T v_j := \sum_l^k v_{il} v_{jl}

这样就将参数个数减少到 kn,可以设置较少的k值(一般设置在100以内,k << n),极大地减少模型参数,增强模型泛化能力,这跟矩阵分解的方法是一样的。但是这样为什么说可以提高模型的泛化能力呢?

以上述电影评分系统为例,假设我们要计算用户AA与电影STST的交叉项,很显然,训练数据里没有这种情况,这样会导致 wA,ST=0w_{A,ST}=0 ,但是我们可以近似计算出 <VA,VST><V_A,V_{ST}> 。首先,用户 BBBB 有相似的向量 VBV_BVCV_C ,因为他们对 SWSW 的预测评分比较相似, 所以<VB,VSW><V_B,V_{SW}><VC,VSW><V_C,V_{SW}> 是相似的。用户 AACC 有不同的向量,因为对 TITISWSW 的预测评分完全不同。接下来, STSTSWSW 的向量可能相似,因为用户 BB 对这两部电影的评分也相似。最后可以看出, <VA,VST><V_A,V_{ST}><VA,VSW><V_A,V_{SW}> 是相似的。

于是,函数y^\hat{y}可以进一步改写为:

y^(x)=w0+i=1nwixi+i=1n1j=i+1n<viT,vj>xixj\hat{y}(x) = w_0 + \sum_{i=1}^n w_ix_i + \sum_{i=1}^{n-1} \sum_{j=i+1}^n <v_i^T, v_j> x_i x_j

这就是FM的模型方程。

3 复杂度分析与化简

FM模型的方程中,参数包括:

w0R,WRn,VRn×kw_0 \in R, W \in R^n, V \in R^{n \times k}

共有1+n+n×k1+n+n \times k个参数,其中w0w_0为整体的偏置,WW为各特征分量xix_i的参数向量,VV为交叉特征的参数向量矩阵,函数的计算复杂度为:

{n+(n1)}+{n(n1)2[k+(k1)+2]+n(n1)21}+2=O(kn2)\{n+(n-1)\}+\left\{\frac{n(n-1)}{2}[k+(k-1)+2]+\frac{n(n-1)}{2}-1\right\}+2=\mathcal{O}\left(k n^{2}\right)

第一个花括号内对应i=1nwixi\sum_{i=1}^n w_ix_i的加法和乘法操作,第二个花括号内对应i=1n1j=i+1n<viT,vj>xixj\sum_{i=1}^{n-1} \sum_{j=i+1}^n <v_i^T, v_j> x_i x_j的加法和乘法操作。

我们对方程进行改写约简,即可将计算复杂度降到O(kn)O(kn),推导过程如下:

i=1nj=i+1n<vi,vj>xixj\sum_{i=1}^{n} \sum_{j=i+1}^{n}<v_{i}, v_{j}>x_{i} x_{j}

=12i=1nj=1n<vi,vj>xixj12i=1n<vi,vi>xixi=\frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n}<v_{i}, v_{j}>x_{i} x_{j}-\frac{1}{2} \sum_{i=1}^{n}<v_{i}, v_{i}>x_{i} x_{i}

=12(i=1nj=1nf=1kvi,fvj,fxixji=1nf=1kvi,fvi,fxixi)=\frac{1}{2}\left(\sum_{i=1}^{n} \sum_{j=1}^{n} \sum_{f=1}^{k} v_{i, f} v_{j, f} x_{i} x_{j}-\sum_{i=1}^{n} \sum_{f=1}^{k} v_{i, f} v_{i, f} x_{i} x_{i}\right)

=12f=1k((i=1nvi,fxi)(j=1nvj,fxj)i=1nvi,f2xi2)=\frac{1}{2} \sum_{f=1}^{k}\left(\left(\sum_{i=1}^{n} v_{i, f} x_{i}\right)\left(\sum_{j=1}^{n} v_{j, f} x_{j}\right)-\sum_{i=1}^{n} v_{i, f}^{2} x_{i}^{2}\right)

=12f=1k((i=1nvi,fxi)2i=1nvi,f2xi2)=\frac{1}{2} \sum_{f=1}^{k}\left(\left(\sum_{i=1}^{n} v_{i, f} x_{i}\right)^{2}-\sum_{i=1}^{n} v_{i, f}^{2} x_{i}^{2}\right)

可以计算出,上式的计算复杂度为

k{[n+(n1)+1]+[3n+(n1)]+1}+(k1)+1=O(kn)k\{[n + (n-1) + 1] + [3n + (n-1)] + 1\} + (k-1) + 1 = O(kn)

需要注意的是:在高度稀疏的数据集中,特征向量X中绝大部分分量为0,即文章开始我们引入的Nz(X)N_z(X)会很小,于是计算复杂度为O(kNz(X))O(k N_z(X)),对整个数据集D而言,平均计算复杂度为:O(kNz(X))O(k \overline{N_z}(X))

4 推广高阶

y^(x)=w0+i=1nwixi+l=2di1=1n(l1)i2=i1+1n(l2)il=il1+1n(j=1lxij)(f=1klj=1lvij,f(l))\hat{y}(x)=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{l=2}^{d} \sum_{i_{1}=1}^{n-(l-1)} \sum_{i_2=i_1+1}^{n-(l-2)} \ldots \sum_{i_{l}=i_{l-1}+1}^{n}\left(\prod_{j=1}^{l} x_{i_{j}}\right)\left(\sum_{f=1}^{k_{l}} \sum_{j=1}^{l} v_{i_{j}, f}^{(l)}\right)

详细理解见最上方参考文献。

5 回归与分类任务的损失函数

5.1 回归问题

回归问题常用的衡量损失的函数有最小平方误差(LSE)、均方差(MSE),均方根误差(RMSE)、平均绝对误差(MAE),这里以最小平方误差为例:

loss(y^,y)=(y^y)2loss(\hat{y},y) = (\hat{y}-y)^2

5.2 二分类

01损失,交叉熵损失函数等

6 优化方法

6.1 梯度下降

推荐算法-因式分解机FM

对SGD超参数的讨论:

  1. 学习率η\eta: SGD的收敛依赖于η\eta的取值,η\eta太大,则可能不收敛;太小,则收敛会很慢,因此这个参数要取得合适
  2. 正则化系数λ\lambda: FM模型的泛化能力(相应的预测质量)很大程度上依赖于这些正则化系数的选取。它们通常是在单独的 holdout set上通过 grid search方法来获取,由于它们个数多,取值区间大,因此,通过 grid search方法来选取会非常费时。一种提高效率的做法是减少它们的个数。例如,可以考虑让矩阵V中行号经π\pi映射后为同一个值的那些行使用同一个正则化系数。此时,正则化系数集λ\lambda变为λ0,λπ(i)w,λπ(i)v,i{1,2,,n}\lambda^{0}, \quad \lambda_{\pi(i)}^{w}, \quad \lambda_{\pi(i)}^{v}, \quad i \in\{1,2, \cdots, n\}
  3. 正态分布方差参数σ\sigma: 矩阵V的初始化采用符合正态分布N(0,σ)N(0,\sigma)的随机初始化,方差参数σ\sigma通常取得很小

7 FM与MF的关系

FM包含矩阵分解的模型,矩阵分解的模型是FM的一个特例,当特征只剩下userID和itemID时,FM就退化成了MF。

以user对item评分预测问题为例,基于矩阵分解的协同过滤可以看做FM的一个特殊例子,对于每一个样本,FM可以看做特征只有userid和itemid的onehot编码后的向量连接而成的向量。从FM和MFCF公式来看,MFCF的用户embedding和item embedding可以看做FM中的隐向量,用户和item的bias向量就是FM中的一次项系数,常数μ也和FM中的常数w0w_0相对应,可以看到,MFCF就是FM的一个特例!另外,FM可以采用更多的特征,学习更多的组合模式,这是单个矩阵分解的模型所做不到的!因此,FM比矩阵分解的方法更具普遍性!事实上,现在能用矩阵分解的方法做的方案都直接上FM了!

推荐算法-因式分解机FM

另外,FM与决策树,FM与神经网络的关系请参考参考文献2