FFM模型

作者: 一个菜鸟的自我修养 | 来源:发表于2020-03-31 10:30 被阅读0次

      回顾上一节说的FM模型https://www.jianshu.com/p/b63c05758b2a
    ,同样假设我们的样本有m个,维度是n,经过ont-hot或者multi-hot之后的维度是feature_size=N维。则二阶项实际上是如下的表达式:
    (x_{i, 1},x_{i,2},....x_{i,N})\left[ \begin{matrix} v_{1,1} & v_{1, 2} & ... & v_{1,d}\\ v_{2,1} & v_{2,2} &...& v_{2,d}\\ ...& ...&...&...\\ v_{N,1} &v_{N,2}&... & v_{N,d} \end{matrix} \right]^T\left[ \begin{matrix} v_{1,1} & v_{1, 2} & ... & v_{1,d}\\ v_{2,1} & v_{2,2} &...& v_{2,d}\\ ...& ...&...&...\\ v_{N,1} &v_{N,2}&... & v_{N ,d} \end{matrix} \right] \left[ \begin{matrix} x_{i,1}\\ x_{i,2} \\ ... \\ x_{i,N} \end{matrix} \right]
    当然实际上我们不这样求解,因为一般N很大, 这也就解释了上节为何我们要进行一个简化,由下式也很容易看出,比如\sum_{f=1}^d v_{1,f}x_{i,1}很多计算是不必要的,因为ont-hot或者multi-hot之后,实际上很多x_{i,j}都等于0,0乘以一个数仍然是0。上节的问题,所谓的embedding的含义,也就可以这样理解
    \left[ \begin{matrix} v_{1, 1} & v_{1, 2} & ... & v_{1,d}\\ v_{2, 1} & v_{2, 2} &...& v_{2,d}\\ ...& ...&...&...\\ v_{N,1} &v_{N,2}&... & v_{N,d} \end{matrix} \right] \left[ \begin{matrix} x_{i,1}\\ x_{i,2} \\ ... \\ x_{i,N} \end{matrix} \right]=\left[ \begin{matrix} \sum_{f=1}^d v_{1,f}x_{i,1}\\ \sum_{f=1}^d v_{2,f}x_{i,2} \\ ... \\ \sum_{f=1}^d v_{N,f}x_{i,N} \end{matrix} \right]
      将原本one-hot或者multi-hot变高维的稀疏向量映射到了d维的低维向量。若我们令上述降维后的向量为z,则二阶部分就是<z, z>。有文章说这样做有个缺陷就是将不同fild看成无差异性。我们先解释一下经常会见到的fild域。举个例子,比如性别它是一个性别域记为fild1,它的取值有男,女,未知,未知域fild2,它的取值有北京,上海等。实际上每个域经过one-hot/multi-hot后都有一个稀疏表示,这里大家就会惊奇的发现,若我们将所有的特征域归为一个域fild1,就变成了FM模型,所以我们会发现FM模型实际上是FFM模型的一个特例。当然每个域是不一样的,如果将每个域看成无差异的,将其都映射到d维的低维空间是不对的。
      若将不同的fild降维到不同的维度,则第一个式子就变成了,我们重新定义x_{i, fild_{l,k}}表示第i个样本的第l个域的第k个特征,若将该域降维到d维,。举个例子,还是性别吧,假设性别是第l个域,男=1,女=2,未知=3,则k就取值1,2,3,若样本i是男,则对应的是
    \left[ \begin{matrix} v_{fild_{l,1},fild_{l,1}} & v_{fild_{l,1}, fild_{l, 2}} & ... & v_{fild_{l,1},d}\\ v_{fild_{l, 2},fild_{l,1}} & v_{fild_{l, 2},fild_{l, 2}} &...& v_{fild_{l, 2},d}\\ ...& ...&...&...\\ v_{fild_{l,N} ,fild_{l,1}} &v_{fild_{l,N} ,fild_{l, 2}}&... & v_{fild_{l,N} ,d} \end{matrix} \right] \left[ \begin{matrix} x_{i,fild_{l,1}}\\ x_{i,fild_{l, 2}} \\ ... \\ x_{i,fild_{l,N} } \end{matrix} \right]
    然后将所有embedding后的结果拼接成一列,得到的embedding后的向量[x_{i,fild_{1,1}}, x_{i,fild_{1,d_1}},...,x_{i,fild_{L,d_L}}]^T,再做内积即可。
      在代码实现之前,先抛出一个问题,一直也困扰我很久但尚未解决的。对于embedding的维度,是如何确定的?之前看过一段代码的是这样得到embedding的维度的 embedding_dim = 6 * int(pow(vocabulary_size, 0.25)),其中vocabulary_size表示的是词典的大小。举个例子,比如性别,它的取值只有男、女、未知三种,则vocabulary_size=3。说明embedding的维度与fild的取值个数有关系。一般大家用的时候默认的大小是4,这个4又是怎么得到的?跪求大佬解答。
      接下来讲一下,如何将FM模型的代码快速的修改成FFM模型的实现代码。我们观察发现求和后面部分的实现逻辑和FM一致,我们要做的是将每个特征分到特定的fild里,然后复用FM的框架。首先我们得知道每个fild的其实x_index是多少(翻看上一节的代码)。
      首先我们要将每个fild的特征进行降维,然后拼接成一个1\times t的向量,其中t为每个fild降维后的维度的总和。

    相关文章

      网友评论

          本文标题:FFM模型

          本文链接:https://www.haomeiwen.com/subject/oxbidhtx.html