Attention Mechanism[Transformer、Transformer-XL、XLNet]

Content

Attention Mechanism—>聚焦关键点

1 History

  1. 2014 Neural machine translation by jointly learning to align and translate: 首次提出Attention Model(AM)
  2. 2014 Google Mind. Recurrent Models of Visual Attention. CV
  3. 2015 Neural Machine Translation by Jointly Learning to Align and Translate. NLP [Seq2Seq(RNN)+Attention]
  4. 2017 Attention is All You Need. NMT(Neural machine translation)[Transformer+self-attention]
  5. 2018 Character-Level Language Modeling with Deeper Self-Attention [Transformer+fixed context]
  6. 2019.1 Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context [Transformer+recurrent+relative position encoding]
  7. 2019.6 XLNet: Generalized Autoregressive Pretraining for Language Understanding
  8. 2020 Deep Transformer Models for Time Series Forecasting: The Influenza Prevalence Case
  9. 2018 GAT:Graph Attention Network

2 Introduction

计算XX的相关程度,用query, key, value来描述self-attention

通过输入信息input得到三个相关矩阵query, key, value来进行注意力系数的提取,进行内部相关度的计算


早期的序列模型往往采用的encoder-decoder结构,并且encoderdecoder基本上基于RNN,一般的RNN包括两个输入和两个输出,示意图如下所示(补充RNN的简图)。encoder将输入序列 { x 1 , x 2 , . . . , x T } \{x_1,x_2,...,x_T\} {x1​,x2​,...,xT​}编码成固定长度的向量 { h 1 , h 2 , . . . , h T } \{h_1,h_2,...,h_T\} {h1​,h2​,...,hT​}(输入数据的向量表示/隐藏状态,一般用 h T h_T hT​表示上下文向量);decoder将隐藏状态 h T h_T hT​作为输入,生成输出序列 { y 1 , y 2 , . . . , y T ′ } \{y_1,y_2,...,y_{T'}\} {y1​,y2​,...,yT′​}。

一般处理的过程是:将输入序列 X X X按照顺序逐个输入RNN,并依次得到encoder的隐藏状态 H H H,计算完成之后,用最后一个 h T h_T hT​作为decoder的输入,得到decoder的隐藏状态 S S S,从而得到第一个输出 y 1 y_1 y1​,然后用上一个隐藏状态和上一个输出值作为下一次的输入,依次执行下去,直到遇到EOF

一般的局限在于:固定的隐藏序列长度,可能会损失输入序列的信息;RNN训练的顺序性,距离较远的元素之间关系会随着距离变弱。

Attention Mechanism是将encoder和decoder的隐藏状态hs两两之间计算了一个注意力权重,往往用于得到一个上下文向量c, c j = ∑ i = 1 T α i j h i c_j=\sum_{i=1}^T \alpha_{ij}h_i cj​=∑i=1T​αij​hi​表示用注意力权重来凸显隐藏向量的相关性,如下图所示(补充英文博客的乘积变浅的图)。

Attention Mechanism[Transformer、Transformer-XL、XLNet]

  • S S S:query state
  • h h h:candidate state
  • C C C:context vector:在decoder中,能够获取所有的输入序列的信息,并且能关注最相关的序列位置。

3 structure

4 application situation

5 results

背景、框架、效果

6 Ref

  1. 川陀学者,Attention机制详解(一)——Seq2Seq中的Attention
  2. Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)
  3. a survey note1|note2
  4. 浅谈attention机制
  5. Transformer和XL理解
  6. Harvard NLP:The Annotated Transformer(代码实现)
  7. Attention Transformer
  8. 自然语言处理中的自注意力机制
  9. Transformer, Transformer-XL, XLNet: 追溯XLNet的前世今生

attention mechanism适用于多种任务的处理,结合多种神经网络,可提高网络的可解释性。注意力机制可以用人类生物系统来解释,人们的视觉系统会天然的关注重要的东西,忽略其余不相关的因素,同样,在语言、文字等感官方面类似。一张图片、一句话、一篇文章往往只和某几个重要的点有很强的相关性,因此,AM的作用就是让模型动态的关注输入数据中某个重要部分,使得任务处理更加有效。

神经网络注意力建模的快速发展主要有三个原因。首先,这些模型是目前最先进的,用于多种任务,如机器翻译、问题回答、情绪分析、词性标注、群体解析和对话系统。其次,除了提高主要任务的性能之外,它们还提供了其他一些优势。它们被广泛地用于提高神经网络的可解释性,否则被认为是黑盒模型。这是一个显著的好处,主要是因为人们对影响人类生活的应用程序中的机器学习模型的公平性、可问责性和透明度越来越感兴趣。第三,它们有助于克服递归神经网络(RNNs)的一些挑战,比如随着输入长度的增加而导致的性能下降,以及由于输入的顺序处理而导致的计算效率低下。因此,在本工作中,我们旨在提供一个简要的,但全面的调查注意建模。

Attention is all you need — Transformer

1 摘要

针对序列传播问题,主流方法是基于复杂的RNN或者包含encoder-decoder框架的CNN。而最好的模型是通过attention连接的encoder-decoder框架,本文提出了Transformer模型,仅仅用Attention机制处理输入输出间的依赖关系,不使用RNN,CNN

主流的RNN网络主要是LSTMGRU,在NLP和机器翻译MT任务中有很好的效果,同时,越来越多的成果采用RNN编码解码器架构来共同处理序列建模问题。RNN类模型通常沿着序列输入输出的字符位置进行factor computation,生成隐藏状态作为下一个时刻的输入,这种固有的顺序特性妨碍了训练示例中的并行化,而在较长的序列长度下,并行化就变得至关重要,因为内存约束限制了示例之间的批处理。factorization tricksconditional computation在计算效率上有了提升。然而,顺序约束的基本限制还在。(时间序列的顺序特性)

注意力机制已经成为各种任务中引人注目的序列建模转换(transduction)模型的一个组成部分,允许建模依赖关系而不考虑它们在输入或输出序列中顺序对齐。然而,少数情况下,这样的注意机制是与RNN一起使用的。

2 模型框架:

Attention Mechanism[Transformer、Transformer-XL、XLNet]

Attention Mechanism[Transformer、Transformer-XL、XLNet]

Character-Level Language Modeling with Deeper Self-Attention

1 模型解释

首先,了解一下什么是字符级语言建模?该任务的目的是什么?语言模型是为了预测即将到来的字符。LSTM只能记忆最近的50个token,因此长序列问题仍然是个大问题。

因为transformer可以处理长序列问题以及不需要序列顺序的优点,本文只采用了其decoder部分,即包含一个带maskself-attention和一个全连接前馈网络层,本文的模型用了64层,每一层包含前述的两个部分。在此基础上增加了auxiliary losses,可以增加网络训练的深度。主要体现在三个方面,序列中间位置即将出现的字符、从中间隐藏表示中预测即将出现的字符、预测未来多个时间步目标位置上即将出现的字符。

RNN的顺序特性是解决序列问题的天然优点,缺点是必须按顺序逐步训练,无法并行,无法发挥GPU的作用。attention的特点是可以并行处理,缺点是不能表达顺序性,因此引入位置编码。在原transformer中,在做词嵌入的时候,将词嵌入加上位置编码组成输入向量来训练,此后无需加入位置编码。本文模型由于处理的层数较多,如果只在第一层加入位置编码,那么经过多层传递,这个信息很容易丢失,所以它是每层都会将上一层的输出与位置编码加在一起作为下一层的输入,而且,Positional Embeddings是需要学习的。所以,光Positional Embeddings部分模型就要学习N*L*dim 个参数,其中N是网络的层数(本文64层),L是上下文的长度(本文512),dim是位置嵌入的维度(本文=512)。

为字符序列定义一个条件概率分布函数: P r ( t 0 : L ) = P ( t 0 ) ∏ i = 1 L P r ( t i ∣ t 0 : i − 1 ) Pr(t_{0:L})=P(t_0)\displaystyle\prod^L_{i=1}Pr(t_i|t_{0:i-1}) Pr(t0:L​)=P(t0​)i=1∏L​Pr(ti​∣t0:i−1​),其中 t 0 : L t_{0:L} t0:L​表示token sequencesL为序列长度。

2 训练小trick

利用transformer框架,casual mask attention只考虑历史内容。

这个辅助的loss分为3类:Multiple Positions; Intermediate Layer Losses; Multiple Targets

原本只预测最后一层最后一个结果,现在增加最后一层所有预测,在每个中间层也进行了下一个词的预测,这样中间层的每个位置都会有对应的损失函数,为辅助损失。

原因:在刚开始进行训练时,当transformer的层数超过10层后,模型收敛速度变慢性能变差,为了解决这个问题加入了auxiliary losses

为了方便,我们只以2层来展示,且每一个segment的length=4,原本我们是根据t0~t3的输入,在H节点这个位置预测t4的结果,loss就是H节点的输入计算一个交叉熵。现在辅助loss的第一类loss就是:对于最后一层所有的节点都计算下一步应该预测的字符,即在节点E处根据输入t0,预测输出为t1,在节点F处根据输入为t0和t1,输出是t2,以此类推。然后将每一个Positions处的loss加起来。第一类loss贯穿整个train的全部阶段,不发生衰减。

Attention Mechanism[Transformer、Transformer-XL、XLNet]

中间层的loss并不贯穿整个train始终,而是随着训练进行,逐渐衰减,衰减的方式是,一共有n层网络,当训练进行到 (k/(2*n))时停止计算第k层loss。也就是说当训练进行到一半的时候,所有的 中间层 都不再贡献loss。

当然最后所有的损失函数都是要加入到总损失函数中去的,再用总损失函数进行梯度下降算法进行学习。我们这里使用的是加权求和,即每个辅助损失函数以一定的权重加入到总损失函数总去。对于中间层的辅助损失函数的权重我们有两个要:

  • 层越低,权重越小。
  • 假设我们一共有n层,训练完成l/2n后,要求第l层的辅助损失权重为0

在序列中的每个位置,模型对下一个字符进行两次(或更多次)预测。对每次预测我们使用不同的分类器,这样我们对transformer的每一层的每个位置都会产出两个或多个损失函数,选择一共作为主要损失,其他的都称为字符辅助损失。每个位置的多个损失需要合并成当前位置的总损失,我们将每个辅助损失乘0.5加上主损失得到当前位置的总损失。

Attention Mechanism[Transformer、Transformer-XL、XLNet]

在标准的transformposition embeding用的是正弦曲线产生的时间信息,并且这个位置嵌入是在输入transformer最下层之前加入到词嵌入中去的。由于我们的模型深度比较深,这种时间信号可能在沿着transformer向上传递的时候发生丢失。为了解决这个问题,我们在每一层添加一个维度512Positional Embeddings矩阵,这些矩阵都是可学习的。这样第i − 1层的输出加上第i − 1层的Positional Embeddings后再输入到第i层中去。

  • 未登录词:没有被收录在分词词表中但必须切分出来的词,包括各类专有名词(人名、地名、企业名等)、缩略词、派生词、数字类复合词、新增词汇等等。通俗而言,就是系统词库中不存在的词组,比如新兴词汇、新出现的网络热词等。在自然语言处理过程中,分词是很重要也比较困难的一部分。
  • 语言模型:为单词序列分配概率的模型就叫做语言模型。即对于单词序列 { w 1 , w 2 , . . . , w n } \{w_1,w_2,...,w_n\} {w1​,w2​,...,wn​},计算 P { w 1 , w 2 , . . . , w n } P\{w_1,w_2,...,w_n\} P{w1​,w2​,...,wn​} 的模型。通俗来说,对于任意的词序列,它能够计算出这个序列是一句话的概率,或者能预测单词序列的下一个词是什么。

参考:pingpingsunny: Vanilla Transformer,缺点:计算量大,每预测一个字符就要重新算一遍?无记忆性吗?

Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context

Transformer具有学习长程依赖关系的潜力,但是受到语言建模中上下文长度固定的限制。为此,本文提出一种新的神经网络架构Transformer-XL,该网络结构能够在不破坏时间一致性的情况下,学习到超越固定长度的依赖性。该网络结构由片段级的循环机制(segment-level recurrence)和全新的位置编码策略(positional encoding scheme)组成。其优点是不仅可以捕获更长的依赖关系,还可以解决上下文碎片化(context fragmentation)的问题。

本文是基于上一篇文章的改进,上文是基于固定的序列长度,每一个batch之间没有信息交流,因此无法捕捉超过固定长度的序列特征,造成上下文碎片化。本文在原模型的基础上,增加了循环机制,即增加了记忆,在batch之间建立循环连接。采用相对位置编码,处理更长的序列。

0 摘要

Transformer具有学习长程依赖关系的潜力,但是受到语言建模中上下文长度固定的限制。为此,本文提出一种新的神经网络架构Transformer-XL,该网络结构能够在不破坏时间一致性的情况下,学习到超越固定长度的依赖性。该网络结构由片段级的循环机制(segment-level recurrence)和全新的位置编码策略(positional encoding scheme)组成。其优点是不仅可以捕获更长的依赖关系,还可以解决上下文碎片化(context fragmentation)的问题。从实验结果上来看,Transformer-XL 学习到的依赖性比 RNN 学习到的长 80%,比标准 Transformer 学到的长 450%,无论在长序列还是短序列中都得到了更好的结果,而且在评估时比标准 Transformer 快 1800+ 倍。值得一提的是,Transformer-XL还刷新了 bpc 和perplexity(困惑度)的当前最佳结果:在 enwiki8 上 bpc 从 1.06 提升至 0.99,在 text8 上从 1.13 提升至 1.08;在 WikiText-103 上困惑度从 20.5 提升到 18.3,在 One Billion Word 上从 23.7 提升到 21.8,在宾州树库(不经过微调的情况下)上从 55.3 提升到 54.5。本文模型的代码、预训练模型以及超参数在 TensorFlow 和 PyTorch 中都可以使用。

1 介绍

语言建模需要对长期依赖性进行建模,它成功应用了无监督的预训练方法 (Peters et al., 2018; Devlin et al., 2018)。但要让神经网络对序列数据的长期依赖性建模一直都是一项挑战。RNN网络,特别是LSTM是一个标准的方案,它可以在多个benchmarks上获得健壮的结果(strong results)。尽管其使用广泛,但是RNNs由于梯度消失和梯度爆炸问题的存在,难以优化。纵使引入一些门限和梯度裁剪技术,仍然不足以完全解决该问题。此前的工作已经表明LSTM平均可以捕获200个word的上下文信息,这也指出了进一步改进的空间。

另一方面,通过attention机制直接连接长程word pairs可以缓解优化问题,同时习得长程依赖(即原始的Transformer工作)。近来Al-Rfou 等人(2018)设计了一组辅助损失来训练深度 Transformer 网络进行字符级(character-level)语言建模,其结果远超LSTM。虽然已经取得成功,但是 Al-Rfou 等人(2018)的语言模型是在长度固定的几百个字符片段上独立训练的,没有任何跨片段的信息流(即多个segments,每个segment的长度固定,由数百个characters组成。但是segments之间没有信息交流)。由于上下文的长度是固定的,因此模型无法捕获任何超过预定义上下文长度的长程依赖。此外,长度固定的segments都是在不考虑句子或其它语义边界的情况下,通过选择连续的符号块来创建的。因此,模型缺乏必要的上下文信息来很好地预测前几个符号,这就导致模型的优化效率和性能低下。我们将这个问题称为上下文碎片化(context fragmentation)。

为了解决上文提到的上下文固定长度的限制,本文提出了一种叫做Transformer-XL(超长)的新架构。我们将循环(recurrence)概念引入了深度自注意力网络。我们不再从头计算每个新segment的隐藏状态,而是复用从之前segments中获得的隐藏状态。被复用的隐藏状态视为当前segment的memory,而当前的segment为segments之间建立了循环连接(recurrent connection)。因此,超长依赖性建模成为了可能,因为信息可以通过循环连接来传播。同时,从之前的segment传递信息也可以解决上下文碎片化的问题。更重要的是,本文展示了使用相对位置而不是用绝对位置进行编码的必要性,这样做可以在不造成时间混乱(temporal confusion)的情况下,实现状态的复用。因此,作为额外的技术贡献,文本引入了简单但有效的相对位置编码公式,它可以泛化至比在训练过程中观察到的长度更长的注意力长度

从单词级(word-level)到字符级(character level)的五个语言建模数据集上,Transformer-XL都获得了很好的结果。Transformer-XL在仅基于100M tokens训练的基础上也可以生成相对连贯的长文本文章(参见附录E)。

本文的主要贡献包括:(1)在纯粹的自注意力模型中引入了recurrence的概念,即循环连接。(2)推导了一种新的位置编码方案。这两种技术构成了一组完整的解决方案,因为其中任何一种单独都不能解决上下文长度固定的问题。Transformer-XL是首个从实质上不管是character-level还是word-level都比RNN更优秀的自注意力模型。

2 相关工作

近年来语言建模领域的进展大概有以下几个方向:

  • (1)发明新的架构,以更好地对上下文进行编码
  • (2)改善正则化方法和优化算法
  • (3)加速Softmax的计算
  • (4)丰富输出分布的种类

针对语言建模过程中如何捕获长程关系,其中的一个方案是将更为宽广的上下文表征直接输入到网络结构中,作为一个额外的输入。现有的工作还包括手动定义上下文表征和依赖于从数据中学到的文档级主题。
更广泛地说,在一般序列建模中,如何捕获长程依赖关系一直是一个长期的研究问题。从这个角度来看,随着LSTM在这一方面的推广,学者们的研究重点主要集中在消除梯度消,包括如何获得更好的初始化,额外的loss信息,增强结构的记忆能力及其演变出其他RNNs的变种结构以简化优化。与先哲们不同的是,本文的工作是基于Transformer,并通过实验表明将语言建模作为现实世界的任务,能够从学习长程依赖关系中获益。

3 模型

3.1 vanilla model

vanilla model在训练阶段,不论是前向传播还是反向传播,不同segments之间信息是没有交流的。
这种采用固定上下文的方案存在2个主要局限性:

  • 长程关系依赖的最大长度是以segment长度为上限,而segment的长度只有几百个characters。尽管自注意力机制相比于RNNs受梯度消失的影响较少,但是vanilla model不能够完全利用这个优化上的优势。
  • 尽管可以在句子或者其他语义分界上使用padding,但是在实践过程中,为了提高效率,简单地将长文本分割成固定长度的segments已经成为标准做法。然而,简单地将序列分成固定长度的segments将导致上下文碎片问题。
  • 在评估阶段,vanilla model在每个Step都消费与训练期间相同长度的一个segment,但是在最后一个位置只是进行一次预测。然后,在下一个Step中,这个segment只向右移动一个位置,就形成一个新的segment。这个新的segment必须从头开始处理,如上图Figure 1b所示。该方式能够确保每个预测都使用了训练中暴露的尽可能长的文本,还可以缓解训练中遇到的文本碎片问题。但是这种评估方式的计算代价很高。实验结果表明,本文提出的方法能够大大提高计算速度。

Attention Mechanism[Transformer、Transformer-XL、XLNet]

3.2 segment-level recurrent with state reuse

为了解决使用固定长度上下文的局限性,本文提出在 Transformer 架构中引入了循环机制(recurrence mechanism)。在训练过程中,前一个segment计算的隐藏状态序列是固定的,并被缓存起来,并在模型处理后面的新segment时作为扩展上下文重复使用,如图 2a 所示。

Attention Mechanism[Transformer、Transformer-XL、XLNet]

虽然梯度仍然保留在一个segment中,但是这个额外的输入允许网络利用历史上的信息,从而能够对长程依赖关系建模并避免上下文碎片化。

Attention Mechanism[Transformer、Transformer-XL、XLNet]

公式SG名称为 stop gradient 的缩写,判断是否切断梯度更新

3.3 相对位置编码

Attention Mechanism[Transformer、Transformer-XL、XLNet]Attention Mechanism[Transformer、Transformer-XL、XLNet]

其中记忆矩阵$m_\tau{n-1}=h_{\tau-1}{n-1} $是隐藏状态的另一种书写方式。

vanilla和XLNet的evaluate对比:

Attention Mechanism[Transformer、Transformer-XL、XLNet]

Attention Mechanism[Transformer、Transformer-XL、XLNet]

2019 XLNet: Generalized Autoregressive Pretraining for Language Understanding

XLNet 和 BERT 紧密相关,如果说 BERT 的出现代表基于 Transformer 的自注意力派系彻底战胜基于 RNN 的自回归系,那么 XLNet 则是出自自注意力派系门下,融合两家武学之长的集大成者。

BERT

Attention Mechanism[Transformer、Transformer-XL、XLNet]

BERT 由双层双向 Transformer 构建而成,训练分为两个步骤:预训练 (pre-training) 和 微调 (find-tuning)。预训练是为了在输入的词向量中融入上下文特征,微调则是为了使 BERT 能适应不同的下游任务,包括分类、问答、序列标注等,两者是独立进行的。由此可知,BERT 是一个普适性非常强的模型。

预训练时,BERT 采用的策略与标准 Transformer 不同的地方在于,后者是基于预测 next token,只在输入句子的结尾进行预测;而前者预测的是句子本身,只是输入时 15% 的 token 被随机遮盖 (mask) 掉了,这便是 BERT 独特的 Mask 机制,也是众多 data corruption 方式中的一种。而 BERT 在标准 Transformer 的位置编码基础上,还添加了一项 segment 编码:Attention Mechanism[Transformer、Transformer-XL、XLNet]

2020 深度transformer用于时间序列预测

理论分析(优缺点,如何对不同的问题建模,求什么之间的相关性),框架,应用,实现,交通预测的应用

上一篇:【Java技术探索】「ConcurrentHashMap」深入浅出的源码分析(JDK1.7版本)


下一篇:Kylin多维分析引擎(五):Kylin集成Spark、Flink与增量构建