- 资产集市
- 教学
- 实践
- AI说
- 案例库
- 生态合作
- 专区
中国站
简体中文DeepFM推荐网络基于DeepFM: A Factorization-Machine based Neural Network for CTR Prediction实现,是一个端到端的模型,不需要人工特征工程。 DeepFM模型结合了广度和深度模型的优点,联合训练FM模型和DNN模型,来同时学习低阶特征组合和高阶特征组合,从而能够学习到各阶特征之间的组合关系。该模型的Deep component和FMcomponent从Embedding层共享数据输入,优势在于Embedding层的隐式向量在(残差反向传播)训练时可以同时接受到Deep component和FM component的信息,从而使Embedding层的信息表达更加准确而最终提升推荐效果。
DeepFM网络的基本结构如下图。
###2.1. 数据介绍
以Criteo数据集为例。
Criteo原始训练数据集为train.txt, 测试集为test.txt。 样例如下。
criteo 原始数据中,第一列为label,表示是否点击,后续39列为特征列,其中前13列为连续值特征,后26列为离散类别特征(为经过hash处理后的字符串)。原始数据集需要经过数据预处理之后才能进行训练。
###2.2. 数据预处理
数据预处理详情请参考DeepFM数据预处理,或者使用自己的预处理脚本(可忽略本文档预处理流程), 但数据输出格式必须和此文档保持一致。
####2.2.1 预处理流程
统计各连续值列的min-max value; 统计各类别列的词典频次字典;
按threshold=100,对频次词典进行过滤,得到类别映射为id的map字典;
对连续值进行MinMaxScaler; 将类别列特征映射为 id 值;
最后得到feature特征分为两种,id特征 和 weights特征 。
处理后的特征数据保存为H5文件,特征数据共78列(0-38为id特征列,39-77为weights特征列),内容格式如下:
criteo feature数据:
####2.2.2 数据输出格式
处理之后的数据格式如下:
output_path
|- preprocessed_data(预处理后的txt格式数据)
|- train_part_0.txt
|- train_part_1.txt
|- test_part_0.txt
|- ...
|- stats_dict (用于在线推理服务)
|- cat_count_dict.pkl
|- val_min_dict.pkl
|- val_max_dict.pkl
|- multi_cat_count_dict.pkl
|- tfrecord (预处理后的tfrecord格式数据,训练使用tfrecord格式)
|- train_part_0.tfrecord
|- train_part_1.tfrecord
|- test_part_0.tfrecord
|- ...
|- fixed.txt ()
|- param.toml(用于训练和在线推理的数据和模型参数)
订阅算法流程请参考使用AI市场的预置算法训练模型-订阅算法。
数据预处理完成之后,将预处理后的数据迁移至OBS,上传OBS请参考如何上传数据至OBS? 。
注意: 如果使用自定义预处理脚本,数据输出格式一定要和2.2.2 数据输出格式
保持一致。
使用订阅算法创建训练作业请参考 使用AI市场的预置算法训练模型-创建训练作业。
区别在于,数据来源选择数据存储位置,选择上传的OBS路径即可,例如,上传的OBS路径为:/my-bucket/deepfm/output_path/(目录结构与2.2.2 数据输出格式
保持一致),则数据存储位置为/my-bucket/deepfm/output_path。
算法默认会去选择 tfrecord文件夹下的数据,并加载param.yaml中的参数进行训练,stats_dict文件夹用于适配在线推理服务。
param.toml中包含的参数有num_features、num_inputs、train_size、test_size、line_per_sample、value_col_num、category_col_num、threshold、multi_category_len、train_tag、test_tag、feat_sep、multi_category_sep
。
**算法默认会去加载param.toml中的训练参数,用户无需填写。**加载参数包括:num_features、num_inputs、train_size、test_size、line_per_sample、multi_category_len、train_tag、test_tag、feat_sep、multi_category_sep
。其中threshold、value_col_num、category_col_num、multi_category_len、feat_sep、multi_category_sep
用于在线推理,与训练无关。会在训练结束后将这6个参数写入model文件夹用于在线推理。其他参数,可适当修改。
参数详细说明请参考下表:
名称 | 默认值 | 类型 | 是否必填 | 是否可修改 | 描述 |
---|---|---|---|---|---|
batch_size | 1000 | int | True | 是 | 每步训练的样本数量 |
n_epoches | 40 | int | True | 是 | 训练的epoch个数,一个epoch代表遍历一次完整的数据集 |
l2_v | 1e-4 | float | True | 是 | L2 正则损失系数 |
optimizer | lazy_adam | string | True | 是 | 优化器,支持lazy_adam或adam |
loss_mode | full | string | True | 是 | 损失函数,支持batch或者full |
learning_rate | 5e-4 | float | True | 是 | adam优化器学习率策略 |
evaluate_every_n_epochs | 1 | int | True | 是 | 每n个epoch做一次验证 |
print_freq | 100 | int | True | 是 | 训练日志打印频率,步数 |
perform_shuffle | True | string | True | 是 | 训练时数据集是否shuffle |
num_features | None | int | True | 是 | 数据词典总量,请根据数据集如实填写(若使用本文档提供的预处理脚本,会在param.toml文件中输出,无需填写) |
num_inputs | None | int | True | 是 | 预处理后的数据特征个数,请根据数据集如实填写(若使用本文档提供的预处理脚本,会在param.toml文件中输出,无需填写) |
train_size | None | int | True | 是 | 训练样本个数,请根据数据集如实填写(若使用本文档提供的预处理脚本,会在param.toml文件中输出,无需填写) |
test_size | None | int | True | 是 | 测试样本个数,请根据数据集如实填写(若使用本文档提供的预处理脚本,会在param.toml文件中输出,无需填写) |
line_per_sample | 1000 | int | True | 是 | tfrecord文件每条记录存储的样本数 |
train_tag | None | string | True | 是 | tfrecord训练数据的文件匹配关键字(若使用本文档提供的预处理脚本,会在param.toml文件中输出,无需填写) |
test_tag | None | string | True | 是 | tfrecord测试数据的文件匹配关键字(若使用本文档提供的预处理脚本,会在param.toml文件中输出,无需填写) |
output_path
|- checkpoint(模型保存路径)
|- DeepFM-1.meta
|- DeepFM-1.index
|- DeepFM-1.data-00000-of-00001
|- ...
|- DeepFM-checkpoint
|- log (模型日志)
|- DeepFM
|- model(用于在线推理的模型)
|- stats_dict
|- cat_count_dict.pkl
|- val_min_dict.pkl
|- val_max_dict.pkl
|- multi_cat_count_dict.pkl
|- variables(模型文件)
|- variables.data-00000-of-00001
|- variables.index
|- saved_model.pb(模型文件)
|- customize_service.py(在线推理脚本)
|- config.json(在线推理配置文件)
|- param.toml(在线推理参数文件)
|- summary
|- events.out.tfevents.xxx.localhost.localdomain
训练作业完成之后即可管理模型,部署模型进行在线推理。
管理模型请参考:管理模型
部署模型请参考:部署模型
注意:推理配置文件model/config.json, 默认使用CPU推理镜像(runtime:tf1.xx-python3.x-cpu )。
若使用GPU推理,导入模型之前需修改model/config.json文件,将runtime字段修改为:tf1.xx-python3.x-gpu。
推理数据输入格式为list, list中的每个值是原始数据的一条样本字符串,每条字符串的特征以“\t”分隔符(Tab)分开。
例如推理2个样本的输入如下,每个样本的特征长度为39:
{"text":[
"1\t23\t1\t14\t56\t15\t10\t35\t161\t1\t2\t0\t15\t5bfa8ab5\t09e68b86\taa8c1539\t85dd697c\t4cf72387\t7e0ccccf\t845fb196\t5b392875\ta73ee510\t6997b535\t911b463c\td8c29807\t0c9cc756\t8ceecbc8\td2f03b75\tc64d548f\t07c540c4\t63cdbb21\tcf99e5de\t5840adea\t5f957280\t1f89b562\t32c7478e\t1793a828\te8b83407\tb7d9c3bc",
"0\t22\t12\t14\t15308\t497\t1\t44\t258\t0\t1\t0\t16\t68fd1e64\t2c16a946\t004273d4\t65723153\tf281d2a7\tfbad5c96\tac652f55\tc8ddd494\ta73ee510\t3b08e48b\t5a0a81aa\td9a59982\t99b38f98\tb28479f6\t3628a186\tc0c7a39b\td4bb7bd8\te4ca448c\tad3062eb\t946027cb\t335a6a1e\t32c7478e\t9117a34a\tac73f6cb\t001f3601\ta3efae54"
]}
备注:如果数据包含多值特征,假如多值特征的分隔符是“,",以2列多值特征为例,则推理输入数据请参考(仅供参考):
{"text":[
"1\t23\t1\t14\t56\t15\t10\t35\t161\t1\t2\t0\t15\t5bfa8ab5\t09e68b86\taa8c1539\t2,3,6,9,15,18,19\t1,2,3,4,5",
"0\t22\t12\t14\t158\t497\t1\t44\t258\t0\t1\t0\t16\t68fd1e64\td9a59982\t99b38f98\t5,7,15,18,32\t1,2,3,4,5"
]}
您可以在华为云ModelArts控制台直接使用资产,但无法下载资产
版本号 | 版本ID | 发布时间 | 状态 | 版本说明 | 使用约束 |
---|
7.0.0 | 7.0.0 | 2021-01-30 08:03 | 已完成 | optimize | |
6.0.0 | 6.0.0 | 2020-11-13 03:37 | 已完成 | -- | |
5.0.0 | 5.0.0 | 2020-11-03 09:37 | 已完成 | -- |
若您怀疑合法知识产权遭受侵犯,可以通过此链接进行投诉与建议。