文本生成系列之transformer结构扩展(一)

技术

提纲

1 简介

2 SongNet

3 DeepRapper

4 TransferTransfo

5 GPT-2

6 XNLG

7 总结

参考文献

1 简介

在前面几章《文本生成系列之encoder-decoder》,《文本生成系列之因果语言模型》,《文本生成系列之前缀语言模型》中我们介绍的各种模型都是基于普通的transformer构建的,但是  **实际特定任务下可以通过对transformer里面的模块做相应的调整,从而使得模型可以适应多种特定任务下的输入格式。** 可以理解为在某些特定任务下不适合直接挪用普通的transformer,需要根据具体任务对模型结果进行一定的调整才能适配。




在本章节中,  **我们会介绍若干种在transformer基础上引进额外embedding的模型和对应的任务背景** ,embedding虽然浅显,但是可以为相应token增加明显的信息。通过引起额外的embedding,完成特定任务的适配,不失为一种简单有效的方式。

2 SongNet

用神经网络来做文本生成任务的一个通用特点是大多数文本生成任务在生成时都没有固定格式的限制,但是如果想用神经网络的方法来生成诗或者词(具有固定格式的文本),我们就必须  **要对模型进行改造,让它能生成固定格式的结果。** 想要生成好的诗词,必须要保证这三点。




a). 完全遵循固定格式。




b). 遵循相应的韵法。




c). 保证句子的完整性。

picture.image

图1: SongNet框架

  **SongNet是一种自回归的语言模型,在transformer的基础上引进了额外的embedding,Format and Rhyme Embeddings和Intra Position Embedding。** Format and Rhyme Embedding有三种类型,c0表示一般的token,c1表示标点符号,c2 表示韵律的token,通过这个embedding,可以使得押韵的token学到一个不同的表示,让模型知道它跟一般token的区别,从而实现押韵。Intra Position Embedding主要表示同一个句子内部的顺序,跟Global Position Embedding表示全局顺序不同,这里的顺序指的是句子内部的局部顺序。  **同时这里采用的是倒序,也就是句子的最后一个token用p0表示,通常指的是标点符号,句子倒数第二个token用p1表示,通常是押韵的那个token,通过这个embedding迫使模型去捕捉句子动态的信息和准确结束当前句子的能力。**




除了embedding以外,SongNet每个transformer里面存在两个attention计算过程,Masking Multi-Head Self-Attention和Global Multi-Head Attention。其中Masking Multi-Head Self-Attention中的mask跟transformer的decoder一样,就是当前token看不到在它后面的token的信息,所以计算attention的时候需要进行相应的mask,这里的H0用的是全部的embedding

picture.image

图2: SongNet的Masking Multi-Head Self-Attention计算过程

Global Multi-Head Attention是为了更好的去表征全局动态格式信息,而不拘泥其中某个位置的格式信息,所以这里的F0虽然也是embedding,但是相比于H0,缺了Token Embedding跟Global Position Embedding。

picture.image

图3: SongNet的Global Multi-Head Attention计算过程

预训练跟微调过程一样,随机选取20%的token保持不变,然后去预测其他的token。输入格式如下图所示。

picture.image

图4: SongNet的训练输入样式

完成模型训练后,在推理过程中只要给行相应的格式C,就能得到P(具体内部顺序),从而按照自回归的方式就能生成对应的诗词。这里可以逐渐迭代这个过程去获得令人满意的效果。 例如下图中生成第一次结果Y后,可以保留一部分生成的结果再次进行推理,完成相应的润色。

picture.image

图5: SongNet的润色过程

3 DeepRapper

  **DeepRapper是为了生成rap相应的歌词和相应的节奏而被提出来的** ,同样是依赖于transformer做自回归任务的。但是有三点不同,




a). 因为韵律词一般都位于句子的结束位置,为了更好的对韵律词进行建模,  **DeepRapper是从句子的结束位置开始从右往左进行的** 。因为如果直接使用标准的自回归语言模型并且从左到右依次生成的话,我们还需要去判断当前时刻是否是句子的结束位置,才能去决定是否生成跟前面句子保持一致的韵律词。所以为了更好的对韵律词建模,DeepRapper使用一个相反顺序的语言模型去生成文本,其实就是将句子内部反转顺序后再输入而已。  **例如下图的例子,原本的文本是“我抬头仰望。天空的苍茫”,将句子内部反转顺序后给模型的输入为“望仰头抬我。茫苍的空天”。**




b). 为了对韵律进行显示建模,DeepRapper引进了一个特别的token[BEAT],会在对应的词前面插入[BEAT]。不同的rap会伴随着不同的节奏频率,为了更好的对节奏频率建模和生成特定频率的rap,DeepRapper用[S],[M],[F]分别表示低,中,高节奏频率并且将它加到rap的开始位置。




c). 为了对韵律词跟韵律更好的建模,DeepRapper引入了额外的embedding。DeepRapper的embedding部分包括五种embedding,其中,Token Embedding跟Positional Embedding跟普通的transformer的一样,Sentence Embedding跟普通的transformer的Segment Embedding基本一致,除了多了一个代表开始的S【start】。另外的Vowel Embedding跟Intra-Sentence Positional Embedding则是新增的,其中Intra-Sentence Positional Embedding用于建模句子内部的顺序,就是局部顺序,而Vowel Embedding则是利用对应token的拼音来获得相应的韵律表示。通过这些额外新增的embedding,来增强韵律词的表示。

picture.image

图5: DeepRapper的框架

除此之外,有的rap不仅是句子最后一个位置押韵,而是那连续的一个片段都押韵,为了处理这种情形,  **DeepRapper支持N-gram的韵律词生成,就是在预测当前token的时候,如果发现之前的token跟前面句子的token的韵律相同时,如果预测的token能保持押韵的话,我们会适当增加这个token的概率,从而鼓励生成长度更长的具有共同韵律的片段。**

4 TransferTransfo

闲聊对话也是文本生成的一个常见场景,现有的文本生成应用到闲聊对话会遇到以下几个问题。




a). 不一致的回复和缺乏个性化




b). 缺乏长期记忆




c). 生成通用化的回复




TransferTransfo是一个应用于闲聊机器人的方法,它在回复的相关性,个性化设定跟对话历史的连贯性,语法跟通顺度等方面都有明显的提升。它是由12层的包含mask self-attention的transformer decoder组成,它的embedding部分包括Word Embedding, Positional Embedding, 和Dialog state Embedding,  **其中Dialog state Embedding有三种可能,代表当前token是来自于个性化句子(个性化设定),还是来自于第一个人说的话,还是来自于第二个人说的话。这一点跟普通的transformer有一点不同。**

picture.image

图6: TransferTransfo的embedding组成

另外,TransferTransfo的微调过程也有些许不同,除了常规的一个语言模型损失外,还有新增的损失项,  **下一句的分类损失,就是将预测生成的回复和随机选择的回复都分别拼接到历史对话然后用分类器去预测那个回复更加合适。将这两部分损失加到一起去联合优化模型。**

picture.image

图7: TransferTransfo微调过程的分类任务

5 GPT-2

  **这里不是要介绍GPT-2的方法,而是如何将GPT-2应用到任务型机器人。** 前面那个方法是应用到闲聊对话场景的,如果是任务型对话场景又有些许不同。  **一般的任务型对话系统都是基于pipeline的,通过NLP模块理解用户意图,通过DST模块进行状态追踪,通过PL模块选择相应的策略,最终再通过NLP模块生成相应的回复,一环扣一环,容易导致误差传递。** 所以就有人提出将GPT-2应用到任务型对话系统中去,  **它的输入包括对话历史,对话状态,系统动作跟系统回复四部分** ,这里的对话状态跟系统动作跟任务型对话系统强相关,主要包括一些预先设置好的槽信息。然后在用户话术,系统回复,对话状态,系统动作前分别插入<usr><sys><ds><sa>进行区分,同时,因为有的槽的信息例如电话号码,名字,地址等是需要通过相关数据库查询得到的,所以在训练时会讲这些具体槽信息替换为特殊token,后续预测得到这些特殊token时需要去查询相应数据库后将相应槽的信息tian ru 即可。

picture.image

图8: GPT-2的输入

  **整个微调GPT-2的过程除了原本的从左往右的语言模型任务目标外,新增一个分类任务损失,在给定对话历史条件下,利用模型生成的这个对话系统的结果包括对话状态,系统动作以及系统回复和随机从数据集中选取的结果混合一起,训练一个分类模型进行判断,选择正确的对话系统结果。模型利用这两部分损失的加权平均进行联合优化。**

picture.image

图9: 基于GPT-2的任务型对话系统框架

完成训练后具体使用过程中利用将历史对话文本输入GPT-2,通过自回归文本生成得到相应的对话状态,系统动作跟系统回复,然后将系统动作结果输入到外部数据库进行查询,查到到的结果再替换掉系统回复中的槽的特殊token,否则就输出兜底结果。

6 XNLG

  **XNLG是一个实现了跨语言的文本生成模型,给定一个文本跟相应的语言标签,XNLG可以生成相应的表示,基于生成的表示和一定语言标签,XNLG可以生成相应语言的文本。XNLG基于transformer的结构,具备encoder跟decoder两个部分,为了能够识别源文本语言跟目标文本语言,在embedding的部分新增一个tag embeding用于表示当前token所属的语言。**

picture.image

图10: XNLG的框架

另外,XNLG的预训练过程比较特别,分别两个阶段,分别对encoder和decoder进行训练。  **第一个阶段先对encoder进行训练** ,训练的目标函数都是一样的,无论数据是单个语言的,还是多个语言的语言对形式,都是将文本拼接到一起,按照一定的比例进行mask,然后预测相应被mask的位置的token。  **通过第一个阶段,XNLG的encoder能够将不同语言的文本编码到同一个共享的词嵌入空间中。第二个阶段是固定encoder的参数,只训练decoder的参数,这个阶段的损失用的是自重建损失函数** ,就是将文本通过encoder编码到一个隐藏空间,然后利用decode再还原为原始文本。这里如果是单个语言的语料,就是将文本进行自重建,如果是多种语言的语料对,那么就是将一种语言的文本编码到一个隐藏空间,然后再解码成另一种语言的文本。




在具体的下游任务微调中,我们可以根据具体需要采取不同方式,例如如果我们是想要一个多语言到英文的模型,那么就固定encoder的参数,只对decoder的参数进行训练即可。

7 总结

  **可以看到,无论是诗词生成,对话自动回复,跨语言翻译等文本生成任务,都可以基于transformer的结构进行相应调整,而且调整的幅度不大,大多是引进了额外的特定任务所属的embedding,就可以将模型迁移到特定任务中。对于更多的场景也是一样,我们首先要弄清具体的任务是什么,然后才对模型进行一定合理的调整,再做相应的训练即可。**

参考文献

  1. (2020, SongNet) Rigid Formats Controlled Text Generation

https://arxiv.org/pdf/2004.08022v1.pdf

  1. (2020, DeepRapper) DeepRapper: Neural Rap Generation with Rhyme and Rhythm Modeling

https://arxiv.org/pdf/2107.01875.pdf

  1. (2019, TransferTransfo) TransferTransfo: A Transfer Learning Approach for Neural Network Based Conversational Agents

https://arxiv.org/pdf/1901.08149v2.pdf

  1. (2020,) End-to-End Neural Pipeline for Goal-Oriented Dialogue Systems using GPT-2

https://aclanthology.org/2020.acl-main.54/

  1. (2019, XNLG) Cross-Lingual Natural Language Generation via Pre-Training

https://arxiv.org/pdf/1909.10481v3.pdf

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论