深度解析从 RNN 到 Transformer:构建 NLP 应用的架构演进之路

# 深度解析从RNN到Transformer:构建NLP应用的架构演进之路 📖阅读时长:50分钟 🕙发布时间:2025-01-20 深入探索架构,并利用从RNN到Transformer的NLP模型构建现实世界中的应用程序。 >本文1w字,阅读时长~~ 看速度 2025年01月10日 晴 零下3度 ![](https://upload-images.jianshu.io/upload_images/17294212-db71fb25cf4c0c1d.png) >[1. LLM大模型架构专栏](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzkxMDcwMDExOQ==&action=getalbum&album_id=3803521454633697283#wechat_redirect) 欢迎关注公众号 **柏企科技圈** 如果您有任何问题或建议,欢迎在评论区留言交流! ## 目录 1. **引言** - 1.1 LLM是如何构建和训练的? - 1.2 背景:前Transformer时代 - 1.3 Transformers简介 - 1.4 为什么说“注意力就是你所需要的一切”? 2. **Transformer架构** - 2.1 嵌入 - 2.1.1 输入嵌入 - 2.2 编码器 - 2.2.1 多头自注意力 - 2.2.2 归一化和残差连接 - 2.2.3 前馈神经网络 - 2.2.4 编码器的输出 - 2.3 解码器 - 2.3.1 输出嵌入 - 2.3.2 位置编码 - 2.3.3 解码器层堆栈 - 2.3.4 用于生成输出概率的线性分类器和Softmax - 2.3.5 归一化和残差连接 - 2.3.6 解码器的输出 3. **LLM架构** - 3.1 Seq-2-Seq模型(编码器 - 解码器) - 3.2 自动编码模型(仅编码器) - 3.3 自回归模型(仅解码器) - 3.4 专家混合(MoE) 4. **推理** - 4.1 推理技术 - 4.1.1 贪心搜索 - 4.1.2 束搜索 5. **Transformer推理优化** - 5.1 Transformer架构和推理流程 - 5.2 Transformer推理的阶段:预填充和解码 6. **Transformer推理中的挑战** 7. **用于加速推理的优化技术** - 7.1 量化 - 7.2 键值(KV)缓存 - 7.3 推测解码 - 7.4 批处理 - 7.5 硬件优化:并行性 - 7.6 FlashAttention和内存效率 8. **推理性能基准测试** - 8.1 Transformer推理的趋势 - 8.1.1 使用分页(Paging)和FlashAttention进行内存优化 - 8.1.2 多查询和分组查询注意力 - 8.1.3 并行性:张量和序列 - 8.1.4 实时应用的推测推理 9. **处理大型数据集** - 9.1 高效的数据加载和预处理 - 9.2 分布式训练 - 9.3 混合精度训练 - 9.4 梯度累积 - 9.5 检查点和恢复 - 9.6 数据增强和采样 10. **总结** ## 1. 引言 大型语言模型(LLM)是一种人工智能(AI)算法,它运用深度学习技术和海量数据集来实现通用语言的理解与生成。LLM会在大量数据上进行预训练,这些数据通常涵盖如Common Crawl和Wikipedia等来源。 LLM旨在依据从训练中获取的知识,识别、总结、翻译、预测并生成文本及其他形式的内容。 LLM的主要特点包括: - **Transformer模型架构**:LLM基于Transformer模型,该模型由编码器和解码器构成,能够从文本序列中提取含义,并理解单词之间的关系。 - **注意力机制**:这一机制使LLM能够捕捉单词之间的长距离依赖关系,从而理解上下文。 - **自回归文本生成**:LLM根据先前生成的标记来生成文本,使其能够以不同的风格和语言产出文本。 ![](https://upload-images.jianshu.io/upload_images/17294212-3ffe2038b62f16d0.png) ![](https://upload-images.jianshu.io/upload_images/17294212-3b2b420c8a6ad858.png) 一些广为人知的LLM实例包括OpenAI的GPT - 3和GPT - 4、Meta的LLaMA 2以及Google的Gemini。这些模型有潜力颠覆众多行业,如搜索引擎、自然语言处理、医疗保健、机器人技术和代码生成等领域。 ### 1.1 LLMs是如何构建和训练的? 构建和训练大型语言模型(LLMs)是一个复杂的过程,涉及多个步骤。最初,需要从书籍、网站和社交媒体帖子等各种来源收集大量文本数据。接着,对这些数据进行清理和处理,使其转化为AI能够学习的格式。 LLMs的架构采用具有数十亿参数的深度神经网络进行设计。会使用诸如编码器 - 解码器、因果解码器和前缀解码器等不同的Transformer架构,模型的设计对其能力有着重大影响。 ![](https://upload-images.jianshu.io/upload_images/17294212-7ecf194c2e87deed.png) 然后,利用计算能力和优化算法对LLMs进行训练。这种训练通过统计方式调整参数以预测文本,训练得越多,模型的能力就越强。 最后,通过扩大数据规模、增加参数数量和提升计算能力,企业得以生产出能力接近人类语言运用水平的LLMs。 - **数据收集**:LLMs需要大量的文本数据集进行训练,这些数据可包括书籍、网站、社交媒体帖子等。数据经过清理和处理,转换为AI能够学习的格式。 - **模型架构**:LLMs具有包含数十亿参数的深度神经网络架构,会使用Transformer或GPT等不同架构,模型设计会影响其能力。 - **训练**:LLMs利用计算能力和优化算法进行训练,训练通过调整参数以统计方式预测文本,更多的训练会使模型能力更强。 - **扩展**:通过扩大数据、参数和计算能力的规模,企业已经生产出能力接近人类语言使用水平的LLMs。 大型语言模型操作(LLMOps)专注于在生产环境中有效部署、监控和维护LLMs,它涵盖模型版本控制、扩展和性能提升等方面。 ### 1.2 背景:前Transformer时代 Transformers是为了解决序列转换(即神经机器翻译)问题而开发的。这意味着任何将输入序列转换为输出序列的任务,包括语音识别、文本转语音等。 ![](https://upload-images.jianshu.io/upload_images/17294212-acc5708cbed384fa.png) 对于序列转换模型来说,记忆至关重要。例如,在翻译句子 “The Transformers are a Japanese hardcore punk band. The band was formed in 1968 during the height of Japanese music history” 时,短语 “the band” 指代的是 “The Transformers”。识别这些联系对于准确翻译至关重要。传统上,循环神经网络(RNNs)和卷积神经网络(CNNs)等模型被用于处理这些依赖关系,但它们都存在局限性。让我们快速探究一下这些架构及其缺点。 #### 1.2.1 多层感知机(MLPs) 让我们从多层感知机(MLPs)开始介绍,它是经典的神经网络方法之一。MLPs本身的能力并不强大,但你会发现它几乎集成在任何其他架构中(令人惊讶的是,甚至在Transformer中也有)。MLPs本质上是一系列线性层或全连接层。 ![](https://upload-images.jianshu.io/upload_images/17294212-62cd677d2febc1ab.png) #### 多层感知机(MLPs) 在人工智能领域找到适用于各种模态的最佳架构之前,MLPs长期以来一直被用于对不同类型的数据进行建模。但可以肯定的是,它们不适合用于序列建模。由于其前馈设计,MLPs无法保留序列中信息的顺序。当数据的顺序丢失时,序列数据就失去了意义。因此,MLPs无法保留信息顺序的这一特性使其不适合用于序列建模。此外,MLPs需要大量参数,这是神经网络不希望具备的另一个特性。 #### 1.2.2 循环神经网络(RNNs) 循环神经网络(RNNs)中存在循环结构,这使得信息能够持续存在。 ![](https://upload-images.jianshu.io/upload_images/17294212-70f578e92a8dc977.png) 在上图中,神经网络的一部分A接收输入$x_t$并输出值$h_t$。循环结构允许信息从网络的一个步骤传递到下一个步骤。循环神经网络可以被看作是同一个网络的多个副本,每个副本都向后续副本传递一条消息。考虑一下如果我们展开这个循环会发生什么: ![](https://upload-images.jianshu.io/upload_images/17294212-3709cb8781214832.png) 这种链式结构表明循环神经网络与序列和列表密切相关。它们是处理这类数据的自然神经网络架构。而且它们确实被广泛应用!在过去几年里,RNNs在应用于各种问题(如语音识别、语言建模、翻译、图像字幕生成等)上取得了巨大成功。 ![](https://upload-images.jianshu.io/upload_images/17294212-55e55d2da2cfb502.png) **长期依赖问题** 假设有一个语言模型试图根据前面的单词预测下一个单词。如果我们要预测句子 “the clouds in the ….” 的下一个单词,我们不需要更多的上下文信息,很明显下一个单词是 “sky”。 在这种相关信息与所需信息之间的差距较小的情况下,RNNs可以学习使用过去的信息,并推断出这个句子的下一个单词。 ![](https://upload-images.jianshu.io/upload_images/17294212-bc5533ffc9f4fb00.png) 但在某些情况下,我们需要更多的上下文信息。例如,假设你试图预测文本 “I grew up in France… I speak fluent …” 的最后一个单词。最近的信息表明下一个单词可能是一种语言,但如果我们想确定是哪种语言,我们需要文本中更前面提到的法国这一上下文信息。 ![](https://upload-images.jianshu.io/upload_images/17294212-04d068d5d9b23122.png) 当相关信息与需要该信息的点之间的差距变得非常大时,RNNs就会变得非常低效。这是因为信息在每个步骤中传递,链条越长,信息在传递过程中丢失的可能性就越大。 那么,RNNs的主要问题是什么呢?它们在自然语言处理(NLP)任务中效率不高,主要有两个原因: 1. 它们按顺序依次处理输入数据。这种循环过程没有利用为并行计算设计的现代图形处理单元(GPUs),因此使得此类模型的训练速度相当缓慢。 2. 当元素之间距离较远时,它们会变得非常低效。这是由于信息在每个步骤中传递,链条越长,信息在传递过程中丢失的可能性就越大。 #### 1.2.3 长短期记忆网络(LSTM) 当安排一天的日历时,我们会优先考虑约会。如果有重要的事情,我们可以取消一些会议来安排重要的事项。 RNNs不会这样做。每当它添加新信息时,它会通过应用一个函数完全转换现有信息。整个信息都被修改,而不会考虑哪些重要哪些不重要。 LSTM通过乘法和加法对信息进行小的修改。通过LSTM,信息通过一种称为细胞状态的机制流动。通过这种方式,LSTM可以有选择地记住或忘记重要和不太重要的事情。 在内部,一个LSTM的结构如下: ![](https://upload-images.jianshu.io/upload_images/17294212-2be2fee62940b2df.png) 每个细胞接收$x_t$(在句子到句子翻译的情况下是一个单词)、前一个细胞状态和前一个细胞的输出作为输入。它对这些输入进行处理,并基于它们生成一个新的细胞状态和一个输出。我不会详细介绍每个细胞的工作机制。 通过细胞状态,在翻译时,句子中对翻译某个单词重要的信息可以从一个单词传递到另一个单词。 **LSTM的问题** 与RNNs通常遇到的问题一样,当句子太长时,LSTM的表现也不太好。这是因为保持与当前正在处理的单词距离较远的单词的上下文的概率会随着距离的增加而呈指数下降。 这意味着当句子很长时,模型常常会忘记序列中较远位置的内容。RNNs和LSTMs的另一个问题是,处理句子的工作很难并行化,因为必须逐个单词地处理。不仅如此,它们也没有对长距离和短距离依赖关系进行建模。 总之,LSTMs和RNNs存在3个问题: 1. 顺序计算抑制了并行化 2. 没有对长距离和短距离依赖关系进行显式建模 3. 位置之间的“距离”是线性的 #### 1.2.4 注意力机制 为了解决其中一些问题,研究人员创造了一种关注特定单词的技术。 当翻译一个句子时,我会特别注意我正在翻译的单词。当我转录音频记录时,我会仔细听我正在记录的片段。如果你让我描述我所在的房间,我会在描述过程中扫视我所描述的物体。 神经网络可以使用注意力机制实现相同的行为,即专注于所给信息的一部分。例如,一个RNN可以关注另一个RNN的输出。在每个时间步,它关注另一个RNN中的不同位置。 为了解决这些问题,注意力机制被应用于神经网络中。对于RNNs,不是仅将整个句子编码在一个隐藏状态中,而是每个单词都有一个相应的隐藏状态,该状态一直传递到解码阶段。然后,在RNN的每个步骤中使用这些隐藏状态进行解码。 ![](https://upload-images.jianshu.io/upload_images/17294212-83b8a4e6d8a36c68.png) 绿色步骤称为编码阶段,紫色步骤称为解码阶段。 其背后的想法是,句子中的每个单词都可能包含相关信息。因此,为了使解码准确,需要使用注意力机制考虑输入的每个单词。 为了在序列转换中为RNNs引入注意力机制,我们将编码和解码分为两个主要步骤。一个步骤用绿色表示,另一个用紫色表示。绿色步骤称为编码阶段,紫色步骤称为解码阶段。 ![](https://upload-images.jianshu.io/upload_images/17294212-973dc95b54e4b0c0.png) 绿色步骤负责从输入创建隐藏状态。与之前使用注意力机制不同,我们不是仅将一个隐藏状态传递给解码器,而是将句子中每个“单词”生成的所有隐藏状态都传递到解码阶段。每个隐藏状态在解码阶段用于确定网络应该关注的位置。 例如,将句子 “Je suis étudiant” 翻译成英语时,解码步骤需要在翻译时关注不同的单词。 ![](https://upload-images.jianshu.io/upload_images/17294212-392fde2fa346828b.png) 这个图展示了将句子 “Je suis étudiant” 翻译成英语时,每个隐藏状态被赋予的权重。颜色越深,与每个单词相关的权重越大。 但是,我们讨论的一些问题,使用注意力机制的RNNs仍然无法解决。例如,无法并行处理输入(单词)。对于大量文本,这会增加翻译文本所需的时间。 **注意力机制的缺点** 1. **顺序训练**:传统的基于LSTM的编码器 - 解码器架构一次处理一个单词,使得训练本质上是顺序的。这限制了训练过程中的并行性,导致训练时间更长。由于其顺序性,扩展到大型数据集变得低效,使得迁移学习不切实际。 2. 因此,模型无法有效地进行微调,每个任务都需要从头开始训练。这导致计算成本更高、训练时间更长和数据需求增加,显著提高了每个训练周期的成本。 ### 1.2.5 卷积神经网络(CNNs) 卷积神经网络(CNNs)在处理序列转换任务时具有显著优势: - **并行性**:CNNs在层的层面很容易实现并行化,这意味着可以同时处理输入的多个部分。与像RNNs这样的顺序模型相比,计算速度更快。 - **局部依赖利用**:CNNs擅长通过卷积滤波器捕捉附近元素(比如句子中的单词)之间的局部模式和关系。这些滤波器专注于输入数据的较小区域。 - **对数距离**:在CNNs中,任何输入和输出元素之间的 “距离” 与层数呈对数关系(log(N))。这意味着与RNNs相比,连接远距离元素所需的操作数量显著减少。在RNNs中,元素之间的距离会随着序列长度(N)线性增长。 一些广为人知的序列转换模型,如WaveNet和ByteNet,都是基于CNN架构构建的。在像WaveNet这样的模型中,每个输入(单词或标记)都独立于前一个输入进行处理,实现了并行处理。这意味着CNNs避免了RNNs的顺序瓶颈,在RNNs中每个单词都依赖于前一个单词。 ![](https://upload-images.jianshu.io/upload_images/17294212-adf33a65b050ba6d.png) 此外,在CNNs中,输出与任何输入之间的 “距离” 大致与网络的深度成正比,约为log(N)。这比RNNs高效得多,在RNNs中距离是线性增长的(N),这使得CNNs在处理序列时速度更快。 然而,CNNs在处理长距离依赖关系方面存在局限性。它们难以有效地对序列中距离较远的单词之间的关系进行建模,尤其是当相距较远的标记所提供的上下文至关重要时。这就是引入Transformers的原因 —— 它们将CNNs的并行性与自注意力机制相结合,能够有效地捕捉局部和全局依赖关系。 ### 1.3 Transformers简介 如原文所述,Transformers的主要架构是左侧有一个编码器,右侧有一个解码器。 ![](https://upload-images.jianshu.io/upload_images/17294212-645e26b6e0b50455.png) *Transformers的主要架构,左边是编码器,右边是解码器。 为了解决并行化问题,Transformers尝试通过将编码器、解码器与注意力模型结合使用来解决该问题。注意力机制提高了模型从一个序列转换到另一个序列的速度。 让我们来看看Transformer是如何工作的。Transformer是一种利用注意力机制来提升速度的模型,更具体地说,它使用的是自注意力机制。 ![Transformer架构](https://upload-images.jianshu.io/upload_images/17294212-456943428e0cd04f.png) 在内部,Transformer具有与上述先前模型类似的架构。但Transformer由六个编码器和六个解码器组成。 有三篇具有开创性的论文为Transformer模型奠定了基础: 1. 《Sequence to Sequence Learning with Neural Networks》 2. 《Neural Machine Translation by Jointly Learning to Align and Translate》 3. 《Attention is All You Need》 ### 1.4 为什么“注意力就是你所需要的一切”? 1. **用自注意力取代LSTM**:自注意力机制的引入取代了基于LSTM的架构,实现了并行化训练,显著加快了训练过程。 2. **稳定的架构**:Transformer架构通过组合几个较小的组件(如位置编码和多头注意力),变得十分强大,从而产生了一种可扩展且可靠的模型设计。 3. **稳定的超参数**:事实证明,原始Transformer架构中使用的超参数随着时间的推移是稳定且具有弹性的。值得注意的是,如今许多基于Transformer的模型仍然使用类似的超参数值,这表明了它们在各种任务和数据集上的稳健性。 ![](https://upload-images.jianshu.io/upload_images/17294212-58270fb63cac4948.png) *注意力机制与其他循环网络架构的对比。Transformer几乎具备神经网络的所有优点。卷积神经网络(ConvNets)与Transformer接近,但它们需要很多层才能实现长距离依赖。* 与其他循环网络架构相比,Transformer几乎具备神经网络的所有优点。卷积神经网络(ConvNets)与Transformer较为接近,但它们需要很多层才能实现长距离依赖。 让我们详细了解一下Transformer架构。 ### 2. Transformer架构 ![](https://upload-images.jianshu.io/upload_images/17294212-3fea59e5c455033b.png) 从根本上说,文本生成的Transformer模型基于预测下一个单词的原理:给定用户输入的文本提示,在这个输入之后最可能出现的下一个单词是什么?Transformer的核心创新和强大之处在于其使用的自注意力机制,这使得它们能够比以前的架构更有效地处理整个序列并捕捉长距离依赖关系。 ![](https://upload-images.jianshu.io/upload_images/17294212-9131bf92bcc3d618.png) 最初,Transformer是为序列转换或神经机器翻译而设计的,它在将输入序列转换为输出序列方面表现出色。它是第一个完全依靠自注意力来计算输入和输出表示的转换模型,而不使用与序列对齐的RNN或卷积。Transformer架构的主要核心特征是它保留了编码器 - 解码器模型。 如果我们把用于语言翻译的Transformer看作一个简单的黑箱,它会接受一种语言(例如英语)的句子作为输入,并输出该句子的翻译(比如英语翻译成其他语言)。 ![](https://upload-images.jianshu.io/upload_images/17294212-f129bd38eb476758.png) *如果把Transformer当作黑箱,它会将一种语言的句子作为输入,输出其翻译。* 如果我们深入探究一下,就会发现这个黑箱主要由两部分组成: - 编码器接收我们的输入,并输出该输入的矩阵表示。例如,英语句子 “How are you?”。 - 解码器接收编码后的表示,并迭代地生成输出。在我们的例子中,就是翻译后的句子 “¿Cómo estás?”。 ![](https://upload-images.jianshu.io/upload_images/17294212-49ec373426803885.png) 然而,实际上编码器和解码器都是由多个层堆叠而成的(两者的层数相同)。所有编码器都具有相同的结构,输入进入每个编码器,并传递到下一个编码器。所有解码器也具有相同的结构,它们从最后一个编码器和前一个解码器获取输入。 原始架构由6个编码器和6个解码器组成,但我们可以根据需要复制任意数量的层。所以,假设编码器和解码器都有N层。 ![](https://upload-images.jianshu.io/upload_images/17294212-3297f85bed51750a.png) 既然我们对Transformer的整体架构有了一个大致的了解,那么让我们把重点放在编码器和解码器上,以便更好地理解它们的工作流程: #### 2.1 嵌入 编码器是Transformer架构的基本组件。编码器的主要功能是将输入的标记转换为上下文相关的表示。与早期独立处理标记的模型不同,Transformer编码器会捕捉每个标记相对于整个序列的上下文信息。 它的结构组成如下: ![](https://upload-images.jianshu.io/upload_images/17294212-8c169ae276b13fc0.png) 文本输入被分割成称为标记(tokens)的较小单元,这些标记可以是单词或子单词。这些标记被转换为称为嵌入(embeddings)的数值向量,嵌入向量能够捕捉单词的语义含义。 #### 2.1.1 输入嵌入 ![](https://upload-images.jianshu.io/upload_images/17294212-43df3792582a013d.png) 假设你想使用Transformer模型生成文本。你输入这样一个提示:“Data visualization empowers users to”。这个输入需要转换为模型能够理解和处理的格式。这就是嵌入的作用:它将文本转换为模型能够处理的数值表示。为了将提示转换为嵌入,我们需要: 1. 对输入进行分词; 2. 获取标记嵌入; 3. 添加位置信息; 4. 最后将标记和位置编码相加,得到最终的嵌入。 让我们看看这些步骤是如何完成的。 ![](https://upload-images.jianshu.io/upload_images/17294212-441cfdd815fad7cb.png) 那么,让我们将其工作流程分解为最基本的步骤: - **步骤1:分词** 分词是将输入文本分解为更小、更易于管理的部分(称为标记)的过程。这些标记可以是一个单词或一个子单词。例如,“Data” 和 “visualization” 分别对应不同的标记,而 “empowers” 这个单词可能会被拆分成两个标记。在训练模型之前,就确定了完整的标记词汇表:GPT-2的词汇表有50,257个独特的标记。现在我们将输入文本分割成具有不同ID的标记,这样就可以从嵌入中获取它们的向量表示。 ![](https://upload-images.jianshu.io/upload_images/17294212-d2535d6d03f6aa49.png) - **步骤2:标记嵌入** 嵌入操作只在最底层的编码器中进行。编码器首先使用嵌入层将输入的标记(单词或子单词)转换为向量。这些嵌入捕捉了标记的语义含义,并将它们转换为数值向量。 所有编码器都接收一个向量列表,每个向量的大小为512(固定大小)。在底层编码器中,这些向量是单词嵌入,但在其他编码器中,它们是其直接下方编码器的输出。 ![](https://upload-images.jianshu.io/upload_images/17294212-10b498376f02466f.png) ![](https://upload-images.jianshu.io/upload_images/17294212-d62ad8389a3d36f0.png) - **步骤3:位置编码** ![](https://upload-images.jianshu.io/upload_images/17294212-1c9287a613ffb004.png) ![](https://upload-images.jianshu.io/upload_images/17294212-8dcfa0d7919a929c.png) ![](https://upload-images.jianshu.io/upload_images/17294212-4b88b9620f7101b1.png) 自注意力机制的最大优点之一是它能够根据特定单词的使用上下文生成动态的上下文嵌入。此外,自注意力的一个主要优势是它允许并行计算所有上下文嵌入,从而能够快速处理大型文档。然而,这种并行处理也带来了一个显著的缺点:自注意力模块无法捕捉句子中单词的顺序。例如,考虑以下两个句子: - Ravi killed the lion. - The lion killed Ravi. 如果你将这两个句子都通过一个自注意力模块,它将无法区分它们,因为它没有捕捉到单词的顺序。 这种局限性可能会导致对句子含义的误解,因为该模块会将单词相同但顺序不同的句子视为相同。在Transformer架构中引入位置编码就是为了解决这个问题。位置编码提供了句子中单词顺序的信息,确保模型理解序列并保持正确的上下文。 解决位置编码问题可以逐步进行。最初,在处理像 “Ravi killed the lion” 这样的句子时,自注意力机制本身并不理解单词的顺序。一个基本的解决方案是给单词分配位置编号(例如,“Ravi” = 1,“killed” = 2),并将这些编号嵌入到单词嵌入中。然而,这会引入几个问题: 1. **数字的无界增长**:较大的位置编号(例如书中的100,000)会使神经网络训练不稳定,导致梯度消失或梯度爆炸等问题。即使对这些数字进行归一化处理,也会在不同长度的句子之间产生不一致性。 2. **离散数字**:神经网络难以处理离散数字,因为它们更适合处理平滑、连续的值。离散值在训练过程中可能会导致数值不稳定。 3. **无法捕捉相对位置**:这种方法只捕捉了绝对位置,却无法理解单词之间的相对距离,而这在自然语言处理任务中至关重要。 为了解决这些问题,需要一个有界、连续且周期性的函数,使模型能够有效地捕捉绝对位置和相对位置。这就引出了位置编码的概念。 为此,研究人员建议使用各种正弦和余弦函数的组合来创建位置向量,这样就可以将这种位置编码器用于任何长度的句子。 在这种方法中,每个维度由波的独特频率和偏移表示,值的范围从 -1到1,有效地表示每个位置。 - **步骤4:最终嵌入** 最后,我们将标记编码和位置编码相加,得到最终的嵌入表示。这种组合表示既捕捉了标记的语义含义,又捕捉了它们在输入序列中的位置信息。 ![](https://upload-images.jianshu.io/upload_images/17294212-cc8d1b9e5e6d984f.png) ### 2.2 编码器 #### 编码器层堆栈 Transformer编码器由一堆相同的层组成(在原始的Transformer模型中有6层)。这个层数是通过实验确定的,在各种任务中都能给出最佳结果。 ![](https://upload-images.jianshu.io/upload_images/17294212-2b464484a39dbe8b.png) 编码器层的作用是将所有输入序列转换为连续的抽象表示,这种表示封装了从整个序列中学到的信息。该层包含两个子模块: ![](https://upload-images.jianshu.io/upload_images/17294212-c896e008a6eeef61.png) - 多头注意力机制 - 全连接网络 但这些模块是如何协同工作的呢?编码器模块的实际架构还包括额外的组件,如加法与归一化层以及残差连接。这些组件确保信息在通过每个模块时能保持流畅传递。 输入数据(通常是一批句子)进入第一个编码器模块,经过处理后,输出会传递到下一个编码器模块。这个过程会在所有六个编码器模块中依次进行,最终输出被传递到解码器。每个模块对数据的处理方式相似,这使得整个架构高效且结构有序。 ![](https://upload-images.jianshu.io/upload_images/17294212-91207e767f4568dd.png) 简而言之,它在每个子层周围都采用了残差连接,然后进行层归一化。 #### 2.2.1 多头自注意力 ![](https://upload-images.jianshu.io/upload_images/17294212-322807d8f38834c1.png) 自注意力机制使模型能够聚焦于输入序列的相关部分,从而捕捉数据中的复杂关系和依赖。下面让我们逐步了解这种自注意力是如何计算的。 1. **查询、键和值矩阵**:每个词元的嵌入向量会被转换为三个向量:查询(Query,Q)、键(Key,K)和值(Value,V)。这些向量是通过将输入嵌入矩阵与为Q、K和V学习到的权重矩阵相乘得到的。这里有一个网络搜索的类比,可以帮助我们理解这些矩阵背后的含义: - 查询(Q)是你在搜索引擎栏中输入的搜索文本,也就是你想要 “查找更多相关信息” 的词元。 - 键(K)是搜索结果窗口中每个网页的标题,它代表了查询可以关注的可能词元。 - 值(V)是显示的网页实际内容。一旦我们将合适的搜索词(查询)与相关结果(键)匹配,我们就希望获取最相关网页的内容(值)。 通过使用这些QKV值,模型可以计算注意力分数,这些分数决定了在生成预测时每个词元应受到的关注程度。 ![](https://upload-images.jianshu.io/upload_images/17294212-adb2778640f33a76.png) 第一个自注意力模块使模型能够从整个序列中捕捉上下文信息。它不是执行单一的注意力函数,而是将查询、键和值进行h次线性投影。在这些投影后的查询、键和值上并行执行注意力机制,从而产生h维的输出值。详细的架构如下: ![](https://upload-images.jianshu.io/upload_images/17294212-8ddab39f2fbbeef4.png) 2. **矩阵乘法(MatMul)——查询与键的点积**:一旦查询、键和值向量通过线性层,就会在查询和键之间进行点积矩阵乘法,从而创建一个分数矩阵。 分数矩阵确定了每个词对其他词应给予的关注程度。因此,在同一时间步内,每个词都会被赋予一个与其他词相关的分数,分数越高表示关注程度越高。这个过程有效地将查询映射到它们相应的键。 ![](https://upload-images.jianshu.io/upload_images/17294212-36c071313c6f314b.png) 3. **降低注意力分数的幅度**:然后,分数会除以查询和键向量维度的平方根来进行缩放。这一步是为了确保梯度更稳定,因为值的乘法可能会导致过大的影响。 ![](https://upload-images.jianshu.io/upload_images/17294212-24853efcac375bf9.png) 4. **对调整后的分数应用Softmax函数**:随后,对调整后的分数应用Softmax函数以获得注意力权重,结果是得到0到1之间的概率值。Softmax函数会突出较高的分数,同时抑制较低的分数,从而增强模型有效确定哪些词应受到更多关注的能力。 ![](https://upload-images.jianshu.io/upload_images/17294212-54fc8abe110c4343.png) 5. **将Softmax结果与值向量相结合**:注意力机制的下一步是将Softmax函数得到的权重与值向量相乘,得到一个输出向量。在这个过程中,只有Softmax分数高的词会被保留。最后,这个输出向量会被输入到一个线性层进行进一步处理,这样我们最终就得到了注意力机制的输出! 你可能会好奇,为什么它被称为多头注意力呢?还记得在所有过程开始之前,我们将查询、键和值分解了h次吧。这个被称为自注意力的过程,会在这些较小的阶段或 “头” 中分别进行。每个头独立发挥作用,生成一个输出向量。这些输出向量会通过一个最终的线性层,就像一个过滤器,对它们的综合性能进行微调。这里的美妙之处在于每个头的学习具有多样性,丰富了编码器模型,使其拥有强大且多方面的理解能力。 #### 2.2.2 归一化和残差连接 ![](https://upload-images.jianshu.io/upload_images/17294212-ff87da6091e0ccd2.png) 编码器层中的每个子层之后都会进行归一化步骤。此外,每个子层的输出会与其输入相加(残差连接),这有助于缓解梯度消失问题,使得模型可以构建得更深。在经过前馈神经网络之后,也会重复这个过程。 #### 2.2.3 前馈神经网络 ![](https://upload-images.jianshu.io/upload_images/17294212-78f59be4c8a85e24.png) 归一化后的残差输出会继续通过逐点前馈网络,这是进一步优化的关键阶段。可以将这个网络想象成由两个线性层组成,中间嵌入一个ReLU激活函数,就像一座桥梁。处理后的输出会回到起点,与逐点前馈网络的输入合并。合并之后会进行另一轮归一化,确保一切都调整到位,为后续步骤做好准备。 #### 2.2.4 编码器的输出 最终编码器层的输出是一组向量,每个向量都代表了对输入序列有着丰富上下文理解的结果。这个输出随后会作为Transformer模型中解码器的输入。这种精心的编码为解码器铺平了道路,引导它在解码时关注输入中正确的词。可以把它想象成建造一座塔,你可以堆叠N个编码器层。这个堆叠中的每一层都有机会探索和学习注意力的不同方面,就像知识的不同层次。这不仅使理解更加多样化,还能显著增强Transformer网络的预测能力。 ### 2.3 解码器 解码器的主要作用是生成文本序列。与编码器类似,解码器也配备了一组相似的子层。它有两个多头注意力层、一个逐点前馈层,并且在每个子层之后都采用了残差连接和层归一化。这些组件的功能与编码器的层类似,但有一个关键的不同点:解码器中的每个多头注意力层都有其独特的任务。 ![](https://upload-images.jianshu.io/upload_images/17294212-f49914b15d4c3346.png) 解码器的最后一个步骤包括一个作为分类器的线性层,顶部还有一个Softmax函数,用于计算不同单词的概率。Transformer解码器具有专门设计的结构,通过逐步解码编码信息来生成输出。 需要注意的是,解码器是以自回归的方式工作的,它会以一个起始词元开始。它巧妙地将之前生成的输出列表作为输入,同时结合编码器输出中包含的来自初始输入的丰富注意力信息。这种解码的顺序过程会一直持续,直到解码器生成一个表示输出创建结束的词元。 #### 2.3.1 输出嵌入 在解码器的起始阶段,这个过程与编码器类似。在这里,输入首先会通过一个嵌入层。 #### 2.3.2 位置编码 与编码器类似,在嵌入之后,输入会经过位置编码层,这个序列旨在生成位置嵌入。然后,这些位置嵌入会被输送到解码器的第一个多头注意力层,在那里会精心计算特定于解码器输入的注意力分数。 #### 2.3.3 解码器层堆栈 解码器由一堆相同的层组成(在原始Transformer模型中有6层)。每层有三个主要子组件: ![](https://upload-images.jianshu.io/upload_images/17294212-59f8446570116e47.png) 1. **掩码自注意力机制**:这与编码器中的自注意力机制类似,但有一个关键区别:它防止当前位置关注后续位置,这意味着序列中的每个词不会受到未来词元的影响。例如,在计算单词 “are” 的注意力分数时,“are” 不能 “看到” 序列中后续的单词 “you”。这种掩码确保了对特定位置的预测只能依赖于该位置之前的已知输出。 2. **编码器 - 解码器多头注意力或交叉注意力**: ![](https://upload-images.jianshu.io/upload_images/17294212-2e7386e94a39e248.png) 在解码器的第二个多头注意力层中,我们可以看到编码器和解码器组件之间独特的相互作用。在这里,编码器的输出同时充当查询和键,而解码器第一个多头注意力层的输出则作为值。这种设置有效地将编码器的输入与解码器的输入对齐,使解码器能够识别并突出编码器输入中最相关的部分。之后,这个第二层多头注意力的输出会通过一个逐点前馈层进行优化,进一步提升处理效果。在这个子层中,查询来自前一个解码器层,键和值来自编码器的输出。这使得解码器中的每个位置都能关注输入序列中的所有位置,有效地将编码器中的信息与解码器中的信息整合在一起。 3. **前馈神经网络**:与编码器类似,每个解码器层都包括一个全连接的前馈网络,该网络分别且相同地应用于每个位置。 #### 2.3.4 用于生成输出概率的线性分类器和Softmax 数据在Transformer模型中的处理过程,最终会通过一个作为分类器的最终线性层。这个分类器的大小与涉及的类别总数(词汇表中包含的单词数量)相对应。例如,在一个有1000个不同类别代表1000个不同单词的场景中,分类器的输出将是一个包含1000个元素的数组。然后,这个输出会被输入到一个Softmax层,该层将其转换为一系列概率分数,每个分数都在0到1之间。这些概率分数中最高的那个至关重要,其对应的索引直接指向模型预测的序列中的下一个单词。 ![](https://upload-images.jianshu.io/upload_images/17294212-e025bd37a15e3b9d.png) #### 2.3.5 归一化和残差连接 每个子层(掩码自注意力、编码器 - 解码器注意力、前馈网络)之后都会进行归一化步骤,并且每个子层都包含一个围绕它的残差连接。 ![](https://upload-images.jianshu.io/upload_images/17294212-3ce20f00331907c8.png) #### 2.3.6 解码器的输出 最后一层的输出会被转换为预测序列,通常是通过一个线性层,然后接一个Softmax函数,以生成词汇表上的概率。在操作流程中,解码器会将新生成的输出合并到其不断增长的输入列表中,然后继续进行解码过程。这个循环会一直重复,直到模型预测出一个特定的词元,表示完成。概率最高的预测词元被指定为最终类别,通常由结束词元表示。 请再次记住,解码器并不局限于单层。它可以由N层构成,每一层都基于从编码器和前序层接收到的输入进行构建。这种分层架构使模型能够分散其关注点,并在其注意力头之间提取不同的注意力模式。这样的多层方法可以显著提高模型的预测能力,因为它对不同的注意力组合有了更细致的理解。最终的架构与原文中的类似: ![](https://upload-images.jianshu.io/upload_images/17294212-8a8870205c5b0697.png) ### 3. LLM架构 机器学习(ML)中的架构指的是模型中神经元和层的排列方式。它就像一个蓝图,勾勒出模型将如何从数据中学习。不同的架构捕捉数据中的不同关系,并在训练过程中突出特定的组件。因此,架构会影响模型擅长的任务以及它生成的输出质量。 #### 3.1 Seq-2-Seq模型(编码器 - 解码器) ![](https://upload-images.jianshu.io/upload_images/17294212-794f4f8dbecd6cab.png) 编码器 - 解码器由两个组件组成: - **编码器**:接受输入数据,并将其转换为抽象的连续表示,捕捉输入的主要特征。 - **解码器**:将连续表示转换为可理解的输出,同时吸收其先前的输出。 编码和解码过程使模型能够通过更高效的数据表示来处理复杂的语言任务,这有助于模型连贯地做出响应。这种双过程架构在生成任务中表现出色,如机器翻译(将同一句话从一种语言转换为另一种语言)和文本摘要(总结文本中的相同关键点),在这些任务中,在生成输出之前理解整个输入至关重要。然而,由于需要先处理整体输入,它在推理时可能会较慢。 - **LLM示例**:谷歌的T5、Flan-UL2和Flan-T5;Meta的BART。 #### 3.2 自动编码模型(仅限编码器) ![](https://upload-images.jianshu.io/upload_images/17294212-2cc9abdc462093a6.png) 像广为人知的BERT(《Pre-training of Deep Bidirectional Transformers for Language Understanding》,2018年)和RoBERTa(《A Robustly Optimized BERT Pretraining Approach》,2018年)这样的模型,使用仅限编码器的架构,将输入转换为丰富的上下文相关表示,而不直接生成新的序列。例如,BERT通过两种创新方法在大量文本语料库上进行预训练:掩码语言建模(MLM)和下一句预测。MLM的工作方式是在句子中隐藏随机词元,并训练模型根据上下文预测这些词元。通过这种方式,模型理解了词在左右上下文中的关系。这种 “双向” 理解对于需要强大语言理解能力的任务至关重要,如句子分类(例如情感分析)或填空。 但是,与能够解释和生成文本的编码器 - 解码器模型不同,它们本身并不生成长文本序列,而是更专注于解释输入。 - **LLM示例**:谷歌的BERT和ALBERT;Meta的RoBERTa;微软的DeBERTa。 #### 3.3 自回归模型(仅解码器) ![](https://upload-images.jianshu.io/upload_images/17294212-b06b5d3160e63809.png) 仅解码器架构根据先前的上下文生成输入序列的下一部分。与基于编码器的模型不同,它们无法理解整个输入,但在生成下一个可能的单词方面表现出色。因此,仅解码器模型在输出上更具 “创造性” 和 “开放性”。这种逐个词元的输出生成方式对于文本生成任务非常有效,如创意写作、对话生成和故事完成。 - **LLM示例**:OpenAI的GPT-4和GPT-3系列;谷歌的PaLM和Bard;Meta的LLaMA和OPT。 #### 3.4 专家混合(MoE) 像Mistral 8x7B等采用的MoE,与传统Transformer模型不同,它基于这样的观察:一个单一的整体语言模型可以分解为更小的、专门的子模型。一个门控网络在这些子模型之间分配任务(例如切换输入词元),协调这些专注于输入数据不同方面的子模型。 这种方法实现了扩展(高效计算和资源分配)和多样化的技能,这使得MoE在处理具有不同要求的复杂任务方面表现出色。这种架构的目的是在不相应增加计算成本的情况下,增加LLM的参数数量。那么,Mistral 8x7B被认为是LLM吗?尽管它在架构上与Transformer模型不同,但由于几个原因,它仍然符合LLM的标准: - **模型大小**:它巨大的规模和参数数量 —— 1870亿个参数,使其在复杂性和容量上与其他LLM相当。 - **预训练**:与其他LLM一样,Mistral 8x7B通过无监督学习技术在综合数据集上进行预训练,使其能够理解和模仿类似人类的语言模式。 - **多功能性**:它在各种任务中表现出色,展示了LLM广泛的能力范围。 - **适应性**:与其他LLM一样,Mistral 8x7B也可以针对特定任务进行微调,提高性能。 ### 4. 推理 现在我们已经介绍了Transformer的架构,并详细了解了其组件,是时候讨论推理实际上是如何执行的了。我们已经训练了Transformer模型,现在在预测阶段,其架构的行为与训练期间略有不同。 ![](https://upload-images.jianshu.io/upload_images/17294212-795ab0ebe06573d8.png) ![](https://upload-images.jianshu.io/upload_images/17294212-45d23f1381fa845f.png) ![](https://upload-images.jianshu.io/upload_images/17294212-a2ac2a1030dc4d4e.png) ![](https://upload-images.jianshu.io/upload_images/17294212-246d99ce0b45c556.png) #### 训练和推理的主要区别 - **训练**:训练Transformer模型是为了学习输入数据中的模式和关系(例如语言建模、翻译等)。 - **推理**:使用训练好的Transformer模型进行预测,如生成文本、翻译语言或对文本进行分类。 在推理过程中,主要的区别出现在解码器中。与训练不同,在训练时我们已经知道整个输出句子,可以一次性将所有词元传递给解码器,使其以非自回归的方式运行;而在推理时,我们事先不知道完整的输出句子。因此,解码器必须以自回归的方式一次生成一个翻译单词。它使用每个先前预测的单词来帮助预测序列中的下一个单词,这个过程会一直持续,直到模型生成整个翻译后的句子。 #### 推理过程中的数据流向 1. 输入序列被转换为嵌入(带有位置编码)并输入到编码器中。 2. 编码器堆栈对其进行处理,并生成输入序列的编码表示。 3. 我们不使用目标序列,而是使用一个仅包含句子起始词元的空序列。将其转换为嵌入(带有位置编码)并输入到解码器中。 4. 解码器堆栈结合编码器堆栈的编码表示对其进行处理,以生成目标序列的编码表示。 5. 输出层将其转换为单词概率并生成输出序列。 6. 我们取输出序列的最后一个单词作为预测单词。这个单词现在被填充到解码器输入序列的第二个位置,此时解码器输入序列包含一个句子起始词元和第一个单词。 7. 回到步骤3。像之前一样,将新的解码器序列输入到模型中。然后取输出的第二个单词并将其附加到解码器序列中。重复这个过程,直到它预测出一个句子结束词元。请注意,由于编码器序列在每次迭代中都不会改变,我们不必每次都重复步骤1和步骤2。 ![](https://upload-images.jianshu.io/upload_images/17294212-4d70594516ed47bc.png) #### 4.1 推理技术 Transformer可以通过一次输入一个词元序列来进行推理。编码器用于处理输入序列并生成嵌入序列。解码器用于一次生成一个词元的输出序列。解码器使用编码器的输出和先前生成的词元来生成下一个词元。Transformer可以使用不同的推理策略,如贪婪搜索和束搜索。 #### 4.1.1 贪婪搜索 贪婪搜索是一种简单的推理策略。在每个时间步,解码器根据其模型生成概率最高的词元。这个过程会一直重复,直到解码器生成一个序列结束词元。贪婪搜索速度快,但可能会陷入局部最优解。 ![](https://upload-images.jianshu.io/upload_images/17294212-79fa010314f8a326.png) #### 4.1.2 束搜索 束搜索是一种更复杂的推理策略。在每个时间步,解码器生成一组词元,束的大小是一个超参数。然后解码器从这组词元中选择前k个词元,并继续从这些词元中生成词元。这个过程会一直重复,直到解码器生成一个序列结束词元。束搜索比贪婪搜索慢,但可以生成更多样化和准确的输出 ![](https://upload-images.jianshu.io/upload_images/17294212-1676b4e96ebac535.png) ### 5. Transformer推理优化 Transformer模型以其自注意力机制而闻名,在自然语言处理和计算机视觉等任务中至关重要。推理,即这些模型对未见过的数据生成预测的阶段,需要大量的计算资源。 影响Transformer推理的一个关键因素是浮点运算次数(FLOPs)。每一层都涉及矩阵乘法,对于像GPT-3这样的大型模型,每个令牌可能需要数万亿次的FLOPs。为了减少计算开销,人们使用键值(KV)缓存技术,使模型能够重用先前计算的注意力向量,加快自回归解码速度。 内存使用是另一个限制因素,像GPT-3这样的模型需要超过200GB的内存。量化和并行计算等技术有助于更有效地管理这些资源,但Transformer推理通常仍然受限于内存,即内存带宽限制了计算速度。 #### 5.1 Transformer架构和推理流程 Transformer的核心架构基于自注意力机制和一系列堆叠层,每一层都包含注意力和前馈网络。在推理过程中,Transformer应用预训练的参数进行预测,在像GPT这样的自回归模型中通常是逐个令牌进行预测。 推理涉及多个矩阵运算,特别是每个注意力层中的矩阵 - 向量乘法。对于每个新令牌,模型通过将输入嵌入与学习到的权重矩阵相乘来计算查询(Q)、键(K)和值(V)向量。 注意力机制通过将查询与转置的键矩阵相乘、将结果除以维度大小的平方根并应用softmax函数来计算相关性分数。这个过程使模型能够权衡序列中每个令牌的重要性。虽然非常有效,但这些矩阵乘法在计算上成本高昂,特别是在像GPT-3或LLaMA这样的大型模型中,每个注意力头每个令牌都要执行数十亿次的FLOPs。 #### 5.2 Transformer推理的阶段:预填充和解码 Transformer推理分为两个关键阶段:预填充和解码。这些阶段决定了模型如何处理输入令牌和生成输出令牌,每个阶段对性能的影响各不相同。 1. **预填充阶段**:在预填充阶段,模型并行处理整个输入序列,将令牌转换为键值对。这个阶段计算量很大,但具有高度的并行性,能够有效利用GPU。操作主要涉及矩阵 - 矩阵乘法,使GPU能够同时处理多个令牌。预填充在批处理中表现出色,可以一起处理大量数据,最大限度地减少延迟。 2. **解码阶段**:解码阶段更多地受限于内存且是顺序进行的,一次生成一个令牌。每个新令牌都依赖于先前生成的令牌,需要进行矩阵 - 向量乘法,与预填充阶段的并行性质相比,这对GPU的利用率较低。顺序过程会引入延迟瓶颈,使得这个阶段明显较慢,特别是在像GPT-3这样的大型模型中。 ![](https://upload-images.jianshu.io/upload_images/17294212-178c427c22d106e9.png) 键值(KV)缓存是解码阶段的一项关键优化。通过存储先前计算的键值矩阵,模型避免了重新计算,将复杂度从二次降低到线性。 ![](https://upload-images.jianshu.io/upload_images/17294212-f3afebbfa99723d9.png) ### 6. Transformer推理中的挑战 大型Transformer模型,特别是像GPT-3这样的大型语言模型(LLMs),由于其规模和计算需求,在推理过程中带来了一些挑战。这些挑战围绕着内存限制、延迟以及内存受限和计算受限操作之间的平衡。 1. **内存和计算需求**:在推理过程中存储模型权重和键值(KV)缓存需要大量内存。像GPT-3这样拥有1750亿参数的大型模型,通常需要超过200GB的内存。此外,KV缓存的大小会随着序列长度和批量大小线性增长,进一步增加了内存负担。例如,一个有70亿参数且序列长度为4096的LLaMA模型,仅KV缓存就可能消耗约2GB的内存。 2. **顺序令牌生成中的延迟**:延迟是一个关键问题,特别是在解码阶段,令牌是逐个生成的。每个新令牌都依赖于前一个令牌,这导致了顺序操作,无法充分利用GPU的计算能力。即使是经过高度优化的模型也会受到内存带宽瓶颈的影响,随着序列长度的增加,这种影响会更加明显。 3. **批量大小和性能的平衡**:较大的批量大小可以提高GPU的利用率,特别是在预填充阶段,但会受到内存容量的限制。增加批量大小有助于最大化吞吐量,但当系统受限于内存时,就会达到极限。超过这个极限,系统可能会出现收益递减的情况,因为内存带宽开始限制进一步的性能提升。 4. **内存受限与计算受限操作的权衡**:Transformer推理在内存受限和计算受限操作之间交替进行。在解码阶段,矩阵 - 向量乘法通常受限于内存,而预填充阶段的矩阵 - 矩阵操作往往受限于计算。有效优化批量大小、KV缓存管理和精度(例如FP16、INT8)对于减少延迟和确保GPU的高效使用至关重要。 ### 7. 用于更快推理的优化技术 随着像GPT-3、LLaMA和其他大型语言模型(LLMs)等Transformer模型的不断扩展,优化技术对于管理推理过程中增加的内存、计算负载和延迟变得至关重要。通过应用量化、键值(KV)缓存、推测解码、批处理和并行计算等技术,开发人员可以显著提高推理性能。 #### 7.1 量化 ![](https://upload-images.jianshu.io/upload_images/17294212-e4fb60e35f7a59b3.png) 量化降低了模型权重和激活值的精度,从而实现更快的计算和更低的内存使用。模型可以使用8位(INT8)甚至更低的精度,而不是依赖32位或16位浮点精度,这减少了内存带宽,使模型能够更有效地处理更大的批量或更长的序列。 ![](https://upload-images.jianshu.io/upload_images/17294212-f40238d7b582d501.png) 内存带宽利用率(MBU)公式显示了内存带宽如何限制性能,参数数量、每个参数的字节数和每秒令牌数都会影响推理速度。 例如,对GPT-3应用INT8量化可以使内存需求降低多达50%,直接导致推理期间的延迟更低和吞吐量更高。量化对于受内存带宽限制的模型特别有用。 ![](https://upload-images.jianshu.io/upload_images/17294212-9e6c3a79d18f7a6b.png) #### 7.2 键值(KV)缓存 在自回归模型中,每个新令牌的生成都需要访问所有先前的令牌。随着序列长度的增长,这会导致计算量呈二次方增加。KV缓存通过存储先前令牌的键和值张量来缓解这个问题,使模型能够重用它们而无需重新计算。 KV缓存的大小会随着令牌数量、层数和注意力头数线性增长。例如,在LLaMA 7B模型中,4096个令牌的序列长度将需要大约2GB的内存用于KV缓存。这种优化显著减少了解码阶段的计算负载,提高了速度和内存效率。 #### 7.3 推测解码 推测解码是一种先进的优化技术,通过并行化令牌生成来减少延迟。它不是等待每个令牌按顺序处理,而是使用一个较小的草稿模型提前预测几个令牌,然后用主模型验证这些预测。如果预测准确,就接受它们;如果不准确,就丢弃。 这种方法允许并行执行,在保持准确性的同时减少了生成令牌所需的总时间。它对于实时应用(如聊天机器人)特别有用,因为快速的响应时间至关重要。 #### 7.4 批处理 批处理是一种简单而强大的优化Transformer推理的技术。通过同时处理多个输入,批处理提高了GPU的利用率,因为模型权重的内存成本可以在多个请求之间共享。然而,批处理受限于可用内存,特别是在处理长序列的模型中。 传统批处理的一个挑战是,批处理中的不同请求可能会生成不同数量的输出令牌。这可能会导致效率低下,因为所有请求都必须等待最长的请求完成。为了解决这个问题,动态批处理允许系统立即从批处理中移除已完成的请求,为新请求释放资源。 #### 7.5 硬件优化:并行性 ![](https://upload-images.jianshu.io/upload_images/17294212-3ac6eb765344cb93.png) 硬件优化,特别是张量并行和流水线并行,对于扩展大型模型至关重要。这些方法将计算负载分布到多个GPU上,使系统能够处理超出单个GPU内存容量的模型。 - **张量并行**:这种技术将模型的参数分割到多个GPU上,使它们能够并行处理相同输入的不同部分。张量并行在注意力层特别有效,不同的注意力头可以独立计算。 - **流水线并行**:这种方法将模型划分为顺序的块,每个块由不同的GPU处理。流水线并行减少了每个GPU的内存占用,使更大的模型能够高效运行。然而,它会在GPU之间引入一些空闲时间,因为需要等待前一阶段的数据。 这两种并行方式对于管理像GPT-3和LLaMA这样的大型模型至关重要,因为它们的内存和计算需求通常超出了单个GPU的能力。 #### 7.6 FlashAttention和内存效率 另一项关键进展是FlashAttention,它通过减少数据在内存中加载和存储的次数来优化内存访问模式。FlashAttention利用GPU内存层次结构更高效地执行计算,融合操作并最小化数据移动。这种技术可以显著提高速度,特别是在具有长序列长度的模型中,通过减少内存浪费并支持更大的批量大小来实现。 ### 8. 对推理性能进行基准测试 对GPT-3和LLaMA的基准测试说明了这些优化的影响。对于GPT-3,与未优化的模型相比,KV缓存和量化的组合已被证明可以将推理时间减少多达60%,吞吐量达到每秒数百个令牌。在LLaMA中,并行技术的使用确保即使是最大的模型,如LLaMA 65B,也能在控制延迟的同时保持高吞吐量。 这些优化使这两种模型都能有效地扩展,确保它们能够处理从长上下文生成到实时响应的实际应用,同时显著降低计算和内存需求。 #### 8.1 Transformer推理的趋势 随着Transformer模型在规模和复杂性上不断增长,优化推理对于满足实际应用的需求至关重要。下一波创新集中在高效扩展Transformer模型、改进内存管理以及利用先进的硬件能力上。以下是一些最具影响力的趋势,它们正在塑造Transformer推理的未来。 #### 8.1.1 使用分页(Paging)和FlashAttention进行内存优化 一个关键趋势是通过PagedAttention和FlashAttention等技术优化内存使用。在当前的推理过程中,模型通常会过度分配内存以处理可能的最大序列长度,这导致了效率低下。PagedAttention通过按需分配内存来解决这个问题,将键值(KV)缓存分解为按需获取的较小块。 FlashAttention通过优化计算顺序和减少内存与计算单元之间的数据移动,进一步提高了内存效率。通过融合操作并利用GPU内存层次结构,FlashAttention可以显著减少内存浪费,并支持更大的批量大小和更快的处理速度。这些进展对于扩展大型模型同时保持高性能至关重要。 #### 8.1.2 多查询和分组查询注意力 优化注意力机制本身是另一个重要趋势。多查询注意力(MQA)和分组查询注意力(GQA)是两种变体,它们在保持模型性能的同时减少了内存占用。在MQA中,所有头共享相同的键值对,这减少了KV缓存的大小,同时保持了准确性。 分组查询注意力(GQA)在MQA和传统多头注意力之间取得平衡,为分组的头使用共享的键值对。这种方法进一步减少了内存使用,同时保持了高性能,使其对于像LLaMA 2 70B这样的长上下文模型特别有用。 #### 8.1.3 并行性:张量和序列 并行性仍然是扩展大型模型的核心策略。张量并行将模型层划分为可以在多个GPU上处理的独立块,减少了单个设备上的内存负担。这种方法在注意力头和前馈层中效果很好,并行处理可以显著提高效率。 序列并行通过在序列维度上分割像LayerNorm和Dropout这样的操作,进一步提高了内存效率。这减少了内存开销,特别是对于长序列任务,并使模型能够更有效地扩展。 #### 8.1.4 实时应用程序的推测推理 对于实时应用,推测推理提供了一种创新的方法来减少延迟。通过使用较小的草稿模型提前预测多个令牌,推测推理允许并行执行。然后,主模型验证这些草稿令牌,决定接受或丢弃它们。 ### 9. 处理大型数据集 在大型数据集上训练Transformer带来了独特的挑战,需要谨慎的策略: #### 9.1 高效的数据加载和预处理 - **并行数据加载**:利用像TensorFlow的tf.data或PyTorch的DataLoader这样的框架,并结合多线程,可以加快数据预处理速度。 - **打乱和批处理**:适当的打乱可以防止模型过度拟合特定的数据顺序,批处理则确保GPU的高效利用。 #### 9.2 分布式训练 - **数据并行**:将模型复制到多个GPU上,每个GPU处理不同的小批量数据,并聚合梯度。 - **模型并行**:将模型本身分割到多个GPU上,这对于无法装入单个设备内存的非常大的模型很有用。 #### 9.3 混合精度训练 利用16位(半精度)浮点运算而不是32位,可以显著减少内存使用并加快计算速度,同时对准确性的影响较小。 #### 9.4 梯度累积 在GPU内存限制批量大小的情况下很有用。在执行优化器步骤之前,在多个较小的批量上累积梯度。 #### 9.5 检查点和恢复 在训练期间定期保存模型状态有助于在出现故障时从上一个检查点恢复,也可用于提前停止训练和微调。 #### 9.6 数据增强和采样 - **数据增强技术**:增加数据的可变性,有助于模型泛化。 - **智能采样策略**:确保模型不会过度拟合常见模式,同时不会忽略罕见但重要的模式。 ### 10. 总结 本文深入探讨了大型语言模型(LLMs)的开发和优化,首先概述了它们的构建和训练方法。它追溯了从Transformer之前的模型到Transformer的变革性引入的演变,强调了关键的 “注意力就是你所需要的一切” 这一概念。 文章的核心剖析了Transformer架构,详细介绍了其组件,如嵌入层、编码器 - 解码器交互和自注意力机制。它探索了各种LLM架构,包括Seq-2-Seq、自动编码和自回归模型,揭示了它们的独特功能。 对于实际部署,文章研究了推理策略、优化技术,如量化、KV缓存、推测解码和硬件并行性,并以GPT-3和LLaMA等实际例子进行说明。性能基准测试、内存优化和并行技术突出了高效Transformer推理的趋势。 本文由[mdnice](https://mdnice.com/?platform=6)多平台发布
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容