每天给你送来NLP技术干货!


来自:NLP日志

作者:zelong

提纲

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). 保证句子的完整性。

图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

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

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

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

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

图4: SongNet的训练输入样式

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

图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,来增强韵律词的表示。

图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有一点不同。

图6: TransferTransfo的embedding组成

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

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

5 GPT-2

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

图8: GPT-2的输入

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

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

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

6 XNLG

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

图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

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

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

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

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

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

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

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

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

下载一:中文版!学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!  后台回复【五件套】
下载二:南大模式识别PPT  后台回复【南大模式识别】

投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

整理不易,还望给个在看!

文本生成系列之transformer结构扩展(一)相关推荐

  1. 可控文本生成系列-A Survey of Controllable Text Generation using Transformer-based Pre-trained

    一.Controlable Text Generation(CTG)定义与应用 1. 什么是CTG Controlable Text Generation,可控制的文本生成,就是能够在传统的文本生成的 ...

  2. 【DL】第 6 章:文本生成转换器

    在本章中,您将: 从概念上了解注意力机制如何模仿我们对句子中某些词的重视程度高于其他词的方式 从第一原则深入研究注意力机制的工作原理,包括如何创建和操作查询.键和值 了解因果掩蔽对于文本生成任务的重要 ...

  3. ACL2022 | 文本生成的相关前沿进展

    每天给你送来NLP技术干货! 来自:复旦DISC 引言 文本生成作为人工智能领域研究热点之一,其研究进展与成果也引发了众多关注.本篇主要介绍了三篇ACL2022的三篇文章.主要包含了增强预训练语言模型 ...

  4. 论文领读|基于 VQVAE 的长文本生成

    ​欢迎关注「澜舟论文领读」专栏!关注"澜舟科技"公众号探索更多 NLP 前沿论文! 本期分享者:杨二光 北京交通大学自然语言处理实验室四年级博士生,导师为张玉洁教授,研究方向为可控 ...

  5. 基于结构化数据的文本生成:非严格对齐生成任务及动态轻量的GCN生成模型

    作者|邴立东.程丽颖.付子豪.张琰等 单位|阿里巴巴达摩院.香港中文大学等 摘要 基于结构化数据生成文本(data-to-text)的任务旨在生成人类可读的文本来直观地描述给定的结构化数据.然而,目前 ...

  6. huggingface transformers实战系列-05_文本生成

    # hide from utils import * setup_chapter() Using transformers v4.11.3 Using datasets v1.13.0 Using a ...

  7. 论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成

    论文笔记整理:谭亦鸣,东南大学博士生,研究方向为跨语言知识图谱问答. 来源:NAACL2019 链接:https://arxiv.org/pdf/1904.02342.pdf 本文关注如何从信息抽取结 ...

  8. Diffusion扩散模型学习2——Stable Diffusion结构解析-以文本生成图像(文生图,txt2img)为例

    Diffusion扩散模型学习2--Stable Diffusion结构解析-以文本生成图像(文生图,txt2img)为例 学习前言 源码下载地址 网络构建 一.什么是Stable Diffusion ...

  9. transformer xl在文本生成上面的应用

    Transformer_xl相关介绍:https://zhuanlan.zhihu.com/p/84159401 从文本生成看Seq2Seq模型:https://zhuanlan.zhihu.com/ ...

  10. transformer xl 用于文本生成

    本文尝试用transformer xl做中文文本续写,基于论文为:<Transformer-XL: Attentive Language Models Beyond a Fixed-Length ...

最新文章

  1. JS 正则表达式 0.001 ~99.999
  2. 裸奔浏览器_【大数据早报】上网=“裸奔”?单凭浏览器历史记录就能锁定身份...
  3. [长流支流]的专栏--《金质打印通》、《WebMIS.NET快速开发平台》,MIS/ERP开发利器...
  4. 机器学习之支持向量机SVM之python实现ROC曲线绘制(二分类和多分类)
  5. stm32超声波测距代码_干货!特斯拉Autopilot核心传感器解读超声波雷达篇
  6. 二分法查找c语言程序_C语言的那些经典程序 第十四期
  7. java查询SQLServer遇到问题:对象名无效。
  8. 在Tomcat上部署WebService服务
  9. 51nod1464(trie + dfs)
  10. 查看Ubuntu内核和版本的两条命令以及LTS的含义
  11. 在Magento 2中自定义电子邮件模板
  12. 怎么实现ZBrush与数位板雕刻模型的结合运用
  13. word 2019 方框中打勾
  14. C#实现简单气泡屏保(二)
  15. 简单模仿赛尔号哈莫雷特对战谱尼最难打的第五条命
  16. aircrack-ng/airdrop-ng
  17. 曝NV或将推出新一代Titan显卡:48G显存 功率高达900W
  18. 陈潭:大数据战略实施的实践逻辑与行动框架
  19. requests发送get请求,参数含字典时请求有误
  20. python 头条号_python爬取今日头条收藏目录

热门文章

  1. [Python]集合的交集,并集,差集
  2. poj 3714 Raid
  3. android 异步加载图片缩略图
  4. java day06【类与对象、封装、构造方法】
  5. Docker 容器启动 查看容器状态 - 四
  6. 前端开发的工具,库和资源总结
  7. bzoj3620 似乎在梦中见过的样子
  8. mysql_fetch_row()获取显示数据
  9. YT工作日志-0911
  10. 几个C#关于Html解析的类