1. 程式人生 > 其它 >【推薦演算法】DeepFM

【推薦演算法】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