【推荐系统】Factorization Machine

【推荐系统】Factorization Machine

Factorization Machine(FM)[1](#fn1)是现代推荐系统的基础算法之一。本文介绍FM的模型思想、计算与优化方法。

FM模型

问题

输入:

    n



   n


n维数据




    x



   \bf{x}


x。<br> 预测:标量




    y



   y


y

举例

  • 回归:

      x



     \bf x


  x的元素和




      y



     y


  y都为实数</li><li>二类分类:




      x



     \bf x


  x的元素为实数,




      y



     y


  y为




      ±


      1



     \pm1


  ±1</li><li>排序:




      x


      =


      (



       x


       a



      ,



       x


       b



      )



     \textbf x =(x^a,x^b)


  x=(xa,xb)为有序对,




      y



     y


  y为




      ±


      1



     \pm1


  ±1</li></ul> 


在实际问题中,

    x



   \bf x


x往往非常稀疏:




    x



   \bf x


x中非零元素个数远远小于




    n



   n


n。

举例
一个电影推荐系统,系统中有

      n


      1




    n_1


 n1​个用户,有





      n


      2




    n_2


 n2​部电影。 想要设计一个系统,预测用户某时刻对某一部电影的评分。</p> 


对于每一条记录,按照如下方式将其转化为

     (


     x


     ,


     y


     )



    (\textbf x,y)


 (x,y)对: |----|----|----|<br> |




     x



    \textbf x


 x|1-hot编码的用户编号|





      n


      1




    n_1


 n1​|用户多,此部分稀疏|<br> ||1-hot编码的电影编号|





      n


      2




    n_2


 n2​|电影多,此部分稀疏|<br> ||0-1标记用户已经看过的电影,归一化到和为一|





      n


      2




    n_2


 n2​|大部分用户只看过很少电影,此部分稀疏| |y|评分|1||</p> 


稀疏数据的挑战

一个预测模型可以有不同的“度”(degree),度越大,对

    x



   \bf x


x元素之间的相互作用考虑的越多。






    d


    =


    1



   d=1


d=1时,是线性模型:<br> 




     y


     (


     x


     )


     =



      ∑



       i


       =


       1



      n




      w


      i




      x


      i




    y(\textbf x)=\sum_{i=1}^nw_ix_i


 y(x)=i=1∑n​wi​xi​<br> 




    d


    =


    2



   d=2


d=2时,考虑元素对之间的关系:<br> 




     y


     (


     x


     )


     =



      ∑



       i


       =


       1



      n




      w


      i


      1




      x


      i



     +



      ∑



       i


       =


       1



      n




      ∑



       j


       =


       i


       +


       1



      n




      w



       i


       j



      2




      x


      i




      x


      j




    y(\textbf x)=\sum_{i=1}^nw^1_ix_i+\sum_{i=1}^n\sum_{j=i+1}^nw^2_{ij}x_ix_j


 y(x)=i=1∑n​wi1​xi​+i=1∑n​j=i+1∑n​wij2​xi​xj​

注意第二项,下标j的循环从i+1开始。

    d


    =


    3



   d=3


d=3时,考虑三元组之间的关系:<br> 




     y


     (


     x


     )


     =



      ∑



       i


       =


       1



      n




      w


      i


      1




      x


      i



     +



      ∑



       i


       =


       1



      n




      ∑



       j


       =


       i


       +


       1



      n




      w



       i


       j



      2




      x


      i




      x


      j



     +



      ∑



       i


       =


       1



      n




      ∑



       j


       =


       i


       +


       1



      n




      ∑



       k


       =


       j


       +


       1



      n




      w



       i


       j


       k



      3




      x


      i




      x


      j




      x


      k




    y(\textbf x)=\sum_{i=1}^nw^1_ix_i+\sum_{i=1}^n\sum_{j=i+1}^nw^2_{ij}x_ix_j+\sum_{i=1}^n\sum_{j=i+1}^n \sum_{k=j+1}^nw^3_{ijk}x_ix_jx_k


 y(x)=i=1∑n​wi1​xi​+i=1∑n​j=i+1∑n​wij2​xi​xj​+i=1∑n​j=i+1∑n​k=j+1∑n​wijk3​xi​xj​xk​

模型中参数总量为

    O


    (



     n


     d



    )



   O(n^d)


O(nd)。比较而言,训练数据本身数量不足(记录不多),且非常稀疏,**很容易过拟合**。

FM的解决方案

FM使用分解(factorization)的方法解决这个问题。

    d


    =


    2



   d=2


d=2为例,令:<br> 





      w



       i


       j




     =


     <



      v


      i



     ,



      v


      j



     >


     =



      ∑



       p


       =


       1



      r




      v



       i


       p





      v



       j


       p





    w_{ij}=<\textbf v_i, \textbf v_j>=\sum_{p=1}^rv_{ip}v_{jp}


 wij​=<vi​,vj​>=p=1∑r​vip​vjp​

类似地,

    d


    =


    3



   d=3


d=3时:<br> 





      w



       i


       j


       k




     =


     <



      v


      i



     ,



      v


      j



     ,



      v


      k



     >


     =



      ∑



       p


       =


       1



      r




      v



       i


       p





      v



       j


       p





      v



       k


       p





    w_{ijk}=<\textbf v_i, \textbf v_j,\textbf v_k>=\sum_{p=1}^rv_{ip}v_{jp}v_{kp}


 wijk​=<vi​,vj​,vk​>=p=1∑r​vip​vjp​vkp​

其中,

    <


    ∗


    ,


    ∗


    >



   <*,*>


<∗,∗>表示向量的对位相乘之和。向量长度




    r


    <


    <


    n



   r<<n


r<<n。

可以从以下两个角度考察FM模型的物理意义

  • 参数总量从

         O
    
    
         (
    
    
    
          n
    
    
          d
    
    
    
         )
    
    
    
        O(n^d)
    
    
     O(nd)减少到
    
    
    
    
         O
    
    
         (
    
    
         r
    
    
         n
    
    
         d
    
    
         )
    
    
    
        O(rnd)
    
    
     O(rnd)。
    
    
    
    
         r
    
    
    
        r
    
    
     r越大参数越多,模型越精细;
    
    
    
    
         r
    
    
    
        r
    
    
     r越小,泛化力越强。</li><li>分解削弱了高阶参数之间的独立性:
    
    
    
    
    
          w
    
    
    
           i
    
    
           j
    
    
    
    
    
        w_{ij}
    
    
     wij​和
    
    
    
    
    
          w
    
    
    
           i
    
    
           k
    
    
    
    
    
        w_{ik}
    
    
     wik​通过
    
    
    
    
    
          v
    
    
          i
    
    
    
    
        \bf v_i
    
    
     vi​关联。
    
    
    
    
    
          v
    
    
          i
    
    
    
    
        \bf v_i
    
    
     vi​维度
    
    
    
    
         r
    
    
    
        r
    
    
     r越高,
    
    
    
    
    
          v
    
    
          i
    
    
    
    
        \bf v_i
    
    
     vi​对
    
    
    
    
         <
    
    
    
          v
    
    
          i
    
    
    
         ,
    
    
    
          v
    
    
          j
    
    
    
         >
    
    
    
        <\textbf v_i,\textbf v_j>
    
    
     <vi​,vj​>的决定性,高阶参数之间独立性越强,模型越精细。</li>
    

    对于实际问题,选用较小的

        r
    
    
    
       r
    
    
    r即可克服系数数据问题,同时获得较好预测结果。
    
    

    计算与求解

    FM模型的计算和求解都非常快。

    计算

        d
    
    
        =
    
    
        2
    
    
    
       d=2
    
    
    d=2为例,在计算
    
    
    
    
        y
    
    
        (
    
    
        x
    
    
        )
    
    
    
       y(x)
    
    
    y(x)时,只需考虑计算量最大的二元项:<br> 
    
    
    
    
         二
    
    
         元
    
    
         项
    
    
         =
    
    
    
          ∑
    
    
    
           i
    
    
           =
    
    
           1
    
    
    
          n
    
    
    
    
          ∑
    
    
    
           j
    
    
           =
    
    
           i
    
    
           +
    
    
           1
    
    
    
          n
    
    
    
    
          (
    
    
    
           x
    
    
           i
    
    
    
    
           x
    
    
           j
    
    
    
          <
    
    
    
           v
    
    
           i
    
    
    
          ,
    
    
    
           v
    
    
           j
    
    
    
          >
    
    
          )
    
    
    
    
        二元项=\sum_{i=1}^n \sum_{j=i+1}^n\left(x_ix_j<\textbf v_i, \textbf v_j>\right)
    
    
     二元项=i=1∑n​j=i+1∑n​(xi​xj​<vi​,vj​>)
    
    

    可以首先把

         x
    
    
         i
    
    
    
    
       x_i
    
    
    xi​(标量)和对应的参数向量
    
    
    
    
    
         v
    
    
         i
    
    
    
    
       \textbf v_i
    
    
    vi​(长度为
    
    
    
    
        r
    
    
    
       r
    
    
    r)相乘,并记录下来:<br> 
    
    
    
    
    
          u
    
    
          i
    
    
    
         =
    
    
    
          x
    
    
          i
    
    
    
         ⋅
    
    
    
          v
    
    
          i
    
    
    
    
        \textbf u_i=x_i\cdot \textbf v_i
    
    
     ui​=xi​⋅vi​<br> 对于
    
    
    
    
        n
    
    
    
       n
    
    
    n个元素,共需要:
    
    
    
    
        n
    
    
        ⋅
    
    
        r
    
    
    
       n\cdot r
    
    
    n⋅r次乘法。
    
    
    
    
    
    
         二
    
    
         元
    
    
         项
    
    
         =
    
    
    
          ∑
    
    
    
           i
    
    
           =
    
    
           1
    
    
    
          n
    
    
    
    
          ∑
    
    
    
           j
    
    
           =
    
    
           i
    
    
           +
    
    
           1
    
    
    
          n
    
    
    
         <
    
    
    
          u
    
    
          i
    
    
    
         ,
    
    
    
          u
    
    
          j
    
    
    
         >
    
    
         =
    
    
    
          ∑
    
    
    
           p
    
    
           =
    
    
           1
    
    
    
          r
    
    
    
    
          (
    
    
    
           ∑
    
    
    
            i
    
    
            =
    
    
            1
    
    
    
           n
    
    
    
    
           ∑
    
    
    
            j
    
    
            =
    
    
            i
    
    
            +
    
    
            1
    
    
    
           n
    
    
    
    
           u
    
    
    
            i
    
    
            p
    
    
    
    
    
           u
    
    
    
            j
    
    
            p
    
    
    
    
          )
    
    
    
    
        二元项=\sum_{i=1}^n \sum_{j=i+1}^n<\textbf u_i, \textbf u_j>=\sum_{p=1}^r \left( \sum_{i=1}^n \sum_{j=i+1}^n u_{ip}u_{jp}\right)
    
    
     二元项=i=1∑n​j=i+1∑n​<ui​,uj​>=p=1∑r​(i=1∑n​j=i+1∑n​uip​ujp​)
    
    

    灵感

          (
    
    
          a
    
    
          +
    
    
          b
    
    
          +
    
    
          c
    
    
    
           )
    
    
           2
    
    
    
          =
    
    
    
           a
    
    
           2
    
    
    
          +
    
    
    
           b
    
    
           2
    
    
    
          +
    
    
    
           c
    
    
           2
    
    
    
          +
    
    
          2
    
    
          a
    
    
          b
    
    
          +
    
    
          2
    
    
          a
    
    
          c
    
    
          +
    
    
          2
    
    
          b
    
    
          c
    
    
    
         (a+b+c)^2=a^2+b^2+c^2+2ab+2ac+2bc
    
    
      (a+b+c)2=a2+b2+c2+2ab+2ac+2bc</p> 
    

    左边只需要1次乘法,而右边需要6次乘法:把二次项凑成和的平方可以节约计算

    把上式的求和项统一范围,便于计算:

         二
    
    
         元
    
    
         项
    
    
         =
    
    
    
          1
    
    
          2
    
    
    
    
          ∑
    
    
    
           p
    
    
           =
    
    
           1
    
    
    
          r
    
    
    
    
          (
    
    
    
           ∑
    
    
    
            i
    
    
            =
    
    
            1
    
    
    
           n
    
    
    
    
           ∑
    
    
    
            j
    
    
            =
    
    
            1
    
    
    
           n
    
    
    
    
           u
    
    
    
            i
    
    
            p
    
    
    
    
    
           u
    
    
    
            j
    
    
            p
    
    
    
    
          −
    
    
    
           ∑
    
    
    
            i
    
    
            =
    
    
            1
    
    
    
           n
    
    
    
    
           u
    
    
    
            i
    
    
            p
    
    
    
           2
    
    
    
          )
    
    
    
    
        二元项=\frac{1}{2}\sum_{p=1}^r\left(\sum_{i=1}^n \sum_{j=1}^n u_{ip}u_{jp} - \sum_{i=1}^nu_{ip}^2\right)
    
    
     二元项=21​p=1∑r​(i=1∑n​j=1∑n​uip​ujp​−i=1∑n​uip2​)
    
    
    
    
    
    
         =
    
    
    
          1
    
    
          2
    
    
    
    
          ∑
    
    
    
           p
    
    
           =
    
    
           1
    
    
    
          r
    
    
    
    
          (
    
    
    
    
            (
    
    
    
             ∑
    
    
    
              i
    
    
              =
    
    
              1
    
    
    
             n
    
    
    
    
             u
    
    
    
              i
    
    
              p
    
    
    
    
            )
    
    
    
           2
    
    
    
          −
    
    
    
           ∑
    
    
    
            i
    
    
            =
    
    
            1
    
    
    
           n
    
    
    
    
           u
    
    
    
            i
    
    
            p
    
    
    
           2
    
    
    
          )
    
    
    
    
        =\frac{1}{2}\sum_{p=1}^r\left( \left(\sum_{i=1}^nu_{ip}\right)^2- \sum_{i=1}^nu_{ip}^2 \right)
    
    
     =21​p=1∑r​⎝⎛​(i=1∑n​uip​)2−i=1∑n​uip2​⎠⎞​
    
    

    括号内,两部分计算量均

        O
    
    
        (
    
    
        n
    
    
        )
    
    
    
       O(n)
    
    
    O(n)。整体计算量为
    
    
    
    
        O
    
    
        (
    
    
        n
    
    
        r
    
    
        )
    
    
    
       O(nr)
    
    
    O(nr)
    
    

    结论

    FM是个线性模型。其计算量相对于变量维度

         n
    
    
    
        n
    
    
     n,以及模型度
    
    
    
    
         r
    
    
    
        r
    
    
     r均为线性。</p> 
    
    
    

    求解

    FM模型的参数可以使用SGD方法方便地求解。

    预测值对一元参数的导数非常直接:

           ∂
    
    
           y
    
    
           (
    
    
           x
    
    
           )
    
    
    
    
           ∂
    
    
    
            w
    
    
            i
    
    
            1
    
    
    
    
    
         =
    
    
    
          x
    
    
          i
    
    
    
    
        \frac{\partial y(x)}{\partial w^1_i}=x_i
    
    
     ∂wi1​∂y(x)​=xi​
    
    

    时间复杂度为

        O
    
    
        (
    
    
        1
    
    
        )
    
    
    
       O(1)
    
    
    O(1)。
    
    

    预测值对于二元参数的导数:

           ∂
    
    
           y
    
    
           (
    
    
           x
    
    
           )
    
    
    
    
           ∂
    
    
    
            v
    
    
    
             i
    
    
             p
    
    
    
    
    
    
         =
    
    
    
          x
    
    
          i
    
    
    
         ⋅
    
    
    
    
           ∂
    
    
           y
    
    
           (
    
    
           x
    
    
           )
    
    
    
    
           ∂
    
    
    
            u
    
    
    
             i
    
    
             p
    
    
    
    
    
    
         =
    
    
    
          x
    
    
          i
    
    
    
         ⋅
    
    
    
          (
    
    
    
           ∑
    
    
    
            j
    
    
            =
    
    
            1
    
    
    
           n
    
    
    
    
           u
    
    
    
            j
    
    
            p
    
    
    
    
          −
    
    
    
           u
    
    
    
            i
    
    
            p
    
    
    
    
          )
    
    
    
    
        \frac{\partial y(x)}{\partial v_{ip}}=x_i\cdot \frac{\partial y(x)}{\partial u_{ip}}=x_i\cdot \left( \sum_{j=1}^nu_{jp}-u_{ip}\right)
    
    
     ∂vip​∂y(x)​=xi​⋅∂uip​∂y(x)​=xi​⋅(j=1∑n​ujp​−uip​)
    
    

    其中

         ∑
    
    
    
          j
    
    
          =
    
    
          1
    
    
    
         n
    
    
    
    
         u
    
    
    
          j
    
    
          p
    
    
    
    
    
       \sum_{j=1}^nu_{jp}
    
    
    ∑j=1n​ujp​和当前参数
    
    
    
    
    
         x
    
    
         i
    
    
    
    
       x_i
    
    
    xi​无关,可以提前统一计算。故此部分时间复杂度同样为
    
    
    
    
        O
    
    
        (
    
    
        1
    
    
        )
    
    
    
       O(1)
    
    
    O(1)。
    
    

    对于全部参数,求解梯度的时间复杂度为

        O
    
    
        (
    
    
        r
    
    
        n
    
    
        d
    
    
        )
    
    
    
       O(rnd)
    
    
    O(rnd)。同样为线性。
    
    1. Rendle, Steffen. “Factorization Machines.” IEEE International Conference on Data Mining IEEE Computer Society, 2010:995-1000. ↩︎
  • posted @ 2020-12-28 10:07  刘桓湚  阅读(229)  评论(0)    收藏  举报