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木块共享
参考资料
2.