DeepCTR 中的 ONN(Operation-aware Neural Networks)模型:基于操作感知嵌入的二阶交互建模指南
发布时间:2026/9/27 12:32:30来源:尧图网络
人工智能深度学习机器学习【免费下载链接】DeepCTREasy-to-use,Modular and Extendible package of deep-learning based CTR models .项目地址https://gitcode.com/gh_mirrors/de/DeepCTR点击查看免费下载导读本文聚焦 DeepCTR 仓库中的 ONNOperation-aware Neural Networks for User Response Prediction模型。ONN 借鉴 FFMField-aware Factorization Machines的思想为每个特征字段维护多组「操作感知」嵌入向量从而在显式建模二阶特征交互的同时尽可能保留交互信息再由深层神经网络学习更高阶的特征组合。读完本文你将掌握 ONN 的完整 API 参数语义、源码实现路径、特征列配置方式以及如何基于测试用例快速验证模型为 CTR/CVR 预估任务选用和调优 ONN 提供直接参考。一、ONN 是什么从 FM/FFM 说起在点击率CTR预估场景中特征交叉一直是模型效果的关键。DeepCTR 官方特性文档对 ONN 的定位如下见 docs/source/Features.mdONN models second order feature interactions like FFM and preserves second-order interaction information as much as possible. Further more, deep neural network is used to learn higher-ordered feature interactions.即ONN 像 FFM 一样显式建模二阶特征交互并尽可能完整保留二阶交互信息在此基础上叠加深度神经网络学习高阶特征交互。对比经典的 FM 与 FFMFM每个特征只有一个嵌入向量任意两个特征用各自的嵌入向量做内积或逐元素乘积后求和来刻画交互FFM引入「场field」的概念每个特征在与不同场的特征交互时使用不同的嵌入向量交互刻画更精细ONN在 FFM 思路上更进一步——每个特征在与其他每个特征交互时都有专属的操作感知嵌入向量交互信息被更完整地保留而不是像部分模型那样把交互结果压缩成一个标量。ONN 论文来源为deepctr/models/onn.py头部注释中的引用Yang Y, Xu B, Shen F, et al. Operation-aware Neural Networks for User Response Prediction[J]. arXiv preprint arXiv:1904.12579, 2019.二、ONN 模型 API 与全部参数详解ONN 的模型入口是deepctr.models.onn模块中的ONN()工厂函数签名如下见 deepctr/models/onn.pydef ONN(linear_feature_columns, dnn_feature_columns, dnn_hidden_units(256, 128, 64), l2_reg_embedding1e-5, l2_reg_linear1e-5, l2_reg_dnn0, dnn_dropout0, seed1024, use_bnTrue, reduce_sumFalse, taskbinary): Instantiates the Operation-aware Neural Networks architecture.各参数的含义、默认值与底层作用如下表参数默认值类型/取值范围作用说明linear_feature_columns必填iterable线性部分一阶项使用的特征列集合dnn_feature_columns必填iterable深度部分使用的特征列集合也是操作感知嵌入与二阶交互的输入来源dnn_hidden_units(256, 128, 64)list正整数或空列表深度网络各隐藏层的神经元数量控制层数与每层宽度l2_reg_embedding1e-5float施加在嵌入向量上的 L2 正则强度源码中通过l2()传入每个 Embedding 层的embeddings_regularizerl2_reg_linear1e-5float线性部分一阶项的 L2 正则强度经get_linear_logit(..., l2_regl2_reg_linear)生效l2_reg_dnn0floatDNN 部分权重矩阵的 L2 正则强度作用于 DNN 层 的 kernelseed1024integer随机种子贯穿线性部分、嵌入初始化与 DNN 权重初始化保证可复现dnn_dropout0float[0,1)DNN 各隐藏层的 Dropout 比例use_bnTruebool是否在 FFM 式交互输出之后、进入 DNN 之前施加 BatchNormalizationreduce_sumFalsebool是否对交互向量做reduce_sum为True时把逐元素乘积向量压缩为标量沿最后一维求和为False时保留完整交互向量taskbinarybinary/regression输出层任务类型binary对应二分类 loglossregression对应回归损失函数返回一个 KerasModel实例可直接用于model.compile(...)/model.fit(...)。三、源码级拆解ONN 的完整数据流结合 deepctr/models/onn.py 的实现ONN 的构造过程可以拆为以下 8 步1. 构建输入层与线性 logitfeatures build_input_features(linear_feature_columns dnn_feature_columns) inputs_list list(features.values()) linear_logit get_linear_logit(features, linear_feature_columns, seedseed, prefixlinear, l2_regl2_reg_linear)build_input_features与get_linear_logit均来自 deepctr/feature_column.py。线性 logit 即一阶项相当于 LR/FM 中的线性部分后续与 DNN 输出相加。2. 筛选稀疏特征列sparse_feature_columns list(filter(lambda x: isinstance(x, SparseFeat), dnn_feature_columns)) varlen_sparse_feature_columns list(filter(lambda x: isinstance(x, VarLenSparseFeat), dnn_feature_columns))只有SparseFeat定长离散特征与VarLenSparseFeat变长序列特征参与二阶交互计算稠密数值特征仅通过get_dense_input在进入 DNN 前拼接。3. 核心构建操作感知Operation-aware嵌入字典这是 ONN 与 FM 类模型最本质的区别sparse_embedding {fc_j.embedding_name: {fc_i.embedding_name: Embedding( fc_j.vocabulary_size, fc_j.embedding_dim, embeddings_initializerfc_j.embeddings_initializer, embeddings_regularizerl2(l2_reg_embedding), mask_zeroisinstance(fc_j, VarLenSparseFeat), namesparse_emb_ str(fc_j.embedding_name) _ fc_i.embedding_name) for fc_i in sparse_feature_columns varlen_sparse_feature_columns} for fc_j in sparse_feature_columns varlen_sparse_feature_columns}这是一个二维嵌套字典对每个特征fc_j都会为其与所有其他特征fc_i的交互准备一个独立的 Embedding 层嵌入层命名形如sparse_emb_{field_j}_{field_i}体现了「每个特征对一组专属嵌入」的操作感知设计因此 ONN 的参数规模显著大于 FM若离散字段数为m、嵌入维度为kONN 约有m²·k量级的嵌入参数FFM 为m·field·k这正是「保留更多交互信息」的代价。4. 两两组合并计算二阶交互向量embed_list [] for fc_i, fc_j in itertools.combinations(sparse_feature_columns varlen_sparse_feature_columns, 2): i_input features[fc_i.name] if fc_i.use_hash: i_input Hash(fc_i.vocabulary_size)(i_input) j_input features[fc_j.name] if fc_j.use_hash: j_input Hash(fc_j.vocabulary_size)(j_input) fc_i_embedding feature_embedding(fc_i, fc_j, sparse_embedding, i_input) fc_j_embedding feature_embedding(fc_j, fc_i, sparse_embedding, j_input) element_wise_prod multiply([fc_i_embedding, fc_j_embedding]) if reduce_sum: element_wise_prod Lambda(lambda x: K.sum(x, axis-1))(element_wise_prod) embed_list.append(element_wise_prod)itertools.combinations(..., 2)枚举所有无序特征对(i, j)每个特征取出针对对方特征的专属嵌入然后做multiply逐元素乘积即 FFM 风格的交互reduce_sumFalse默认时保留长度为embedding_dim的交互向量是「尽可能保留二阶交互信息」的直接体现reduce_sumTrue时压缩为标量与 FM 的交互聚合方式更接近若特征配置了use_hashTrue输入会先经Hash层做哈希分桶源码来自 deepctr/layers/utils.py。5. 交互特征聚合与归一化ffm_out Flatten()(concat_func(embed_list, axis1)) if use_bn: ffm_out BatchNormalization()(ffm_out)所有二阶交互向量沿轴 1 拼接后展平默认再经过 BatchNormalization 归一化即参数use_bnTrue稳定后续 DNN 的训练。6. 拼接稠密特征并送入 DNNdense_value_list get_dense_input(features, dnn_feature_columns) dnn_input combined_dnn_input([ffm_out], dense_value_list) dnn_out DNN(dnn_hidden_units, l2_regl2_reg_dnn, dropout_ratednn_dropout)(dnn_input) dnn_logit Dense(1, use_biasFalse)(dnn_out)combined_dnn_input见 deepctr/layers/utils.py 的combined_dnn_input函数把展平后的交互向量与稠密数值特征拼接为 DNN 的输入。DNN层实现于 deepctr/layers/core.py使用glorot_normal初始化 kernel、Zeros初始化 bias默认 ReLU 激活并可按dnn_dropout逐层施加 Dropout。DNN 负责学习二阶以上的高阶特征交互。7. 合并 logit 并输出final_logit add_func([dnn_logit, linear_logit]) output PredictionLayer(task)(final_logit) model Model(inputsinputs_list, outputsoutput) return modelDNN logit 与线性 logit 相加对应 Wide Deep 式的双路合并再交给PredictionLayer按任务类型输出最终预测。8. 辅助函数feature_embeddingdef feature_embedding(fc_i, fc_j, embedding_dict, input_feature): fc_i_embedding embedding_dict[fc_i.name]fc_j.name if isinstance(fc_i, SparseFeat): return NoMask()(fc_i_embedding) else: return SequencePoolingLayer(fc_i.combiner, supports_maskingTrue)(fc_i_embedding)定长稀疏特征直接取嵌入并通过NoMask()去除 mask变长序列特征VarLenSparseFeat则经SequencePoolingLayer按combinersum/mean/max聚合序列中的多个嵌入supports_maskingTrue使其能正确忽略 padding。四、特征列配置与可运行的调用示例ONN 对特征列的依赖通过 deepctr/feature_column.py 中的SparseFeat与VarLenSparseFeat表达SparseFeat(name, vocabulary_size, embedding_dim4, use_hashFalse, ...)embedding_dim传auto时会自动计算为6 * int(pow(vocabulary_size, 0.25))默认嵌入初始化器为RandomNormal(mean0.0, stddev0.0001, seed2020)VarLenSparseFeat(sparsefeat, maxlen, combinermean, ...)包装一个SparseFeatcombiner控制序列聚合方式可取值sum、mean、max。参考 tests/models/ONN_test.py 中的构造方式一个最小可运行的示例骨架如下from deepctr.feature_column import SparseFeat, DenseFeat, VarLenSparseFeat, get_feature_names from deepctr.models import ONN # 离散稀疏特征field 名 词表大小 sparse_features [user_id, item_id] sparse_feature_columns [SparseFeat(feat, vocabulary_size1000, embedding_dim8) for feat in sparse_features] # 稠密数值特征 dense_features [age, price] dense_feature_columns [DenseFeat(feat, 1) for feat in dense_features] # 变长序列特征maxlen 控制序列最大长度combiner 控制池化方式 behavior_feature_columns [VarLenSparseFeat(SparseFeat(hist_item_id, vocabulary_size1000, embedding_dim8), maxlen10, combinermean)] model ONN(linear_feature_columnssparse_feature_columns dense_feature_columns, dnn_feature_columnssparse_feature_columns dense_feature_columns behavior_feature_columns, dnn_hidden_units(64, 32), dnn_dropout0.2, taskbinary) model.compile(optimizeradam, lossbinary_crossentropy, metrics[AUC]) # model.fit(X, y, batch_size256, epochs10, validation_split0.1)实际喂入的X需要以get_feature_names(...)返回的特征名为键构造字典输入参见 deepctr/inputs.py具体数据预处理可参考examples/目录下的run_classification_criteo.py、run_din.py等示例脚本。需要注意的是DeepCTR 当前以 TensorFlow 2 的tensorflow.keras为基础见 deepctr/models/onn.py 的导入方式运行前请确认环境中的 TensorFlow 版本与模型 API 匹配。五、测试用例与验证路径仓库在 tests/models/ONN_test.py 中为 ONN 提供了参数化测试pytest.mark.parametrize(sparse_feature_num, [2]) def test_ONN(sparse_feature_num): if version.parse(tf.__version__) version.parse(1.15.0): return x, y, feature_columns get_test_data(sample_size, sparse_feature_numsparse_feature_num, dense_feature_numsparse_feature_num, sequence_feature(sum, mean, max,), hash_flagTrue) model ONN(feature_columns, feature_columns, dnn_hidden_units[4, 4], dnn_dropout0.5) check_model(model, model_name, x, y)从测试可以提炼出 ONN 覆盖的关键能力序列特征支持sequence_feature(sum, mean, max,)验证了VarLenSparseFeat三种combiner池化方式的正确性对应源码中SequencePoolingLayer的调用分支Hash 分桶支持hash_flagTrue覆盖了use_hashTrue时Hash层参与的路径网络结构可配置dnn_hidden_units[4, 4]、dnn_dropout0.5验证了 DNN 结构与 Dropout 的配置生效check_model位于 tests/utils.py负责模型前向/反向与形状校验。需要留意该测试在tf.__version__ 1.15.0时会直接跳过说明它主要针对早期 TensorFlow 1.x 环境编写在新的 TensorFlow 2.x 环境下应以端到端训练脚本来验证模型。六、ONN 在 DeepCTR 模型家族中的定位从源码结构与特性文档可以推断ONN 处于「显式二阶交互 深度高阶建模」这一路线与FFMdeepctr/models/ffm.py注意当前deepctr/models目录下 FFM 相关实现相比ONN 的交互向量默认不压缩为标量二阶信息保留得更完整与DeepFMdeepctr/models/deepfm.py相比ONN 用多组操作感知嵌入替代 FM 共享嵌入来刻画交互与FNN / PNN相比ONN 的 DNN 输入中显式包含了两两特征交互的向量化表示而非仅由嵌入拼接或内积/外积聚合而来。适用场景建议基于模型特性推断当业务特征以离散稀疏特征为主、且二阶交叉对预估目标贡献明显时ONN 的细粒度嵌入设计可能带来更充分的交互信息利用代价是嵌入参数量随字段数近似平方增长需要结合l2_reg_embedding正则与dnn_dropout防止过拟合并对大词表特征开启use_hash控制内存。七、小结本文围绕 DeepCTR 的deepctr.models.onn模块完整梳理了 ONN 的 API 参数、操作感知嵌入的源码实现、特征列配置与测试验证路径。核心要点回顾操作感知嵌入每个特征针对不同交互对象拥有专属嵌入是 ONN 区别于 FM 的关键设计实现于 deepctr/models/onn.py 的二维嵌入字典二阶交互保留默认reduce_sumFalse保留完整交互向量配合use_bnTrue归一化后再进入 DNN配置灵活dnn_hidden_units、l2_reg_*、dnn_dropout、task等参数覆盖了从正则到任务类型的完整调优维度可验证仓库提供的 ONN 测试用例 覆盖序列池化、Hash 分桶与 DNN 结构配置。若需在真实数据上进一步实践可参考 docs/source/Features.md 中 ONN 的模型说明、docs/source/Models.rst 的模型索引以及examples/目录下的分类与多值特征示例脚本。赞分享人工智能深度学习机器学习【免费下载链接】DeepCTREasy-to-use,Modular and Extendible package of deep-learning based CTR models .项目地址https://gitcode.com/gh_mirrors/de/DeepCTR点击查看免费下载相关推荐ESP-SensairShuttle 板级适配指南xiaozhi-esp32 下基于 ESP32-C5 的动作感知与大模型交互开发板ESP SensairShuttle 板级适配指南xiaozhi esp32 下基于 ESP32 C5 的动作感知与大模型交互开发板 ESP SensairS人工智能大模型语音交互助手嵌入式物联网智能硬件MCP 服务DeepCTR 中的 IFMInput-aware Factorization Machine模型源码解析与实战指南DeepCTR 中的 IFMInput aware Factorization Machine模型源码解析与实战指南 导读 本文围绕 DeepCTR 开源人工智能深度学习机器学习PaddleNLP 中的 LUKE 模型实战基于实体感知自注意力Entity-aware Self-attention的实体表征微调指南PaddleNLP 中的 LUKE 模型实战基于实体感知自注意力Entity aware Self attention的实体表征微调指南 LUKELan人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇QMK Secure 功能完全指南解锁序列、自动锁定与安全状态管理下一篇Plate 编辑器测试行为收割ProseMirror Test Name Index 与 Slate v2 行为路由实践指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网