GPT-3 工作原理深度解读
详解 Transformer 架构与 GPT-3 文本生成机制,帮助开发者理解大模型基础。
详解 Transformer 架构与 GPT-3 文本生成机制,帮助开发者理解大模型基础。
自从 Transformer 架构在 7 年前发表的里程碑论文《Attention is All You Need》推出以来,机器学习的格局已经发生了根本性的改变。这一架构及其自注意力机制已经渗透到机器学习的每个角落,从计算机视觉到强化学习。现代大语言模型主要是建立在 Transformer 架构及其核心原理的基础之上。然而,随着大语言模型开发的深入,这些模型的架构与原始 Transformer 设计的演进和分化往往没有得到充分的记录。通常需要查阅论文才能追踪每个修改的来源和原因。
本文旨在阐明一些最具影响力的大语言模型架构,深入探讨其具体设计选择背后的逻辑。文章假设读者已经对原始 Transformer 架构有清晰的理解。欲了解更多信息,请查看这篇文章。
毫无疑问,大语言模型革命始于 2022 年 11 月 30 日 ChatGPT 的发布。ChatGPT 基于 GPT-3 架构,并通过人工反馈强化学习(RLHF)进行了对话任务的微调。
GPT 系列模型远不止改变了游戏规则,从 GPT 到 GPT-4,在每次迭代中,GPT 系列几乎总是在当时所有其他 NLP 模型中保持领先地位。
在原始 GPT 论文中,该模型通过采用仅解码器架构而与当时的所有其他模型区别开来。一些当时表现最好的模型,如双向 Transformer(BERT),使用了原始《Attention is All You Need》论文中概述的编码器和解码器模块。仅解码器架构提高了计算效率,并降低了模型的复杂性。在 GPT-3 的成功之后,几乎所有大语言模型都采用了仅解码器架构。
GPT-3 模型的输出是自回归生成的,与原始 Transformer 的实现相似。然而,有一处细微的不同。GPT-3 的输入长度固定为 2048 个标记,任何更短的输入都会用空标记填充,直到达到 2048 个标记。
在每个预测步骤中,模型生成最有可能跟随输入序列末尾的标记。然后将该输出标记附加到输入序列中,重新输入模型进行下一个标记的预测。这个过程重复进行,直到达到输出序列的所需长度或模型认为已到达响应的自然结束。
上述模式适用于所有现代大语言模型。
注意 GPT-3 是如何处理标记而不是单词或字符的。GPT 系列之前的语言模型采用了多种分词方法,其中空格和标点分词被广泛使用。它可以粗略地解释为将输入序列拆分为单个单词和标点符号。
空格和标点分词这样的分词技术通常会生成庞大的词汇表,包含模型训练数据中出现的所有唯一单词和符号。使用这种分词方法不仅会增加计算复杂性,还会在推理时产生处理模型词汇表外的单词的问题。
GPT-3 采用的字节对编码(BPE)通过采用更高效和自适应的分词策略来解决这些挑战。BPE 在字符级粒度和单词级泛化的极端之间取得平衡。大多数现代大语言模型都采用了自己的 BPE 变体。
以下是 BPE 工作方式的简化过程:
词汇表初始化:BPE 从个别字符的词汇表开始。该词汇表包括出现在训练语料库中的所有字符。每个唯一字符被视为初始标记。
构建词汇表:该算法计算训练数据中每对相邻标记(初始为字符)的频率。
合并:它识别最频繁的相邻标记对,并将其合并为单个新标记。例如,如果"h"和"e"是最频繁的对,它们被合并形成标记"he"。
确定合并操作的数量:合并操作的数量是一个根据所需词汇表大小设定的超参数。在 GPT-3 中,这意味着大量的合并,导致词汇表能够有效编码训练数据中的常见序列。
在推理期间对新文本进行分词时,模型通常采取以下步骤:
当处理新文本时,首先将其分解为基本标记(字符)。
然后 BPE 算法应用学到的合并,从最频繁的开始依次进行。
文本被分割为词汇表中找到的最大可能标记。这意味着频繁的单词或子词通常被编码为单个标记,而不太常见的序列可能被分解为更小的部分。
注意,在实践中,GPT-3 没有使用所有可能的 Unicode 字符作为基础词汇表(这会产生超过 130,000 个字符),而是使用了字节级版本,仅包含 256 个唯一字符。GPT-3 的总词汇表大小为 50257。
对于输入序列中的每个标记,它被独热编码为大小为 50257 的向量,生成一个巨大的稀疏矩阵,尺寸为 2048 乘 50257。
GPT-3 采用了与原始 Transformer 类似的词嵌入和位置编码技术。每个独热编码的标记乘以一个学习的嵌入矩阵,将其转换为大小为 2048 乘 12288 的稠密矩阵。
然后,根据每个标记在输入序列中的相对位置,该位置索引被输入到 12288 个正弦函数中,每个函数具有不同的频率,生成与嵌入序列相同大小的矩阵。最后,位置编码矩阵被加到嵌入矩阵中,准备好被注意力块处理。
在原始 Transformer 论文中,每个自注意力块由 4 个组件组成,如下图所示:
图中的归一化指的是层归一化,而不是批量归一化层。
GPT-3 模型对原始 Transformer 架构进行了多项修改。
层归一化被移到每个子块的输入处,而不是在前馈 MLP 之后。
在最后一个自注意力块的末尾添加了额外的层归一化。
GPT-3 在其模型中采用了密集注意力和局部带状稀疏注意力模式的组合,这与多次堆叠相同自注意力块的方法不同。密集注意力模式遵循原始《Attention is All You Need》论文中引入的多头自注意力机制。另一方面,"局部带状稀疏注意力模式"在论文中没有明确说明。然而,据说与稀疏 Transformer 中的修改后的注意力层相似。
像稀疏 Transformer 这样的模型中的稀疏注意力是一项关键创新,它解决了标准全注意力机制的局限性,特别是对于很长的序列。这种方法涉及注意力矩阵的因式分解和战略性地选择要注意的位置子集,而不是整个序列。子集选择对于降低计算复杂性和内存使用至关重要,并且具有能够构建更深模型的额外优势。
GPT-3 模型巧妙地重用了在输入中学到的嵌入矩阵来解码处理后的信息。这涉及将自注意力块的输出乘以嵌入矩阵的逆矩阵。这个变换将矩阵返回到其原始尺寸 2048 乘 50257。
随后,这个输出会通过 softmax 函数处理,沿行维度应用。每个得到的值都代表其对应令牌成为序列中下一个最可能令牌的概率。通常,这个过程只关注最后一个令牌,然后它被选中、输出,并重新附加到输入中进行另一次传递。
为了简洁和一致性,在描述大型语言模型的架构时,我们采用大多数论文使用的记号。
n_layers: 96, n_heads: 96
总参数数:1750 亿。
Meta 的 LLaMA 在 ChatGPT 之后成为了下一个"大事件",LLaMA 2 随后在 GPT-4 发布后被宣布。虽然与 GPT-4 制定的标准相比,这些模型的独立性能看起来几乎微不足道,但它们易于使用和开源的特性为许多独立研究者带来了巨大的好处。到今天为止,LLaMA 的众多衍生版本和微调版本继续在小型到中型 LLM 领域处于领先地位。
LLaMA 2 家族中最大的模型拥有 70 亿参数,具有以下默认架构参数:
与作为 LLaMA 基础的 GPT 系列模型相比,LLaMA 2 引入了几项关键修改。
LLaMA 2 采用分组查询注意力机制来取代原始的自注意力,以加快推理速度,同时保持标准自注意力的性能。
在 GQA 中,注意力头被分成若干组,每组共享一个公共的键和值矩阵。该方法受多查询方法的启发,其中每个注意力头都使用相同的键和值矩阵。令人惊讶的是,GQA 兼具两者的优点,既能达到与多查询和原始自注意力相当的性能,也能达到相当的效率。
每个多头注意力层的组数是用户指定的参数。
LLaMA 2 采用由 PaLM 引入的 SwiGLU 激活函数,偏离了 GPT-3 使用的传统 ReLU 激活函数。该激活函数是 swish 和 GLU 激活函数的组合,定义为:
其中,Σ 是 sigmoid 函数,W 和 V 都是可训练参数,$Swish_\beta$ 是标准的 swish 激活函数。
SwiGLU 的计算成本要高得多,因为它需要 3 次矩阵乘法。然而,它确实展现了显著的性能提升,即使在计算等价的情景中与 ReLU 相比也是如此,在这种情景下,ReLU 可以访问更大的隐藏维度。
LLaMA 2 实现了 RoPE(旋转位置编码)模块,而非传统的相对正弦位置编码方法。与绝对或相对位置编码不同(它们向每个令牌嵌入添加一个唯一的向量来表示其位置),RoPE 通过在高维空间中旋转特征对来编码位置。这种旋转运动类似于信号处理中的相移,其中每个特征对按与其位置成正比的角度旋转,确保相对位置被编码在所得的相移中。
在计算注意力分数的点积之前,RoPE 被应用于查询和键向量。它根据这些向量内每对特征在序列中的各自位置旋转它们,有效地将位置信息混合到表示中。
RoPE 相对于绝对位置编码的优势在于,它本质上捕捉特征的相对位置,从而使模型能够更好地跨不同序列长度进行泛化,并在其对相对位置的理解中保持一致性。与相对位置编码相比(后者通常需要额外的复杂性来跟踪成对的位置关系),RoPE 通过使用数学上简洁且计算效率高的旋转操作来简化这个过程。
Mistral 7B 作为 LLM 派对上的后来者,不仅在 70 亿参数类别中成为了最先进的模型,而且超越了许多规模大得多的模型的性能。
此外,它的后继者 Mixtral 8x7B 是一个以 Mistral 7B 为基础模型的专家混合模型,以远超 ChatGPT 的性能运行,同时使用的计算量显著更少。在当前开源 LLM 的格局中,几乎所有最先进的模型都基于 Mistral 基础模型。
与 LLaMA 家族的模型相比,Mistral 7B 是一个小得多的模型。
除了 GQA 之外,Mistral 7B 还引入了其他几项改进,旨在显著减少训练和推理所需的计算,同时保持模型的性能。
原始自注意力中的操作数相对于序列长度呈二次增长,而内存使用与令牌数量成线性关系。特别是在推理时,由于缓存可用性有限,较大的模型更容易出现频繁的延迟和较小的吞吐量。
为了解决这个问题,GPT-3 采用了稀疏注意力机制,而 Mistral 选择了一个更简单的方法:滑动窗口注意力。
在滑动窗口注意力中,每个令牌不是关注序列中的每个其他令牌,而只是关注其本身之前的固定 W 个令牌。
由于 Transformer 架构的特性,SWA 能够保持 Mistral 7B 模型的性能。SWA 利用顺序堆叠的自注意力层的能力来传输超出其明确设置窗口的信息。
例如,中间的图表显示了位置 i 的令牌 'cat' 仅关注自身和其位置前的两个单词,说明了窗口大小为 3 的 SWA。该令牌的隐藏表示然后使用单词 'The'、'cat' 和 'sat' 的值向量计算。因此,这个单一的隐藏状态将包含所有三个单词的信息。
在随后的自注意力层中,位置 i+W 的令牌关注位置 i 和其间的每个令牌。因此,它将传播来自位置 i 的令牌的信息,该信息已包含来自位置 i-W 到 i 的令牌的信息。
在拥有 k 个注意力层的模型中,SWA 可以有效地跨 k * W 个令牌传输信息,比传统的因果自注意力使用的资源少得多。在 Mistral 7B 中,W 设置为 4096。理论上,Mistral 可以达到 W * {n layers} = 131,000 令牌的注意力跨度。
"滚动缓冲区"就像一个在数据流上移动的固定大小窗口,在任何时候只在内存中保存一部分数据。当新数据到来时,最旧的数据被丢弃。
除了 SWA 带来的内存和计算减少外,Mistral 7B 还利用滚动缓冲区缓存来进一步减少内存使用,当序列长度增加到 32K 时,内存使用可减少 8 倍。
缓存的固定大小为 W。在每个令牌位置 i,其键和值存储在缓存的 (i % W) 槽中。当 i 超过缓存的大小 W 时,模运算将覆盖缓冲区中的第一个槽,将其严格保持在当前窗口内。
在上面的图示中,在每个位置 i,对应于当前令牌的隐藏状态用橙色标记。窗口大小 W 为 4。我们可以看到缓冲区被单词 "an" 和 "example" 填满。当处理下一个令牌 "of" 时,它会覆盖缓冲区中的第一个槽,并丢弃关于单词 "This" 的任何存储信息,因为它不会在当前窗口中被关注。
在生成序列之前,模型用来自提示的已知信息"预填充"缓存,这意味着它基于给定的提示计算和存储键和值。这是一个准备步骤,以便当模型开始生成新令牌时,它可以参考这个预先计算的信息。
当处理非常长的序列时,尽管有滚动缓存,将所有键和值存储在缓存中仍需要大量内存。为了有效地处理这个问题,序列被分解成较小的片段,称为"块"。每个块被单独处理。
以上面的图为例,预填充和分块遵循以下过程:
分解为块: 模型将长提示分成较小的、可管理的部分,称为块。在图中,序列被分割成像 "The cat sat on"、"the mat and saw"、"the dog go to" 这样的块。
生成文本: 使用来自缓存的信息和当前块内的因果注意力,模型生成文本的下一部分。
如前所述,目前最先进的开源大语言模型主要由 Mistral 和 Mixtral 的各种变体占据,偶尔也会出现少数 LLaMA 2 模型。另一方面,专有模型的巅峰依然是 GPT-4。
上述架构可能已经涵盖了 90% 以上的现代大语言模型。回顾过去,模型的核心机制并没有发生太大的剧烈变化。几乎所有改进都是为了提高模型效率,甚至选择仅使用解码器的架构!
一方面,这体现了原始 Transformer 架构的精妙之处:历经多年的机器学习创新与改进,它不仅得以保留,而且持续蓬勃发展。另一方面,这也体现了训练方法、微调技术以及最为关键的数据质量的重要性。
在当前的大语言模型领域,人们更关注如何用更少的投入获得更多成果。通过提高数据质量,可以缩短训练时间;通过优化现有的最先进架构,可以用低得多的成本获得同等性能。
然而,基于 Transformer 的大语言模型可能不会长期占据主导地位。Albert Gu 和 Tri Dao 最近发表的论文《Mamba: Linear-Time Sequence Modeling with Selective State Spaces》,代表着序列建模领域的一次重大转变,尤其对目前占据主导地位的 Transformer 架构提出了挑战。Mamba 的独特之处在于其结构化状态空间模型(SSM)框架,这使其在几个关键方面有别于传统 Transformer 模型。
选择性状态空间模型: Mamba 采用了选择性 SSM,这是一种新颖的方法,使模型能够沿序列长度维度选择性地传播或遗忘信息。这种选择性使 Mamba 可以专注于相关数据,同时忽略关联性较低的信息,从而解决 Transformer 在处理长序列时效率不足的问题。
硬件感知设计: 尽管不再采用高效卷积,Mamba 仍在其循环模式中引入了一种硬件感知的并行算法。这一设计不仅确保了快速推理,还使模型能够随序列长度线性扩展,相比 Transformer 的二次方扩展有了显著改进。
简化的架构: Mamba 将这些选择性 SSM 集成到端到端神经网络架构中,无须依赖注意力机制,甚至也不需要 MLP 模块。这种简化带来了更轻量、更快速的模型,能够高效处理长度高达一百万的序列。
跨模态通用性: Mamba 已在语言、音频和基因组学等多种模态中展现出卓越性能,并取得了最先进的成果。它能够有效处理离散和连续两种数据类型,因此可作为一种通用工具应用于广泛场景。
Mamba 的创新方法解决了当前序列模型的一些根本性局限。尽管它仍然着眼于“效率”,但 Mamba 已经彻底重塑了我们思考序列建模的方式。它可能是自 2017 年以来首批具有与 Transformer 相当潜力的无注意力架构之一。
另一方面,仅仅通过数据就能为基于注意力机制的 Transformer 带来的潜在改进,也是难以估量的。正如一位 OpenAI 研究人员所说:“数据工作在很大程度上是大语言模型背后未被歌颂的英雄……细致的数据工作可以带来巨大的性能差异。例如,尽管使用的计算资源少得多,PaLM 62B 的表现却远优于 LaMDA 137B。”
架构创新与数据优化的交汇正在塑造 AI 的新疆界,为构建更先进、更高效的语言理解系统开辟道路。
注:如果你喜欢这些内容并想了解更多,请点击这里!如果你想查看一份完全详尽的 AI 术语表,请点击这里。
在全球领先的语音 AI 平台上,通过转录和理解能力获取对话智能。