【推薦演算法】DeepFM
阿新 • • 發佈:2021-06-30
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