【推荐算法】DeepFM
DeepFM主要解决了Wide & Deep的以下几个痛点:
- wide部分特征自动交叉。Wide & Deep中的wide部分需要手工做特征工程,DeepFM向wide部分引入FM模块,使wide部分能够自动组合二阶交叉特征,可以实现端到端的训练。
算法
如图,整个网络可以看作三个部分:一阶部分+二阶部分+MLP。也可以看作两个部分:FM+MLP。其中,FM是低阶交叉部分,可以看做Wide & Deep中的Wide部分;MLP即为Deep部分。FM与MLP共享所有embedding,没有额外的手工特征交叉,可以实现端到端训练。
模型输入
FM与MLP部分的定义在前面的章节介绍过,只需要重新设计前向传播过程即可。
class DeepFactorizationMachineModel(torch.nn.Module):
def __init__(self, field_dims, embed_dim=16, mlp_dims=(16, 16), dropout=0.2):
super().__init__()
self.linear = FeaturesLinear(field_dims)
self.fm = FactorizationMachine(reduce_sum=True)
self.embedding = FeaturesEmbedding(field_dims, embed_dim)
self.embed_output_dim = len(field_dims) * embed_dim
self.mlp = MultiLayerPerceptron(self.embed_output_dim, mlp_dims, dropout)
def forward(self, x):
"""
:param x: Long tensor of size ``(batch_size, num_fields)``
"""
embed_x = self.embedding(x)
x = self.linear(x) + self.fm(embed_x) + self.mlp(embed_x.view(-1, self.embed_output_dim))
return torch.sigmoid(x.squeeze(1))
模型效果
设置:
数据集:ml-100k
优化方法:Adam
学习率:0.003
效果:
收敛epoch:6
train logloss: 0.53571
val auc: 0.78205
test auc: 0.78592