FFM模型

  回顾上一节说的FM模型https://www.jianshu.com/p/b63c05758b2a
,同样假设我们的样本有个,维度是,经过ont-hot或者multi-hot之后的维度是feature_size=维。则二阶项实际上是如下的表达式:
(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]
当然实际上我们不这样求解,因为一般很大, 这也就解释了上节为何我们要进行一个简化,由下式也很容易看出,比如很多计算是不必要的,因为ont-hot或者multi-hot之后,实际上很多都等于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变高维的稀疏向量映射到了维的低维向量。若我们令上述降维后的向量为,则二阶部分就是。有文章说这样做有个缺陷就是将不同fild看成无差异性。我们先解释一下经常会见到的fild域。举个例子,比如性别它是一个性别域记为fild1,它的取值有男,女,未知,未知域fild2,它的取值有北京,上海等。实际上每个域经过one-hot/multi-hot后都有一个稀疏表示,这里大家就会惊奇的发现,若我们将所有的特征域归为一个域fild1,就变成了FM模型,所以我们会发现FM模型实际上是FFM模型的一个特例。当然每个域是不一样的,如果将每个域看成无差异的,将其都映射到维的低维空间是不对的。
  若将不同的fild降维到不同的维度,则第一个式子就变成了,我们重新定义表示第个样本的第个域的第个特征,若将该域降维到维,。举个例子,还是性别吧,假设性别是第个域,男=1,女=2,未知=3,则就取值1,2,3,若样本是男,则对应的是
\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后的向量,再做内积即可。
  在代码实现之前,先抛出一个问题,一直也困扰我很久但尚未解决的。对于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的特征进行降维,然后拼接成一个的向量,其中为每个fild降维后的维度的总和。

你可能感兴趣的:(FFM模型)