暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

模型结构之特征交叉(2)-FM系列(2.2)-AFM,DeepFM等(附代码)

播播笔记 2022-03-20
1496
接上一篇《模型结构之特征交叉(2)-FM系列(2.1)-FM,FFM》,继续特征交叉之FM系列,最开始打算讲FM、FFM、FNN、PNN、DeepFM这几个模型,在写这篇分享的时候又看了一些相关论文,所以这一篇会比最开始预计多分享几个模型,包括AFM、FwFM、NFM、FNN、PNN、DeepFM。看起来模型很多,但底层的出发点都是对FM的改进,更充分挖掘特征之间的交叉信息,底层的逻辑是近似的,真正理解了FM,这些模型理解起来也很容易。

为了方便和上一篇连起来,这一篇的各种标题序号,公式序号,图序号也都延续上一篇。


基于FM的系列模型,在FM的基础上进行改进,基本是从两个角度出发:(1) 挖掘不同的特征组合的重要度差异;(2) 结合FM和dnn两部分,充分结合显式特征交叉和隐式特征交叉的优势。



目录

  • 3 AFM

  • 4 FwFM

  • 5 FNN

  • 6 PNN

    • 6.1 网络结构

    • 6.2 embedding layer

    • 6.3 product layer

      • 6.3.1 线性部分

      • 6.3.2 非线性部分

        • 6.3.2.1 IPPN

        • 6.3.2.2 OPPN

  • 7 NFM

  • 8 DeepFM

  • 相关面试问题



特征交叉的目的是找到特征关联的模式,在所有的特征组合里,有的对模型贡献大,有的对模型贡献小,其重要性存在差异。这种差异不同于特征取值不同导致组合结果不同带来的差异,特征本身值的不同带来的差异性是特征本身的差异,而特征组合的重要性差异,和特征值的大小没有关系,只是和某种组合关系相关。举个例子,当数据中运动这类特征和音乐这类特征存在明显的关联性,而运动这类特征和外貌这类特征关联性不强时,则在特征交叉时,特征组合为<运动类特征,音乐类特征>的重要性要高于<运动类特征,外貌类特征>,对模型的贡献程度存在差异。


基于FM模型改进的另一种角度,是将FM和DNN结合。上一篇介绍的FM、FFM、以及第一种思路的改进AFM、FwFM,都是基于LR模型的框架,而DNN已经在CV、NLP等领域验证了它对特征提取的有效性,因此将其应用到推荐领域,是几年前的趋势。NFM、FNN、PNN、DeepFM等模型,正是在这种趋势下提出的。


3 AFM


AFM[5] 出自论文《Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks》,发表于IJCAI2017。


AFM通过使用attention的思路,对不同特征组合赋予个性化的权重。特征交叉部分的网络结构如图4所示。非特征交叉的部分和FM相同。

图4 AFM特征交叉部分网络结构


AFM利用attention net,学每组特征组合的权重,该特征组合项作为attention net的输入,决定了该权重大小。如式子(16)所示,attention net的输入是当前特征组合的哈达玛积形式,是一个K维的向量,其中  ,是attention net的参数;可以理解为特征组合经过带偏置的全连接层后,经过激活函数,再经过一层全连接层,得到对应的权重初始值  ;所有特征组合项的权重初始值得到后,经过softmax归一化,得到最终的权重值  。


哈达玛积:两个形状相同的矩阵,元素按位相乘得到的矩阵。

AFM模型表示为式子(17),其中  。当  且P的每维取值都为1时,AFM则变成了FM。

AFM的求解和FM求解思路相同,对不同的应用可以采用不同的损失函数,再利用梯度下降或其它方法对参数求解。具体可参考上一篇文章《模型结构之特征交叉(2)-FM系列(2.1)-FM,FFM》。


AFM提出了一种很好的思路,即利用attention机制学习不同特征组合的重要度,对不同用户而言,其重要度理论上是存在差异的,后续快手提出的poso网络,其思路和AFM的思路是相同的,这种对网络结构的改进,对用户活跃度相关的问题是一个比较好的思路。


4 FwFM


FwFM[6] 出自论文《Field-weighted Factorization Machines for Click-Through Rate Prediction in Display Advertising》,发表于WWW2018。


FwFM是基于FFM的改进,FFM的每维特征对每个域会对应生成一个隐向量,因此空间复杂度高。为了保持每维特征在特征组合时对不同域的差异性,同时又保持较小的空间复杂度,FwFM使用了一组参数描述所有域的组合的重要性。


式子(18)表示了FwFM模型。通过引入一组参数  (  表示隐向量  所在的域)描述隐向量基于域的重要性差异,将模型的空间复杂度从FFM的  降到  ,其中n表示特征维度,f表示域数量,k表示隐向量维度。

FwFM求解和FM求解思路相同。





AFM和FwFM是从特征交叉重要度的角度,在FM的基础上进行改进。在FM系列模型中,显式交叉的特征一般都只使用到二阶为止,构建更高阶的交叉会导致参数量呈数量级的增加,使计算量变大。而实际上特征之间的关联性非常复杂,至少比二阶复杂,因此需要比手工交叉更方便的形式,来获取特征之间更高阶的交叉性,这也是基于FM优化的另一种角度,即结合FM显式特征交叉和DNN隐式高阶特征交叉,使模型对特征的提取更充分,因此FNN、PNN、NFM、DeepFM等模型相继被提出。


5 FNN

FNN[7] 出自论文《Deep Learning over Multi-field Categorical Data – A Case Study on User Response Prediction》,发表于ECIR2016。


FNN的思路简单直接,将FM作为DNN的输入,利用DNN继续进行特征的高阶隐式交叉。

图5 FNN网络结构

FNN采用了分阶段训练方式:先针对任务训练FM模型,如式子(19),得到FM的模型参数;然后将FM的参数初始化FNN的输入,对整个模型训练。如图5所示,FM训练后得到n个field的隐向量   ,每个filed的隐向量  和当前field在FM模型中的参数   concat构成FNN dense输入中的  ,如式子(20)所示;将FM训练得到的  和所有   concat构成了FNN的dense输入,如式子(21)所示;再将dense层  作为DNN的输入,经过几层全连接层得到模型的输出结果。

FNN的求解和DNN网络的求解相同,针对当前应用问题定义损失函数,基于梯度下降法求解参数。


FNN将FM和DNN对特征学习的能力结合起来,为后续DNN在推荐领域的模型优化提供了一种思路。

另一方面,FNN也存在一些问题:

  • (1) 采用分阶段的训练方式而不是end-to-end的方式,有损实现过程的方便性;

  • (2) FM的训练结果作为FNN的底层输入,导致FNN的模型能力受限于FM学到的特征表达的上限;

  • (3) 在网络反向传播时,经过几层DNN,容易导致FM的信息被削弱;

  • (4) FNN通过DNN进行特征的高阶隐式交叉,忽略了特征的低阶交叉信息,FM学到的信息作为输入。


6 PNN


PNN[8] 出自论文《Product-based Neural Networks for User Response Prediction》,发表于ICDM2016。


PNN通过网络结构设计,在网络低层实现了类似FM的特征交叉,再连接dnn学习特征的高阶交叉性,从而实现FM和DNN的结合。


6.1 网络结构


推荐领域的特征类别特征非常多,one-hot的表征方式导致特征高维稀疏,特征空间的巨大使得特征的one-hot的表达形式,无法直接应用到dnn,FNN采用的是预训练FM解决这个问题,PNN采用了另一种方法,使用embedding layer,将高维稀疏的特征转化为低维稠密的表征。在显式特征交叉部分,PNN沿用了FM的思想,在网络结构中引入product layer,对特征进行线性组合以及低阶显式交叉,得到特征表征后,连接到dnn进行隐式高阶交叉。PNN的网络结构如图6所示。  

图6 PNN网络结构


6.2 embedding layer


利用embedding layer, PNN将原始高维稀疏特征转化为低维稠密特征作为模型的特征输入,如式子(22)所示,对第i个filed的特征,通过对应的参数  和该filed的one-hot特征表征  进行矩阵乘法,得到该filed的dense embedding。在实际实现中,通常使用tf中的lookup方法。


6.3 product layer


PNN的product layer包括线性和非线性两部分,通过这两部分对特征进行低阶交叉组合。在这一节中,论文中所使用的符号  表示按位相乘并求和。


6.3.1 线性部分


线性部分最终表征为  ,如式子(23)所示,其输入为  ,  是由所有特征dense embedding concat得到,  的每个维度  是由对应第  个维度的参数向量  和  的内积得到,因此  是对  进行一次全连接操作得到,全连接的参数为  ,N为特征filed的个数,K为隐向量的维度,  为  的维度。线性部分的空间复杂度为参数  的复杂度,为  ,时间复杂度为  。

 

6.3.2 非线性部分

非线性部分指PNN的特征交叉部分,有两种操作方式,内积和外积,分别被称为IPPN和OPPN。非线性部分最终表征为  ,如式子(24)所示,  由所有特征交叉组合组成,  的每个维度  由对应第  个维度的参数  和  对应位置元素相乘再求和得到。对于内积和外积两种交叉形式,  的计算方式不同,因此  的形状不同,对应的参数  的形状也随之变化,保持和  形状相同。

6.3.2.1 IPPN


当特征交叉使用内积方式时,  为一个数值,  是长度为  的向量,则  的每一维  都是由向量  (长度为  )和  的内积得到,因此  可以看成是由  经过一次全连接操作得到,全连接的参数  。此时非线性部分的空间复杂度为  的参数量,是  ,时间复杂度包括特征两两交叉和计算(由  与  对应元素相乘求和)两部分,为  。


受矩阵分解的启发,对非线性部分的内积进行简化,将矩阵  分解为两个向量,如式子(25)所示,则  可以表示为式子(26)。此时  的每个维度  ,对应有N个参数  (长度为K的向量),因此空间复杂度为  ,每个维度  的计算量为  ,因此计算  的时间复杂度为  ,有效减小了空间和时间复杂度。

代码1 未使用近似处理的内积交叉代码 

    def cross_layer_ipnn(params, input_layer):
    '''
    :param params: the model config params
    :param input_layer: [B, F, K]
    :return: cross feature lp [B, D1]
    '''


    layer_name = 'cross_layers_pnn'


    field_size = input_layer.shape[1].value # return the F number input_layer [B, F, D]
    output_size = params.cross_layers['out_dim']


    kernel_initializer = tf.glorot_uniform_initializer()


    input_x = tf.transpose(input_layer, [0, 2, 1]) # [B, K, F]
    field_cross_fea = tf.matmul(input_layer, input_x) # ([B, F, K], [B, K, F]) -> [B, F, F] all feild cross
    field_cross_fea = tf.reshape(field_cross_fea, [-1, field_size * field_size]) # [B, F, F] -> [B, F*F]


    comb_dim = field_cross_fea.shape[1].value # F*F


    output_w = tf.get_variable(
    name="{0}_nl_w".format(layer_name),
    shape=[comb_dim, output_size],
    dtype=tf.float32,
    initializer=kernel_initializer,
    ) # [F*F, output_dim]


    # lp # [B, comb_dim], [comb_dim, output_dim] -> [B, output_dim]
    output_layer = tf.matmul(field_cross_fea,
    output_w,
    name="{0}_output".format(layer_name))
    return output_layer


    6.3.2.2 OPPN


    当特征交叉使用外积方式时,特征两两交叉的形式为  ,此时每个交叉组合  ,因此  ,可以理解为  有  个元素,每个元素都是  的矩阵。对于  的每一个维度  ,其计算都是由矩阵  和  的对应元素相乘后求和得到,  ,有  个  ,因此空间复杂度为  ,时间复杂度包括外积的计算和  的计算(由参数  与  对应元素相乘求和)两部分,为  。


    product layer通过线性部分和非线性部分对特征低阶进行了充分的交叉组合,再将两部分输出相加,作为dnn的输入,如式子(27)所示。

    PNN的参数求解和普通的DNN相同。


    PNN将FM和DNN的结合设计到end-to-end的网络结构中,不需要分阶段训练,实现方便。但PNN也存在一些不足:

    • (1) 特征交叉部分的内积和外积的计算复杂度高,虽然有近似处理,但会损失一些信息量;

    • (2) PNN虽然在product layer做了特征低阶的交叉和组合,但其结果作为DNN的输入,导致整个模型最终学到的是高阶的组合特征,忽略了低阶部分。


    7 NFM


    NFM[9] 出自论文《Neural Factorization Machines for Sparse Predictive Analytics》,发表于SIGIR2017。


    NFM既保留了低阶特征的组合,又结合FM和DNN对特征进行高阶交叉,相比于FNN和PNN,它保留了低阶特征的信息。


    NFM模型如式子(28)所示,形式和FM类似,不同的是对交叉特征项的处理,FM是直接对二阶交叉项求和,而NFM通过结合FM和DNN,通过网络结构学习特征之间的交叉性,即式子中的  项,图7表示了  的网络结构。

    图7 NFM中特征交叉项f(x)的网络结构


    网络的输入是高维稀疏的原始特征,通过embedding层,得到低维稠密的embedding表征  ;再利用FM思路对特征进行两两交叉,即网络结构中的bi-interaction layer(简写为BI)。不同于FM对交叉特征求和后用一个值表征,BI layer对交叉的特征按位相乘,得到一个向量表征,再对所有交叉项进行pooling操作,从而得到一个K维向量表征,如式子(29)所示,同FM计算优化推导类似,BI层的计算也可以优化;然后再将二阶交叉得到的向量表征输入到后续的dnn结构,进行高阶特征交叉。

    BI层的时间复杂度为   ,其中N为原始特征中值为非0的维度数量,K为embedding的维度。


    将DNN的计算放进NFM模型的式子,则可将其表示为式子(30)。当DNN只有一层,且  为单位向量,  为零向量时,NFM则变成了FM。

     

    NFM的参数求解同普通的DNN。


    NFM不仅考虑了低阶特征的组合信息,同时通过在网络结构中使用BI层对二阶交叉特征进行向量表征,保留了其信息量,提高了后续DNN对高阶特征交叉的能力。


    8 DeepFM


    DeepFM[10] 出自论文《DeepFM: A Factorization-Machine based Neural Network for CTR Prediction》,发表于IJCAI2017。


    DeepFM和前面介绍的几种模型(FNN、PNN、NFM)类似,充分结合FM和DNN对特征交叉优势。不同的是,前面几种模型采用的是串行思路,将交叉后的特征作为DNN的输入,使得模型最终难以保留低阶特征交叉组合信息;而DeepFM采用了并行的思路,使得模型最终既保留了特征的低阶交叉组合信息,又具有高阶交叉信息,提高了模型的表征能力。DeepFM的模型设计思路类似Wide&Deep,将显式特征交叉和隐式特征交叉两部分结构并行化,这也是后续DCN系列模型的设计思路。


    图8 DeepFM网络结构


    DeepFM的网络结构如图8所示,通过dense embedding层将高维稀疏的原始特征转化为低维稠密embedding输入。左边部分为FM显式特征交叉结构,如图9所示,既包括一阶特征线性组合,也包括特征二阶交叉,如式子(31)所示。DeepFM网络结构右边部分为DNN结构,即对embedding输入进行高阶特征交叉。

    图9 FM网络结构


    模型最后的输出如式子(32)所示,对FM部分和DNN部分加和后经过sigmoid得到结果。参数求解同一般的DNN。

    下面给出DeepFM中FM部分代码,这部分代码的输出为FM的特征表征,最后得到FM的输出  还需要经过一层全连接层,或者直接累加求和。


    代码2 DeepFM中FM的代码

      def fm_layer(params, sparse_x, embedding_x, mode, layer_dropout=1):
      '''
      Reference: [IJCAI 2017] DeepFM: A Factorization-Machine based Neural Network for CTR Prediction
      :param params: the model config params
      :param sparse_x: raw feature input [B, N]
      :param embedding_x: dense feature embedding [B, F, K]
      :return: lr: [B, 1] , fm: [B, K]
      '''


      layer_name = 'fm_layer'
      kernel_initializer = tf.glorot_uniform_initializer()
      sparse_dim = sparse_x.shape[1].value # N
      fm_layer_out = []


      # linear part
      if params.fm_layers['use_linear']:
      kernel = tf.get_variable(name="{0}_linear_w".format(layer_name),
      shape=[sparse_dim, 1],
      dtype=tf.float32,
      initializer=kernel_initializer,
      ) # [N]
      linear_out = tf.matmul(sparse_x, kernel, name="{0}_linear_out".format(layer_name)) # [B, N], [N, 1] -> [B, 1]
      fm_layer_out.append(linear_out)


      # second order
      embedding_input = embedding_x # [B, F, K]
      summed_features_emb = tf.reduce_sum(embedding_input, 1) # [B, K]
      summed_features_emb_square = tf.square(summed_features_emb) # [B, K]
      squared_features_emb = tf.square(embedding_input) # [B, F, K]
      squared_sum_features_emb = tf.reduce_sum(squared_features_emb, 1) # [B, K]
      fm_output = 0.5 * (tf.subtract(summed_features_emb_square, squared_sum_features_emb)) # [B, K]


      if layer_dropout < 1.0:
      fm_output = tf.layers.dropout(fm_output, rate=1 - layer_dropout, training=(mode == tf.estimator.ModeKeys.TRAIN))
      fm_layer_out.append(fm_output)


      output_layer = tf.concat(fm_layer_out, axis=1) # [B, 1+K]


      return output_layer

      我在自己的业务场景对交叉特征进行改进时,发现一个细节问题,即交叉特征的表征方式不同,信息量的不等价问题。FM是对交叉特征进行求和,所以用优化算法和不用优化算法完全等价,而如果想表征成一个向量,后续再进行操作,则有一些差异。如论文中FM网络结构所示,是对域之间进行两两交叉,交叉的形式为内积,此时得到的向量表征的维度为  ,可以理解为是在隐向量维度K上进行求和;而在代码中为了利用tf中的矩阵操作的方便性,是在field维度求和,最终得到的向量表征维度为K。这里存在一定信息表征的差异性,对最终结果的影响可以通过线上实验验证。我猜想有一点影响,但效果不会明显,有兴趣的朋友可以试试。



      DeepFM通过网络结构的并行性,充分结合了FM和DNN对特征交叉的优势,相比同样网络结构并行化的Wide&Deep,它实现了特征的自动低阶交叉,不需要依赖人工设计。FM部分和DNN部分通过embedding共享,加速了网络的训练过程,且有利于embedding学得更充分。


      DeepFM在业界取得了很好的效果,是一个不错的base。针对DeepFM在特征交叉上的提升空间,主要聚焦在特征交叉的高阶性问题。由于DNN的高阶交叉是隐式的,对工程师来说是一个黑盒状态,因此后续对其改进的思路是通过设计可以显式的高阶特征交叉网络结构,实现特征的高阶显式交叉,这也是后面DCN系列模型的思路,下一篇继续分享。


      以及朋友们有什么想要一起探讨的,可以在评论区告诉我,共同学习一起进步呀~




      相关面试问题

      • 对FM模型的改进模型有那些

      • DeepFM的原理,FM和DNN在输出上是怎么结合的


      reference

      [5] Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks

      [6] Field-weighted Factorization Machines for Click-Through Rate Prediction in Display Advertising

      [7] Deep Learning over Multi-field Categorical Data– A Case Study on User Response Prediction

      [8] Product-based Neural Networks for User Response Prediction

      [9] Neural Factorization Machines for Sparse Predictive Analytics

      [10] DeepFM: A Factorization-Machine based Neural Network for CTR Prediction



      推荐系列文章:

      - 推荐模型结构-特征交叉

      - 基础知识类

      - 工具类


      微信最近对公众号的推送算法改版较大,为了更好地找到我,动动手对这个公众号置顶呀~


      公众号的内容会同时在知乎专栏更新,有兴趣的朋友可以在知乎找我玩,知乎专栏:

      从入门到入门的推荐。


      生活的思考和记录会在另一个公众号更新,有兴趣的朋友也可以动手关注一下

      文章转载自播播笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论