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个特征值,w0wiwij是模型参数。由于在数据稀疏普遍存在的应用场景中,二项式系数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}} } \]

上式中,vivj分别是xixj的隐向量。其中,

\[\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,svj,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个样本的实际输出和期望输出,因此上式的损失函数对θ(包含:w0wivi,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,因此上式的损失函数对θ(包含:w0wivi,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}}}\)的梯度时,xixj都不为零,否则无法计算它们的梯度,故:

\[{\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。

posted on 2018-10-24 16:47  媛阿柴  阅读(472)  评论(0编辑  收藏  举报