DeepFM算法
在前面推荐系统的文章里面提到了FM算法,它可以做特征组合,但是计算量大,一般只考虑2阶特征组合。那么如何既考虑低阶(1阶+2阶),又能考虑到高阶特征呢?这时候引入了DeepFM = FM+DNN,DeepFM设计了一种end-to-end的模型结构 ,无需特征工程,但是在各种benchmark和工程中表现效果都很好。
DeepFM = FM + DNN
- 提取低阶(low order)特征 => 因子分解机FM
既可以做1阶特征建模,也可以做2阶特征建模 - 提取高阶(high order)特征 => 神经网络DNN
- 对于特征i,wi是1阶特征的权重,
Vi表示该特征与其他特征的交互影响,输入到FM模型中可以获得特征的2阶特征表示,输入到DNN模型得到高阶特征。
FM模型
- 1阶模型的建模
- 通过隐向量点乘=> 得到2阶特征组合
y F M = ⟨ w , x ⟩ + ∑ j 1 = 1 d ∑ j 2 = j 1 + 1 d ⟨ V i , V j ) x j 1 ⋅ x j 2 y_{F M}=\langle w, x\rangle+\sum_{j_{1}=1}^{d} \sum_{j_{2}=j_{1}+1}^{d}\left\langle V_{i}, V_{j}\right) x_{j_{1}} \cdot x_{j_{2}} yFM=⟨w,x⟩+j1=1∑dj2=j1+1∑d⟨Vi,Vj)xj1⋅xj2
Deep模型
- 原始特征向量维度非常大,高度稀疏,为了更好的发挥DNN模型学习高阶特征的能力,设计子网络结构(从输入层=>嵌入层),将原始的稀疏表示特征映射为稠密的特征向量。(Input Layer => Embedding Layer)
- 不同field特征长度不同,但是子网络输出的向量具有相同维度k
- 利用FM模型的隐特征向量V作为网络权重初始化来获得子网络输出向量
什么是embedding?
- embedding是一种降维方式,将不同特征转换为维度相同的向量。
- 在推荐系统中,对于离线变量我们需要转换成one-hot => 维度非常高,可以将其转换为embedding向量。
- 原来每个Field i维度很高,都统一降成k维embedding向量。 Field ( i ) = > e i \text { Field }(i)=>e_{i} Field (i)=>ei
- 方法:接入全连接层,对于每个Field只有一个位置为1,其余为0,因此得到的embedding就是图中连接的红线,对于Field 1来说就是 V 11 , V 12 , … , V 1 k V_{11}, V_{12}, \ldots, V_{1 k} V11,V12,…,V1k
- FM模型和Deep模型中的子网络权重共享,也就是对于同一个特征,向量Vi是相同的。
DeepFM中的模块
- Sparse Features,输入多个稀疏特征。
- Dense Embeddings,对每个稀疏特征做embedding,学习到他们的embedding向量(维度相等,均为k),因为需要将这些embedding向量送到FM层做内积。同时embedding进行了降维,更好发挥Deep Layer的高阶特征学习能力。
- FM Layer
一阶特征:原始特征相加。
二阶特征:原始特征embedding后的embedding向量两两内积。 - Deep Layer,将每个embedding向量做级联,然后做多层的全连接,学习更深的特征。
- Output Units,将FM层输出与Deep层输出进行级联,接一个dense层,作为最终输出结果。
DeepFM模型效果对比
1.对于不同激活函数,不同模型的AUC和Logloss对比
- relu和tanh比sigmoid更适合
- relu对于所有深度模型来说更适合
2.对于不同Dropout,不同模型的AUC和Logloss对比
- Dropout一般设置为0.6-0.9之间最适合
3.对于不同神经元个数,不同模型的AUC和Logloss对比
- 每层的神经元个数越多,未必越好
- 设置为200-400个比较适合
4.对于不同隐层层数,不同模型的AUC和Logloss对比
- 层数越多,起初效果明显,之后效果不明显,甚至更差,容易过拟合
- 3层比较适合
5.不同模型的训练时间对比
- 不论是CPU还是GPU,DeepFM的执行时间都是最短的
6.对于不同网络形状,不同模型的AUC和Logloss对比
- 固定(200-200-200),增长(100-200-300), 下降(300-200-100), 菱形(150-300-150).
- 采用固定的形状效果最好