CRSLab:可能是最适合你的对话推荐系统开源库
随着对话系统和推荐系统的快速发展,新方向——对话推荐系统(Conversational Recommender System,简称CRS)也开始了蓬勃发展,其关注于如何通过基于自然语言的对话来获得用户的意图和偏好,以实现精准推荐。但是现有的CRS相关数据集和模型在建模场景、最终目标和使用技术等方面存在一定差异,使得研究者们很难对这些模型进行统一的评测对比。对于科研新手来说,更是难以在这些模型和数据集中抉择并快速搭建CRS系统。
为帮助各位道友“快乐+快速”上手研究对话推荐任务,我们(中国人民大学AI BOX团队)推出了开源项目CRSLab ——一个用于构建对话推荐系统(CRS)的开源工具包,在这里我们致力于帮您实现一键复现,快速开发,自动评测的一条龙服务,相关代码和对应论文目前也已经开源。
目前为止,我们支持以下几大功能,还有更多好玩的功能正在路上!
便捷的使用方法:新手别害怕,CRSLab提供了简单而灵活的配置,快速调用分分钟的事; 6个数据集和18个模型:各种数据预处理已帮您完成,各种新模型也适配完毕,任君取用; 多样的评测方式:各个自动的评测指标都已经帮您实现,甚至还有人机交互的接口哦; 通用和可扩展的框架:还不满意?框架给您搭好,函数接口给您安排上,想怎么玩就怎么玩;
论文地址:https://arxiv.org/pdf/2101.00939.pdf
项目GitHub地址:https://github.com/RUCAIBox/CRSLab
懒人一键安装:pip install crslab
特性介绍
CRSLab完全基于 PyTorch 实现、主要面向研究者使用,其具有以下四大特性。
通用和可扩展的结构
我们设计了通用和可扩展的结构来统一各种对话推荐数据集和模型,并集成了多种内置接口和函数以便于快速开发。其具体框架如下所示:
图片: CRSLab 的总体架构
其中Configuration模块提供了针对用户的接口,用户可以通过简单的命令行操作或修改给出的config文件,即可实现快速调用不同的CRS模型!Data,Model和Evaluator模块中集成了多个现有的数据集,模型和评测方案,省去了用户自行复现的时间。Utilities中集成了多个常用的功能函数,可以帮助用户快速从新搭建一个新的对话推荐系统!
全面的基准模型和数据集
在CRSLab中,我们集成了常用的 6 个数据集和 18 个模型。这6个数据集均为常用的人工标注数据集,但是其在任务定义、领域等方面存在差异。我们对其进行了预处理以得到统一的格式,并努力使其支持更多的先进模型,这些预处理包括:推荐商品抽取、实体链接、BPE分词等。我们提供了预处理后数据的下载链接以方便用户使用,如下为这些数据集的统计数据:
Dataset | Dialogs | Utterances | Domains | Task Definition | Entity KG | Word KG |
---|---|---|---|---|---|---|
ReDial | 10,006 | 182,150 | Movie | -- | DBpedia | ConceptNet |
TG-ReDial | 10,000 | 129,392 | Movie | Topic Prediction | CN-DBpedia | HowNet |
GoRecDial | 9,125 | 170,904 | Movie | Action Prediction | DBpedia | ConceptNet |
DuRecDial | 10,200 | 156,000 | Movie, Music | Goal Planning | CN-DBpedia | HowNet |
INSPIRED | 1,001 | 35,811 | Movie | Strategy Prediction | DBpedia | ConceptNet |
OpenDialKG | 13,802 | 91,209 | Movie, Book | Path Generation | DBpedia | ConceptNet |
我们将对话推荐任务主要拆分成三个子任务:推荐任务(生成推荐的商品),对话任务(生成对话的回复)和策略任务(规划对话推荐的策略)。其中所有的对话推荐系统都具有对话和推荐任务,它们是对话推荐系统的核心功能,而策略任务是一个辅助任务,其致力于更好的控制对话推荐系统,在不同的模型中的实现也可能不同(如TG-ReDial采用一个主题预测模型,DuRecDial中采用一个对话规划模型等)
在CRSLab中,我们实现了18 个模型,覆盖CRS、推荐、对话和策略模型四种类别,其中CRS模型是指同时对推荐和对话任务(甚至策略任务)进行建模的融合模型,其可以利用这些任务以相互增强彼此的表现;而其他模型则只针对于某一个子任务。这些模型中还包括一些已经在CRS任务上表现较好的前沿模型,如图神经网络(GCN)和预训练模型(BERT 和 GPT-2)。下表为这些模型的相关信息:
类别 | 模型 | Graph Neural Network | Pre-training Model |
---|---|---|---|
CRS 模型 | ReDial KBRD KGSF TG-ReDial | × √ √ × | × × × √ |
推荐模型 | Popularity GRU4Rec SASRec TextCNN R-GCN BERT | × × × × √ × | × × × × × √ |
对话模型 | HERD Transformer GPT-2 | × × × | × × √ |
策略模型 | PMI MGCG Conv-BERT Topic-BERT Profile-BERT | × × × × × | × × √ √ √ |
多样的标准评测
我们支持一系列被广泛使用的评估方式来测试和比较不同的 CRS。针对对话推荐中包含的各个子任务(推荐,对话,策略),我们分别设计了对应的评测方法,供直接用户使用,如下表所示:
类别 | 指标 |
---|---|
推荐任务 | Hit@{1, 10, 50}, MRR@{1, 10, 50}, NDCG@{1, 10, 50} |
对话任务 | PPL, BLEU-{1, 2, 3, 4}, Embedding Average/Extreme/Greedy, Distinct-{1, 2, 3, 4} |
策略任务 | Accuracy, Hit@{1,3,5} |
这里的推荐任务的若干指标均为常用的基于排序的指标;对话任务的指标包括评估概率分布(PPL),关联度(BLEU,Embedding)和多样性(Distinct)的指标;由于对话推荐系统中的策略往往不尽相同,这里我们采用常用的Accuracy和Hit来进行评估。
此外,我们还提供了人机交互接口,用户可以直接通过特定的接口函数和命令和自己搭建的对话推荐系统进行交互,进而分析其中的的bad case等,也可以帮助初学者掌握系统的运行流程。
便捷的使用方法
我们为新手提供了简单而灵活的配置,以快速启动集成在 CRSLab 中的模型。对于已经集成的模型和数据集,可以直接使用命令行进行调用,使用以下命令,系统将依次完成数据的预处理,以及各模块的训练、验证和测试,并得到指定的模型评测结果:
python run_crslab.py --config config/kgsf/redial.yaml
如果您希望保存数据预处理结果与模型训练结果,可以使用如下命令:
python run_crslab.py --config config/kgsf/redial.yaml --save_data --save_system
总的来说,run_crslab.py
有如下参数可供调用:
--config
或-c
:配置文件的相对路径,以指定运行的模型与数据集。--save_data
或-sd
:保存预处理的数据。--restore_data
或-rd
:从文件读取预处理的数据。--save_system
或-ss
:保存训练好的 CRS 系统。--restore_system
或-rs
:从文件载入提前训练好的系统。--debug
或-d
:用验证集代替训练集以方便调试。--interact
或-i
:与你的系统进行交互的对话。
如果希望调节模型或数据集的参数设置,可以直接对yaml文件进行更改,其提供了相比较于命令行更方便的编辑功能,具体的各项参数定义在文档中已经给出。
安装与使用
CRSLab 可以在以下几种系统上运行:
Linux Windows 10 macOS X
CRSLab 需要在 Python 3.6 或更高的环境下运行。CRSLab 要求 torch 版本在 1.4.0 及以上,如果用户想在 GPU 上运行 CRSLab,请确保你的 CUDA 版本或者 CUDAToolkit 版本在 9.2 及以上。
提醒:因为用户可能会因为未正确配置PyTorch,PyTorch Geometric等环境而导致无法使用,这里我们提供了详细的从零开始的安装流程,确保大家能够顺利安装。
安装 PyTorch
使用 PyTorch 本地安装命令或者先前版本安装命令安装 PyTorch,比如在 Linux 和 Windows 下:
# CUDA 10.1
pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html
# CPU only
pip install torch==1.6.0+cpu torchvision==0.7.0+cpu -f https://download.pytorch.org/whl/torch_stable.html
安装完成后,如果你想在 GPU 上运行 CRSLab,请确保如下命令输出True
:
$ python -c "import torch; print(torch.cuda.is_available())"
>>> True
安装 PyTorch Geometric
确保安装的 PyTorch 版本至少为 1.4.0:
$ python -c "import torch; print(torch.__version__)"
>>> 1.6.0
找到安装好的 PyTorch 对应的 CUDA 版本:
$ python -c "import torch; print(torch.version.cuda)"
>>> 10.1
安装相关的包:
pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-${TORCH}+${CUDA}.html
pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-${TORCH}+${CUDA}.html
pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-${TORCH}+${CUDA}.html
pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-${TORCH}+${CUDA}.html
pip install torch-geometric
其中${CUDA}
和${TORCH}
应使用确定的 CUDA 版本(cpu
,cu92
,cu101
,cu102
,cu110
)和 PyTorch 版本(1.4.0
,1.5.0
,1.6.0
,1.7.0
)来分别替换。比如,对于 PyTorch 1.6.0 和 CUDA 10.1,输入:
pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.6.0+cu101.html
pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.6.0+cu101.html
pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.6.0+cu101.html
pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.6.0+cu101.html
pip install torch-geometric
安装 CRSLab
git clone https://github.com/RUCAIBox/CRSLab && cd CRSLab
pip install -e .
快速测试
从 GitHub 下载 CRSLab 后,可以使用提供的脚本进行简单的测试:
python run_crslab.py --config config/kgsf/redial.yaml
系统将依次完成数据的预处理,以及各模块的训练、验证和测试,并得到指定的模型评测结果。
结果展示
我们在 TG-ReDial 数据集上对模型进行了训练和测试,并记录了在三个任务上的评测结果。其中效果最好的模型是基于图神经网络的KGSF和基于预训练的TG-ReDial模型。
推荐任务
Model | Hit@1 | Hit@10 | Hit@50 | MRR@1 | MRR@10 | MRR@50 | NDCG@1 | NDCG@10 | NDCG@50 |
---|---|---|---|---|---|---|---|---|---|
SASRec | 0.000446 | 0.00134 | 0.0160 | 0.000446 | 0.000576 | 0.00114 | 0.000445 | 0.00075 | 0.00380 |
TextCNN | 0.00267 | 0.0103 | 0.0236 | 0.00267 | 0.00434 | 0.00493 | 0.00267 | 0.00570 | 0.00860 |
BERT | 0.00722 | 0.00490 | 0.0281 | 0.00722 | 0.0106 | 0.0124 | 0.00490 | 0.0147 | 0.0239 |
KBRD | 0.00401 | 0.0254 | 0.0588 | 0.00401 | 0.00891 | 0.0103 | 0.00401 | 0.0127 | 0.0198 |
KGSF | 0.00535 | 0.0285 | 0.0771 | 0.00535 | 0.0114 | 0.0135 | 0.00535 | 0.0154 | 0.0259 |
TG-ReDial | 0.00793 | 0.0251 | 0.0524 | 0.00793 | 0.0122 | 0.0134 | 0.00793 | 0.0152 | 0.0211 |
生成任务
Model | BLEU@1 | BLEU@2 | BLEU@3 | BLEU@4 | Dist@1 | Dist@2 | Dist@3 | Dist@4 | Average | Extreme | Greedy | PPL |
---|---|---|---|---|---|---|---|---|---|---|---|---|
HERD | 0.120 | 0.0141 | 0.00136 | 0.000350 | 0.181 | 0.369 | 0.847 | 1.30 | 0.697 | 0.382 | 0.639 | 472 |
Transformer | 0.266 | 0.0440 | 0.0145 | 0.00651 | 0.324 | 0.837 | 2.02 | 3.06 | 0.879 | 0.438 | 0.680 | 30.9 |
GPT2 | 0.0858 | 0.0119 | 0.00377 | 0.0110 | 2.35 | 4.62 | 8.84 | 12.5 | 0.763 | 0.297 | 0.583 | 9.26 |
KBRD | 0.267 | 0.0458 | 0.0134 | 0.00579 | 0.469 | 1.50 | 3.40 | 4.90 | 0.863 | 0.398 | 0.710 | 52.5 |
KGSF | 0.383 | 0.115 | 0.0444 | 0.0200 | 0.340 | 0.910 | 3.50 | 6.20 | 0.888 | 0.477 | 0.767 | 50.1 |
TG-ReDial | 0.125 | 0.0204 | 0.00354 | 0.000803 | 0.881 | 1.75 | 7.00 | 12.0 | 0.810 | 0.332 | 0.598 | 7.41 |
策略任务
Model | Hit@1 | Hit@10 | Hit@50 | MRR@1 | MRR@10 | MRR@50 | NDCG@1 | NDCG@10 | NDCG@50 |
---|---|---|---|---|---|---|---|---|---|
MGCG | 0.591 | 0.818 | 0.883 | 0.591 | 0.680 | 0.683 | 0.591 | 0.712 | 0.729 |
Conv-BERT | 0.597 | 0.814 | 0.881 | 0.597 | 0.684 | 0.687 | 0.597 | 0.716 | 0.731 |
Topic-BERT | 0.598 | 0.828 | 0.885 | 0.598 | 0.690 | 0.693 | 0.598 | 0.724 | 0.737 |
TG-ReDial | 0.600 | 0.830 | 0.893 | 0.600 | 0.693 | 0.696 | 0.600 | 0.727 | 0.741 |
未来展望
对话推荐系统在未来肯定还会有更多工作,而且我们的CRSLab也有许多需要继续完善的地方。我们AI BOX团队将会持续开发维护CRSLab,保持版本稳定,并不断加入更多更新的模型和数据集。期待各位读者能够提供宝贵意见。
更多推荐
新年快乐 | 回顾AI Box 2020的年度记忆
夺冠 or 姜子牙?ChatBot帮你搞定:基于话题引导的对话推荐系统