深度模型DeepFM模型
引言
Wide&Deep模型中Wide侧是一个广义线性模型,它具备捕获低阶特征交互的能力,通常是在特征向量中手动对低阶特征进行显性特征交互,但是它不能进行一些显性高阶特征交互以及一些很少出现在训练数据中的特征交互;而且Wide侧的输入依赖特征工程,更多需要人工进行设计特征输入,与Deep侧的输入无法进行输入共享。
因子分解机(FM)将成对特征交互建模为特征之间潜在向量的内积,并显示出非常有前景的结果;虽然原则上FM可以模拟高阶特征交互,但在实践中,由于高度复杂,通常只考虑二阶特征交互。
DeepFM模型
DeepFM模型是在原有Wide&Deep模型结构上改造而来,将Wide侧的LR模型替换成FM模型结构,从而组成了DeepFM模型,而且FM结构和Deep结构的输入是共享输入,可以在没有任何特征工程的情况下进行端到端的训练。DeepFM模型结构图如下
DeepFM模型的输出有FM结构和Deep结构相加得到
\(\begin{aligned}
y = sigmoid(y_{FM} + y_{Deep})
\end{aligned}\)
1、FM结构
FM结构是由一阶的线性部分和二阶的交叉部分组成,一阶线性部分是给与每个特征一个权重,然后进行加权和;二阶交叉部分是对特征进行两两相乘,然后赋予权重加权求和。然后将两部分结果累加在一起即为FM的输出
\(\begin{aligned}
y_{FM} = w_0 + \sum_{i=0}^n w_i x + \sum_{i=0}^{n} \sum_{j=i+1}^{n} <V_i, V_j> x_i x_j
\end{aligned}\)
2、Deep结构
Deep结构是一个DNN模型,主要用来学习高阶隐性特征交互,不同Sparse特征经过Embedding层映射成相同维度的Dense特征,经过多个隐藏层进行特征交互学习,最后经过sigmoid激活函数得到输出。
DeepFM实现
import tensorflow as tf
from tensorflow.keras.layers import Input, Embedding, Dense, Concatenate, Flatten
from tensorflow.keras.models import Model
class DeepFM(tf.keras.Model):
def __init__(self, feature_dim, embedding_dim, hidden_units):
super(DeepFM, self).__init__()
# Embedding 层
self.embedding_layer = Embedding(input_dim=feature_dim, output_dim=embedding_dim)
self.fm_embedding = Embedding(input_dim=feature_dim, output_dim=1)
# Dense 层(Deep 部分)
self.dense_layers = [Dense(units, activation='relu') for units in hidden_units]
# 输出层
self.output_layer = Dense(1, activation='sigmoid')
def call(self, inputs):
# 输入层
input_layer = Input(shape=(inputs,))
# Embedding 层
embedding_layer = self.embedding_layer(input_layer)
embedding_flatten = Flatten()(embedding_layer)
# FM 部分
fm = self.fm_embedding(input_layer)
fm = Flatten()(fm)
# Deep 部分
deep = embedding_flatten
for dense_layer in self.dense_layers:
deep = dense_layer(deep)
# 合并 FM 和 Deep 部分
concat = Concatenate()([fm, deep])
# 输出层
output = self.output_layer(concat)
return output
DeepFM优缺点
优点:
- 融合了线性和非线性模型: DeepFM同时包含了因子分解机的线性部分和深度神经网络的非线性部分,因此能够在建模能力上更全面地考虑线性和非线性关系。
- 适用于稀疏数据: 由于Embedding层的引入,DeepFM对于高维稀疏数据的建模效果较好,适用于处理具有大量离散特征的数据。
- 能够学习特征的交叉信息: 因子分解机的存在使得模型能够有效地学习特征之间的交叉信息,提高了对特征组合的建模能力。
- 端到端的训练: 可以通过端到端的方式进行训练,使用梯度下降等优化算法来同时优化因子分解机和深度神经网络。
缺点:
- 计算复杂度较高: 由于同时包含了因子分解机和深度神经网络,DeepFM的计算复杂度相对较高,尤其是在处理大规模数据时。
- 超参数调优困难: 模型包含多个部分,需要对深度神经网络和因子分解机的超参数进行调优,这可能需要更多的计算资源和经验。
- 可能需要大量的数据: 深度神经网络部分可能需要大量的数据来进行训练,以避免过拟合。
- 可能存在过拟合的风险: 深度神经网络的引入增加了过拟合的风险,因此需要谨慎处理正则化等技术。