Skip to content

Gen AI 中 Transformers 的架构

基于 Transformer 架构构建的大语言模型(LLM)彻底改变了自然语言处理(NLP)和生成式 AI 领域。与早期的循环架构(如循环神经网络 (RNN) 和长短期记忆网络 (LSTM))相比,它们在机器翻译、文本摘要、问答和复杂文本生成等广泛任务中展现了卓越的性能。

Transformer 卓越的能力源于其独特的架构,这一架构首次在 Vaswani 等人(2017 年)的开创性论文“Attention Is All You Need”中提出。本章将以易于理解的方式解释原始 Transformer 模型的核心概念,重点介绍其关键组成部分:编码器、解码器以及作为其操作核心的创新性自注意力机制。

概念概述:Transformer 如何处理信息

Section titled “概念概述:Transformer 如何处理信息”

让我们来看看 Transformer 如何在概念上处理一个句子以完成翻译或文本生成等任务:

  • 利用注意力机制同时考虑单词:与顺序处理单词的 RNN 不同,Transformer 可以同时考虑输入句子中的所有单词。“注意力机制”允许模型在处理任何给定单词时,权衡不同单词相对于彼此的重要性。例如,在处理“The animal didn’t cross the street because it was too tired.”这句话中的“it”时,注意力机制有助于识别“it”指的是“animal”。
  • 识别关系:通过在上下文中共处理单词,Transformer 可以学习单词之间复杂的依赖关系和联系,即使它们在句子中相距较远。这有助于理解细微的含义。
  • 构建丰富的表示:输入句子被转换成一种丰富的、语境化的表示,它不仅捕捉单个单词的含义,还捕捉它们如何相互作用以形成句子的整体含义。
  • 生成输出:对于生成式任务,Transformer 使用这些丰富的表示和注意力机制,一次生成一个单词(或 token)的输出序列(例如,翻译或文本的延续),并始终考虑已生成内容的上下文以及输入表示。

核心 Transformer 架构:编码器与解码器

Section titled “核心 Transformer 架构:编码器与解码器”

原始 Transformer 模型包含两个主要部分:一个编码器栈和一个解码器栈。以下是其高层架构的文字描述:

想象一个包含两个主要块的图。左侧是编码器栈,它接收输入序列(例如,一个英语句子)。输入序列首先经过一个“输入嵌入”(Input Embedding)层和一个“位置编码”(Positional Encoding)层。然后,它通过一系列 N 个相同的编码器层。每个编码器层有两个主要的子层:一个“多头自注意力”(Multi-Head Self-Attention)机制和一个“位置级前馈网络”(Position-wise Feed-Forward Network)。在这两个子层中的每一个周围都有残差连接,然后是层归一化(Layer Normalization)。

右侧是解码器栈,它生成输出序列(例如,翻译后的法语句子)。解码器也接收先前生成的输出序列作为输入(向右移动,并且也经过“输出嵌入”(Output Embedding)和“位置编码”)。它也包含 N 个相同的解码器层。每个解码器层有三个主要的子层:一个“带掩码的多头自注意力”(Masked Multi-Head Self-Attention)机制、一个“多头交叉注意力”(Multi-Head Cross-Attention)机制(它也接收来自编码器栈的输出)和一个“位置级前馈网络”。与编码器类似,在每个子层周围应用残差连接和层归一化。最后,解码器栈的输出经过一个线性层(Linear layer)和一个 Softmax 层,以生成关于目标词汇表中下一个单词/token 的概率分布。

值得注意的是,Transformer 架构完全放弃了循环(Recurrence)(RNN/LSTM 中存在的)并仅依靠注意力机制来获取输入和输出之间的全局依赖关系。

让我们更详细地讨论关键组件和子层:

  • 嵌入(Embeddings):来自输入和输出序列的单词(或子词 token)首先被转换为称为嵌入的稠密向量表示。这使得模型可以处理数值数据。
  • 位置编码(Positional Encoding):由于 Transformer 同时处理序列中的所有单词,并且不像 RNN 那样具有固有的序列感知能力,因此将位置编码添加到嵌入中。这些编码提供了序列中每个单词位置的信息。

编码器的作用是处理整个输入序列并将其转换为连续的表示序列(上下文嵌入),这些表示捕获了每个单词相对于整个序列的含义和上下文。原始论文中的编码器栈包含 N=6 个相同的层(尽管现代 LLM 中的这个数字有所不同)。

一个单独的编码器层可以可视化如下:输入(第一层的嵌入 + 位置编码,或前一层的输出)首先进入一个“多头自注意力”子层。该注意力子层的输出然后与其输入相加(一个残差连接)并经过“层归一化”。这个归一化后的输出然后进入一个“位置级前馈网络”子层。同样,其输出与其输入相加(残差连接)并经过“层归一化”。这个最终的归一化输出就是编码器层的输出,然后将其输入到下一个编码器层或解码器栈。

每个编码器层包含两个主要的子层:

  • 多头自注意力机制(Multi-Head Self-Attention Mechanism):这使得输入序列中的每个单词能够“关注”序列中的所有其他单词(包括自身),以理解它们之间的关系。“多头”意味着它并行执行多个注意力计算,每个计算关注关系的不同方面,然后组合它们的输出。
  • 位置级前馈网络(Position-wise Feed-Forward Network,FFN):这是一个简单的全连接前馈网络,独立应用于每个位置(即,应用于来自注意力层的每个单词的表示)。它由两个线性变换组成,中间夹着一个 ReLU 激活函数,这有助于进一步处理和转换表示。

残差连接和层归一化:编码器层中的每个子层(注意力层和 FFN)周围都有一个残差连接,然后是层归一化。每个子层的输出是 LayerNorm(x + Sublayer(x)),其中 Sublayer(x) 是子层自身实现的函数(例如,自注意力)。残差连接有助于深度网络中的梯度流动,防止梯度消失,而层归一化则稳定激活。

解码器的作用是逐个 token 生成输出序列(例如,翻译后的句子)。它接收编码器的输出(输入序列的上下文表示)以及先前生成的输出序列的 token 作为输入。与编码器一样,原始论文中的解码器栈也包含 N=6 个相同的层(现代 LLM 中的这个数字也有所不同)。

一个单独的解码器层结构稍微复杂一些:输入(第一层的先前生成的 token 的嵌入 + 位置编码,或前一个解码器层的输出)首先进入一个“带掩码的多头自注意力”子层。其输出与其输入相加并归一化。然后,这个结果进入一个“多头交叉注意力”子层,该子层也接收整个编码器栈的输出作为额外的输入。这个交叉注意力的输出与其输入相加并归一化。最后,这个结果通过一个“位置级前馈网络”,然后是另一个残差连接和层归一化。这就是一个解码器层的输出。

每个解码器层包含三个主要的子层:

  • 带掩码的多头自注意力机制(Masked Multi-Head Self-Attention Mechanism):这类似于编码器中的自注意力,但有一个关键的修改:它包含一个掩码。这个掩码确保在预测当前输出 token 时,解码器只能关注输出序列中先前生成的 token,而不能关注未来的 token。这保持了自回归特性(基于过去的 token 逐个生成 token)。
  • 多头交叉注意力机制(Multi-Head Cross-Attention Mechanism,编码器-解码器注意力):这个子层允许解码器中的每个位置关注输入序列中的所有位置(通过编码器的输出)。这是解码器将输入上下文与正在生成的输出关联起来的地方。例如,在翻译中,它帮助解码器确定哪些输入单词与预测当前输出单词最相关。
  • 位置级前馈网络(Position-wise Feed-Forward Network,FFN):这在结构上与编码器层中的 FFN 相同。

与编码器类似,残差连接和层归一化应用于这三个子层中的每一个周围。

在最后一个解码器层之后,输出表示通过一个最终的线性层(用于投影到词汇表大小)和一个 Softmax 函数。Softmax 将这些分数转换为概率,表示词汇表中每个单词成为输出序列中下一个单词的可能性。通常选择概率最高的单词(尽管存在其他采样策略)。

本章详细介绍了生成式 AI 中 Transformer 的基本架构,重点关注其两个主要组成部分:编码器和解码器,以及注意力机制的核心作用。原始的 Transformer 建议编码器和解码器都使用 N=6 个层,但现代实现,特别是在大语言模型中,通常使用显着更多的层来获得更大的容量和性能。

编码器的作用是使用自注意力和前馈层构建对输入序列的丰富、上下文理解。然后,解码器利用这种理解,结合其自身输出上的带掩码自注意力以及对编码器输出的交叉注意力,逐步生成目标序列。

Transformer 架构通过用注意力机制取代循环,实现了序列的并行处理,从而在大数据集上实现了更高效的训练,并能够有效地捕获长距离依赖关系。这种设计从根本上改变了自然语言处理的格局,并且是大多数最先进的文本生成式 AI 模型(以及越来越多地,其他模态的模型)的基石。