ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DeepCTR 之 DeepFEFM 模型实战指南:Field-Embedded Factorization Machines 的原理、参数与消融实验

DeepCTR 之 DeepFEFM 模型实战指南:Field-Embedded Factorization Machines 的原理、参数与消融实验 人工智能深度学习机器学习【免费下载链接】DeepCTREasy-to-use,Modular and Extendible package of deep-learning based CTR models .项目地址https://gitcode.com/gh_mirrors/de/DeepCTR点击查看免费下载导读DeepFEFMField-Embedded Factorization Machines是 DeepCTR 内置的 CTR 预估模型之一其核心思想是在经典 FM 的成对特征交互中引入域Field相关的投影矩阵用更细粒度的方式刻画不同特征域之间的相互作用。本文基于docs/source/deepctr.models.deepfefm.rst对应的模块文档结合 deepctr/models/deepfefm.py 的源码实现、FEFMLayer 的交互层逻辑以及 tests/models/DeepFEFM_test.py 的测试用例系统讲解 DeepFEFM 的模型结构、全部构造函数参数、消融实验开关、Keras 与 Estimator 两种使用方式以及完整的端到端训练流程。读完本文你将能够在 DeepCTR 中独立搭建、配置并评估 DeepFEFM及其浅层 FEFM 变体模型。一、DeepFEFM 是什么从 FM 到 FEFMDeepFEFM 的源码参考论文为Field-Embedded Factorization Machines for Click-through Rate PredictionarXiv:2009.09931见 deepctr/models/deepfefm.py。论文由 Harshit Pande 提出并在 DeepCTR 中落地实现模块作者同样为 Harshit Pande。在经典 FM 中二阶交互项对每一对特征都使用一个统一的交互权重w_ij表达能力有限。FEFM 的改进在于对每一对特征域(i, j)维护一个专属的field embedding 矩阵W_ij形状为embedding_size × embedding_size交互时先对特征 i 的向量做域相关的线性变换再与特征 j 的向量做点积。这样同一个特征在与不同域的特征交互时会被投影到不同的语义空间中从而更精确地建模跨域交互。DeepFEFM 则是将这一 FEFM 交互作为浅层分支与经典 DeepCTR 式的线性 DNN结构叠加形成线性 FEFM Deep的三分支模型。二、模型结构与前向流程从 deepctr/models/deepfefm.py 的源码可以还原完整的模型构建流程构建输入build_input_features(linear_feature_columns dnn_feature_columns)为全部特征创建 KerasInput占位符线性分支get_linear_logit(...)产出线性 logit特征分组嵌入input_from_feature_columns(..., support_groupTrue)返回按group_name分组的稀疏嵌入字典与稠密特征值列表FEFM 交互嵌入对每个分组内DEFAULT_GROUP_NAME即default_group定义于 deepctr/feature_column.py的嵌入做concat_func(v, axis1)后送入FEFMLayer再按组拼接DNN 输入combined_dnn_input(...)将全部稀疏嵌入与稠密特征拼接为 DNN 输入向量并根据开关拼接 FEFM 交互嵌入DNN 分支DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seedseed)后接一个Dense(1, use_biasFalse)产出 DNN logitFEFM logitLambda(lambda x: reduce_sum(x, axis1, keep_dimsTrue))(fefm_interaction_embedding)将交互嵌入向量逐元素求和得到标量 logitlogit 组合根据各开关状态按分支组合见第五节结构组合矩阵最终由PredictionLayer(task)输出预测。FEFMLayer 的域相关交互计算FEFM 交互的具体实现在 deepctr/layers/interaction.py输入为三维张量(batch_size, field_size, embedding_size)输出为二维张量(batch_size, num_fields * (num_fields - 1) / 2)每一列对应一对域的组合在build阶段使用itertools.combinations(range(num_fields), 2)为每一对域(fi, fj)创建形状为(embedding_size, embedding_size)的可训练权重矩阵field_embeddings[fi-fj]初始化器为TruncatedNormal并施加l2(regularizer)正则参数即l2_reg_embedding_field在call阶段对每对域feat_embed_i_tr matmul(feat_embed_i, field_pair_embed_ij transpose(field_pair_embed_ij))通过对称化W W^T保证交互的对称性再与feat_embed_j做batch_dot得到该域对的交互值f所有域对的交互值沿axis1拼接返回。这正是 FEFM 与 FM/FFM 的关键区别FFM 使用随特征域变化的向量而 FEFM 直接学习域对 → 投影矩阵的映射参数量级为C(num_fields, 2) × embedding_size²。三、DeepFEFM 构造函数参数详解模块文档中的核心内容即DeepFEFM的全部参数见 deepctr/models/deepfefm.py下表逐一给出含义、类型、默认值与取值约束参数类型默认值含义linear_feature_columnsiterable必填线性部分使用的特征列dnn_feature_columnsiterable必填深度部分使用的特征列use_fefmboolTrue是否使用最终 FEFM logit不影响FEFM 嵌入参与 DNN只控制最终 FEFM logit 是否加入预测dnn_hidden_unitslist(256, 128, 64)DNN 每层的神经元数传空列表()可得到浅层 FEFM 模型l2_reg_linearfloat0.00001线性部分的 L2 正则强度l2_reg_embedding_featfloat0.00001特征嵌入向量的 L2 正则强度l2_reg_embedding_fieldfloat0.00001域嵌入矩阵field pair matrix的 L2 正则强度l2_reg_dnnfloat0DNN 的 L2 正则强度seedint1024随机种子dnn_dropoutfloat0.0DNN Dropout 概率取值[0, 1)exclude_feature_embed_in_dnnboolFalse消融用从 DNN 输入中剔除原始特征嵌入只保留 FEFM 交互嵌入use_linearboolTrue消融用是否使用线性 logituse_fefm_embed_in_dnnboolTrue消融用FEFM 交互嵌入是否拼入 DNN 输入False对应论文 Ablation4dnn_activationstrreluDNN 激活函数dnn_use_bnboolFalseDNN 各层是否在激活前使用 BatchNormalizationtaskstrbinarybinary表示二分类 loglossregression表示回归损失其中l2_reg_embedding_field直接对应FEFMLayer的regularizer参数源码中FEFMLayer(regularizerl2_reg_embedding_field)见 deepctr/models/deepfefm.py用于约束域对矩阵的复杂度防止过拟合。四、FEFM 与 DeepCTR 其他模型的定位DeepFEFM 已注册进 DeepCTR 的公共 APIfrom deepctr.models import DeepFEFM见 deepctr/models/init.py并出现在__all__导出列表第 26 行在 docs/source/Models.rst 中也有对应索引页DeepFEFMdeepctr.models.deepfefm。相比 DeepFMFM 交互 DNN与 FwFMField-weighted FM学习标量域权重FEFM 用矩阵级别的域对参数刻画交互是三者中参数量更大、表达能力更强的域感知二阶交互方案其不足之处是参数量随域数平方增长特征域较多时训练成本与正则压力都会上升。五、结构组合矩阵如何用开关还原论文的消融实验deepctr/models/deepfefm.py源码开头的注释明确指出this file also supports all the possible Ablation studies for reproducibility。第 84-99 行是一组互斥分支判断将模型拆解为以下可复现的组合组合dnn_hidden_unitsuse_fefmuse_linear实际结构备注A()FalseTrue仅线性最简基线B()TrueTrue线性 FEFM浅层 FEFMC非空FalseTrue线性 Deep对应Ablation1D非空TrueTrue线性 FEFM Deep默认完整 DeepFEFME()TrueFalse仅 FEFM纯浅层 FEFMF非空FalseFalse仅 Deep—G非空TrueFalseFEFM Deep对应Ablation2此外还有两个 DNN 输入侧开关use_fefm_embed_in_dnnFalse对应Ablation4即 FEFM 交互嵌入完全不进入 DNN源码第 69 行注释明确标注exclude_feature_embed_in_dnnTrue需同时use_fefm_embed_in_dnnTrue对应Ablation3DNN 输入只保留 FEFM 交互嵌入、剔除原始特征嵌入源码第 71-73 行。上述开关组合在 tests/models/DeepFEFM_test.py 中被参数化逐一验证覆盖了use_fefm、use_linear、use_fefm_embed_in_dnn三个布尔开关的 8 种全组合以及hidden_size()的浅层场景可直接作为复现论文实验的参考清单。六、完整使用示例基于 Criteo 样本的分类训练DeepFEFM 的使用方式与其他 DeepCTR 模型完全一致可参照 examples/run_classification_criteo.py 的标准流程仅将模型替换为DeepFEFM。示例数据为仓库自带的 examples/criteo_sample.txt26 个稀疏特征 C1-C26 13 个稠密特征 I1-I13 label。import pandas as pd from sklearn.metrics import log_loss, roc_auc_score from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder, MinMaxScaler from deepctr.models import DeepFEFM from deepctr.feature_column import SparseFeat, DenseFeat, get_feature_names if __name__ __main__: data pd.read_csv(./criteo_sample.txt) sparse_features [C str(i) for i in range(1, 27)] dense_features [I str(i) for i in range(1, 14)] data[sparse_features] data[sparse_features].fillna(-1) data[dense_features] data[dense_features].fillna(0) target [label] # 1. 稀疏特征做 Label Encoding稠密特征做 MinMax 归一化 for feat in sparse_features: lbe LabelEncoder() data[feat] lbe.fit_transform(data[feat]) mms MinMaxScaler(feature_range(0, 1)) data[dense_features] mms.fit_transform(data[dense_features]) # 2. 构建特征列稀疏特征按词表大小声明 embedding_dim稠密特征维度为 1 fixlen_feature_columns [SparseFeat(feat, vocabulary_sizedata[feat].max() 1, embedding_dim4) for feat in sparse_features] [DenseFeat(feat, 1, ) for feat in dense_features] dnn_feature_columns fixlen_feature_columns linear_feature_columns fixlen_feature_columns feature_names get_feature_names(linear_feature_columns dnn_feature_columns) # 3. 划分训练/测试集并组织模型输入字典 train, test train_test_split(data, test_size0.2, random_state2020) train_model_input {name: train[name] for name in feature_names} test_model_input {name: test[name] for name in feature_names} # 4. 构建 DeepFEFM 并训练评估 model DeepFEFM(linear_feature_columns, dnn_feature_columns, taskbinary) model.compile(adam, binary_crossentropy, metrics[binary_crossentropy]) history model.fit(train_model_input, train[target].values, batch_size256, epochs10, verbose2, validation_split0.2) pred_ans model.predict(test_model_input, batch_size256) print(test LogLoss, round(log_loss(test[target].values, pred_ans), 4)) print(test AUC, round(roc_auc_score(test[target].values, pred_ans), 4))说明SparseFeat的embedding_dim也可设为auto此时按6 * int(pow(vocabulary_size, 0.25))自动推算见 deepctr/feature_column.pySparseFeat默认use_hashFalse、dtypeint32若使用dtypestring则必须开启use_hashTrue否则会抛出异常见 deepctr/feature_column.py如需跑浅层 FEFM将dnn_hidden_units()传入即可。七、Estimator 版本面向生产的 DeepFEFMEstimator除 Keras 版DeepFEFM外DeepCTR 还提供 TensorFlow Estimator 版DeepFEFMEstimator从deepctr.estimator.models.deepfefm模块导出见 deepctr/estimator/models/init.py。Estimator 版在 deepctr/estimator/models/deepfefm.py 中实现与 Keras 版的关键差异是不提供消融开关。源码注释明确说明Ablation support not provided as estimator is meant for production, Ablation support provided in DeepFEFM implementation in models——Estimator 面向生产环境默认固定使用线性 FEFM DNN的完整结构消融能力只保留在deepctr.models的实现中。Estimator 版额外增加的参数参数默认值含义model_dirNone模型参数、graph 与 checkpoint 的保存目录也可用于加载已有 checkpoint 继续训练configNonetf.RunConfig对象用于配置运行时设置linear_optimizerFtrl线性部分的优化器默认 FTRLdnn_optimizerAdagrad深度部分的优化器默认 Adagradtraining_chief_hooksNone训练时在 chief worker 上运行的tf.train.SessionRunHook迭代器其内部_model_fn在DNN_SCOPE_NAME作用域下复用同一个FEFMLayer将fefm_logit、dnn_logit与linear_logits相加后交给deepctr_model_fn处理训练/评估/预测。使用方式可参照 examples/run_estimator_pandas_classification.py 与 examples/run_estimator_tfrecord_classification.py 中其他 Estimator 模型的调用模式。八、测试与验证tests/models/DeepFEFM_test.py 提供了两层验证Keras 模型测试test_DeepFEFM参数化遍历use_fefm、use_linear、use_fefm_embed_in_dnn的 8 种开关组合分别以dnn_hidden_units(2,)与()验证模型可正常构建、训练并前向推理调用check_modelEstimator 测试test_DeepFEFMEstimator验证DeepFEFMEstimator在dnn_hidden_units(2,)与()下可通过check_estimator完成 Estimator 生命周期检查测试依赖TEST_Estimator开关且 TensorFlow 1.4/1.15 下会跳过以节省时间。这两个测试也是读者快速自检环境、验证开关组合可行性的现成入口。九、适用场景与注意事项适用场景需要精细刻画特征域间交互的 CTR/CVR 预估任务尤其是特征域数适中如几十个域以内、数据量足以支撑矩阵级域对参数学习的场景参数量注意FEFM 的域对矩阵参数随域数n以O(n² × d²)增长d为嵌入维度域数过多时建议适当增大l2_reg_embedding_field并配合dnn_dropout控制过拟合消融开关语义use_fefmFalse只会移除最终 FEFM logitFEFM 交互嵌入仍会拼入 DNN除非同时use_fefm_embed_in_dnnFalse这一点从 deepctr/models/deepfefm.py 的代码顺序可以清楚看到回归/二分类适配通过taskbinary/taskregression切换PredictionLayer的输出激活与损失若原文档无特殊说明二分类场景使用默认值即可。以上内容均以当前仓库为证据模型结构与参数以 deepctr/models/deepfefm.py 为准交互层原理以 deepctr/layers/interaction.py 为准实验组合以 tests/models/DeepFEFM_test.py 为准生产版实现以 deepctr/estimator/models/deepfefm.py 为准。读者可沿这些文件路径继续深入源码研读。赞分享人工智能深度学习机器学习【免费下载链接】DeepCTREasy-to-use,Modular and Extendible package of deep-learning based CTR models .项目地址https://gitcode.com/gh_mirrors/de/DeepCTR点击查看免费下载相关推荐DeepCTR DeepFEFMEstimator 深度指南基于 Field-Embedded Factorization Machines 的生产级 CTR 预估 EstimatorDeepCTR DeepFEFMEstimator 深度指南基于 Field Embedded Factorization Machines 的生产级 CTR人工智能深度学习机器学习DeepCTR FwFMEstimator 深度解析基于 Field-weighted Factorization Machines 的 CTR 预估 Estimator 实战指南DeepCTR FwFMEstimator 深度解析基于 Field weighted Factorization Machines 的 CTR 预估 Est人工智能深度学习机器学习DeepCTR 中的 IFMInput-aware Factorization Machine模型源码解析与实战指南DeepCTR 中的 IFMInput aware Factorization Machine模型源码解析与实战指南 导读 本文围绕 DeepCTR 开源人工智能深度学习机器学习上一篇vux灰度发布金丝雀部署策略下一篇Databend 本地模式 Python 绑定bendpy实战指南内嵌分析、文件查询与云存储统一入口创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表