|
1 | | -# Paddle-TDM |
| 1 | +# Paddle TDM系列模型解决方案 |
2 | 2 |
|
3 | | -TDM召回方法来源于阿里妈妈团队在`KDD2018`发表的论文[Learning Tree-based Deep Model for Recommender Systems](https://arxiv.org/pdf/1801.02294.pdf),本示例代码提供了基于PaddlePaddle实现的TreeBased推荐搜索算法,主要包含以下组成: |
| 3 | +本示例代码提供了基于PaddlePaddle实现的树模型推荐搜索算法,包括[TDM](https://arxiv.org/pdf/1801.02294.pdf),[JTM](https://arxiv.org/pdf/1902.07565.pdf)。树模型是为大规模推荐系统设计的、能承载任意先进模型来高效检索用户兴趣的推荐算法解决方案。该方案基于树结构,提出了一套对用户兴趣度量进行层次化建模与检索的方法论,使得系统能直接利高级深度学习模型在全库范围内检索用户兴趣。其基本原理是使用树结构对全库item进行索引,然后训练深度模型以支持树上的逐层检索,从而将大规模推荐中全库检索的复杂度由O(n)(n为所有item的量级)下降至O(log n)。 |
4 | 4 |
|
5 | | -- 基于fake数据集,适用于快速调试的paddle-tdm模型。主要用于理解paddle-tdm的设计原理,高效上手设计适合您的使用场景的模型。 |
6 | 5 |
|
7 | | -以上内容将随paddle版本迭代不断更新,欢迎您关注该代码库。 |
| 6 | +## 快速开始 |
8 | 7 |
|
9 | | -## TDM设计思路 |
| 8 | +基于demo数据集,快速上手TDM系列模型,为您后续设计适合特定使用场景的模型做准备。 |
10 | 9 |
|
11 | | -### 基本概念 |
12 | | -TDM是为大规模推荐系统设计的、能承载任意先进模型来高效检索用户兴趣的推荐算法解决方案。TDM基于树结构,提出了一套对用户兴趣度量进行层次化建模与检索的方法论,使得系统能直接利高级深度学习模型在全库范围内检索用户兴趣。其基本原理是使用树结构对全库item进行索引,然后训练深度模型以支持树上的逐层检索,从而将大规模推荐中全库检索的复杂度由O(n)(n为所有item的量级)下降至O(log n)。 |
| 10 | +假定您PaddleRec所在目录为${PaddleRec_Home}。 |
13 | 11 |
|
14 | | -### 核心问题 |
| 12 | +- Step1: 进入tree-based模型库文件夹下,完成demo数据集的切分、建树等准备工作。 |
15 | 13 |
|
16 | | -1. 如何构建树结构? |
17 | | -2. 如何基于树结构做深度学习模型的训练? |
18 | | -3. 如何基于树及模型进行高效检索? |
| 14 | +```shell |
| 15 | +cd ${PaddleRec_Home}/models/treebased/ |
| 16 | +./data_prepare.sh demo |
| 17 | +``` |
| 18 | +demo数据集预处理一键命令为 `./data_prepare.sh demo` 。若对具体的数据处理、建树细节感兴趣,请查看 `data_prepare.sh` 脚本。这一步完成后,您会在 `${PaddleRec_Home}/models/treebased/` 目录下得到一个名为 `demo_data`的目录,该目录结构如下: |
19 | 19 |
|
20 | | -### PaddlePaddle的TDM方案 |
| 20 | +``` |
| 21 | +├── treebased |
| 22 | +├── demo_data |
| 23 | +| ├── samples JTM Tree-Learning算法所需, |
| 24 | +| | ├── samples_{item_id}.json 记录了所有和item_id相关的训练集样本。 |
| 25 | +| ├── train_data 训练集目录 |
| 26 | +| ├── test_data 测试集目录 |
| 27 | +| ├── ItemCate.txt 记录所有item的类别信息,用于初始化建树。 |
| 28 | +| ├── Stat.txt 记录所有item在训练集中出现的频次信息,用于采样。 |
| 29 | +| ├── tree.pb 预处理后,生成的初始化树文件 |
| 30 | +``` |
21 | 31 |
|
22 | | -1. 树结构的数据,来源于各个业务的实际场景,构造方式各有不同,paddle-TDM一期暂不提供统一的树的构造流程,但会统一树构造好之后,输入paddle网络的数据组织形式。业务方可以使用任意工具构造自己的树,生成指定的数据格式,参与tdm网络训练。 |
23 | | -2. 网络训练中,有三个核心问题: |
24 | | - |
25 | | - - 如何组网?答:paddle封装了大量的深度学习OP,用户可以根据需求设计自己的网络结构。 |
26 | | - - 训练数据如何组织?答:tdm的训练数据主要为:`user/query emb` 加 `item`的正样本,`item`需要映射到树的某个叶子节点。用户只需准备符合该构成的数据即可。负样本的生成,会基于用户提供的树结构,以及paddle提供的`tdm-sampler op`完成高效的负采样,并自动添加相应的label,参与tdm中深度学习模型的训练。 |
27 | | - - 大规模的数据与模型训练如何实现?答:基于paddle优秀的大规模参数服务器分布式能力,可以实现高效的分布式训练。基于paddle-fleet api,学习门槛极低,且可以灵活的支持增量训练,流式训练等业务需求。 |
28 | | -3. 训练好模型后,可以基于paddle,将检索与打分等流程都融入paddle的组网中,生成inference_model与参数文件,基于PaddlePaddle的预测库或者PaddleLite进行快速部署与高效检索。 |
| 32 | +- Step2: 训练。config.yaml中配置了模型训练所有的超参,运行方式同PaddleRec其他模型静态图运行方式。当前树模型暂不支持动态图运行模式。 |
| 33 | + |
| 34 | +```shell |
| 35 | +python -u ../../../tools/static_trainer.py -m config.yaml |
| 36 | +``` |
| 37 | + |
| 38 | +- Step3: 预测,命令如下所示。其中第一个参数为训练config.yaml位置,第二个参数为预测模型地址。 |
| 39 | + |
| 40 | +``` |
| 41 | +python infer.py config.yaml ./output_model_tdm_demo/0/ |
| 42 | +``` |
| 43 | + |
| 44 | +- Step4: 提取Item(叶子节点)的Embedding,用于重新建树,开始下一轮训练。命令如下所示,其中第一个参数为训练config.yaml位置,第二个参数模型地址,第三个参数为输出文件名称。 |
| 45 | + |
| 46 | +``` |
| 47 | +python get_leaf_embedding.py config.yaml ./output_model_tdm_demo/0/ epoch_0_item_embedding.txt |
| 48 | +``` |
| 49 | + |
| 50 | +- Step5: 基于Step4得到的Item的Embedding,重新建树。命令如下所示。 |
| 51 | + |
| 52 | +``` |
| 53 | +cd ../builder && python tree_index_builder.py --mode by_kmeans --input epoch_0_item_embedding.txt --output new_tree.pb |
| 54 | +``` |
| 55 | + |
| 56 | +- Step6: 修改config.yaml中tree文件的路径为最新tree.pb,返回Step2,开始新一轮的训练。 |
0 commit comments