CRSLab: An Open-Source Toolkit for Building Conversational

CRSLab: An Open-Source Toolkit for Building Conversational

Recommender System
近年来,会话推荐系统(CRS)在研究界备受关注。 然而,现有CRS的研究在场景、目标和技术上存在差异,缺乏统一、标准化的实施或比较。 为了应对这一挑战,我们提出了一个开源 CRS 工具包 CRSLab,它提供了一个具有高度解耦模块的统一且可扩展的框架来开发 CRS。 基于这个框架,我们收集了 6 个常用的人工注释 CRS 数据集,并实现了 18 个模型,其中包括最近的技术,如图神经网络和预训练模型。 此外,我们的工具包提供了一系列自动评估协议和人机交互界面来测试和比较不同的 CRS 方法。

近年来,会话推荐系统(CRS)取得了显着进展(Christakopoulou et al., 2016; Sun and Zhang, 2018; Li et al., 2018),旨在通过自然语言对话向用户提供高质量的推荐 . 为了构建有效的 CRS,用户提出了大量的数据集(Kang et al., 2019; Zhou et al., 2020c; Liu et al., 2020)和模型(Lei et al., 2020; Chen et al., 2019;廖等人,2019)。 然而,这些作品在场景(如电影或电子商务平台)、目标(如准确推荐或用户激活)和技术(如图神经网络或预训练模型)方面存在差异,因此具有挑战性 方便用户快速建立合理的基线系统或开发新的CRS模型。

为了缓解上述问题,我们开发了 CRSLab,这是第一个用于研究目的的开源 CRS 工具包。 在 CRSLab 中,我们提供了一个具有高度解耦模块的统一且可扩展的框架来开发 CRS。 具体来说,我们将 CRS 现有作品的任务描述统一为三个子任务,即推荐、对话和策略,涵盖主流 CRS 的常见功能需求。 为了实现整个框架,我们设计和开发了高度解耦的模块(例如,数据模块和模型模块),它们提供了清晰的接口。 此外,我们封装了不同模块共享的有用程序和常用功能,以供重用。 通过这种方式,用户可以轻松地使用我们的工具包添加新数据集或开发新模型。

基于该框架,我们在 CRSLab 中集成了全面的基准数据集和模型。 到目前为止,我们已经整合了 6 个常用的人工注释数据集并实现了 18 个模型,包括高级技术,例如图神经网络 (GNN) (Schlichtkrull et al., 2018; Zhou et al., 2020a) 和 pre- 训练模型(Devlin 等人,2019;Zhou 等人,2020b)。 为了支持这些模型,我们对集成数据集(例如实体链接和分词)执行必要的预处理,并发布处理后的数据。 在我们的 CRSLab 中,我们通过配置文件或命令行提供灵活的支持机制,在集成数据集上运行、比较和测试这些模型,用户可以通过这些机制开发强大的 CRS。

此外,CRSLab 提供了一系列自动评估协议和人机交互界面,用于测试和比较不同的 CRS,有助于标准化会话推荐的评估协议。 具体来说,我们实施了各种自动评估指标来测试 CRS 在推荐、对话和策略任务上,分别涵盖现有工作中常用的指标。 此外,CRSLab 提供人机交互界面进行定量分析,有助于用户部署系统并通过网页与系统进行对话。

Background

如前所述,现有的 CRS 数据集和模型因场景和目标而异,因此对应的领域和任务定义可能不同,这在将现有模型应用于不同数据集或场景时会带来差距。 为了填补这些空白,我们在之前的工作(Lei et al., 2020; Zhou et al., 2020c; Sun and Zhang, 2018)的基础上,将 CRS 的任务统一为两个基本子任务和一个辅助子任务, 即推荐对话和策略。 这三个子任务被描述为:给定对话上下文(即,历史话语)和其他有用的辅助信息(例如,交互历史和知识边缘图),我们的目标是(1)预测用户偏好的项目(推荐) ,(2)产生适当的响应(对话),以及(3)选择适当的交互动作(策略)。

值得注意的是,上述任务描述涵盖了大部分 CRS 模型和数据集。 所有这些作品都考虑了推荐和对话子任务。 最近的工作(Zhou et al., 2020c; Lei et al., 2020)需要策略子任务,通过它,CRS 可以主动引导对话以获得更好的推荐。 针对不同的目标和场景,策略子任务可以不同。 例如,TG ReDial (Zhou et al., 2020c) 利用主题预测模型来完成策略子任务,而 DuRecDial (Liu et al., 2020) 将其定义为目标规划任务。

我们的工具包 CRSLab 的总体框架如图 1 所示。配置模块为用户提供了一个灵活的界面,可以轻松设置实验环境(例如数据集、模型和超参数)。 数据、模型和评估模块建立在配置模块之上,它构成了我们工具包的核心部分。 底部是实用程序模块,提供辅助功能和接口以供其他模块(例如,记录器和资源)重用。 在下面的部分中,我们简要介绍了上述模块的设计,更多细节可以在工具包文档中找到。
在这里插入图片描述图1:CRSLab的整体框架

Confifigurations

在 CRSLab 中,我们设计了配置模块供用户方便地选择或修改实验设置(例如数据集、模型和超参数)。 具体来说,我们设计类 Config 来存储所有配置设置,它为 CRS 的每个组件和给定实验的环境指定模型及其超参数。 为了避免指定复杂的命令行参数,我们在命令行中提供了一些常用的配置设置(即文件路径和调试模式),而在 YAML 配置文件中提供了其他设置。 这样,用户只需对配置文件稍作修改,就可以构建和评估各种不同的 CRS

Data Modules

为了可扩展性和可重用性,我们设计了一个优雅的数据流,将原始数据集转换为模型输入,如下所示:
数据集-→预处理数据集→数据集→数据加载器→系统。 接下来,我们详细介绍这些组件的设计

Data Preprocessing

由于原始公共数据集的格式和特征各不相同,我们对这些数据集进行预处理以支持数据模块中的统一接口。 基于第 2 节中的任务描述,我们首先预处理 CRS 数据集以匹配输入和输出格式。
具体来说,我们将对话上下文和边信息组织为输入,同时提取推荐项目、对话动作和响应作为推荐、策略和对话子任务的输出。 为了支持一些高级模型(例如,图神经网络和预训练模型),我们合并了有用的侧数据(例如,知识图谱)并进行特定的预处理(例如,实体链接和 BPE 段)

如表 1 所示,我们收集了 6 个常用的人工注释数据集,并在 CRSLab 中发布了带有辅助数据的预处理版本。 此外,我们还发布了预训练的词嵌入和其他相关文件,从而简化了集成数据集的使用并降低了时间成本。
在这里插入图片描述
表 1:CRSLab 中收集的数据集。 DB 和 CN-DB 分别代表面向实体的知识图谱 DBpedia 和 CN-DBpedia。CNet 和 HNet 分别代表面向词的知识图 ConceptNet 和 HowNet

Dataset Class

为了在 CRSLab 中解耦数据准备的实现,我们设计了 Dataset 类来集成与模型无关的数据处理功能,而其余功能由 DataLoader 类实现。 这样,Dataset 只关注将输入数据处理成统一的格式(即 python.dict 的列表),而不考虑具体的模型。 在 CRSLab 中,我们设计了 BaseDataset 类,其中包含 Dataset 的一些常用属性(例如配置和数据路径)和基本功能(例如加载数据),因此用户可以通过很少的修改来继承 BaseDataset 以集成新的数据集。

DataLoader Class

事实上,不同的 CRS 模型需要不同的垫子。 由于 Dataset 已将输入数据处理成统一的格式,DataLoader 进一步重新格式化数据以支持各种模型。 具体来说,DataLoader 侧重于从 Dataset 之后的处理后的数据中选择特征,形成批量或小批量的十个 sor 数据(即torch.Tensor),可直接用于下游模型的更新和计算。 为了实现它,我们设计了类 BaseDataLoader 来集成公共属性和功能,并继承它为相应的模型生成新的数据加载器。

Model Modules

如前所述,CRS 可能由对应子任务的多个模型组成。 在模型模块中,我们专注于为开发提供一个基本结构和有用的高度解耦的函数或过程。 具体而言,我们将各种模型的基本属性和功能(例如参数初始化和模型加载)统一到类BaseModel中。 用户可以继承 BaseModel 并实现一些功能来开发和设计新模型。

我们仔细查阅了最近的文献,将常用的模型分为四类,即CRS模型、推荐模型、会话模型和策略模型。 策略和对话模型只关注单个子任务中的一个。 如表 2 所示,我们主要关注最近提出的神经方法,同时保留了一些经典的启发式方法,如流行度和 PMI。 在第一个发布版本中,我们实现了 18 个模型,包括一些高级模型,例如图神经网络和预训练模型。 对于所有实现的模型,我们已经在两个或三个选定的数据集上测试了它们的性能,并邀请了代码审查员检查实现的正确性。 未来,更多的方法也将与定期更新一起被纳入。
在这里插入图片描述
表 2:CRSLab 中实现的模型。 推荐、策略和对话模型指定了相应的单个子任务,而 CRS 模型可以一起完成这些子任务。 GNN 和 PTM 分别代表图神经网络和预训练模型

System Class

为了在高层次上支持 CRS 的灵活架构,我们设计了系统模块,作为一个连接点,将数据加载器、模型和评估器模块集成在一起,以构建一个完整的 CRS。具体而言,系统模块主要用于建立模型来完成 CRS 任务,分发 从数据加载器到相应模型的张量数据,使用适当的优化策略训练模型,并使用指定的协议进行评估。

为了实现上述需求,我们设计了类BaseSystem来统一结构和接口,其中包含相应的功能。 在BaseSystem中,我们还实现了一系列有用的功能,如优化初始化、学习率调整和earlystop策略。 这些功能和小技巧简化了新系统的开发过程,并极大地改善了我们 CRSLab 的用户体验。

Evaluation Modules

评估模块的功能是实现CRS模型的评估协议。在CRSLab中,我们实现了常用的自动评估指标。 此外,我们还设计了一个人机交互界面,供用户进行端到端的定量分析。

Automatic Evaluation Modules

由于 CRS 任务分为三个子任务,我们在评估模块中开发了相应的自动度量。我们在表 3 中总结了所有支持的自动评估指标。对于推荐子任务,遵循现有的 CRS 模型(Sun 和 Zhang,2018;Zhang 等人,2018),我们开发了基于排名的指标来衡量生成的排名性能aCRS 推荐列表。对于对话子任务,CRSLab 支持基于相关性和基于多样性的评估指标。基于相关性的度量包括 Perplexity、BLEU (Papineni et al., 2002) 和 Embedding metrics (Liu et al., 2016),从概率、n gram 和词嵌入的角度衡量 ground-truth 和生成的响应之间的相似性,分别。基于多样性的指标是 Distinct-{1,2,3,4} (Liet al., 2016),测量生成的响应中不同的 {1,2,3,4}-gram 的数量。由于策略子任务在现有 CRS 中有所不同(例如,动作和主题预测),我们实施常用指标 Accuracy 和 Hit@K 来评估真实值和预测值之间的性能。

类似地,我们通过实现通用属性和函数来设计类 BaseEvaluator。 然后,我们继承 BaseEvaluator 并实现 RecEvaluator、ConvEvaluator 和 PolicyEvaluator 分别用于评估推荐、对话和策略子任务。 值得注意的是,我们在这些评估器中实现了 report() 函数。 使用此功能,用户可以打印和监控模型评估验证或测试集的性能。
在这里插入图片描述
表 3:CRSLab 中实现的自动评估指标。

Human-Machine Interaction Interface

为了定量评估 CRS,CRSLab 提供了人机交互界面来帮助用户进行端到端的评估。 人机交互界面与系统模块相集成,通过该模块,界面内的交互策略可以很容易地适应特定的策略模型。 通过这种方式,用户可以与 CRS 对话并诊断系统,这提供了一种直接评估 CRS 整体性能的方法。 此外,交互界面使用户能够通过修改中间结果来纠正错误。

具体来说,为了进行端到端的评估,用户首先设置模拟用户的背景(例如,交互历史和用户资料),然后通过界面与 CRS 自由聊天。 在对话过程中,对话历史和每个组件的输出(包括推荐的项目和选择的策略)都被存储为字典,这有助于用户更好地了解他们的系统是如何工作的。

Utilities

为了更好地使用我们的 CRSLab,我们设计了包含辅助功能(例如 logger() 和 scheduler())的实用程序模块。 具体来说,我们实现了一系列有用的功能来促进我们工具包的使用。 一个特别有用的函数是 scheduler(),它提供了一套训练大规模模型的策略,例如预热策略和权重衰减。 另外,我们还实现了其他功能来改善我们的工具包的用户体验,例如保存模型()和加载模型()来存储和重用学习的模型,记录器()来打印和监控运行过程。

为了简化新CRS的开发,我们还将其他模块中常用的函数或过程(例如Layers)解耦形成实用程序文件(即utils.py),它构成了实用程序模块的另一部分。 通过这种方式,用户可以对实用程序文件中的功能进行简单的修改或修改,从而开发和设计新的 CRS。

System Demonstration

在本节中,我们将通过代码示例展示如何使用我们的 CRSLab。 我们将使用描述分为两部分,即在我们的工具包中运行现有的 CRS 和基于我们工具包中提供的接口实现新的 CRS。

Running an Existing CRS

我们的 CRSLab 允许在几行代码内轻松创建 CRS。 图 2 展示了在我们的工具包中运行现有 CRS 的一般过程。

首先,整个过程依赖于配置来准备数据集和构建系统。 在配置中,用户选择要使用的数据集并指定标记器。 然后,Dataset 类将根据配置自动下载数据集并执行必要的处理步骤(例如,标记化并将标记转换为 ID)。 此过程由函数 get dataset() 执行。 根据处理后的数据集,用户可以使用get dataloader()函数生成训练集、验证集和测试集,其中的配置指定了数据处理的批大小和其他参数。 之后,用户可以通过 get system() 函数来构建一个 CRS,它利用从数据集和上述数据加载器中准备好的侧数据。 在 CRS 中,配置指定模型的结构并设置训练和评估程序。 用户可以通过以下函数 System.fit() 启动运行进程
在这里插入图片描述
图 2:我们的 CRSLab 的说明性使用流程

Adding a New CRS

基于我们的工具包,使用提供的接口实现新的 CRS 很方便。 用户只需要继承几个基本类,实现一些接口功能。 在这一部分中,我们将分别介绍添加新数据集和模型的详细实现过程。

Adding a New Dataset

添加一个新的数据集,需要继承BaseDataset,设计一个新的Dataset类,将数据集准备成统一的格式。 在Dataset中,需要实现以下函数:init()、load data()和data preprocess()。

具体来说,在 init() 中,用户设置参数和数据集链接。 在 load data() 中,从相应的文件中加载训练、验证、测试数据和其他辅助数据。 请注意,如果用户遵循我们的命名协议,则需要做的就是重用现有 Dataset 类中已实现的功能。 函数data preprocess() 执行加载数据的准备工作。 我们在实用程序模块中集成了有用的功能以简化实现。

Adding a New Model

要添加新模型,用户需要继承BaseModel 来设计一个新的Model 类,在该类中需要实现build model() 和forward() 函数。 在构建模型中,用户构建模型、初始化参数并设置损失函数。 在 forward() 中,用户使用模型来预测结果或计算输入数据的损失。 实际上,用户可以利用实用程序文件中封装的层和功能来实现这两个功能,这与现有的 CRS 模型是分离的,并且在大多数情况下可能很有用。

Conclusion

在本文中,我们发布了一个名为 CRSLab 的新会话推荐系统 (CRS) 工具包,它是第一个用于研究目的的开源 CRS 工具包。 在 CRSLab 中,我们提供了一个具有高度解耦模块的统一且可扩展的框架来开发 CRS。 基于此框架,我们集成了全面的基准数据集和模型。 到目前为止,我们已经在我们的工具包中整合了 6 个常用数据集并实现了 18 个模型。 此外,CRSLab 还提供广泛的自动评估协议和人机交互界面来比较和测试不同的 CRS。

借助 CRSLab 工具包,我们希望帮助用户快速实现现有的 CRS,简化新系统的开发过程,并为 CRS 的研究建立一个基准框架。 未来,我们会继续努力增加更多的数据集和模型,也会考虑增加更多的实用工具来提高我们工具包的使用,例如结果可视化和算法调试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值