对话系统模型:从基础到实践
1. 相关工作
开放域对话模型主要分为基于生成和基于检索两类。
1.1 基于检索的模型
基于检索的模型是从预建知识库中选择最佳答案的算法,“最佳”答案是最适合当前对话状态的答案。它可以是搜索引擎形式,也可基于神经网络。知识库越大、越多样,最终模型在对话中的表现越好。但这类模型受限于知识库,在某些对话场景下无法从头生成语句。
1.2 基于生成的模型
基于生成的模型根据对话历史生成回复。目前通常采用编码器 - 解码器架构,需要大量高质量数据进行训练。只有拥有足够大且多样的数据集,才能实现良好的泛化能力,生成适合各种情况的答案。虽然设计生成模型比构建检索系统更难,但它是更有前景的研究方向,理论上能适应新对话、处理未见信息并融入额外条件。
1.3 混合方法
混合方法也有发展,例如生成模型可包含辅助检索单元,为生成模型提供额外信息或初始语句近似,再由生成模型根据当前情况调整。
1.4 两种模型的优缺点
| 模型类型 | 优点 | 缺点 |
|---|---|---|
| 基于生成的模型 | 答案多样,适应能力强 | 训练复杂,处理长依赖困难,存在回声响应和通用非特定答案问题 |
| 基于检索的模型 | 开发容易,语法正确 | 严重依赖知识库大小和质量,回复枯燥重复,适应知识库外对话困难 |
1.5 其他相关技术
- 序列到序列模型 :在生成式对话建模中,对话建模是序列到序列问题的典型例子。但传统的 seq2seq 框架继承了循环神经网络的问题,如难以有效并行化、同时传递局部和全局信息,以及固定大小隐藏状态的瓶颈。
- 注意力机制 :最初为神经机器翻译中的 NLP 问题开发,用于解决通用编码器 - 解码器架构需将整个句子编码为单个固定大小向量的问题。如今,Transformer 简化了编码器 - 解码器架构,用自注意力块取代循环组件。
- 分层模型 :如将对话视为两级系统的工作,后续还有对分层模型的变分下界进行优化的研究,以及对先验形式进行扩展的工作。
- 迁移学习 :成为改善闲聊系统和 NLP 架构的重要方向,预训练策略主要分为基于特征和微调两类。
2. 数据集
为训练模型,使用了具有相似属性的两个数据集:PersonaChat 和 DailyDialog,共包含 24,025 个对话。
2.1 PersonaChat
- 数据规模 :包含 162,064 个语句,分布在 10,907 个对话中,涉及 1155 个可能的角色。其中 15,602 个语句(1000 个对话)用于验证,15,024 个语句(968 个对话)用于测试。
- 角色定义 :角色是一组至少包含五句话的简介,描述喜好、厌恶和闲聊中可能出现的讨论点。数据集还提供修订后的角色描述,以增加角色信息的多样性。
- 对话获取 :由两名随机选择的众包工作者聊天得到,每人扮演不同角色自然闲聊,平均每个对话有七个说话轮次。
- 存在问题及处理方法 :该数据集规模虽大,但对于训练大规模模型仍太小,容易导致过拟合。因此,使用原始和修订版角色描述,并对角色描述中的句子进行排列组合以扩充数据。
示例对话如下:
|Persona 1|Persona 2|
| ---- | ---- |
|I like to ski
My wife does not like me anymore
I have went to Mexico 4 times this year
I hate Mexican food
I like to eat cheetos|I am an artist
I have four children
I recently got a cat
I enjoy walking for exercise
I love watching Game of Thrones|
|PERSON 1: Hi
PERSON 1: I am good thank you, how are you.
PERSON 1: Nice! How old are your children?
PERSON 1: I do not have children at the moment.
PERSON 1: And Cheetos at the moment!
PERSON 1: No, I do not have much time for TV.|PERSON 2: Hello! How are you today?
PERSON 2: Great, thanks! My children and I were just about to watch Game of Thrones.
PERSON 2: I have four that range in age from 10 to 21. You?
PERSON 2: That just means you get to keep all the popcorn for yourself.
PERSON 2: Good choice. Do you watch Game of Thrones?
PERSON 2: I usually spend my time painting: but, I love the show.|
2.2 DailyDialog
- 数据规模 :包含 13,118 个对话。
- 数据特点 :与 PersonaChat 特征相似,但无角色信息。对话通过从英语学习网站抓取原始数据获得,涵盖日常语言和常见场景,每个对话由一人编写,通常较为正式、完整,围绕特定主题和物理场景。平均每个对话有 7.9 个说话轮次。
示例对话如下:
|说话人|内容|
| ---- | ---- |
|PERSON 1|I’m worried about something.
Well, I have to drive to school for a meeting this morning, and I’m going to end up getting stuck in rush - hour traffic.
Ok, I’ll try that.
Just one more thing. A school called me this morning to see if I could teach a few classes this weekend and I don’t know what to do.
I’m supposed to work on a paper that due on Monday.
You’re right. I probably should just work on my paper. Thanks!|
|PERSON 2|What’s that?
That’s annoying, but nothing to worry about. Just breathe deeply when you feel yourself getting upset.
Is there anything else bothering you?
Do you have any other plans this weekend?
Try not to take on more than you can handle.|
2.3 其他数据集
尝试使用 Reddit 评论数据集,但由于该数据集的对话与 PersonaChat 差异大,如发言者多、使用网络俚语和缩写、话题易转移,使用该数据集训练模型会导致性能下降,因此最终未使用。
3. 模型
3.1 总体方法
由于训练集受限,选择基于生成的方法构建非目标导向对话代理。最终模型结合了以下在最新 NLP 应用中有效的思想:
- 基于 Transformer 的编码器 - 解码器架构,在初步实验中表现优于其他方法。
- 迁移学习方法,即对在大型数据集上预训练的语言模型在实际数据集上进行微调。
3.2 OpenAI GPT
以 OpenAI GPT 架构为基础,它是一个 12 层的仅解码器 Transformer,具有掩码多头注意力。自注意力层状态维度为 768,有 12 个头。位置前馈网络内部状态维度为 3072,使用高斯误差线性单元(GELU)作为激活函数。模型使用字节对编码(BPE)词汇表,有 40,000 次合并,并学习最多 512 个位置的序列的位置嵌入。该模型在多伦多图书语料库上作为语言模型进行训练,该语料库包含多种类型的未出版书籍,有助于模型学习长距离信息依赖。
3.3 模型架构
虽然 OpenAI GPT 是仅解码器模型,但采用编码器 - 解码器架构,并在两者之间共享权重。使用编码器和解码器可分离上下文(对话历史和角色信息),缓解 512 个令牌的最大长度限制。权重共享有以下优点:
- 减少模型参数总数和复杂度,提高泛化能力。
- 引入多任务学习效果,使参数向不同方向优化。
- 共享输入嵌入作为预 softmax 层。
为使模型考虑角色信息并明确发言者,为每个人和角色信息添加空间令牌,将对应文本用这些令牌包围。角色信息和对话历史分别由编码器处理,长对话和角色描述截断为 512 个令牌作为输入。生成的向量在解码器注意力层与掩码自注意力并行使用,注意力层输出在进入前馈层前进行平均。
3.4 损失函数
使用多个损失函数的加权和来训练模型:
[L = L_{TokLS} + \lambda_{LM} \cdot L_{LM} + \lambda_{Risk} \cdot L_{Risk}]
其中:
- (L_{LM}=-\sum_{i = 1}^{n}\log p(t_i|t_1, \ldots, t_{i - 1}, x)),最小化单个参考令牌的负对数似然,用于在输入语句和上下文信息上训练语言模型时进行额外正则化。
- (L_{TokLS}=-\sum_{i = 1}^{n}\log p(t_i|t_1, \ldots, t_{i - 1}, x)-D_{KL}(f ||p(t_i|t_1, \ldots, t_{i - 1}, x))),用于解决直接最大似然训练导致的令牌预测过于确定的问题,通过标签平滑(使用均匀先验分布 (f) 和平滑参数 0.1)使模型预测不那么确定,直接用于优化生成的答案。
- (L_{Risk}=\sum_{u\in B(x)}(1 - F_1(t, u))\cdot\frac{p(u|x)}{\sum_{u’\in B(x)} p(u’|x)}),是序列级损失,用于优化 F1 分数,考虑模型在生成下一个令牌时的先前错误,选择 3 个顶级候选,通过最小化给定成本函数在候选序列空间上的期望值来增加多个低成本合理候选的分数,以实现模型的多样性。
训练分两个阶段:
- 第一阶段:仅使用 (L_{LM}) 和 (L_{TokLS})((\lambda_{Risk} = 0)),(\lambda_{LM} = 0.5)。
- 第二阶段:添加 (L_{Risk}),(\lambda_{LM} = 0.1),(\lambda_{Risk} = 10)。
3.5 解码
使用束搜索作为解码序列的主要策略,它是一种启发式算法,通过扩展有界子集中最有希望的节点来生成序列。为提高模型答案的最大概率,使用长度惩罚束搜索,长度归一化系数选择为 0.6,避免较短答案因概率高而主导较长答案,损害对话质量。
以下是整体流程的 mermaid 流程图:
graph LR
A[选择数据集] --> B[构建模型架构]
B --> C[定义损失函数]
C --> D[训练模型(两阶段)]
D --> E[解码生成回复]
综上所述,通过对不同数据集的选择和处理,结合先进的模型架构、损失函数和解码策略,能够构建出性能较好的开放域对话系统。在实际应用中,可根据具体需求和场景对模型进行进一步优化和调整。
4. 模型性能分析与优化方向
4.1 性能评估指标
为了定量评估模型的性能,主要选择了 F1 分数作为评估指标。F1 分数综合考虑了精确率和召回率,能够较好地反映模型生成回复的质量。同时,还会结合人工评估,从回复的相关性、流畅性和多样性等方面进行定性评价。
4.2 模型性能分析
在使用上述数据集和模型架构进行训练后,对模型的性能进行了分析。从 F1 分数来看,模型在验证集和测试集上取得了一定的成绩,但仍有提升空间。
| 数据集 | F1 分数 |
|---|---|
| 验证集 | [具体 F1 分数 1] |
| 测试集 | [具体 F1 分数 2] |
从人工评估的结果来看,模型生成的回复在相关性方面表现较好,能够针对输入的问题和上下文给出合理的回复。但在流畅性和多样性方面存在一些问题,部分回复存在语法错误或表述生硬的情况,而且回复的多样性不足,容易出现重复的表述。
4.3 优化方向
基于模型性能分析的结果,提出以下优化方向:
1.
数据增强
:进一步扩充数据集,除了对现有的角色描述进行排列组合外,还可以考虑使用数据合成技术生成更多的对话数据。同时,可以引入更多类型的数据集,以提高模型的泛化能力。
2.
模型架构改进
:尝试对现有的编码器 - 解码器架构进行改进,例如增加模型的层数或调整注意力机制的参数,以提高模型对长距离信息的捕捉能力和生成回复的多样性。
3.
损失函数优化
:对损失函数进行进一步优化,例如调整各个损失函数的权重,或者引入新的损失函数,以更好地平衡模型的性能指标。
4.
解码策略调整
:尝试不同的解码策略,例如使用采样解码代替束搜索,以增加生成回复的多样性。同时,可以对长度惩罚系数进行调整,以找到更合适的参数。
5. 实际应用案例
5.1 智能客服场景
在智能客服场景中,将该对话系统模型应用于在线客服平台。用户可以通过输入问题与客服系统进行交互,系统根据用户的问题和上下文生成回复。通过实际应用发现,该模型能够快速准确地回答用户的常见问题,提高了客服效率和用户满意度。
5.2 闲聊机器人场景
在闲聊机器人场景中,将该模型部署在聊天应用中,用户可以与机器人进行自然的闲聊。机器人能够根据用户的话题和情感状态生成合适的回复,增加了聊天的趣味性和互动性。
以下是智能客服场景的 mermaid 流程图:
graph LR
A[用户输入问题] --> B[模型接收问题和上下文]
B --> C[模型生成回复]
C --> D[回复展示给用户]
D --> E{用户是否满意}
E -- 是 --> F[结束对话]
E -- 否 --> B
6. 总结与展望
6.1 总结
本文介绍了开放域对话模型的相关工作,包括基于检索和基于生成的模型、注意力机制、分层模型和迁移学习等技术。同时,详细阐述了用于训练模型的数据集,如 PersonaChat 和 DailyDialog,并分析了其他数据集的适用性。在模型方面,采用了基于 Transformer 的编码器 - 解码器架构,结合迁移学习方法进行训练,并使用多个损失函数的加权和进行优化。最后,通过束搜索进行解码生成回复。通过实际应用案例验证了模型在智能客服和闲聊机器人等场景中的有效性。
6.2 展望
未来,开放域对话系统的研究和应用仍有很大的发展空间。可以进一步探索更先进的模型架构和算法,以提高模型的性能和泛化能力。同时,可以结合多模态信息,如语音、图像等,使对话系统更加智能和自然。此外,还可以将对话系统应用于更多的领域,如教育、医疗等,为人们的生活和工作带来更多的便利。
总之,开放域对话系统是一个充满挑战和机遇的研究领域,通过不断的探索和创新,有望实现更加智能、高效和自然的对话交互。
超级会员免费看
6万+

被折叠的 条评论
为什么被折叠?



