智客公社

标题: 英伟达在自然语言生成领域的最新研究进展 [打印本页]

作者: mxbaaa    时间: 2022-11-23 12:13
标题: 英伟达在自然语言生成领域的最新研究进展
导读:本文将介绍英伟达在自然语言生成领域的一些最新的进展。主要包含两个方面:
分享嘉宾|齐家兴博士 英伟达 高级解决方案架构师

编辑整理|扈应 贵州大学

出品社区|DataFun

01

多角色生成式对话建模

首先和大家分享多角色生成式对话建模的工作。
1. 生成式闲聊对话背景

[attach]794918[/attach]

在这项工作当中,我们关注的主要是闲聊式的对话生成。在业界中,闲聊式对话主要有两大类方法:检索式和生成式。检索式相当于是一种搜索任务,需要从预先准备好的回复当中选择一条合适的回复。生成式方法一般会采用自回归的采样来进行回复的生成。因此,生成式方法具有一定的灵活性,每次能够生成不同的内容。但是,生成式模型的可控性较差,在一次完整的多轮对话当中,生成式模型的对话风格可能并不统一,或者是在对话的过程当中生成无意义的内容。在业界有一些工作尝试向生成式模型添加一些情感,或者是说话人的 Embedding,但是这种方法需要有相应的这种标注的数据。当想要增大模型提升效果的时候,很难有足量的数据来支持模型的训练。

2. 背景

[attach]794919[/attach]

在这项工作当中,为了让模型能够在交互对话的过程当中生成风格比较稳定的对话内容,我们尝试让模型基于某个说话人之前的对话内容去生成风格一致的新的内容。这样就不用预先定义风格,而是让模型从目标说话人之前的内容当中提取出他的说话风格,并在之后的对话生成过程中继续保持这种风格。通过一系列的对比实验发现,这种方法比之前的方法有更好的可控性,能生成更合适的对话回复。另外,在实验过程中,我们也尝试增加模型的尺寸,从 117M 增加到 3.8B,结果显示,模型越大,生成的对话内容是越自然。

3. GPT-2 自回归语言模型方法

[attach]794920[/attach]

在这项工作中,主要使用的是基于 GPT-2 的生成式模型进行对话的生成。GPT-2 是基于语言模型的建模,采用的是自回归采样的方法。在生成一轮对话时,每次先生成一个 Token,然后将 Token 添加到之前生成的序列后面,作为新的输入,再输入到模型生成新的 Token。用 GPT-2 模型生成多轮对话,也是相同的方法。首先,生成一条回复,然后把它添加到之前生成的序列后作为新的输入,再生成下条回复。

4. 添加目标说话人历史对话方法

[attach]794921[/attach]

为了控制生成对话的风格,这项工作的一个思路就是将数据集中的某一个目标说话人的对话内容,作为输入的一部分输入到模型中,让模型能够在生成的过程当中生成同样风格的新的对话内容。为了让模型能更明白作为参考的历史对话内容是怎么样产生的,同时,还将目标说话人这一轮对话所对应的回复的前一轮的回复也包含进来,让模型能够更好的对说话人的风格进行建模,从而保持同样风格的内容的生成。

5. 模型结构与步骤

[attach]794922[/attach]

在模型方面使用的是和 GPT-2 相同结构的模型结构,使用生成式的模型控制对话内容的生成,所以也叫做生成式对话控制模型,简称为 GCC。基于这种建模方法的模型包含三个主要的步骤:首先,确定在对话过程当中想要模仿的说话人的风格;然后,从已有的数据集中提取它的历史对话作为参考;最后,在生成对话的过程当中,把该参考和当前对话已有的内容一起拼接,输入给模型,让模型以自回归的方式生成新的对话。

6. 模型输入格式

[attach]794923[/attach]

以一个例子是来说明模型的输入。如图,当前是建模三个人(A,B,C)的四轮对话(A1,B,A2,C)。与一般的 GPT 模型类似,模型的输入由多种不同的 Embedding 组合而成。首先是 Token 序列,它是由两个部分组成:第一个部分是目标说话人 A 的历史的对话内容的 Token(如左图);第二部分是当前的三个人的多轮对话内容。类似地,建模目标说话人为 C 的说话风格的时候,就采用 C 的历史对话作为参考,然后 C 的历史以及当前的对话序列拼接在一起,作为 Token序列(如右图)。除了 Token 序列以外,还用不同的 Token Type 来区别 Token 的来源。Token Type 也是分为两个部分:首先,在对话历史作为参考的这个部分使用 P 和 R 来区分当前 Token 是来自于目标说话人还是非目标说话人;另外,在当前的对话历史当中使用 S 和 NS 来区分当前 Token 是来自于目标说话人还是非目标说话人。最后,在输入当中去加入 Position-Embedding 来表示 Token 的序列信息。在训练时,Loss 的计算会只考虑当前目标说话人对应位置的 Logits。

7. 数据

[attach]794924[/attach]

在数据方面,所有的实验都采用了 Reddit 论坛里网友的提问和回复来作为对话的数据。Reddit 论坛的所有数据都可以从 pushshift.io 网站下载。使用 2018 年 10 月到 2019 年 3 月的数据训练,使用 2009 年 4 月的数据进行测试。
8. 数据

[attach]794925[/attach]

Reddit 论坛当中网友的回复本身是一种树的结构(如左图)。为了将这种树结构的数据转换为多轮对话序列形式,做了相应的处理和提取。另外,根据经验设定一些条件排除数据当中一些不合适的内容,比如,对话的最少的轮数,最多的轮数,每条回复的最短长度等等。对于每位网友,最多会保留他在论坛当中的八条回复。经过处理,平均每个人有 7.1 条回复作为数据进行之后的训练。

9. 对比试验:自动测试和人工测试

[attach]794926[/attach]

在实验阶段采用了两种不同的测试方法。首先是使用基于困惑度自动测试,并且对比了不同的几种baseline模型结构:首先,类似于 GPT 的 decoder-only 的结构,称之为 GCC-DEC;基于 Seq2Seq 的模型结构,称之为 S2S;基于变分自编码器的模型结构,称为 VAE;在 GPT 模型中不使用目标说话人之前的对话历史的模型,称为 NRC。另外,也对预训练的效果进行相应测试。还进行了实际的人工测试。

10. 结果:模型结构对比

[attach]794927[/attach]

基于困惑度的自动的测试。在测试集上,对比了不同模型结构以及大小的性能。从表格的上半部分可以看出来,在相同的模型参数量的情况下,基于 Decoder 的模型结构得到的困惑度值是最低。在表格的下半部分,进一步的增加了 Seq2Se 和自编码器的模型的大小,结果发现,即便增加参数量,这两种模型结构的效果还是比不上基于 Decoder 的生成式模型的效果,后面的实验也是基于 Decoder 的模型。

11. 结果:预训练的影响

[attach]794928[/attach]

除了对模型结构的测试,还测试了预训练对于模型效果的影响。从这个表格当中可以看出,预训练对于模型的效果是有帮助的。通过前两行的对比,可以看出,如果不借助预训练,训练的时间更长,或者 batch_size 更大,最终模型达到的 PPL 值还是会稍微高一些。另外,还对比了是否使用目标说话人的历史信息的差别,也就是表格中的第二行和第三行。结果显示,包含历史对话的方法,达到的 PPL 值是更低。

12. 测试:模型参数量的影响

[attach]794929[/attach]

除了模型结构和预训练的影响,进一步的对模型的大小对做对比测试,尝试调整模型的层数以及不同层数下所对应的这个 hidden_size。从这张表格当中可以看到,随着模型的增大,困惑度不断下降。

13. 测试:人工评价对话生成质量

[attach]794930[/attach]

在基于困惑度的自动测试之后,又进行了人工的测试,从多个维度评价模型生成对话的质量,包含对话生成的本质真实度,对话风格的一致性以及内容的质量、连贯性。具体来说,给定一段真实的 n 轮对话的前 n-1 轮内容,对于最后一轮对话,用不同的实现方式(模型生成或真实的文本),把这两种不同方式的结果都展示给测评者,让他在几个不同的维度对这两种不同方法产生的对话内容去进行倾向性的对比,看哪一种方法产生的文本效果更好。

14. 联合建模需求场景

[attach]794931[/attach]

人工测试的测评主要做了两种类型的对比,首先,用不同大小的模型与来自真人的对话内容作对比,也就是表格的上半部分。表格的第二部分是按照模型大小进行排序,相近大小的两两模型的对比。通过这两种方式结果都显示,大模型相较于比小模型的效果要好一些。另外,从表格中加粗的结果中可以看到,在实验当中所使用的参数量最大 8.3B 的模型的效果与真人的对话的效果是非常接近的,在多个维度上都只有比较小的差距。

15. 总结

[attach]794932[/attach]

传统的生成式对话可能会存在一些风格不可控的问题,为了解决这类问题,我们尝试去借助某一目标说话人的历史对话,让生成式模型在对话内容生成的过程中保持更一致的风格。在训练的过程当中,主要是借助于Reddit论坛当中获取的真实网友的回复来作为训练数据。在测评的过程中,首先采用自动测试,之后也采用了人工的测评。对比多种结构模型,模型结构以及大小,最终的结果显示,基于decoder的模型是最好的,并且效果会随着模型参数的增大而进一步的提升。
--

02

借助合成数据训练问答模型


1. 背景

[attach]794933[/attach]

深度学习的发展高度依赖于标注数据来进行模型训练。但是,标注数据通常是稀缺的,而且获取成本是较高的。一种折中的解决方法是半监督学习,即在已有的数据上训练模型,然后再用这个模型去标注新的数据,再反过来进行模型的训练以及提升。但对于问答任务来说,训练问答模型,需要问题和答案的数据对进行模型的训练。相对来说,合成数据在问答领域的质量与人工标据的数据还有一定的差距。
2. 背景

[attach]794934[/attach]

在这项工作当中,我们希望,在给定的文档集合上,借助生成式模型合成问题与答案,然后借助这种生成的问题和答案,作为一种数据增强的方式,更好的帮助训练问答模型。在 SQUAD1.1 测试集,使用纯的合成的数据训练而来的模型比使用传统的基于标注数据微调的模型的精度更好。更进一步,在生成的文本上生成问答对,用于微调模型,能够达到与传统的基于标注的真实数据相近的精度。

3. 方法:完整流程

[attach]794935[/attach]

这项工作的主要的思路是生成问答对数据,然后进行模型的微调,然后评价他的效果。该方法完整的流程分为四部分

4. 方法:答案-问题-过滤

[attach]794936[/attach]

合成数据的 Pipeline 采用了包含三个部分模型合成问答数据。给定文档集合 C,首先使用答案生成模块生成答案,然后再根据生成的答案以及文档集合生成问题,最后,对生成的问题做一定的筛选。对于答案的生成,训练类似于 BERT QA 的模型,和一般的 BERT QA 模型的差别就在于它的输入只有文本的段落而没有问题。采用这种方式,让模型预测答案的起始以及终止位置。有了答案之后,再生成问题。这一步骤采用的是类似于 GPT-2 的模型,基于文本的段落以及刚才生成的答案生成问题。生成的问题的质量可能是层次不一的,为了保证合成问题的这个质量,还需利用在标注的数据上训练的 BERT QA 模型,在生成的问题上产生答案。用生成的答案和之前生成的答案进行对比,如果两者一致,就认为生成的问题质量较高,就会保留它。否则,就放弃这个问题。

5. 数据

[attach]794937[/attach]

在数据方面,做了相应的消融实验,探索问题的生成和答案的生成,以及答案过滤模型的效果。在消融实验过程中,使用了 SQUAD 数据集中一半的数据作为训练数据,用 SQUAD 数据集的另一半进行相应的答案的生成。生成了问答对之后,进行 QA 模型的微调,在 SQUAD 的这个验证集上进行相应的测评。另外,尝试用全部的 SQUAD 的数据进行相应的探索,看在什么样的条件下能达到最佳的合成精度。

6. 结果:最好的模型

[attach]794938[/attach]

上图展示的是最好的模型的结果。实验步骤如下:首先,使用 SQUAD1.1 数据集训练问答生成 Pipeline。然后分别在真实的 Wikipedia 和合成的 Wikipedia 上进行问答的合成。最后在合成的问答数据上进行BERT QA的微调,并测试 EM 和 F1值,在用 SQUAD 进一步进行微调。从表中可以看出,传统的使用标注数据微调 BERT 得到的 EM 分数和 F1 值分别是 87.7 和 94。使用合成的 Pipeline 所产生的问答对微调的模型的分数是能达到88.4以及 94.1,比传统使用标注数据要更好。在合成的数据的基础上,在增加 SQUAD 的真实标注数据,模型的效果是有进一步的提升。另外,使用预先训练好的 GPT-2 模型,然后生成 Wikipedia 的文本,再生成问答对后进行 BERT 微调,通过这种方法发现,最终的问答模型的精度和基于真实文本所生成的模型的精度类似。

7. 结果:模型大小对合成 Pipeline 的影响

[attach]794939[/attach]

模型大小对 Pipeline 的影响。问答生成Pipeline 主要是有三个部分组成,首先是问题答案生成,然后是问题生成,最后是问题过滤模块。这三个模块分别是三个不同的模型组成的。上图对比了两种模型大小对于 Pipeline 的影响。可以看看到,基于大模型所生成的问答对的精度更高。

8. 结果:模型大小对问题生成的影响

[attach]794940[/attach]

除了对整个 Pipeline 的模型大小做相应的测试,进一步对 Pipeline 中单独的模块做了相应的测试,即观察模型大小对各个模块会有什么样的影响。首先是对问题生成的模块做相应的测试。从结果可以看到,生成的问题的质量随着模型的增大而变好。

9. 结果:模型大小对答案生成的影响

[attach]794941[/attach]

与问题生成的模块不同,在实验中发现,答案生成模块与模型的大小并没有产生比较明显的相关性。

10. 结果:模型大小对问题过滤的影响

[attach]794942[/attach]

对于过滤模块也尝试使用不同大小的模型。对于问题过滤模型来说,增大它的模型体积是可以提升问题过滤的效果。
11. 总结

[attach]794943[/attach]

在这项工作中,我们思路是借助生成模型在给定文档集合上,用生成的方法生成问题与答案,从而作为一种数据增强方式,更好的帮助训练模型。通过在 SQUAD1.1 测试集上进行验证,我们发现,使用纯粹的合成的数据训练而来的模型比传统的基于标注的模型的精度更好一些。另外,增大模型会对问题生成和问题过滤都更好的精度,但是对于答案生成的影响比较。

[attach]794944[/attach]

--

03

问答环节

Q1:老师,您这边有考虑对大模型做知识蒸馏吗?
A1:暂时还没有,我们的更多的工作是尝试增大模型的 Size,然后去看他对生成式任务或问答任务的效果的提升。
Q2:历史对话有很多,那选取多少合适?
A2:在我们这项工作当中,对每个网友一般会采取保留最多八条的对话。实际上,在论坛中,我们发现一个网友的回复都是远远多于八条的。这个选取也起决于你的模型的输入的整个序列的长度限制。在我们的实验当中发现,八条能够满足 GPT-2 模型最大长度为 1024 的限制。
Q3:基于合成数据方法做数据增强会不会导致数据的 Pattern 严重的依赖于生成模型,假如生成模型和真实数据 Pattern 是类似的,那么效果上可能效果较好,假如不一致,是如何保证效果的?
A3:是的,生成的数据在很大程度上取决于生成模型在训练阶段所使用数据的领域。所以说,如果需要在不同领域进行相应的文本的生成,需要预先的对生成模型进行风格的迁移,或者是在生成的过程当中使用相应的目标领域的文本,使模型有一定的生成内容的指导性。
Q4:请问有没有对分类任务尝试过生成方法的数据增强?
A4:暂时还没有使用这种合成的数据进行分类任务的数据增强,当前更多的是基于生成式的任务场景。
Q5:半监督学习、迁移学习、数据合成,哪个会比较好?
A5:这需要根据具体的场景来决定。在一些场景,半监督学习,确实有相当多的工作已经证明了有比较好的效果,比如说在图像。但是,比如说问答,它的问答对和简单的图像的标注稍微不太一样。而且对于自然语言来说,所涉及的多样性、复杂性会更高一些,相对来说,半监督学习并不太容易去做问答领域数据的增强。
Q6:对话 Style 的控制和历史对话会不会存在一些情况:没有引入历史对话的Style,反而干扰了现有最新对话的内容?
A6:在实验的过程当中,发现确实会有这样的情况出现。因为生成式模型在生成的时候,可控性是一个问题。针对这个问题,我们的思路主要在数据收集的时候进行相应的条件筛选或者是根据经验进行相应的数据清洗,尽量保证在收集历史对话的时候,收集到高质量的,能体现大风格的对话。另外,历史对话的时间的跨度也会有一定的影响,尽量不要与现在的对话有太大的时间上的改变。
Q7:请问您刚才那几个任务都是在什么硬件资源下运行?
A7:主要是基于公司内部 GPU 集群,每个节点包含 8 张 V100 GPU。
Q8:在生成的时候,有没有加一些可控的策略?
A8:没有添加其他的控制策略,因为这个工作主要是想研究基于历史对话对于风格控制的一个效果,所以说没有引入额外的控制去提升它的效果。可能在实际的场景中,可以根据场景使用多个控制策略,效果会更好一些。
今天的分享就到这里,谢谢大家。
|分享嘉宾|


[attach]794945[/attach]

齐家兴 博士

英伟达 高级解决方案架构师

齐家兴,德国亚琛工业大学博士,目前于英伟达企业解决方案部门担任高级架构师,多年来从事自然语言处理和语音识别等方向研究,助力多家企业基于GPU平台实现高效易用的训练和推理平台。他是英伟达NeMo,Riva语音识别训练推理平台的中文模型开发者之一。
|DataFun新媒体矩阵|


[attach]794946[/attach]

|关于DataFun|

专注于大数据、人工智能技术应用的分享与交流。发起于2017年,在北京、上海、深圳、杭州等城市举办超过100+线下和100+线上沙龙、论坛及峰会,已邀请超过2000位专家和学者参与分享。其公众号 DataFunTalk 累计生产原创文章800+,百万+阅读,15万+精准粉丝。
作者: 巨蟹LYY987    时间: 2022-11-23 21:26
珍爱生命,果断回帖。
作者: Vagrancy_SOUL    时间: 2022-11-24 17:33

作者: 抗日无须理由    时间: 2022-11-25 07:21
支持楼主,用户楼主,楼主英明呀!!!




欢迎光临 智客公社 (http://bbs.cnaiplus.com/) Powered by Discuz! X3.4