以下是本例的简要目录结构及说明:
├── data # 样例数据
├── sample_data # 样例数据
├── train
├── sample_train.txt # 训练数据样例
├── __init__.py
├── README.md # 文档
├── config.yaml # sample数据配置
├── config_bigdata.yaml # 全量数据配置
├── net.py # 模型核心组网(动静统一)
├── criteo_reader.py # 数据读取程序
├── static_model.py # 构建静态图
├── dygraph_model.py # 构建动态图
注:在阅读该示例前,建议您先了解以下内容:
CTR(Click Through Rate)
,即点击率,是“推荐系统/计算广告”等领域的重要指标,对其进行预估是商品推送/广告投放等决策的基础。简单来说,CTR预估对每次广告的点击情况做出预测,预测用户是点击还是不点击。CTR预估模型综合考虑各种因素、特征,在大量历史数据上训练,最终对商业决策提供帮助。本模型实现了下述论文中的 DLRM 模型:
@article{DLRM19,
author = {Maxim Naumov and Dheevatsa Mudigere and Hao{-}Jun Michael Shi and Jianyu Huang and Narayanan Sundaraman and Jongsoo Park and Xiaodong Wang and Udit Gupta and Carole{-}Jean Wu and Alisson G. Azzolini and Dmytro Dzhulgakov and Andrey Mallevich and Ilia Cherniavskii and Yinghai Lu and Raghuraman Krishnamoorthi and Ansha Yu and Volodymyr Kondratenko and Stephanie Pereira and Xianjie Chen and Wenlin Chen and Vijay Rao and Bill Jia and Liang Xiong and Misha Smelyanskiy},
title = {Deep Learning Recommendation Model for Personalization and Recommendation Systems},
journal = {CoRR},
volume = {abs/1906.00091},
year = {2019},
url = {https://arxiv.org/abs/1906.00091},
}
训练及测试数据集选用Display Advertising Challenge所用的Criteo数据集。该数据集包括两部分:训练集和测试集。训练集包含一段时间内Criteo的部分流量,测试集则对应训练数据后一天的广告点击流量。 每一行数据格式如下所示:
<label> <integer feature 1> ... <integer feature 13> <categorical feature 1> ... <categorical feature 26>
其中<label>
表示广告是否被点击,点击用1表示,未点击用0表示。<integer feature>
代表数值特征(连续特征),共有13个连续特征。<categorical feature>
代表分类特征(离散特征),共有26个离散特征。相邻两个特征用\t
分隔,缺失特征用空格表示。测试集中<label>
特征已被移除。
在模型目录的data目录下为您准备了快速运行的示例数据,若需要使用全量数据可以参考下方效果复现部分。
PaddlePaddle>=2.0
python 2.7/3.5/3.6/3.7
os : windows/linux/macos
本文提供了样例数据可以供您快速体验,在任意目录下均可执行。在dlrm模型目录的快速执行命令如下:
# 进入模型目录
# cd models/rank/dlrm # 在任意目录均可运行
# 动态图训练
python -u ../../../tools/trainer.py -m config.yaml # 全量数据运行config_bigdata.yaml
# 动态图预测
python -u ../../../tools/infer.py -m config.yaml
# 静态图训练
python -u ../../../tools/static_trainer.py -m config.yaml # 全量数据运行config_bigdata.yaml
# 静态图预测
python -u ../../../tools/static_infer.py -m config.yaml
DLRM 模型的组网本质是一个二分类任务,代码参考 net.py
。模型主要组成是 Bottom-MLP 层,Embedding 层,特征交叉部分,Top-MLP 层以及相应的分类任务的loss计算和auc计算。
DLRM 模型的特征输入,主要包括 dense 数值型和 sparse 类别型两种特征。dense features 直接连接 MLP(如图中的蓝色三角形), sparse features 经由 embedding 层查找得到相应的 embedding 向量。Interactions 层进行特征交叉(包含 dense features 和 sparse features 的交叉及 sparse features之间的交叉等),与因子分解机 FM 有些类似。
DLRM 模型中所有的 sparse features 的 embedding 向量长度均是相等的,且dense features 经由 MLP 也转化成相同的维度。这点是理解该模型代码的关键。
- dense features 经过 MLP (bottom-MLP) 处理为同样维度的向量
- spare features 经由 lookup 获得统一维度的 embedding 向量(可选择每一特征对应的 embedding 是否经过 MLP 处理)
- dense features & sparse features 的向量两两之间进行 dot product 交叉
- 交叉结果再和 dense 向量 concat 一起输入到顶层 MLP (top-MLP)
- 经过 sigmoid 函数激活得到点击概率
- 为了得到每条样本分属于正负样本的概率,我们将预测结果和
1-predict
合并起来得到predict_2d
,以便接下来计算auc
。 - 每条样本的损失为负对数损失值,label的数据类型将转化为float输入。
- 该batch的损失
avg_cost
是各条样本的损失之和 - 我们同时还会计算预测的auc指标。
为了方便使用者能够快速的跑通每一个模型,我们在每个模型下都提供了样例数据。如果需要复现 README 中的效果,请按如下步骤依次操作即可。 在全量数据下模型的指标如下:
模型 | auc | batch_size | epoch_num | Time of each epoch |
---|---|---|---|---|
DLRM | 0.79+ | 2048 | 1 | 约 1.5 小时 |
- 确认您当前所在目录为
PaddleRec/models/rank/dlrm
- 进入
PaddleRec/datasets/criteo
目录下,执行该脚本,会从国内源的服务器上下载我们预处理完成的criteo全量数据集,并解压到指定文件夹。
cd ../../../datasets/criteo
sh run.sh
- 切回模型目录,执行命令运行全量数据
cd - # 切回模型目录
# 动态图训练
python -u ../../../tools/trainer.py -m config_bigdata.yaml # 全量数据运行config_bigdata.yaml
python -u ../../../tools/infer.py -m config_bigdata.yaml # 全量数据运行config_bigdata.yaml