深入浅出对话系统——检索式对话系统进阶方法

news2024/11/24 20:46:19

引言

本文介绍检索式对话系统进阶方法,主要介绍两篇论文工作。

Fine-grained Post-training for Improving Retrieval-based Dialogue Systems

这里的post-training是定义在pre-training和fine-turning中间的阶段,具体的思想是用一些特定领域的数据去做更深入的预训练。

比如做金融相关的对话系统,那么可以用预训练模型在金融领域数据集上去做进一步地预训练,最后再拿一些有标签数据做微调。

模型

假设数据集 D = { ( c i , r i , y i ) } i = 1 N D=\{(c_i,r_i,y_i)\}_{i=1}^N D={(ci,ri,yi)}i=1N是一个由 N N N个三元组组成的数据集,三元组包含上下文 c i c_i ci、回复 r i r_i ri和真实标签 y i y_i yi
上下文就是语句序列 c i = { u 1 , u 2 , ⋯   , u M } c_i=\{u_1,u_2,\cdots,u_M\} ci={u1,u2,,uM},这里 M M M是最大上下文长度;
j j j个语句 u j = { w j , 1 , ⋯   , w j , L } u_j=\{w_{j,1},\cdots,w_{j,L}\} uj={wj,1,,wj,L}包含了 L L L个token, L L L是最大序列长度;
每个回复 r i r_i ri是单个语句;
标签 y i ∈ { 0 , 1 } y_i \in \{0,1\} yi{0,1} y i = 1 y_i=1 yi=1表示给定的三元组中 r i r_i ri是关于上下文 c i c_i ci的正确回复;
这里的任务是去找到给定数据 D D D的匹配模型 g ( ⋅ , ⋅ ) g(\cdot,\cdot) g(,),给定一个上下文-回复对 ( c i , r i ) (c_i,r_i) (ci,ri),该模型输出它们的匹配程度。

从预训练语言模型问世之后,几乎都是使用预训练-微调的范式。那么如何应用该范式到检索任务中呢。

首先这项工作是基于二分类去微调BERT来做回复选择任务,分析上下文和回复之间的关系。现有的BERT输入格式是([CLS],sequence A,[SEP],sequence B,[SEP]),其中[CLS]和[SEP]是CLSSEP词元。

为了衡量上下文-回复对的匹配程度,通过将sequence A作为上下文、sequence B作为回复的形式构建输入。另外,将语句结束词元(EOU,end of the utterance)放到语句后面用于在上下文中区分它们。即对于BERT的输入格式为:
x = [ C L S ]    u 1    [ E O U ] ⋯ u M    [ E O U ]    [ S E P ]    r i    [ S E P ] (1) x = [CLS] \,\, u_1\,\, [EOU] \cdots u_M \,\, [EOU] \,\, [SEP]\,\, r_i\,\, [SEP] \tag 1 x=[CLS]u1[EOU]uM[EOU][SEP]ri[SEP](1)

x x x经过位置、片段和词元嵌入的累加后变成输入表示。BERT中的transformer 块会计算上下文和回复输入表示之间的交叉注意力,通过自注意力机制。然后,BERT中第一个输入词元 T [ C L S ] T_{[CLS]} T[CLS]最终的隐状态作为上下文-回复对的聚合表示。最后的得分 g ( c , r ) g(c,r) g(c,r),即上下文和回复之间的匹配得分,通过将这个 T [ C L S ] T_{[CLS]} T[CLS]喂给一个单层神经网络而得:
g ( c , r ) = σ ( W f i n e T [ C L S ] + b ) (2) g(c,r) = \sigma(W_{fine}T_{[CLS]} +b) \tag 2 g(c,r)=σ(WfineT[CLS]+b)(2)
其中 W f i n e W_{fine} Wfine是任务相关的可训练参数,用于微调。最终,使用交叉熵损失更新模型的参数:
L o s s = − ∑ ( c i , r i , y i ) ∈ D y i log ⁡ ( g ( c i , r i ) ) + ( 1 − y i ) log ⁡ ( 1 − g ( c i , r i ) ) (3) Loss = -\sum_{(c_i,r_i,y_i) \in D} y_i \log (g(c_i,r_i)) + (1-y_i) \log (1-g(c_i,r_i)) \tag 3 Loss=(ci,ri,yi)Dyilog(g(ci,ri))+(1yi)log(1g(ci,ri))(3)

那在pre-training和fine-tuning的基础上如何加入post-training呢?

在这里插入图片描述
如上图所示,短上下文长度 k = 3 k=3 k=3。post-training方法有两个学习策略。整个会话被分为多个短上下文-回复对,并使用URC(见下文解释)作为训练目标之一。通过前者模型学习了对话中内部语句的相关性,通过后者学习了语句间的语义相关性和连贯性。

构建多个短上下文-回复对的目的是学习语句级的交互。把每个语句看成是一个回复,且它的前 k k k个语句看成是短上下文。每个短上下文-回复对用于训练内部的语句交互,最终允许模型理解整个对话中所有语句的关系。同时也让模型学习与回复相邻语句的紧密交互,因为上下文并设定为一个较短的长度。

NSP任务不足以捕获语句见的连贯性。因为NSP通过区分随机和下一句主要学习了主题的语义相关性。通过使用SOP(sentence-order prediction)作为一个目标函数,由于模型学习了具有相似主题的两个语句的连贯性,使得识别语义相关性的能力降低。

为了同时学习一个对话中的语义相关性和连贯性,作者提出了一个新的称为URC(utterance relevance classification,语句关系分类)的目标函数。如下图所示:
在这里插入图片描述
URC将给定短上下文的目标语句分成三个标签之一。第一个是随机语句;第二个是一个语句,但不是回复,不过是从同个会话中随机采用出来的。虽然通过会话中的语句与正确回复有类似的主题,但不能看做是连贯性的;第三个是正确的回复。

模型通过在随机语句和正确回复之间进行分类任务来学习主题预测,然后通过区分同对话中的随机语句和正确回复学习连贯性预测。

这样,通过将短上下文和目标语句分为三种类别,模型可以同时对话中的学习语义相关信息和连贯性信息。

具体的训练过程为,首先,给定会话 U i = { u 1 , ⋯   , u M , u M + 1 = r i } U_i=\{u_1,\cdots,u_M,u_{M+1}=r_i\} Ui={u1,,uM,uM+1=ri},选择了连续的语句并形成了一个长度为 k k k的短上下文-回复对 S j = { u j , u j + 1 , ⋯   , u j + k − 1 , u j + k } S_j = \{u_j,u_{j+1},\cdots,u_{j+k-1},u_{j+k}\} Sj={uj,uj+1,,uj+k1,uj+k}。模型分类一个短上下文 s c = { u j , u j + 1 , ⋯   , u j + k − 1 } sc=\{u_j,u_{j+1},\cdots,u_{j+k-1}\} sc={uj,uj+1,,uj+k1}和给定目标语句 u t u_t ut的关系。目标语句可以是三种情况之一:一个随机语句 u r u_r ur;来自同一个对话 u s u_s us中的随机语句;目标回复 u j + k u_{j+k} uj+k,这里 1 ≤ s ≤ M + 1 1 \leq s \leq M+1 1sM+1 j + k ≠ s j+k \neq s j+k=s。那么我们可以表示输入序列 x x x的post-training为:
x = [ C L S ]    u 1    [ E O U ] ⋯ u j + k − 1    [ E O U ]    [ S E P ]    u t    [ S E P ] (4) x = [CLS] \,\, u_1\,\, [EOU] \cdots u_{j+k-1} \,\, [EOU] \,\, [SEP]\,\, u_t\,\, [SEP] \tag 4 x=[CLS]u1[EOU]uj+k1[EOU][SEP]ut[SEP](4)
T [ C L S ] T_{[CLS]} T[CLS]作为一个聚合表示,最终的得分 g u r c ( s c , u t ) g_{urc} (sc,u_t) gurc(sc,ut)通过将该聚合表示喂给一个单层感知机,输出的得分作为短上下文和目标语句之间的相关度。
为了计算URC损失,使用交叉熵损失:
L U R C = − ∑ ∑ i 3 y i log ⁡ ( g u r c ( s c , u t ) i ) (5) L_{URC} = -\sum\sum _i ^3 y_i \log (g_{urc}(sc,u_t)_i) \tag 5 LURC=i3yilog(gurc(sc,ut)i)(5)
同时使用MLM和URC来训练模型。在MLM中,应用的是RoBERTa提出的动态掩码策略。模型可以学习更语境化的表示因为通过每次随机遮盖词元来学习,而不是遮盖一个预定的词元。为了优化模型,使用MLM和URC的交叉熵损失之和:
L F P = L M L M + L U R C (6) L_{FP} = L_{MLM} + L_{URC} \tag 6 LFP=LMLM+LURC(6)

ConveRT

作者认为原始的BERT对于对话来说太重了,导致训练缓慢费钱。接着作者提出了ConveRT,一个针对对话任务的预训练框架,能满足高效、可用(便宜)、快速训练的要求。使用一个基于检索的回复选择任务来预训练,高效地利用量化和双编码器的子词级参数构建一个轻量级的内存和能量有效(energy-efficient)的模型。

在这里插入图片描述
上表是作者给出了高效量化效果,最下面的一行代表本篇工作,它的模型大小只有59MB。

作者首先利用无标注对话数据,把回复选择任务加入到预训练过程中。同时压缩了BERT模型的大小。

回复选择 是一个给定对话历史选择一个最合适的回复任务。该任务是基于检索式对话系统的核心,通常需要在联合语义空间中编码上下文和大量回复。然后通过匹配query表示和每个候选回复表示检索最相关的回复。核心思想为: 1)利用大量无标签对话数据集在通用回复选择任务上来预训练一个模型;2)然后微调这个模型,通常会添加额外的网络层,使用少得多的任务相关数据。

双塔编码器(dual encoder)架构在回复选择上预训练变得越来越流行。

本篇工作引入了一个针对对话压缩的预训练回复选择模型。ConveRT仅有59MB的大小,使得它比之前SOTA级别的dual encoder(444MB)小得多。这种显著地大小减小和训练加速是通过结合8-bit的嵌入量化和量化感知的训练、子词级参数化,并对自注意力进行剪枝来实现的。

多上下文建模 ConveRT超越了单上下文的限制,提出了一个多上下文dual encoder模型,它在回复选择任务中组合了当前上下文和前面的对话历史。该多上下文ConveRT变体仍然是压缩的(共73MB),并且在大量的回复选择任务上带来了性能提升。

在这里插入图片描述
输入和回复表示 在训练之前,获得一个子词词典 V V V,该词典同时由输入端和回复端共享:从Reddit上随机采样10M个句子,然后迭代地运行子词分词算法。最终得到了词典 V V V包含31476个子词token。在训练和推理阶段,在 UTF8标点符号和单词边界上进行初始的单词级分词后,输入文本 x x x被拆分到子词集中。用同样的方式分词所有的回复 y y y

输入和回复编码器 输入和回复的子词嵌入然后经过一系列转换。该转换基于标准的Transformer架构,见上图。在经过自注意块之前,作者在子词嵌入上增加了位置编码。并且学习不同大小的两个位置编码矩阵, M 1 M^1 M1的维度是47512; M 2 M^2 M2是11512。在位置 i i i的嵌入累加为: M i 1 m o d    47 + M i 2 m o d    11 {M^1_i}_{mod \,\, 47} + {M^2_i}_{mod \,\, 11} Mi1mod47+Mi2mod11。接下来的层类似原始Transformer架构,但做了微小的调整。首先,在6层上设置了不同最大相对注意力,这可以帮助模型泛化到长序列和远距离依赖上:前面的层组合学习短语级语义,而后面的层建模更大的模式。并且在整个网络中使用单头注意力。

在进入softmax之前,增加了一个偏置到注意力得分中,它仅依赖相对位置。这可以帮助模型理解相对位置,但对比完全相对位置编码更高效。同样可以使模型泛化到更长的序列。

6个Transformer块使用一个64维的投影用于计算注意力权重,一个2048维的核(图1中前馈网络),和512维嵌入。注意所有的Transformer层使用的参数对于输入端和输出端是共享的。使用square-root-of-N reduction层把嵌入序列转换成固定维度向量。reduction层的输出分别记为 r x r_x rx r y r_y ry,是1024维的,喂给两个“端特定”的前馈网络(不共享参数)。

最后是一个线性层映射文本到最终的L2正则化的512维表示:输入文本是 h x h_x hx;相应的回复文本是 h y h_y hy

输入-回复交互 然后,每个回复与给定输入的相关性通过得分 S ( x , y ) S(x,y) S(x,y)来量化,通过计算 h x h_x hx h y h_y hy的相似度得到。
量化 每个参数不是标准的32位(bit),所有的嵌入参数仅通过8位来表示,其他网络参数只有16位。

在这里插入图片描述

多上下文的ConveRT 作者构建一个多上下文的dual encoder通过使用最多10个之前的语句。这些上下拼接了最近的10个语句,当成网络的一个额外特征,如上图所示。注意,所有上下文表示仍然独立于候选回复的表示,因此我们仍然可以进行高效的响应检索和训练。完整训练目标是三个子目标的线性组合:1)给定立即上下文排序回复 2)给定仅额外(非立即)上下文排序回复 3)给定立即和额外上下文的均值排序回复。

参考

  1. 贪心学院课程
  2. Fine-grained Post-training for Improving Retrieval-based Dialogue Systems
  3. ConveRT: Efficient and Accurate Conversational Representations from Transformers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/859674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ControlNet

2023.8.10 Adding Conditional Control to Text-to-Image Diffusion Models 对于 T2I 扩散模型添加 条件控制 相关联比较大的几篇论文: 0.Abstract 可以为预训练的扩散模型提供额外的输入条件控制。不需要很多计算资源。 即使在小数据集上,也具有鲁棒…

中间人攻击与 RADIUS 身份验证

在数字时代,中间人(MitM)攻击已成为一种日益严重的威胁。根据网络安全风险投资公司的网络安全统计数据,预计到2025年,网络犯罪每年将给世界造成10.5万亿美元的损失,比2015年的3万亿美元大幅增加。这种令人震…

企业微信消息模板通过中转页面(h5)判断跳转pc还是跳小程序

需求:甲方要根据不同的端跳转不同端的详情页面,为什么要这样,是应为每次在PC端点击消息,都要扫码登录进入小程序,不想进入小程序,要打开PC端 1、在pc端的微信中点击消息,则打开PC后台管理系统 …

Telegram营销,全球跨境电商都在研究的营销策略

Telegram 目前有7 亿月活跃用户。作为一个如此流行和广泛的即时通讯平台, Telegram 已成为企业和客户沟通的重要即时通讯工具。 为了使企业能够快速有效地覆盖目标受众,Telegram 不断改进平台,提供一系列功能,例如可定制的自动化…

内网穿透实战应用-——【如何在树莓派上安装cpolar内网穿透】

如何在树莓派上安装cpolar内网穿透 文章目录 如何在树莓派上安装cpolar内网穿透前言1.在树莓派上安装cpolar2.查询cpolar版本号3.激活本地cpolar客户端4.cpolar记入配置文件 前言 树莓派作为一个超小型的电脑系统,虽然因其自身性能所限,无法如台式机或笔…

Vue Baidu Map--自定义点图标bm-marker

自定义点图标 将准备好的图标放到项目中 使用import引入&#xff0c; 并在data中进行声明 <script> import mapIconRed from ./vue-baidu-map/img/marker_red_sprite.png export default {data() {return {mapIconRed,}}, } </script>在<bm-marker>中加入参…

【C++】map和set

目录 一、容器补充1.序列式容器与关联式容器2.键值对3.树形结构的关联式容器 二、set1.set的介绍2.set的使用3.multset的介绍4.multset的使用 三、map1.map的介绍2.map的使用3.multimap的介绍4.multimap的使用 一、容器补充 1.序列式容器与关联式容器 我们已经接触过STL中的部…

FISCO BCOS V3.0 Air建链体验——对比V2.9建链差别

前提 好久不见&#xff0c;最近因为毕业的手续等问题&#xff0c;一直都没有更新&#xff0c;FISCO BCOS第二季task挑战赛如期展开啦&#xff0c;因为毕业的问题&#xff0c;也是非常遗憾的错过了上一期的task挑战赛&#xff0c;这一期一定双倍挑战&#xff0c;hhhhhh Air版本…

spring源码之--启动入口

前面的文章搭建过spring源码&#xff0c;这里暂时不做展开讲解 spring源码搭建-略 1、那么spring的源码入口从哪查看呢&#xff1f;springboot的源码是如何启动spring的源码呢&#xff1f;追着这个疑问总结了一下如下&#xff1a; 在spring源码中直接添加一个模块&#xff0c…

Jay17 2023.8.10日报

笔记 【python反序列化】 序列化 类对象->字节流&#xff08;字符串&#xff09; 反序列化 字节流->对象 python反序列化没PHP这么灵活&#xff0c;没这么多魔术方法。 import pickle import os class ctfshow(): def init(self): self.username0 self.password0 d…

uniapp-----封装接口

系列文章目录 uniapp-----封装接口 uniapp-----分包 文章目录 系列文章目录 uniapp-----封装接口 uniapp-----分包 文章目录 前言 一、技术 二、封装步骤 1.准备 ​编辑 2.代码填充 request.js&#xff1a; api.js&#xff1a; min.js 页面使用 总结 前言 uni…

数据库优化脚本执行报错

目录 一、执行数据库优化脚本 报错... 3 解决方法&#xff1a;... 4 1、直接注释掉RECYCLE_POOLS 赋值sql语句块... 4 2、手动修改脚本... 5 附录... 6 一、执行数据库优化脚本 报错 AutoParaAdj3.5_dm8.sql 1&#xff09;manager中报错 -20001: 执行失败, -7065 数据未…

38、IPv6过渡技术

本节内容作为IPv6相关知识的最后一节内容&#xff0c;同时也作为我们本专栏网络层知识的最后一节内容&#xff0c;主要介绍从IPv4地址到IPv6地址过渡的相关技术。在这里我们只学习各类考试中常考的三种技术。 IPv4向IPv6的过渡 在前面的知识中&#xff0c;我们学习到了两种IP地…

R3LIVE项目实战(3) —双目相机与激光雷达 lidar_camera_calib联合标定

目录 3.1 lidar_camera_calib简介 3.2 环境准备 3.3 编译 3.4 运行数据集 (1) 单场景标定 (2) 多场景标定 3.5 使用您自己的传感器设置 3.5.1 采集相机图片和雷达bag数据 3.5.2 使用多场景标定 3.5.3 相机内参获取 3.5.4 运行标定程序 3.5.5 验证结果 源码地址&am…

【LeetCode】买卖股票的最佳时机含冷冻期

买卖股票的最佳时机含冷冻期 题目描述算法分析程序设计 链接: 买卖股票的最佳时机含冷冻期 题目描述 算法分析 程序设计 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();//天数vector<vector<int>> dp(n,vector&l…

11.Eclipse 注释模板的说明及设置

1.在eclipse中点击Window——>java——>Code Style——>CodeTemplates——>Comments 2.常用Variable 3. 我的注释模板 ①Files 文件 /** * Title: ${file_name}* Description: ${todo}* author Jeremy* date ${currentDate:date(yyyy-MM-dd hh:mm:ss)} */ ②Typ…

Leetcode-每日一题【剑指 Offer 21. 调整数组顺序使奇数位于偶数前面】

题目 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数在数组的前半部分&#xff0c;所有偶数在数组的后半部分。 示例&#xff1a; 输入&#xff1a;nums [1,2,3,4]输出&#xff1a;[1,3,2,4] 注&#xff1a;[3,1,2,4] 也是正确的…

如何改造antd-vue的table支持虚拟列表功能

对于超大数据量的接口来说&#xff0c;如果前端直接一股脑的渲染出来&#xff0c;必然会导致渲染超时、操作卡顿、内存爆表、网页奔溃等情况&#xff0c;因此一般的对于大数据量的列表处理&#xff0c;无非就以下几种方式 采取分页的方式&#xff0c;减少每页的数量 比如每页1…

文旅行业苦“黄牛”久矣,消失的门票到底去哪儿了?

今年年初以来&#xff0c;文化与旅游行业强势复苏&#xff0c;明星演唱会、热门景区及文博科技馆成为了“黄牛党”肆虐的重灾区&#xff0c;高价倒卖票、代抢服务等层出不穷&#xff0c;严重扰乱了文旅票务市场秩序。 如何解决黄牛“顽疾”&#xff0c;成为了文旅行业共同关注…