PaddlePaddle / PaddleRec

Recommendation Algorithm大规模推荐算法库,包含推荐系统经典及最新算法LR、Wide&Deep、DSSM、TDM、MIND、Word2Vec、Bert4Rec、DeepWalk、SSR、AITM,DSIN,SIGN,IPREC、GRU4Rec、Youtube_dnn、NCF、GNN、FM、FFM、DeepFM、DCN、DIN、DIEN、DLRM、MMOE、PLE、ESMM、ESCMM, MAML、xDeepFM、DeepFEFM、NFM、AFM、RALM、DMR、GateNet、NAML、DIFM、Deep Crossing、PNN、BST、AutoInt、FGCNN、FLEN、Fibinet、ListWise、DeepRec、ENSFM,TiSAS,AutoFIS等,包含经典推荐系统数据集criteo 、movielens等
https://paddlerec.readthedocs.io/
Apache License 2.0
4.23k stars 721 forks source link

FFM模型Field-aware二阶项部分问题 #869

Open kj-wu opened 1 year ago

kj-wu commented 1 year ago

在FFM模型net.py文件中,FFM实现的Field-aware二阶项部分field_aware_feat_embedding的shape是[-1,sparse_num_field,sparse_num_field,sparse_feature_dim],如果按照FFM算法应该是[-1,sparse_feature_number,sparse_num_field,sparse_feature_dim]吧,请问这里为什么是两个sparse_num_field呢?

        # -------------------Field-aware second order term  --------------------
        sparse_embeddings = self.embedding(sparse_inputs_concat)
        dense_inputs_re = paddle.unsqueeze(dense_inputs, axis=2)
        dense_embeddings = paddle.multiply(dense_inputs_re, self.dense_w)
        feat_embeddings = paddle.concat([sparse_embeddings, dense_embeddings],
                                        1)
        field_aware_feat_embedding = paddle.reshape(
            feat_embeddings,
            shape=[
                -1, self.sparse_num_field, self.sparse_num_field,
                self.sparse_feature_dim
            ])
        field_aware_interaction_list = []
        for i in range(self.sparse_num_field):
            for j in range(i + 1, self.sparse_num_field):
                field_aware_interaction_list.append(
                    paddle.sum(field_aware_feat_embedding[:, i, j, :] *
                               field_aware_feat_embedding[:, j, i, :],
                               1,
                               keepdim=True))
wangzhen38 commented 1 year ago

第一纬度-1等同于batch size,两个sparse_num_field,应该是为了适配公式中的计算