Transformer架构

在深度学习中，transformer（直译为“变换器”）是一种基于多头注意力机制的人工神经网络架构，其中文本被转换为称为词元（token）的数值表示，每个词元通过从词嵌入表中查找转换为一个向量。在每一层，每个词元都通过并行的多头注意力机制在上下文窗口的范围内与其他（未屏蔽的）词元进行上下文关联，从而放大关键词元的信号并减弱不太重要的词元，从而按输入数据各部分重要性的不同而分配不同的权重。采用该架构的模型主要用于自然语言处理（NLP）与计算机视觉（CV）领域。

和循环神经网络（RNN）一样，transformer旨在处理自然语言等顺序输入数据，可应用于翻译、文本摘要等任务。但transformer的优势在于它没有循环单元，能够一次性处理所有输入数据。注意力机制可以为输入序列中的任意位置提供上下文。如果输入数据是自然语言，则transformer不必像RNN一样一次只处理一个单词，这种架构允许更多的并行计算，并以此减少训练时间。之后的变体被广泛用于在大型（语言）数据集上训练大型语言模型（LLM）。

现代版transformer于2017年由谷歌大脑的一个团队在论文《Attention Is All You Need》中提出。其前身最初是为了改进机器翻译的现有架构而开发的，但此后应用范围不断扩大。它们被用于大规模自然语言处理、计算机视觉（视觉transformer）、强化学习、音频处理、多模态学习、机器人，甚至可以下国际象棋，逐步取代长短期记忆（LSTM）等RNN模型成为了NLP问题的首选模型。Transformer模型也催生了预训练系统（迁移学习）的发展，并行化优势允许其在更大的数据集上进行训练，例如GPT 和BERT。这些系统使用了维基百科、Common Crawl等大型语料库进行训练，并可以针对特定任务进行微调。

跟2017年的原始模型相比，一些现代模型（如RoBERTa）在词元化阶段可以改用更高效的WordPiece算法；位置编码则可能使用更新的旋转位置编码(RoPE)方案。

## 背景

在transformer模型之前，大多数最先进的NLP系统都依赖于诸如LSTM、门控循环单元（GRU）等门控RNN模型，并在此基础上增加了注意力机制。transformer正是在注意力机制的基础上构建的，但其没有使用RNN结构，这表明仅依靠注意力机制就能在性能上比肩加上了注意力机制的RNN模型。2014年，注意力机制的提出为transformer奠定了理论基础。

### 顺序处理

RNN模型按顺序处理每一个标记（token）并维护一个状态向量，其中包含所有已输入数据的表示。如要处理第$n$个标记，模型将表示句中到第$n-1$个标记为止的状态向量与最新的第$n$个标记的信息结合在一起创建一个新的状态向量，以此表示句中到第$n$个标记为止的状态。从理论上讲，如果状态向量不断继续编码每个标记的上下文信息，则来自一个标记的信息可以在序列中不断传播下去。但在实践中，这一机制是有缺陷的：梯度消失问题使得对于长序列，模型训练效果较差。且按顺序处理的机制使得长句末尾的模型状态会缺少前面标记的精确信息。此外，每个标记的计算都依赖于先前标记的计算结果，这也使得其很难在现代深度学习硬件上进行并行处理，这导致了RNN模型训练效率低下。

### 自注意力机制

注意力机制解决了上述这些问题。这一机制让模型得以提取序列中任意先前点的状态信息。注意力层能够访问所有先前的状态并根据学习到的相关性度量对其进行加权，从而提供相距很远的标记的相关信息。

翻译是一个能够突显注意力机制优势的例子，其中上下文对于句子中单词的含义至关重要。例如在一个将英语翻译为法语的系统中，法语输出的第一个词很可能取决于英语输入的前几个词。然而在经典的LSTM模型中，为了产生法语输出的第一个单词，模型需要访问处理完最后一个英语单词后得到的状态向量。理论上这个向量包含了整个英语句子的信息，从而为模型提供所有必要的知识。然而在实践中，LSTM通常无法很好地保存这些信息。可以通过添加注意力机制来解决这个问题：解码器可以访问每个英语输入单词的状态向量，而不仅仅是最后一个单词。同时模型可以学习注意力权重，这些权重决定了对每个英语输入状态向量的关注程度。

在RNN模型中添加注意力机制能提高模型的性能。而transformer架构的发展表明，注意力机制本身就足够强大，并且不需要像RNN模型一样再对数据进行顺序循环处理。transformer模型采用了没有RNN模型的注意力机制，它能够同时处理所有标记并计算它们之间的注意力权重。由于注意力机制仅使用来自之前层中其他标记的信息，因此可以并行计算所有标记以提高训练速度。

## 架构

### 输入

输入文本使用字节对编码以进行标记化，每个标记通过词嵌入转换为向量。然后，将标记的位置信息添加到嵌入向量中。

### 编码器-解码器架构

与早期的seq2seq模型一样，原始的Transformer模型使用“编码器-解码器”（encoder–decoder）架构。编码器由逐层迭代处理输入的编码层组成，而解码器则由对编码器的输出执行相同操作的解码层组成。

每个编码层的功能是确定输入数据的哪些部分彼此相关。它将其编码作为输入再传递给下一个编码层。每个解码层的功能则相反，读取被编码的信息并使用整合好的上下文信息来生成输出序列。为了实现这一点，每个编码层和解码层都使用了注意力机制。

对于每个输入，注意力会权衡每个其他输入的相关性，并从中提取信息以产生输出。每个解码层都包含一个额外的注意力机制，它会在从编码层提取信息之前先从之前解码器的输出中提取信息。

编码层和解码层都有一个前馈神经网络用于对输出进行额外处理，并包含残差连接和层归一化步骤。

### 缩放点积注意力

transformer模型的基本构建单元是缩放点积注意力（scaled dot-product attention）单元。当一个句子被传递到一个transformer模型中时，可以同时计算所有标记互相之间的注意力权重。注意力单元为上下文中的每个标记生成嵌入，其中包含有关标记本身的信息以及由注意力权重加权得到的其他相关标记的信息。

对于每个注意力单元，transformer模型学习三个权重矩阵，分别为查询（query）权重$W_Q$、键（key）权重$W_K$以及值（value）权重$W_V$。对于每个标记$i$，输入词嵌入$x_i$分别与三个权重矩阵相乘以得到查询向量$q_i = x_iW_Q$、键向量$k_i = x_iW_K$与值向量$v_i=x_iW_V$。再使用查询向量和键向量计算注意力权重，即计算$q_i$和$k_j$的点积以得到从标记$i$到标记$j$的注意力权重$a_{ij}$。之后再将注意力权重除以向量维度的平方根$\sqrt{d_k}$以在训练期间稳定梯度，并通过softmax函数对权重进行归一化。$W_Q$与$W_K$的不同意味着注意力是非对称的：即使标记$i$很关注标记$j$（即$q_i\cdot k_j$很大），也不能保证标记$j$也反过来关注标记$i$（即$q_j\cdot k_i$可能很小）。对每一个标记$i$而言，注意力单元的输出是以$a_{ij}$（标记$i$到每一个标记的注意力）加权所有标记的值向量得到的加权和。

对所有标记的注意力计算可以表示为使用softmax函数的一个大型矩阵计算，由于可以对矩阵运算速度进行优化，这十分利于训练速度的提升。矩阵$Q$、$K$和$V$可分别定义为第$i$行是向量$q_i$、$k_i$ 和$v_i$的矩阵。

$$\begin{align} \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\mathrm{T}}{\sqrt{d_k}}\right)V \end{align}$$

#### 多头注意力

一组$\left( W_Q, W_K, W_V \right)$矩阵称为一个注意力头（attention head），transformer模型中每一层都包含多个注意力头。每个注意力头都表示不同标记相互之间的注意力，而多个注意力头则可以针对不同的“相关性”计算不同的注意力权重。多注意力头编码的相关性信息是人类可以理解的，例如某个注意力头可能主要关注下一个单词，而另一个注意力头则可能主要关注动词与其直接宾语之间的关系。每个注意力头的计算可以并行执行，这使得处理速度得以加快。注意力层的输出被连接起来传递到前馈神经网络层。

### 编码器

每个编码器由一个自注意力机制和一个前馈神经网络两个主要部分组成。自注意力机制接受来自前一个编码器的输入编码，并计算它们之间相关性的权重以生成输出编码。前馈神经网络则进一步单独处理每个输出编码。然后将这些输出编码作为输入传递给下一个编码器以及解码器。

第一个编码器将输入序列的位置信息和嵌入作为其输入。位置信息向transformer模型提供了序列的顺序信息，这是模型中唯一利用这一信息的部分。

编码器是双向的，这意味着当前标记的注意力可以放在之前或之后的标记上。

BERT是一种仅具有编码器的结构。

### 解码器

每个解码器由一个自注意力机制、一个针对编码器的注意力机制和一个前馈神经网络三个主要部分组成。解码器的功能与编码器类似，但插入了一个额外的注意力机制，它从编码器生成的编码中提取相关信息。这种机制也可以称为编码器-解码器注意力（encoder-decoder attention）。

与第一个编码器一样，第一个解码器也将输出序列的位置信息和嵌入作为其输入。因为模型不能使用当前或未来的输出来预测输出，因此必须对输出序列进行部分屏蔽以防止这种反向信息流。这使得自回归文本生成成为可能。最后一个解码器之后是最终的线性变换和softmax层以产生所有词汇的输出概率。

GPT及其之后的大型语言模型是一种仅具有解码器的架构。

### 替代架构

训练基于transformer模型的架构可能很昂贵，尤其是对于长输入而言。替代架构包括Reformer模型、ETC/BigBird模型等，前者可以将计算复杂度从$O(N^2)$减少为$O(N\ln N)$，后者则可以减少到$O(N)$，其中$N$表示序列长度。其实现得益于局部敏感哈希与可逆层。

原始的Transformer模型需要与上下文窗口大小成二次方的内存大小。无注意力transformer模型（attention-free transformer）则将对内存的需求减少为线性依赖，同时通过连接链与值保留了transformer模型的优势。

2020年底推出了用于比较不同transformer架构的基准测试。

### 稀疏注意力

- Block Sparse（GPT-3）：局部窗口注意力+随机注意力
- Longformer：膨胀滑动窗口模式

### 混合架构

模型｜CV融合方式｜NLP代表

ViT｜图像分块嵌入｜/

BEiT｜视觉tokenizer｜BERT-style

Flamingo｜跨模态适配器｜Chinchilla

## 训练

transformer模型通常会进行自监督学习，包括无监督预训练和监督微调。由于监督微调时使用的带标签训练数据一般比较有限，预训练通常会在比微调时所用的更大的数据集上完成。预训练和微调的任务通常包括：

- 语言建模
- 下一句预测
- 问答系统
- 阅读理解
- 文本情感分析
- 文本改写

## 应用

transformer模型在自然语言处理（NLP）领域取得了巨大成功，例如机器翻译与时间序列预测任务。包括GPT-2、GPT-3、BERT、XLNet与RoBERTa在内的许多预训练模型展示了transformer模型执行各种NLP相关任务的能力，并有很多潜在实际应用。这些应用包括：

- 机器翻译
- 文本摘要
- 文本生成
- 命名实体识别
- 生物序列分析
- 视频理解

2020年，transformer架构（更具体地说是GPT-2）被证明可以通过微调执行下象棋的任务。transformer模型也已应用于图像处理，其结果可与卷积神经网络相媲美。

## 实现

transformer模型已在TensorFlow、PyTorch等标准深度学习框架中实现。

“transformers”是由Hugging Face制作的一个库，提供基于transformer的架构和预训练模型。