导读:
Transformer源自于AI自然语言处理任务;在计算机视觉领域,近年来Transformer逐渐替代CNN成为一个热门的研究方向。此外,Transformer在文本、语音、视频等多模态领域也在崭露头角。本文对Transformer从诞生到逐渐壮大为AI各领域主流模型的发展过程以及目前研究进展进行梳理,见证Transformer的过人之处。
一、Transformer的诞生
1、Transformers的前身:RNN Encoder-Decoder
早在2014年,seq2seq问题是通过两个循环神经网络组合成一个编码器-解码器模型来解决的。通过机器翻译任务中的一个简单示例来演示它的架构,以法语-英语句子对为例,输入是“je suis étudiant”,输出是“I am a student”。首先,“je”通常伴随着一个可以学习或固定的常量向量hE0,被送入RNN编码器。之后输出向量hE1(隐藏状态1),与输入序列中的第二个元素“suis”一起作为RNN编码器的下一个输入,此操作的输出hE2和“étudiant”再次输入编码器,为该训练样本生成最后一个编码隐藏状态hE3。hE3向量依赖于输入序列中的所有标记,因此它应该代表整个短语的含义。出于这个原因,它也被称为上下文向量。上下文向量是RNN解码器的第一个输入,它应该生成输出序列的第一个元素“I”(实际上,解码器的最后一层通常是softmax,但为了简单起见,只保留每个解码器步骤的结果)。此外,RNN解码器会产生隐藏状态hD1。将hD1和之前的输出“I”送回解码器,希望将“am”作为第二个输出。这个生成输出并将其反馈回解码器的过程一直持续到我们生成EOS(句子标记的结尾),表示我们的工作已经完成。

图1 RNN Encoder-Decoder示意图
这种RNN编码器-解码器的结构可能看起来很简单,但事实证明它对许多NLP任务非常有效。事实上,谷歌翻译自2016年以来一直在使用它。然而,RNN编码器-解码器模型确实存在很多缺点。
2、RNN存在的问题1:长序列的向量表示
如上所述的RNN方法对于较长的句子效果不是特别好。试想一下,整个输入序列的含义由一个固定维度的上下文向量来表示,这对于“Je suis étudiant”这种短句来说已经足够好了,但是如果输入是一些非常长的句子,包含几十个甚至几百个单词,那将其编码为上下文向量是很困难的。能有效的解决这个问题的方案就是Attention——注意力机制。

图2 传统RNN编码器-解码器(左)和带注意力的RNN编码器-解码器(右)示意图
Attention背后的基本思想很简单:我们不是只将最后一个隐藏状态(上下文向量)传递给解码器,而是将来自编码器的所有隐藏状态都传递给解码器。在之前示例中,Attention会将hE1、hE2和hE3都传给解码器。解码器将通过softmax层确定它们中的哪些被关注。除了添加这个额外的结构之外,基本的RNN编码器-解码器架构保持不变,但是当涉及到更长的输入序列时,加入Attention的模型表现得更好。
3、RNN存在的问题2:并行能力
困扰RNN的另一个问题与名称中的R有关。根据定义,循环神经网络中的计算是顺序的。模型必须等待上一步完成才能继续下一步,这意味着RNN只能顺序计算而无法并行化,所以模型训练时间和运行推理时间都显著增加。
用CNN来替代RNN用于文本处理是解决RNN无法并行化问题的一个不错的方案,主要优势在于减少文本时序的计算。然而CNN的每个卷积核只能看到其中一段文本的内容,对于长文本任务,需要堆叠很多层才能看到文本全局的内容,这样一来模型需要做得更大。
4、Transformers诞生:Attention is All You Need
Transformer最初出现在谷歌团队2017年的论文《Attention Is All You Need》中,从字面上理解Transformer采用了带有注意力的编码器-解码器模型。它的出现解决了RNN和CNN在处理序列时的各种问题。那么它是如何运作的?首先,输入序列wi经过预处理的元素都作为输入提供给编码器。与RNN不同的是,它是并行完成的。编码器有多个层(例如,在原始的Transformer论文中,它们的数量是六层)。之后使用hi来标记每个wi的最后一个编码器层的最终隐藏状态。解码器通常也包含多个层,层数与编码器的层数相同。所有隐藏状态hi将作为输入送到解码器的六层中的每一层,这就是Transformer的Encoder-Decoder Attention,它在本质上与我们上面讨论的Attention机制非常相似。(如图3,具有两层的编码器,并行处理三元素输入序列(w1、w2和w3)。每个输入元素的编码器还通过其自注意力子层接收有关其他元素的信息,从而捕获句子中单词之间的关系)
预处理层存在于编码器和解码器中,预处理分为两部分:首先,是熟悉的词嵌入,这是大多数NLP模型的主要内容。这些词嵌入可以在训练期间学习,或者可以使用现有的预训练模型嵌入。第二,在没有顺序RNN架构的情况下如何确定每个输入序列的位置?预处理层的第二个作用就是将位置信息编码到向量中,就像我们用词嵌入嵌入词标记的含义一样。生成的后处理向量携带有关单词的含义及其在句子中位置的信息,被传递到编码器和解码器层。

图3 具有两层编码器的Transformer-Encoder结构示意图
引入self-attention的目的是为了学习句子中不同词之间的关系,通俗讲,就是它允许序列中的每个元素相互交互,并找出他们应该更关注谁。Self-Attention层包括Encoder Self-Attention和Decoder Self-Attention。如何计算注意力呢?由线性代数相关的知识我们可以知道,对于相同维度的两个向量,可以通过点积的方法来获得其相关性。其中,用X标记注意力层输入的向量空间。有三个来自于编码器或解码器的向量QKV。Q是一个查询向量,即我们指定我们想要关注的信息类型;V是类似于向量X的线性组合(与X维度不一样);K索引由值Vⁿ捕获的信息类型。我们在训练期间想要学习的是三个嵌入矩阵,Wᴷ,WV和Wᴬ。
K=XWᴷ
V=XWⱽ
Q=XWᴬ
为了确定哪些值应该得到最多的关注,采用解码器的查询Q与编码器的所有键K的点积。结果的softmax会给出各个值V的权重(权重越大,attention越大)。这种机制称为点积注意力,由以下公式计算:

编码器自注意力的计算在每个编码器层内进行,较低编码器层的值V将最接近原始输入标记,而较深层的自注意力将涉及更多抽象结构。

图4 Transformer结构示意图
二、Transformer强在何处
1、在NLP领域
在上一节中,介绍了RNN在处理长文本序列中的两个问题:顺序结构导致无法捕捉长序列上下文信息、并行处理序列困难。Transformer的出现为RNN的Encoder-Decoder结构加入了注意力机制,抛弃RNN顺序结构,实现长序列的并行处理,完美的解决了这两个问题。在AI领域。我们都想要一个通用模型来准确、快速地解决不同的任务,而Transformer模型就是目前序列到序列任务的通用模型。
2、在CV领域
近几年,Transformer也替代CNN成为计算机视觉领域中一个热门的研究方向,那么来自NLP领域的Transformer是如何实现在视觉领域超越CNN结构呢?我们知道Transformer总是对序列进行操作,因此将图像拆分为很多个“小块”并将每个“小块”展平为向量就能得到图像的序列表示,那么用Transformer来处理图像也成为可能。

图5 示例图
CNN非常擅长特征提取,但是对于CNN,上面这两张图片几乎是一样的。CNN不会编码不同特征的相对位置。要想编码这些特征的组合就需要大型滤波器。例如:编码“眼睛高于鼻子和嘴巴”的信息就需要更大的滤波器。
为了捕捉图像中的远距离依赖,CNN需要大的感受野,也就需要更大的卷积核。增加卷积核的大小可以增加网络的表示能力,但这样做也会损失使用局部卷积结构获得的特征和统计效率。
Transformer相较于CNN最大的优势就是注意力机制,注意力机制在某些方面与CNN相似。注意力机制在每个位置都会进行一次计算,把这个位置的信息和其他位置的信息结合起来,同时还能忽略周围大多数不相关的信息。但与CNN不同的是,“其他信息”不需要在附近。(注意力机制不是“局部的”。)而且注意力机制的当前位置不是预定义的,也不是固定的(不像CNN具有固定的“windows”,尺寸规定为3x3或其他)。它们是基于所有输入进行动态计算。以为图片添加标题为例,只有专注于图像的相关部分才能生成有意义的标题,这就是注意力机制所做的事情。它允许捕获序列元素之间的“长期”信息和依赖关系,有助于对跨图像区域的长距离、多级依赖性进行建模。在图6中可以看到一个自注意力模块取代了卷积层,模型能够与远离其位置的像素进行交互。因此Transformer的自注意力机制有效解决CNN卷积结构的一些局限性。

3019




被折叠的 条评论
为什么被折叠?



