在NLP领域中,语言建模由于能够应用于各种NLP任务(如机器翻译和主题分类)而成为一种重要的NLP技术,目前,语言建模有两种主要的体系结构:递归神经网络(RNNs)和Transformer。前者逐个处理输入标记(单词或字符)来学习它们之间的关系;后者则接收一段标记,并使用注意机制立即学习它们之间的依赖关系。RNN可以捕捉单词之间的依赖关系。但因为梯度消失和爆炸的问题,RNN变得非常难以训练,LSTM单元和梯度裁剪方法的提出也不足以解决此类问题。同时RNN网络的计算速度往往很慢,其学习长期依赖的能力也较为有限(论文中提到,LSTM语言模型平均只能建模200个上下文词语)。2017年6月,Google Brain在论文《Attention Is All You Need》中提出的Transformer架构,完全摒弃了RNN的循环机制,采用一种self-attention的方式进行全局处理。
我在
NLP预训练(三)-Transformer 中详细的介绍了Transformer,
https://arxiv.org/abs/1706.03762.pdf
tensorflow版本:https://github.com/tensorflow/tensor2tensor
pytorch版本:http://nlp.seas.harvard.edu/2018/04/03/attention.html
Transformer接收一整段序列,并使用三个可训练的权重矩阵—Query、Key和Value来一次性学习输入序列中各个部分之间的依赖关系。Transformer网络由多个层组成,每个层都由多头注意力机制和前馈网络构成。由于在全局进行注意力机制的计算,忽略了序列中最重要的位置信息。Transformer为输入添加了位置编码(Positional Encoding),使用正弦函数完成,为每个部分的位置生成位置向量,不需要学习,用于帮助网络学习其位置信息。其示意如下图所示:
Transformer结构的特点:
1、全部用self-attention的自注意力机制。
2、在self-attention的基础上改进了Multi-Attention和Mask Multi-Attention两种多头注意力机制。
3、网络由多个层组成,每个层都由多头注意力机制和前馈网络构成。
4、由于在全局进行注意力机制的计算,忽略了序列中最重要的位置信息,添加了位置编码(Position Encoding),使用正弦函数完成,为每个部分的位置生成位置向量。
2、Vanilla Transformer
Vanilla Transformer是Transformer和Transformer-XL中间过度的一个算法,所以在介绍Transformer-XL之前我们先来了解下Vanilla Transformer。
Vanilla Transformer的原理图:
Vanilla Transformer论文中使用64层模型,并仅限于处理 512个字符这种相对较短的输入,因此它将输入分成段,并分别从每个段中进行学习,如下图所示。在测试阶段如需处理较长的输入,该模型会在每一步中将输入向右移动一个字符,以此实现对单个字符的预测。
Vanilla Transformer的三个缺点:
- 上下文长度受限 :字符之间的最大依赖距离受输入长度的限制,模型看不到出现在几个句子之前的单词。
- 上下文碎片 :对于长度超过512个字符的文本,都是从头开始单独训练的。段与段之间没有上下文依赖性,会让训练效率低下,也会影响模型的性能。
- 推理速度慢 :在测试阶段,每次预测下一个单词,都需要重新构建一遍上下文,并从头开始计算,这样的计算速度非常慢。
Transformer-XL架构在vanilla Transformer的基础上引入了两点创新:
- 循环机制(Recurrence Mechanism)
- 相对位置编码(Relative Positional Encoding)。
以克服Vanilla Transformer的缺点。与Vanilla Transformer相比,Transformer-XL的另一个优势是它可以被用于单词级和字符级的语言建模。
3.1、 循环机制(Recurrence Mechanism)
Transformer-XL仍然是使用分段的方式进行建模,但其与Vanilla Transformer的本质不同是在于引入了段与段之间的循环机制,使得当前段在建模的时候能够利用之前段的信息来实现长期依赖性。如下图所示:
在训练阶段,处理后面的段时,每个隐藏层都会接收两个输入:
- 该段的前面节点的输出,与Vanilla Transformer相同(上图的灰色线)。
- 前面段的节点的输出(上图的绿色线),可以使模型创建长期依赖关系。这部分输出市通过cache的机制传导过来,所以不会参与梯度的计算。原则上只要GPU内存允许,该方法可以利用前面更多段的信息。
在预测阶段:
如果预测𝑥11我们只要拿之前预测好的[𝑥1,𝑥2...𝑥10]的结果拿过来,直接测。同理在预测𝑥12的时候,直接在[𝑥1,𝑥2...𝑥10,𝑥11]的基础上计算,不用像Vanilla Transformer一样每次预测一个字就要重新计算前面固定个数的词。
3.2、 相对位置编码
在Transformer中,一个重要的地方在于其考虑了序列的位置信息。在分段的情况下,如果仅仅对于每个段仍直接使用Transformer中的位置编码,即每个不同段在同一个位置上的表示使用相同的位置编码,就会出现问题。比如,第i2段和第i1段的第一个位置将具有相同的位置编码,但它们对于第𝑖i段的建模重要性显然并不相同(例如第i2段中的第一个位置重要性可能要低一些)。因此,需要对这种位置进行区分。
可以将Transformer-XL中的attention的计算分为如下四个部分:
- 基于内容的“寻址”,即没有添加原始位置编码的原始分数。
- 基于内容的位置偏置,即相对于当前内容的位置偏差。
- 全局的内容偏置,用于衡量key的重要性。
- 全局的位置偏置,根据query和key之间的距离调整重要性
4.1、 优点
- 在几种不同的数据集(大/小,字符级别/单词级别等)均实现了最先进的语言建模结果。
- 结合了深度学习的两个重要概念—循环机制和注意力机制,允许模型学习长期依赖性,且可能可以扩展到需要该能力的其他深度学习领域,例如音频分析(如每秒16k样本的语音数据)等。
- 在inference阶段非常快,比之前最先进的利用Transformer模型进行语言建模的方法快300~1800倍。
4.2、 不足
- 尚未在具体的NLP任务如情感分析、QA等上应用。
没有给出与其他的基于Transformer的模型,如BERT等,对比有何优势。 - 训练模型需要用到大量的TPU资源。
参考文章为:
https://www.lyrn.ai/2019/01/16/transformer-xl-sota-language-model/
https://www.cnblogs.com/huangyc/p/11445150.html
https://blog.csdn.net/magical\_bubble/article/details/89060213