提出动机

FM模型主要解决的是系数数据下组合特征权重学习的问题。
以下图为例,场景是用户对电影打分的预测,每行表示一条样本,对于x数据,可分为五个部分,分别用户ID、待打分的电影名、该用户对各个电影的历史打分(归一化)、时间信息、上次打分的电影,y表示对电影的打分,可以看到用User、Movie、Last Move rated都是one-hot的形式,非常稀疏。
FM(Factorization Machines)因子分解机模型
现在每一列xix_{i}都表示一个特征,假设我们现在需要构建一个x到y的模型,需要用到2阶多项式特征,即需要用到特征x间的两两组合,那么y的表达式可以写成:
y~(x)=w0+i=1nwixi+i=1nj=i+1nwijxixj \tilde{y}(x)=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n} w_{i j} x_{i} x_{j}其中w0w_{0}是常数项,wiw_{i}是一阶特征的系数wiwjw_{i}w_{j}是二阶特征的系数,对于该模型,我们需要学习到这三类系数的具体值。

如果其实上式可以看成一个线性回归,把一阶特征组合成的二阶特征看成新的特征,那么就是表达式如下线性回归问题,其中xix_{i}表示原始特征以及其组成的二阶特征
y~(x)=w0+i=1nθixi\tilde{y}(x)=w_{0}+\sum_{i=1}^{n} \theta_{i} x_{i}假设用随机梯度下降法来更新需要求的参数
SGD:θj=θjα(θTxiyi)xjiS G D: \theta_{j}=\theta_{j}-\alpha\left(\theta^{T} x^{i}-y^{i}\right) x_{j}^{i}可以看到θj\theta_{j}的更新依赖于xjx_{j},如果xjx_{j}为0参数就得不到更新,也就是意味着数据中交叉项的值为0是,其交叉参数无法被学习到或者不能被充分学习到。而FM模型可以解决这个问题。

解决方案

将上述模型中交叉特征的系数由常数拆分成两个向量的点积,这样可以在交叉特征不存在的情况下仍能学习到其系数,以应对预测数据中可能出现的特征组合。新的假设函数表达式如下(这里只考虑到最高二阶交叉特征)
y^(x):=w0+i=1nwixi+i=1nj=i+1nvi,vjxixj\hat{y}(\mathbf{x}):=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j}其中w0R,wRn,VRn×kw_{0} \in \mathbb{R}, \quad \mathbf{w} \in \mathbb{R}^{n}, \quad \mathbf{V} \in \mathbb{R}^{n \times k}VV是一个nkn*k的向量矩阵,n是特征xx的个数,kk是个待确定的参数。

<vi,vj><v_{i},v_{j}>表示点乘,即向量对应位置乘积的和
vi,vj:=f=1kvi,fvj,f\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle:=\sum_{f=1}^{k} v_{i, f} \cdot v_{j, f}

为什么可以解决问题

假设函数部分

y^\hat{y}的二阶特征部分做如下分解
i=1nj=i+1nvi,vjxixj=12i=1nj=1nvi,vjxixj12i=1nvi,vixixi=12(i=1nj=1nf=1kvi,fvj,fxixji=1nf=1kvi,fvi,fxixi)=12f=1k((i=1nvi,fxi)(j=1nvj,fxj)i=1nvi,f2xi2)=12f=1k((i=1nvi,fxi)2i=1nvi,f2xi2)\begin{aligned} & \sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j} \\ =& \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j}-\frac{1}{2} \sum_{i=1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{i}\right\rangle x_{i} x_{i} \\ =& \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) \\ =& \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) \\ =& \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) \end{aligned}
这样,基于FM模型的假设函数就可以写成如形式,这也是预测函数的基本形式:
y^(x):=w0+i=1nwixi+12f=1k((i=1nvi,fxi)2i=1nvi,f2xi2)\hat{y}(\mathbf{x}):=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\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)
可以看到,该假设函数的进行预测的时间复杂度为O(kn)O(kn),其中nn是当前待预测样本的特征数

参数求导

之所以能解决稀疏特征交叉问题,因为其在稀疏条件下仍然可以对交叉特征的系数进行求解,如下所示
θy^(x)={1, if θ is w0xi, if θ is wixij=1nvj,fxjvi,fxi2, if θ is vi,f\frac{\partial}{\partial \theta} \hat{y}(\mathbf{x})=\left\{\begin{array}{ll}1, & \text { if } \theta \text { is } w_{0} \\ x_{i}, & \text { if } \theta \text { is } w_{i} \\ x_{i} \sum_{j=1}^{n} v_{j, f} x_{j}-v_{i, f} x_{i}^{2}, & \text { if } \theta \text { is } v_{i, f}\end{array}\right.

上面第三个式子是对特定的vi,fv_{i,f}求导,所以y^\hat{y}表达式中的f=1k\sum_{f=1}^{k}将不存在。
注意上面的式子只是链式求导法则中的最后一步,对于不同的损失函数,链式求导前面的部分不一样,但后面的部分都是一样的。可以看到VV矩阵中的nkn*k个系数求解不依赖与交叉特征是否存在,只依赖于单个特征,这样一般线性模型不能解决的交叉项系数求解的问题得到了解决

效率问题
  • 预测效率:上面已经说过,预测的时间复杂度为O(kn)O(k*n)
  • 训练效率: 对于V矩阵中的每一个参数,在SGD下,其更新方式为xij=1nvj,fxjvi,fxi2x_{i} \sum_{j=1}^{n} v_{j, f} x_{j}-v_{i, f} x_{i}^{2},每次随机一个样本,更新V中的 所有参数,由于这nkn*k个参数更新时都会用到j=1nvj,fxjvi,fxi2\sum_{j=1}^{n} v_{j, f} x_{j}-v_{i, f} x_{i}^{2},所以该式的结果可以提前计算出来作为公共使用的部分,因而每一轮更新中,时间复杂度为O(kn+n+1)O(k*n + n + 1)O(kn)O(k*n)

扩展形式

更泛化的情况下,一个考虑d阶交叉特征的FM模型的表达式如下
y^(x):=w0+i=1nwixi+l=2di1=1nil=il1+1n(j=1lxij)(f=1klj=1lvij,f(l))\begin{aligned} \hat{y}(x) &:=w_{0}+\sum_{i=1}^{n} w_{i} x_{i} +\sum_{l=2}^{d} \sum_{i_{1}=1}^{n} \cdots \sum_{i_{l}=i_{l-1}+1}^{n}\left(\prod_{j=1}^{l} x_{i_{j}}\right)\left(\sum_{f=1}^{k_{l}} \prod_{j=1}^{l} v_{i_{j}, f}^{(l)}\right) \end{aligned}

相关文章:

  • 2021-12-13
  • 2022-12-23
  • 2021-05-14
  • 2021-05-19
  • 2021-07-29
  • 2021-04-30
  • 2022-01-14
  • 2022-12-23
猜你喜欢
  • 2021-12-25
  • 2021-12-12
  • 2022-12-23
  • 2021-12-19
  • 2022-01-09
  • 2021-08-11
  • 2021-11-02
相关资源
相似解决方案