0%

从FM、FM到deepFM

FM

  • 在传统任务中LR存在的缺点:

1、模型一般为$y=w_0+\sum_{i=1}^nw_ix_i$,为考虑特征之间的关系。实际上交叉特征对于模型有很好地提升效果

2、对于categorical特征进行one-hot编码,具有高度稀疏性,带来维度灾难

二阶FM的定义

$W$为实对称矩阵

所以FM的定义可以改写为

FM两个特点

  • 解决特征交叉问题
  • 利用矩阵分解解决数据量过大的问题

FFM

FFM定义

  • 考虑了特征的类别,认为类别之间也存在相关性,所以增加了一个维度。

deepFM

  • 分成了DNN+FM模型的组合,DNN学习高阶交叉特征,FM学习低阶交叉特征
  • 利用FM代替wide&deep中wide部分,无需输入人工特征

第一步:数据预处理

主要数据类型:

  • 数值型,数值型需要归一化到[0,1]
  • 离散单值型
  • 离散多值型

张量

keras input shape的层,最后一层规定最后一层

keras outputlayer

one-hot 其实是指这里的embedding,并没有one-hot

关于Embedding进行的操作,以keras embedding为例子

keras.layers.Embedding(input_dim, output_dim, embeddings_initializer=’uniform’, embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)

keras 主要进行了一下几个操作:

  • 将Embedding进行了one-shot操作,将类别特征变成batch_size * k的向量
  • 将得到的向量分别乘以一个k m的矩阵,得到embedding后的向量矩阵batch_size k *m
  • 将矩阵按照一维reduce_sum,得到最后结果

一般来说,input_dim是类别特征的nunique值,output可以设置为定值或者 x**0.25

embedding数据的输入类型

(batch_size, filed_dim, embedding_dim)

关于FM的交叉项理解

1、在embedding的时候,对应的输出其实已经包含了$w_ix_i$

2、embedding输出维度为[batch_size, filed_dim, embedding_dim]

3、利用tf.reduce_sum() 对embedding_input进行汇总,其实已经得到FM的一次项

离散特征与连续特征的处理

  • 离散特征:先label_encode, 然后进行embedding操作
  • 连续特征:直接作为输入

deepFM一共三个输入模块

1、线性模块

在类别特征后面接了Embedding(input_dim= k,output_dim=1)​,需要注意的是

如果是

然后与Dense特征合并

2、FM模块

Embedding(4,a)

3、DNN模块

与Embedding木块共享

参考资料

1.【通俗易懂】手把手带你实现DeepFM!

2.

坚持原创技术分享,您的支持将鼓励我继续创作!