【推荐算法】DeepFM

DeepFM主要解决了Wide & Deep的以下几个痛点:

  1. 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

posted @ 2021-06-30 17:43  tmpUser  阅读(139)  评论(0编辑  收藏  举报