Transformer 模型架构详解

2017 年 Google 在论文《Attention Is All You Need》中提出 Transformer 模型架构,该架构是基于 Encoder-Decoder (编码器-解码器)的架构。作为当下最先进的深度学习架构之一,Transformer 被广泛应用于自然语言处理领域,它不仅替代了以前流行的循环神经网络(RNN)和长短期记忆网络(LSTM),而且后来的 BERT、GPT-3 等网络架构也是基于 Transformer 架构演化而来。
RNN 和 LSTM 已经在时序任务方面有了广泛的的应用,例如像文本预测、机器翻译、文章生成等等,但是这些应用都面临着如何记录长期依赖的问题,而使用 Transformer 架构就能解决这类问题。

自注意力(Self-Attention)

Transformer 架构的核心主要是基于自注意力机制(Self-Attention),在详解 Transformer 架构之前,我们有必要理解一下自注意力这个概念,我们以《BERT 基础教程:Transformer 大模型实战》这本书的讲解来概述,这本书中的讲解非常浅显易懂。
给定一个英文句子:

A dog ate the food because it was hungry.

句子中的代词 it 可能代表句子里的名词 food 或者 dog,虽然我们人类非常容易理解,但是计算机不可能像我们那样去理解,它也没法像我们一样去理解。计算机是通过自注意力机制来处理代词 it 具体指代的内容是什么(food 或 dog)。
模型的计算逻辑大概是这样的:首先依次计算出句子中每个单词的特征值,在计算每个词的特征值时,需要遍历整个句子,确定当前词与整个句子中其他词的关系,如下图所示(来自《BERT 基础教程:Transformer 大模型实战》一书):

Word-Self-Attention

通过上图,我们就可以看出,it 与 dog 的相关性更高一些,通过比较粗重的线条来表示。那么,怎么能够确定 dog 和 it 之前的相关性更高呢?
我们需要通过自注意力机制的计算来得到,实际上,每个词都对应着一个 Embedding 向量,句子中所有词对应的 Embedding 向量最终构成了一个矩阵 X,这样一个词,比如 it 就与其他词关联起来了。这里需要说明的是,每个词对应的 Embedding 向量,是通过选定的语料库(训练数据集)通过训练从而得到的,具体如何训练和计算可以参考其他资料,这里不过多解释了。
有了矩阵 X,还需要基于矩阵 X 创建另外三个矩阵:查询矩阵 Q、键矩阵 K、值矩阵 V,得到这三个矩阵需要训练对应的另外三个权重矩阵,假设分别为 Wq、Wk、Wv,它们也都是通过训练得到的。这样,我们就可以计算得到下面三个矩阵:

Q = X·Wq
K = X·Wk
V = X·Wv

接着,基于上述三个矩阵 Q 、K、V,就可以计算得出我们需要的句子中每个词与句子中其他词相关性的注意力矩阵了,具体步骤如下图所示:

Self-Attention-Calculate-Process

最终计算结果示例,以词 it 为例,如下图所示:

Dog-Sel-Attention-Value

可见,词 it 与 dog 的自注意力值恰好等于 1.0,也就是 dog 的自注意力值,而其他的都是 0.0,所以代词 it 就指代为 dog。

Transformer 架构

我们参考论文《Efficient Transformers:A Survey》来学习 Transformer 架构,论文给出了标准的 Transformer 架构设计,如下图所示:

Transformer-Architecture

由上图可见,Transformer 由 Encoder 和 Decoder 两部分组成,首先是 Encoder 部分,输入 Embedding 数据经过一些处理后(Embedding输入、位置编码)进入到 N 个 Encoder 中,N 个 Encoder 最终输出特征值数据,结果作为每个 Decoder 中的 Multi-Head Cross-Attention 层的输入;然后是 Decoder 部分,输出 Embedding 数据经过一些处理后(Embedding输入、位置编码)进入到 N 个 Decoder 中,经过 N 个 Decoder 层的处理后,后面还要依次经过 Linear 层、Softmax 层处理后,得到最终的目标输出的预测概率结果。

下面,我们看 Encoder 内部各个子层的详细结构:

一个 Encoder 层包含 4 个子层的顺序堆叠:

  1. Multi-Head Self-Attention 层
  2. Add & Norm 层
  3. Feed Forward 层
  4. Add & Norm 层

数据在 Encoder 层的各个子层之间的传输和处理过程,说明如下:

(1) 将输入(inputs)转换为输入嵌入矩阵(Input Embedding),并将位置编码(Positional Embedding)加入其中,再将结果作为输入传入第一个 ENCODER 层中;
(2) 在 ENCODER 1 层中,接受输入并将其送入多头注意力层(Multi-Head Self-Attention),该子层运算后输出注意力矩阵;
(3) 将注意力矩阵输入到下一个子层,即前馈网络层(Feed Forward),前馈网络层将注意力矩阵作为输入,并计算出特征值作为输出;
(4) 接下来,把从 ENCODER 1 层中得到的输出作为输入,传入下一个层 ENCODER 2;
(5) ENCODER 2 层进行同样的处理,再将给定输入句子的特征值作为输出,最后在 ENCODER N 层输出最终的特征值数据。

下面,我们再看 Decoder 内部各个子层的详细结构:

一个 Decoder 层包含 6 个子层的顺序堆叠:

  1. Masked Multi-Head Self-Attention 层
  2. Add & Norm 层
  3. Multi-Head Cross-Attention 层
  4. Add & Norm 层
  5. Feed Forward 层
  6. Add & Norm 层

数据在 Decoder 层的各个子层之间的传输和处理过程,说明如下:

(1) 将目标(targets)转换为输出嵌入矩阵(Output Embedding),并将位置编码(Positional Embedding)也加入其中,再将结果作为输入传入第一个 DECODER 层中;
(2) 在 DECODER 1 层中,接受输入并将其送入带掩码的多头注意力层(Masked Multi-Head Self-Attention),该子层运算后输出注意力矩阵;
(3) 将注意力矩阵输入到下一个子层 Multi-Head Cross-Attention 层,同时也把 ENCODER N 输出的最终特征值数据作为 Multi-Head Cross-Attention 层的输入,经过处理以后结果输出到下一个子层,即前馈网络层(Feed Forward),并输出结果;
(4) 接下来,把从解码器 DECODER 1 层中得到的输出作为输入,传入下一个解码器层 DECODER 2;
(5) DECODER 2 层进行同样的处理,再将给定输入句子的特征值作为输出,最后在 DECODER N 层输出最终的目标特征值数据;
(6) 最后,在 N 个 DECODER 之后,还需要依次经过 Linear 层、Softmax 层的处理,最终得到预测目标词出现的概率结果。

为了方便了解,我们把 Transformer 架构中 N 个 Encoder、Decoder 都展开,并且填充上内部的各个子层,以及各个层之间数据的交互关系,整合到一张图上,如下图所示:

Detailed-Transformer-Architecture

通过上图来看,Transformer 架构就非常直观并易于理解。

参考资料

Creative Commons License

本文基于署名-非商业性使用-相同方式共享 4.0许可协议发布,欢迎转载、使用、重新发布,但务必保留文章署名时延军(包含链接:http://shiyanjun.cn),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>