Transformer:Attention的伪装,深入简出的解析Transformer

2019-10-11   AI公园
作者:Mihail Eric
编译:ronghuaiyang

导读

前面分享了不少关于Attention相关的内容,今天给大家介绍自注意力的一个具体的应用,Google的Transformer,看看这么牛逼的东西到底长个什么样子。

在这篇文章中,我们将描述一类序列处理模型,称为Transformers (……不是变形金刚哦)。撇开笑话不谈,Transformers其实出来没多长时间,但是它对自然语言处理界的震动是非常大的,它的卖点是:最先进、高效的序列处理,无需递归单元或卷积

“没有递归单元或卷积?!这个模型是什么做的?“,感觉要颠覆我的三观了!

结果是,除了一些注意力和前馈操作之外,没有什么特别的东西。

虽然组成Transformer模型的各个组件并不特别新颖,但是这仍然是一个包含许多活动部件的非常密集的模型。因此,我们在这篇文章的目标将是提炼出模型的关键贡献,而不是过于拘泥于细节。

首先,论文的TLDR:

  1. Transformers证明了递归和卷积对于构建高性能的自然语言模型并不是必不可少的
  2. 他们使用自注意力机制实现了最先进的机器翻译结果
  3. 注意力机制是一种高效的操作,因为它具有并行性和运行时特性

听起来是不是很兴奋,请继续看吧!

Transformer是怎么工作的?

虽然Transformer不使用传统的递归单元或卷积,但它仍然从序列到序列的体系结构中获得灵感,在这种体系结构中,我们对一些输入进行编码,并迭代地解码所需的输出。

这在实践中是如何实现的?让我们首先看看编码器。这个过程有相当多的小细节,所以不要在细节中迷失太多。我们正在做的是对一些输入进行编码。

假设我们想要从西班牙语翻译成英语。Transformer首先将西班牙语短语的token嵌入到一个传统的嵌入矩阵中:

由于模型不使用递归单元,我们需要一些方法来表示模型中基于位置的信息。因此,我们在这个嵌入矩阵中添加了一个位置编码,我们将在下一节中描述它的确切形式:

们修改后的输入被输入到Transformer编码器的第一层。在每个编码器层中,我们对输入执行一系列操作。

首先,我们把输入进行多头注意力操作:

对于这个注意力的输出,我们还添加了一个残差连接,并执行层归一化操作:

现在,我们使用残差连接和层归一化将这个结果反馈给一个前馈层:

这是我们第一层编码器操作的结果!这将作为输入输入到另一个相同的层。Transformer编码器共使用六层叠加:

在我们来看看Transformer解码器。在实践中,解码器也使用六个堆叠层来执行一组操作。这些操作基本上与编码器层相同,只是有一些小的区别:

  • 第一个多头注意力是一个带掩码的注意力操作,被掩码的位置不包括在注意力计算中
  • 多了另一个多头注意力操作,该操作使解码器的输入参与到编码器的输出中。这个操作的灵感来自传统的循环序列到序列模型。

在实践中,这个模型的外观如下:

执行这些操作后,我们可以预测我们翻译的短语的下一个token:

Transformers是怎么构建的?

虽然Transformer体系结构在概念上看起来很简单,但问题当然在于细节。为此,有相当多的方面值得作进一步的说明。

位置编码

添加到编码器和解码器输入中的位置编码是模型中的第一个问号。这是怎么回事?

回想一下,位置编码的目的是帮助模型学习序列的一些概念和token的相对位置。这对基于语言的任务非常重要,尤其是在这里,因为我们没有使用任何传统的递归单元。

在Transformer结构中,位置编码是一个向量,其表达式如下:

这里,i表示我们正在查看的向量索引,pos表示令牌,dmodel表示输入嵌入维度的固定常数。好的,让我们进一步分析。

这个向量的基本意思是,对于给定的固定向量下标,当我们改变pos(对应于不同位置的token)时,我们形成一个正弦:

之所以选择这种特定的位置编码形式,是因为在给定位置PEpos+k的编码值可以表示为在较早位置PEpos的值的线性函数。这是从三角恒等式推导出来的,等价于说给定的token可以学习处理序列中较早的token。这是Transformer的基本属性。

多头注意力

多头注意操作是该模型的主要贡献之一。让我们来看看它是如何工作的。

在高层次上,注意力操作旨在帮助自然语言体系结构中的某个token聚焦于模型的另一部分(通常是另一些token集合)的某些方面。请记住,注意力操作可以用于其他问题领域,如计算机视觉,这里我们关注的是自然语言。

更正式地说,注意力接受一个query,计算一组keys的一些权重,并使用这些权重形成一组values的加权组合。用数学术语来说,Transformer的注意力机制可以描述为:

其中Q、K、V分别是查询矩阵、键矩阵和值矩阵,dk是固定的缩放常数。

在编码器自注意力的情况下,键、值和查询都是相同的值,即来自前一层编码的输出。

在掩码解码器的自注意力的情况下,也是一样的,只是应用了掩码,使解码的位置只能注意到先前的位置。

在编码器-解码器注意力的情况下,键和值是编码器层堆栈的输出,查询是前一解码器层的输出。

多头注意力操作的基本含义是,我们不只使用一次注意力操作,而是多次注意操作(Transformer模型为8次)。数学上,这看起来像:

其中,W**被适当大小的权重矩阵所填充。多头注意力的优点是操作容易并行,从而减少了运行时间。

实验

尽管绕过了传统的递归体系结构,但Transformer还是令人惊讶的,因为它仍然能够胜过它的递归对手。在英语到德语和英语到法语的WMT翻译任务中,Transformer获得了最先进的BLEU评分(EN-FR为41.8,EN-DE为28.4)。

不仅如此,由于它的高度并行性,Transformer能够以显著减少的FLOPs(浮点操作)数量来完成这一任务。所以Transformer不仅更好,而且更快!

分析

在Transformer体系结构中,这种自注意力的概念非常重要。为什么自注意力用来作为一个模型的支柱?

自注意力的一大优势是它的计算效率。自注意力与其他传统网络操作的复杂性比较说明了这一点:

上面,层复杂度表示每层的计算量。在这种情况下,只要序列长度n小于输入嵌入维d,那么自注意力机制就比递归更有效,通常都是这样的。

与需要线性时间计算的递归相比,自注意力机制还通过一个固定的计算时间来连接所有位置。

最后的一点想法

Transformer在自然语言深度学习场景中是一个真正的叛逆者,因为它避开了传统的网络结构,同时仍然优于现有的系统。它挑战了关于自然语言模型中重复的必要性。自发布以来,Transformer已经被扩展并在新的体系结构中使用,最近的一次是BERT。

英文原文:https://www.mihaileric.com/posts/transformers-attention-in-disguise/

请长按或扫描二维码关注本公众号