ARTICLE DETAIL

资讯详情

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

DeepCTR 之 PNN(Product-based Neural Network)模型:源码级原理剖析与完整参数实战指南

DeepCTR 之 PNN(Product-based Neural Network)模型:源码级原理剖析与完整参数实战指南 人工智能深度学习机器学习【免费下载链接】DeepCTREasy-to-use,Modular and Extendible package of deep-learning based CTR models .项目地址https://gitcode.com/gh_mirrors/de/DeepCTR点击查看免费下载导读本文以 DeepCTR 官方 API 文档中 deepctr.models.pnn 模块 为核心系统讲解基于乘积的神经网络 PNNProduct-based Neural Network在 DeepCTR 中的实现与使用。你将掌握 PNN 的完整构造参数与默认值、内积/外积两种特征交互层IPNN / OPNN的底层实现原理、四种产品层组合模式以及基于 Keras 与 TensorFlow Estimator 两种接口的建模、训练、评估与模型持久化全流程。文末还会结合仓库测试用例说明如何快速验证模型可用性。PNN 模型是什么从论文到 DeepCTR 实现PNNProduct-based Neural Network由 Qu 等人提出Product-based neural networks for user response predictionICDM 2016其核心思想是在传统 DNN 之前显式建模特征域之间的乘积交互。与仅仅拼接 embedding 向量的 FNN、DeepFM 不同PNN 在 embedding 层之上增加了一个Product Layer对任意两两特征域计算内积inner product或外积outer product把高阶特征交互信号注入深度网络。在 DeepCTR 中PNN 由三部分协作完成模型入口函数 deepctr/models/pnn.py 中的PNN()负责组装整个网络乘积交互层 deepctr/layers/interaction.py 中的InnerProductLayer与OutterProductLayerDNN 与输出层 deepctr/layers/core.py 中的DNN与PredictionLayer。该模块在官方模型索引 Models.rst 中被列为 DeepCTR 的核心模型之一IPNN 与 OPNN 两种变体可通过参数切换。PNN API 与完整参数详解PNN是典型的 Keras 函数式 API 构造器函数签名见 deepctr/models/pnn.py如下def PNN(dnn_feature_columns, dnn_hidden_units(256, 128, 64), l2_reg_embedding0.00001, l2_reg_dnn0, seed1024, dnn_dropout0, dnn_activationrelu, use_innerTrue, use_outterFalse, kernel_typemat, taskbinary): ... return model调用后返回一个tensorflow.keras.models.Model实例。下表逐参数说明其含义、默认值与取值范围参数类型默认值说明dnn_feature_columnsiterable无必填供深度部分使用的全部特征列SparseFeat/DenseFeat等由deepctr.feature_column构造dnn_hidden_unitslist(256, 128, 64)DNN 隐层神经元数量列表[]表示去掉 DNN只保留产品层输出l2_reg_embeddingfloat0.00001施加在 embedding 向量上的 L2 正则强度l2_reg_dnnfloat0施加在 DNN 权重上的 L2 正则强度seedint1024随机种子用于权重初始化、Dropout 等随机过程复现dnn_dropoutfloat0DNN 神经元丢弃概率取值范围[0, 1)dnn_activationstrreluDNN 激活函数如relu、tanh、sigmoid等use_innerboolTrue是否启用内积Inner Product交互use_outterboolFalse是否启用外积Outer Product交互kernel_typestrmat外积核矩阵类型只能是mat、vec或numtaskstrbinarybinary使用二分类 loglossregression使用回归损失两个值得注意的实现细节非法参数会直接抛错。PNN入口处对kernel_type做了白名单校验deepctr/models/pnn.pyOutterProductLayer构造时同样校验deepctr/layers/interaction.py传入kernel_type之外的字符串会抛出ValueError(kernel_type must be mat,vec or num)。默认组合是 IPNNuse_innerTrue, use_outterFalse这也是论文中最常用的配置。模型结构与数据流源码级解析PNN的完整数据流可以拆成六个步骤对应 deepctr/models/pnn.py第 1 步构建输入层。build_input_features(dnn_feature_columns)把特征列转换为 KerasInput字典inputs_list list(features.values())作为最终Model(inputs..., outputs...)的输入列表。第 2 步生成 embedding 与稠密值。input_from_feature_columns(features, dnn_feature_columns, l2_reg_embedding, seed)返回sparse_embedding_list每个稀疏域一个(batch, 1, embedding_size)的 3D 张量列表和dense_value_list。第 3 步计算乘积特征。两个分支并行inner_product Flatten()(InnerProductLayer()(sparse_embedding_list)) outter_product OutterProductLayer(kernel_type)(sparse_embedding_list)第 4 步拼接线性信号。把所有域的 embedding 首尾相接并Reshape成一维向量linear_signal Reshape( [sum(map(lambda x: int(x.shape[-1]), sparse_embedding_list))])(concat_func(sparse_embedding_list))第 5 步按开关组合深度输入。use_inner/use_outter的四种组合决定deep_input的内容详见下一节随后combined_dnn_input([deep_input], dense_value_list)把产品层输出与稠密原始特征拼在一起喂给 DNN。第 6 步DNN 输出层。DNN(dnn_hidden_units, dnn_activation, l2_reg_dnn, dnn_dropout, False, seedseed)得到dnn_out经Dense(1, use_biasFalse)映射为 logit最后由PredictionLayer(task)输出taskbinary时输出 sigmoid 概率taskregression时输出线性 logit。内积与外积交互层两个关键算子的实现原理InnerProductLayerIPNN 核心InnerProductLayerdeepctr/layers/interaction.py接收 N 个(batch, 1, embedding_size)的 embedding 张量对全部N*(N-1)/2个特征域两两组合row/col通过双重循环生成所有i j的下标对按行、列分组拼接后逐元素相乘得到p * q默认reduce_sumTrue沿 embedding 维度求和输出形状为(batch_size, N*(N-1)/2, 1)若reduce_sumFalse则输出逐元素乘积(batch_size, N*(N-1)/2, embedding_size)。在PNN中该层输出随后被Flatten()展开成一维向量即 IPNN 论文中内积池化的结果。层构建时还会校验所有输入形状必须一致且为(None, 1, embedding_size)形态否则抛ValueError。OutterProductLayerOPNN 核心OutterProductLayerdeepctr/layers/interaction.py的输出形状固定为(batch_size, N*(N-1)/2)其实现参考了论文作者发布的 product-nets 开源代码。关键在于kernel 权重的三种参数化方式这也是kernel_type参数的本源kernel_typekernel 形状计算方式mat(embed_size, num_pairs, embed_size)对每对特征用一个完整的k×k矩阵做双线性变换p^T · W · q最强大但参数量最大vec(num_pairs, embed_size)每对特征共用一个向量做加权求和sum(p * q * k)num(num_pairs, 1)每对特征仅用一个标量做加权sum(p * q * k)参数量最小mat分支在call中通过p扩维后与 kernel 逐元素相乘、两次归约与转置实现p^T W q见 deepctr/layers/interaction.pyvec与num分支则统一走kp reduce_sum(p * q * k, -1)的简洁路径deepctr/layers/interaction.py。四种产品层组合模式use_inner与use_outter的组合决定了送入 DNN 的deep_inputdeepctr/models/pnn.pyuse_inneruse_outterdeep_input 内容对应模型TrueFalselinear_signal inner_productIPNN默认FalseTruelinear_signal outter_productOPNNTrueTruelinear_signal inner_product outter_productIPNNOPNN 混合FalseFalse仅linear_signal退化为纯 embedding 拼接 DNN注意linear_signal始终保留即使关闭全部乘积embedding 拼接信号依然作为 DNN 的输入保证特征信息不丢失。实战用 PNN 完成一次完整的训练与评估DeepCTR 各模型共享统一的使用范式先构造特征列再实例化模型最后compilefit。仓库测试工具 tests/utils.py 中的check_model展示了标准流程tests/utils.pyimport numpy as np from deepctr.models import PNN from deepctr.feature_column import SparseFeat, DenseFeat # 1. 构造特征列稀疏域 稠密域 feature_columns [ SparseFeat(sparse_feature_0, vocabulary_size4, embedding_dim4), SparseFeat(sparse_feature_1, vocabulary_size4, embedding_dim4), DenseFeat(dense_feature_0, 1), ] # 2. 实例化模型IPNN 默认配置 model PNN(feature_columns, dnn_hidden_units(256, 128, 64), dnn_dropout0.5, use_innerTrue, use_outterFalse) # 3. 编译并训练 model.compile(adam, binary_crossentropy, metrics[binary_crossentropy]) x { sparse_feature_0: np.random.randint(0, 4, 8), sparse_feature_1: np.random.randint(0, 4, 8), dense_feature_0: np.random.random(8), } y np.random.randint(0, 2, 8) model.fit(x, y, batch_size100, epochs1, validation_split0.5) # 4. 权重与整模型持久化 model.save_weights(pnn_weights.h5) model.load_weights(pnn_weights.h5) model.save(pnn.h5)关于持久化有两点补充重载完整模型时需要使用 DeepCTR 提供的custom_objectsfrom deepctr.layers import custom_objects以保证InnerProductLayer、OutterProductLayer等自定义层能被正确反序列化PNN_test用例正是依次验证了 train/valid 通过 → save/load weights → save/load 整模型 的完整闭环tests/utils.py。PNNEstimatorTensorFlow Estimator 接口版本除 Keras 版外仓库还提供deepctr.estimator.models.pnn模块下的PNNEstimatordeepctr/estimator/models/pnn.py面向 TensorFlow Estimator 生态。其核心参数与PNN完全一致dnn_hidden_units、l2_reg_embedding、use_inner、use_outter、kernel_type、task等额外扩展了训练运行时配置新增参数默认值说明model_dirNone模型参数、计算图与 checkpoint 的保存目录也用于断点续训configNonetf.RunConfig运行时配置linear_optimizerFtrl线性部分使用的优化器dnn_optimizerAdagrad深度部分使用的优化器training_chief_hooksNone训练时在 chief worker 上运行的SessionRunHook列表结构上的差异deepctr/estimator/models/pnn.py内部_model_fn中稀疏/稠密特征通过input_from_feature_columns得到 embedding内积/外积与linear_signal的拼接逻辑与 Keras 版逐行对应get_linear_logit(features, [], ...)以空线性特征列表构造线性 logit即默认不叠加线性项最后deepctr_model_fn统一封装训练、评估与预测。使用方式遵循 Estimator 惯例model.train(input_fn)/model.evaluate(input_fn)见 tests/models/PNN_test.py 中的PNNEstimator用例。需要留意Estimator 接口的可用性依赖 TensorFlow 版本测试工具中仅对2.0或[2.0, 2.6)区间启用见 tests/utils.py选用前请确认运行环境。测试与验证仓库如何保障 PNN 可用PNN_test.py 使用 pytest 参数化覆盖两类关键配置tests/models/PNN_test.py(use_innerTrue, use_outterTrue, sparse_feature_num3)双乘积混合模式(use_innerFalse, use_outterFalse, sparse_feature_num1)关闭全部乘积的退化模式。测试数据由get_test_data随机生成SAMPLE_SIZE8embedding 维度 4每个用例均以dnn_hidden_units[4, 4], dnn_dropout0.5构造模型并跑通check_model全流程。这从侧面印证了任何use_inner/use_outter组合与稀疏特征数量下PNN 都能完成编译、训练、评估与序列化可作为自定义实验的参照模板。小结PNN 通过产品层把特征域两两交互显式注入深度网络在 DeepCTR 中落地为PNN/PNNEstimator两个入口配合InnerProductLayer、OutterProductLayer两个可复用算子可一键切换 IPNN、OPNN 及混合模式。想要进一步了解与其他深度 CTR 模型的差异可对照同目录下的 FNN、DeepFM、NFM 等模型文档若需在实验中验证梯度流与训练行为可从 tests/models/PNN_test.py 出发快速搭建回归用例。赞分享人工智能深度学习机器学习【免费下载链接】DeepCTREasy-to-use,Modular and Extendible package of deep-learning based CTR models .项目地址https://gitcode.com/gh_mirrors/de/DeepCTR点击查看免费下载相关推荐DeepCTR 中的 DCNDeep Cross Network模型架构原理、参数详解与实战指南DeepCTR 中的 DCNDeep Cross Network模型架构原理、参数详解与实战指南 本文聚焦 DeepCTR 开源仓库中的 deepct人工智能深度学习机器学习Relay 数据刷新实战useRefetchableFragment 完整 API 参考与源码级原理剖析Relay 数据刷新实战useRefetchableFragment 完整 API 参考与源码级原理剖析 导读 useRefetchableFragment前端开发工具Extism Go SDK 实战指南在 Go 宿主应用中加载与调用 WebAssembly 插件Extism Go SDK 实战指南在 Go 宿主应用中加载与调用 WebAssembly 插件 Extism 是一套跨语言的插件运行时体系其 Go SDK人工智能深度学习机器学习上一篇终极workerd兼容性指南掌握兼容性日期的高效管理技巧下一篇从崩溃到稳定Portkey-AI网关Anthropic消息流事件全解析与修复指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表