FM算法全称叫因子分解机( Factorization Machines ),而FFM( Field-aware Factorization Machines )算法是FM算法的特例,这两个算法通常解决稀疏数据下的特征组合问题。
1. FM算法
FM算法的模型是多项式模型,模型的表达式如下:
\[y(\boldsymbol{x}) = {w_0} + \sum\limits_{i = 1}^n {{w_i}{x_i}} + \sum\limits_{i = 1}^{n - 1} {\sum\limits_{j = i + 1}^n {{w_{ij}}{x_i}{x_j}} } \]
上式中,x表示样本向量,xi表示样本的第i个特征值,w0、wi和wij是模型参数。由于在数据稀疏普遍存在的应用场景中,二项式系数wij是很难训练的,因此将二项式系数wij拆分为两个特征隐向量的点积,故FM算法的模型公式为:
\[y(\boldsymbol{x}) = {w_0} + \sum\limits_{i = 1}^n {{w_i}{x_i}} + \sum\limits_{i = 1}^{n - 1} {\sum\limits_{j = i + 1}^n { < {\boldsymbol{v}_i},{\boldsymbol{v}_j} > {x_i}{x_j}} } \]
上式中,vi和vj分别是xi和xj的隐向量。其中,
\[\sum\limits_{i = 1}^{n - 1} {\sum\limits_{j = i + 1}^n { < {\boldsymbol{v}_i},{\boldsymbol{v}_j} > {x_i}{x_j}} } \]
\[ = \frac{1}{2}\left( {\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n { < {\boldsymbol{v}_i},{\boldsymbol{v}_j} > {x_i}{x_j}} - \sum\limits_{i = 1}^n { < {\boldsymbol{v}_i},{\boldsymbol{v}_i} > {x_i}{x_i}} } } \right)\]
\[ = \frac{1}{2}\left( {\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^n {\sum\limits_{s = 1}^k {{v_{i,s}}{v_{j,s}}{x_i}{x_j}} } - \sum\limits_{i = 1}^n {\sum\limits_{s = 1}^k {{v_{i,s}}{v_{i,s}}{x_i}{x_i}} } } } \right)\]
\[ = \frac{1}{2}\sum\limits_{s = 1}^k {\left( {\left( {\sum\limits_{i = 1}^n {{v_{i,s}}{x_i}} } \right)\left( {\sum\limits_{j = 1}^n {{v_{j,s}}{x_j}} } \right) - \sum\limits_{i = 1}^n {v_{i,s}^2x_i^2} } \right)} \]
\[ = \frac{1}{2}\sum\limits_{s = 1}^k {\left( {{{\left( {\sum\limits_{i = 1}^n {{v_{i,s}}{x_i}} } \right)}^2} - \sum\limits_{i = 1}^n {v_{i,s}^2x_i^2} } \right)} \]
上式中,k表示隐向量的维度,vi,s和vj,s分别表示样本第i个和第j个特征隐向量的第s个值。利用梯度下降法训练模型,模型各个参数的梯度如下:
\[\frac{\partial }{{\partial \theta }}y(\boldsymbol{x}) = \left\{ {\begin{array}{*{20}{c}}1&{\theta = {w_0}}\\{{x_i}}&{\theta = {w_i}}\\{{x_i}\sum\limits_{j = 1}^n {{v_{j,s}}{x_j}} - {v_{i,s}}x_i^2}&{\theta = {v_{i,s}}}\end{array}} \right.\]
在随机梯度下降法下,FM算法的损失函数一般分为两种:
(a).回归问题:最小均方误差( the least square error )
\[loss({\overline y ^{(i)}},{y^{(i)}}) = \frac{1}{2}{({\overline y ^{(i)}} - {y^{(i)}})^2}\]
上式中, \({\overline y ^{(i)}}\)与y(i)分别表示第i个样本的实际输出和期望输出,因此上式的损失函数对θ(包含:w0、wi和vi,s)的偏导为:
\[\frac{\partial }{{\partial \theta }}loss({\overline y ^{(i)}},{y^{(i)}}) = ({\overline y ^{(i)}} - {y^{(i)}})\frac{\partial }{{\partial \theta }}{\overline y ^{(i)}}\]
其中\(\frac{\partial }{{\partial \theta }}{\overline y ^{(i)}} = \frac{\partial }{{\partial \theta }}y(\boldsymbol{x})\);
(b).二分类问题
对于二分类问题,采用logit loss函数作为损失函数,即:
\[loss({\overline y ^{(i)}},{y^{(i)}}) = - \ln \sigma ({\overline y ^{(i)}}{y^{(i)}})\]
其中, \(\sigma (x) = \frac{1}{{1 + {e^{ - x}}}}\),为了防止σ(x)函数的输入是零,将期望输出y(i)正例与负例置为1与-1,因此上式的损失函数对θ(包含:w0、wi和vi,s )的偏导为:
\[\frac{\partial }{{\partial \theta }}loss({\overline y ^{(i)}},{y^{(i)}}) = - \frac{1}{{\sigma ({{\overline y }^{(i)}}{y^{(i)}})}}\sigma ({\overline y ^{(i)}}{y^{(i)}})\left[ {1 - \sigma ({{\overline y }^{(i)}}{y^{(i)}})} \right]{y^{(i)}}\frac{\partial }{{\partial \theta }}{\overline y ^{(i)}}\]
\[ = {y^{(i)}}\left[ {\sigma ({{\overline y }^{(i)}}{y^{(i)}}) - 1} \right]\frac{\partial }{{\partial \theta }}{\overline y ^{(i)}}\]
其中\(\frac{\partial }{{\partial \theta }}{\overline y ^{(i)}} = \frac{\partial }{{\partial \theta }}y(\boldsymbol{x})\);
最后根据随机梯度下降法的迭代公式更新每个参数的值。
2. FFM算法
FFM算法是FM算法的改进。在FM算法中,每个特征对应一个隐向量(即:该特征与任何特征进行特征组合都用相同的隐向量)。但是在FFM算法中,每个特征有f-1个隐向量(其中field的个数为f,同一个field中的特征不会进行组合)。因此FFM算法的模型公式为:
\[y(\boldsymbol{x}) = {w_0} + \sum\limits_{i = 1}^n {{w_i}{x_i}} + \sum\limits_{i = 1}^{n - 1} {\sum\limits_{j = i + 1}^n { < {\boldsymbol{v}_{i,{f_j}}},{\boldsymbol{v}_{j,{f_i}}} > {x_i}{x_j}} } \]
\[ = {w_0} + \sum\limits_{i = 1}^n {{w_i}{x_i}} + \sum\limits_{i = 1}^{n - 1} {\sum\limits_{j = i + 1}^n {({\boldsymbol{v}_{i,{f_j}}} \cdot {\boldsymbol{v}_{j,{f_i}}}){x_i}{x_j}} } \]
其中,fj是第j个特征所属的field,fi是第i个特征所属的field。
由于FFM算法中的每个特征的隐向量与field有关,所以FFM算法的二次项并不能够化简。又因为FFM算法与FM算法在回归问题与二分类问题中的损失函数一样,所以只需要计算\({\boldsymbol{v}_{i,{f_j}}}\)和\({\boldsymbol{v}_{j,{f_i}}}\)的梯度。同时需要注意,在计算\({\boldsymbol{v}_{i,{f_j}}}\)和\({\boldsymbol{v}_{j,{f_i}}}\)的梯度时,xi和xj都不为零,否则无法计算它们的梯度,故:
\[{\boldsymbol{g}_{i,{f_j}}} = \kappa \cdot {\boldsymbol{v}_{j,{f_i}}}{x_i}{x_j}\]
\[{\boldsymbol{g}_{j,{f_i}}} = \kappa \cdot {\boldsymbol{v}_{i,{f_j}}}{x_i}{x_j}\]
上式中,\({\boldsymbol{g}_{i,{f_j}}}\)和\({\boldsymbol{g}_{j,{f_i}}}\)分别为\({\boldsymbol{v}_{i,{f_j}}}\)和\({\boldsymbol{v}_{j,{f_i}}}\)的梯度,在回归问题中\(\kappa = {\overline y ^{(i)}} - {y^{(i)}}\),在二分类问题中\(\kappa = {y^{(i)}}\left[ {\sigma ({{\overline y }^{(i)}}{y^{(i)}}) - 1} \right]\),其中\({\overline y ^{(i)}} = y(\boldsymbol{x})\),y(i)是样本的期望输出(1或者-1)。因此,\({\boldsymbol{v}_{i,{f_j}}}\)和\({\boldsymbol{v}_{j,{f_i}}}\)隐向量的第s个维的梯度为:
\[{\left( {{\boldsymbol{v}_{i,{f_j}}}} \right)_s} \leftarrow {\left( {{\boldsymbol{v}_{i,{f_j}}}} \right)_s} - \frac{\eta }{{\sqrt {{{\left( {{\boldsymbol{G}_{i,{f_j}}}} \right)}_s}} }}{\left( {{\boldsymbol{g}_{i,{f_j}}}} \right)_s}\]
\[{\left( {{\boldsymbol{v}_{j,{f_i}}}} \right)_s} \leftarrow {\left( {{\boldsymbol{v}_{j,{f_i}}}} \right)_s} - \frac{\eta }{{\sqrt {{{\left( {{\boldsymbol{G}_{j,{f_i}}}} \right)}_s}} }}{\left( {{\boldsymbol{g}_{j,{f_i}}}} \right)_s}\]
上式中,η是学习率, \({\boldsymbol{G}_{i,{f_j}}}\)和\({\boldsymbol{G}_{j,{f_i}}}\)分别为:
\[{\left( {{\boldsymbol{G}_{i,{f_j}}}} \right)_s} \leftarrow {\left( {{\boldsymbol{G}_{i,{f_j}}}} \right)_s} + \left( {{\boldsymbol{g}_{i,{f_j}}}} \right)_s^2\]
\[{\left( {{\boldsymbol{G}_{j,{f_i}}}} \right)_s} \leftarrow {\left( {{\boldsymbol{G}_{j,{f_i}}}} \right)_s} + \left( {{\boldsymbol{g}_{j,{f_i}}}} \right)_s^2\]
在初始化时,\({\boldsymbol{G}_{i,{f_j}}}\)和\({\boldsymbol{G}_{j,{f_i}}}\)可以为1,这样可以防止分母为0。