微信扫码
与创始人交个朋友
我要投稿
阿里妹导读
本篇是作者从开发人员的视角,围绕着大模型正向推理过程,对大模型的原理的系统性总结,希望对初学者有所帮助。
引言
什么是人工智能?
清华大学出版社出版的《人工智能概论》中提出,人工智能是对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但它能像人那样思考,也可能超过人的智能。
基于这个设想,人工智能应当能够执行通常需要人类智能的任务,如视觉感知、语音识别、决策和语言翻译等工作。就像人一样,可以看见、听见、理解和表达。这涉及了众多人工智能的分支学科,如计算机视觉(CV)、自然语言处理(NLP)、语音识别(VC)、知识图谱(KG)等。
NLP语言模型的发展,引自《A Survey of Large Language Models》
NLP作为其中之一,其发展历经了多个阶段。在统计语言模型阶段,模型利用马尔科夫假设学会了如何进行预测。在神经语言模型的阶段,我们通过词嵌入的向量表示让模型开始理解词的语义,并通过神经网络模型给人工智能装上了神经元,让模型开始“思考”。在预训练语言模型阶段,我们通过预训练告诉语言模型,要先学习走路再去跑。而在如今的大语言模型阶段,我们基于扩展法则认识到了了力大砖飞的重要性,并收获了各种涌现能力的惊喜,为AGI的发展立下了一个新的里程碑。
如今大模型已经带领NLP 领域走向了全新的阶段,并逐步向其他AI领域扩展。LangChain的2024年Agent调研报告显示,51.1%的企业已经在生产中使用Agent,78.1%的企业有计划将Agent投入生产,AI的浪潮已经席卷而来。并且AI发展的步伐还在加快。模型方面,OpenAI在2024年12月的发布会上,推出了o1专业版,凭借其在后训练阶段的深度推理,使得模型在数学、编程、博士级问题上达到了人类专家的水平,相比于此前的大模型达到了断层领先,近期国内Qwen推出了QwQ模型,月之暗面的KIMI推出了KIMI探索版,也都具有深度推理能力,国内外AI上的差距正在逐步缩短。应用方面,各家都在大力发展多模态AI,Sora、可灵等,让视频创意的落地成本从数十万元降低到了几十元,VLM的加持下的端到端自动驾驶也在大放异彩。
总而言之,我们仍然处在第四次科技革命的起点,业内预测在2025年我们可能会见证AGI(通用人工智能)的落地,并且还提出了ASI(超级人工智能)的概念,认为人类可能创造出在各个方面都超越人类智能的AI,AI很有可能带领人类进入新的时代。
目光放回到大模型本身,对于开发人员而言,大模型的重要性,不亚于JAVA编程语言。大模型的推理原理,就像JVM虚拟机原理一样,如果不了解,那么在使用大模型时难免按照工程化的思维去思考,这样常常会遇到困难,用不明白大模型。比如为什么模型不按照提示词的要求输出,为什么大家都在用思维链。
而本篇是作者从开发人员的视角,围绕着大模型的正向推理过程,对大模型的原理的系统性总结,希望对像我一样的初学者有所帮助。文中会引入部分论文原文、计算公式和计算过程,同时会添加大量例子和解释说明,以免内容晦涩难懂。篇幅较长难免有所纰漏,欢迎各位指正。
大语言模型架构
Transformer
Transformer架构由Google在2017年发表的论文《Attention is All You Need》首次提出,它使用自注意力(Self-Attention)机制取代了之前在 NLP 任务中常用的RNN(循环神经网络),使其成为预训练语言模型阶段的代表架构。
要澄清一点,注意力机制并不是由Transformer提出。注意力机制最早起源于计算机视觉领域,其思想在上世纪九十年代就已经被提出。在2014年的论文《Neural Machine Translation by Jointly Learning to Align and Translate》中注意力机制首次应用于NLP领域,结合了RNN和注意力机制,提出了序列到序列(Seq2Seq)模型,来改进机器翻译的性能。Transformer的贡献在于,它提出注意力机制不一定要和RNN绑定,我们可以将注意力机制单独拿出来,形成一套全新的架构,这也就是论文标题《Attention Is All You Need》的来源。
在正式开始前,首先需要说明,什么是注意力机制?
在NLP领域,有三个基础概念:
分词(Tokenization):首先大模型会将输入内容进行分词,分割成一系列的词元(Token),形成一个词元序列。
词元(Token):指将输入的文本分割成的最小单位,词元可以是一个单词、一个词组、一个标点符号、一个字符等。
词嵌入(Embedding):分词后的词元将被转换为高维空间中的向量表示,向量中包含了词元的语义信息。
举个例子,当我们输入“我可以拥有一杯咖啡吗?”时,首先通过分词形成“我”、“可以”、“拥有”、“一杯”、“咖啡”、“吗?”这几个词元,然后通过词嵌入转变成高维空间中的向量。
在向量空间中,每一个点代表一个实体或者概念,我们称之为“数据点”。这些数据点可以代表着具体的单词、短语、句子,他们能够被具体地、明确地识别出来,我们称之为“实体”;也可以不直接对应于一个具体的实体,而是表达一种对事物的抽象理解,我们称之为“概念”。这些数据点在向量空间中的位置和分布反映了实体或概念之间的相似性和关系,相似的实体或概念在空间中会更接近,而不同的则相距较远。其所在空间的每一个方向(维度)都代表了数据点的某种属性或特征。这些属性和特征是通过模型训练获得的,可能包括了“情感”、“语法”、“词性”等方面,事实上由于这些属性和特征是模型通过训练进行内部学习的结果,他们的具体含义往往难以直观解释清楚。
当词元被嵌入到向量空间中,每个词元都会形成一个实体的数据点,此时这些数据点所对应的向量,就代表了词本身的语义。但是在不同的上下文语境中,相同的词也会有不同的语义。比如在“科技巨头苹果”、“美味的苹果”这两句话中,“苹果”这个词,分别代表着苹果公司和水果。因此模型需要对原始向量“苹果”,基于上下文中“科技巨头”、“美味的”等信息,来进行数据点位置的调整,丰富其语义。换句话说,词元与上下文中各个词元(包括其自己)之间具有一定程度的“依赖关系”,这种关系会影响其自身的语义。
为了进一步解释上述内容,我画了一张图帮助大家理解。如下图是一个向量空间,我们假设其只有两个维度,分别是“经济价值”和“食用价值”。“科技巨头”、“美味的”、“苹果”在词嵌入后,会在空间中分别形成自己的数据点,显然“科技巨头”相对于“美味的”的经济价值属性更明显而食用价值的属性更模糊。当我们输入“科技巨头苹果”时,“苹果”的含义会受“科技巨头”的影响,其数据点的位置会向“科技巨头”靠拢,在空间中会形成一个新的概念。
向量空间中的“科技巨头苹果”
每个词元都需要捕捉自身与序列中其他词元的依赖关系,来丰富其语义。在“我配拥有一杯咖啡吗?”中,对于“配”而言,它依赖“我”作为其主语,这是一条依赖关系。对于“咖啡”而言,“一杯”是其量词,这也是一条依赖关系。
这种关系不只会在相邻的词元之间产生,在论文中有个词叫长距离依赖关系(long-range dependencies ),它指在词元序列中,相隔较远的位置的词元之间的相互依赖或关联。比如,在“我深切地感觉到,在这段漫长而忙碌的日子里,保持清醒和集中精力非常有用,难道此时不配拥有一杯咖啡吗?”中,“我”和“配”之间相隔很远,但他们仍然具有语法层面的依赖关系。这种依赖关系可能非常长,从文章的开头,一直到文章的结尾。比如,在一篇议论文中,作者可能在文章开头提出一个论点,然后通过一系列的论据和分析来支持这个论点,直到文章结尾可能再次强调或总结这个论点。在这个过程中,文章开头的论点和结尾的总结之间就存在着长距离依赖关系,它们在语义上是紧密相连的。
不过虽然词元与各个词元之间都可能存在依赖关系,但是其依赖程度不同,为了体现词元之间的依赖程度,NLP选择引入“注意力机制”。“注意力机制”可以动态地捕捉序列中不同位置元素之间的依赖关系,分析其强弱程度,并根据这些依赖关系生成新的序列表示。其核心思想是模仿人类的注意力,即在处理大量信息时,能够聚焦于输入数据的特定部分,忽略掉那些不太重要的信息,从而更好地理解输入内容。
继续以“我配拥有一杯咖啡吗?”为例,读到“拥有”这个词元时,我们会发现“我”是“拥有”的主语,“配”是对“拥有”的强调,他们都与“拥有”产生了依赖关系。这句话的核心思想,是某人认为自己有资格拥有某物,所以可能“配”相对“我”而言,对“拥有”来说更重要,那么我们在分析“拥有”这个词的语义时,会给“配”分配更多的注意力,这通常体现为分配更高的“注意力权重”。
实际上,我们在日常工作中已经应用了注意力机制。比如,我们都知道思维链(COT,常用<输入, 思考, 输出>来描述)对大模型处理复杂问题时很有帮助,其本质就是将复杂的问题拆分成相对简单的小问题并分步骤处理,使模型能够聚焦于问题的特定部分,来提高输出质量和准确性。“聚焦”的这一过程,就是依赖模型的注意力机制完成。通常模型会依赖输出内容或内部推理(如o1具有内部推理过程,即慢思考)来构建思考过程,但哪怕没有这些内容,仅仅依靠注意力本身,COT也能让模型提高部分性能。
自注意力机制是Transformer的核心。在论文中,Transformer说明了三点原因,来说明为何舍弃RNN和CNN,只保留注意力机制
Transformer论文:《Attention is All You Need》
原文:In this section we compare various aspects of self-attention layers to the recurrent and convolutional layers commonly used for mapping one variable-length sequence of symbol representations (x1, ..., xn) to another sequence of equal length (z1, ..., zn), with xi, zi ∈ Rd, such as a hidden layer in a typical sequence transduction encoder or decoder. Motivating our use of self-attention we consider three desiderata. - One is the total computational complexity per layer.
- Another is the amount of computation that can be parallelized, as measured by the minimum number of sequential operations required.
- The third is the path length between long-range dependencies in the network. Learning long-range dependencies is a key challenge in many sequence transduction tasks. One key factor affecting the ability to learn such dependencies is the length of the paths forward and backward signals have to traverse in the network. The shorter these paths between any combination of positions in the input and output sequences, the easier it is to learn long-range dependencies [12].
译文:在这一部分中,我们比较了自注意力层与通常用于将一个可变长序列的符号表示(x1, ..., xn)映射到另一个等长序列(z1, ..., zn)的循环层和卷积层的不同方面,其中xi, zi ∈ Rd。我们考虑了三个主要因素来激励我们使用自注意力:
- 每层的总计算复杂性
- 可以并行化的计算量,通过所需的最小顺序操作数来衡量。
- 网络中长距离依赖之间的路径长度。学习长距离依赖性是许多序列转换任务中的一个关键挑战。影响学习这些依赖性能力的一个关键因素是前向和后向信号在网络中必须穿越的路径长度。输入和输出序列中任意两个位置之间的路径越短,学习长距离依赖性就越容易。
其中后两点尤其值得注意:
并行化计算:在处理序列数据时,能够同时处理序列中的所有元素,这很重要,是模型训练时使用GPU的并行计算能力的基础。
长距离依赖捕捉:在注意力机制上不依赖于序列中元素的特定顺序,可以有效处理序列中元素之间相隔较远但仍相互影响的关系。
可能有些难以理解,让我们输入“我配拥有一杯咖啡?”来进行文本预测,分别看一下RNN和Transformer的处理方式。
依赖捕捉上的差异,是Transformer可以进行并行处理的前提,而并行处理是Transformer的核心优势之一。在预训练语言模型阶段,预训练(Pretrain)+微调(Finetune)是模型训练的主要范式。Transformer的并行化计算能力大大提高了模型训练的速度,长距离依赖捕捉能力为模型打开了上下文窗口,再结合位置编码等能力,使得Transformer相对于RNN获得了显著优势。而预训练又为Transformer带来了特征学习能力(从数据中自动学习和提取特征的能力)和迁移学习能力(将在一个任务上学习到的知识应用到另一个相关任务上的能力)的提升,显著提升了模型的性能和泛化能力。
这些优势,也正是GPT选择Transformer的原因。
GPT-1的论文《Improving Language Understanding by Generative Pre-Training》
原文:For our model architecture, we use the Transformer, which has been shown to perform strongly on various tasks such as machine translation, document generation, and syntactic parsing. This model choice provides us with a more structured memory for handling long-term dependencies in text, compared to alternatives like recurrent networks, resulting in robust transfer performance across diverse tasks.
翻译:对于我们的模型架构,我们使用了Transformer,它在机器翻译、文档生成和句法解析等各种任务上都表现出色。与循环网络等替代方案相比,这种模型选择为我们提供了更结构化的记忆来处理文本中的长期依赖关系,从而在多样化任务中实现了稳健的迁移性能。
Transformer架构图,引自《A Survey of Large Language Models》
理解了Transformer的优势后,让我们先忘记RNN,回到Transformer本身。从架构图中可知,Transformer架构分为两部分:
编码器:用于理解输入序列的内容。它读取输入数据,并将其转换成一个连续的表示,这个表示捕捉了输入数据的关键信息和上下文。
解码器:用于生成输出序列,使用编码器的输出和之前生成的输出来预测序列中的下一个元素。
以文本翻译为例,输入“我爱喝咖啡”,并要求模型将其翻译成英文。编码器首先工作,通过理解每个词元本身的含义,以及其上下文的依赖关系,形成一种向量形式的中间表示,并传递给解码器,这里面包含了整个序列的语义,即“我爱喝咖啡”这句话的完整含义。解码器结合该信息,从零开始,不断地预测下一个最可能的英文词元并生成词元,直至完成翻译。
值得注意的是,在解码器的多头注意力层(也叫交叉注意力层,或编码器-解码器自注意力层),编码器所提供的输出中,“我爱喝咖啡”这句话的含义已经明示。这对于文本翻译这种序列到序列的任务而言,可以确保生成内容的准确性,但对于预测类的任务而言,无疑是提前公布了答案,会降低预测的价值。
随着技术的演进,基于Transformer已经形成了三种常见架构
编码器-解码器架构(Encoder-Decoder Architecture),参考模型:T5
编码器架构(Encoder-Only Architecture),参考模型:BERT
解码器架构(Decoder-Only Architecture),参考模型:GPT(来自OpenAI)、Qwen(来自通义千问)、GLM(来自清华大学)
其中编码器-解码器架构,适合进行序列到序列的任务,比如文本翻译、内容摘要。编码器架构,适合需要对输入内容分析但不需要生成新序列的任务,比如情感分析、文本分类。解码器架构,适合基于已有信息生成新序列的任务,比如文本生成、对话系统。
解码器架构下,又有两个分支:
因果解码器(Causal Decoder),参考模型:GPT、Qwen
前缀解码器(Prefix Decoder),参考模型:GLM
二者之间的主要差异在于注意力的模式。因果解码器的特点,是在生成每个词元时,只能看到它之前的词元,而不能看到它之后的词元,这种机制通过掩码实现,确保了模型在生成当前词元时,不会利用到未来的信息,我们称之为“单向注意力”。前缀解码器对于输入(前缀)部分使用“双向注意力”进行编码,这意味着前缀中的每个词元都可以访问前缀中的所有其他词元,但这仅限于前缀部分,生成输出时,前缀解码器仍然采用单向的掩码注意力,即每个输出词元只能依赖于它之前的所有输出词元。
不同架构的注意力模式比较,引自《A Survey of Large Language Models》
可能有些晦涩,让我们参考《大语言模型概述》的例子来说明一下。该例子中,已经存在了“大家共同努力”这六个词元,模型正在思考如何产生下一个新的词元。此时,“大家共”是输入(前缀),“同努力”是模型解码已经产生的输出,蓝色代表可以前缀词元之间可以互相建立依赖关系,灰色代表掩码,无法建立依赖关系。
因果解码器和前缀解码器的差异在“大家共”(前缀)所对应的3*3的方格中,两种解码器都会去分析前缀词元之间的依赖关系。对于因果解码器而言,哪怕词元是前缀的一部分,也无法看到其之后的词元,所以对于前缀中的“家”(对应第二行第二列),它只能建立与“大”(第二行第一列)的依赖关系,无法看到“共”(第二行第三列)。而在前缀解码器中,“家”可以同时建立与“大”和“共”的依赖关系。
最后贴一张图大家感受一下不同架构之间注意力模式上的差异。
单向注意力和双向注意力,有各自的优势,例如,对于文本生成任务,可能会优先考虑单向注意力以保持生成的连贯性。而对于需要全面理解文本的任务,可能会选择双向注意力以获取更丰富的上下文信息。如上图分别是编码器架构(BERT)、编码器-解码器架构(T5)、因果解码器架构(GPT)、前缀解码器架构(T5、GLM)的注意力模式。
这些架构在当今的大语言模型阶段都有应用,其中因果解码器架构是目前的主流架构,包括Qwen-2.5在内的众多模型采用的都是这种架构。具体可以参考下面的大语言模型架构配置图,其中类别代表架构,L 表示隐藏层层数,N 表示注意力头数,H 表示隐藏状态的大小。
大语言模型架构配置表,引自《A Survey of Large Language Models》
从2018年GPT-1开始,模型的基本原理确实经历了一些变化和改进,但是探讨其基本架构仍然有价值。
GPT
时间来到2018年,OpenAI团队的论文《Improving Language Understanding by Generative Pre-Training》横空出世,它提出可以在大规模未标注数据集上预训练一个通用的语言模型,再在特定NLP子任务上进行微调,从而将大模型的语言表征能力迁移至特定子任务中。其创新之处在于,提出了一种新的预训练-微调框架,并且特别强调了生成式预训练在语言模型中的应用。生成式,指的是通过模拟训练数据的统计特性来创造原始数据集中不存在的新样本,这使得GPT在文本生成方面具有显著的优势。
GPT模型架构,引自GPT-1的论文《Improving Language Understanding by Generative Pre-Training》
上图来自于GPT-1的论文,图片左侧是GPT涉及到的核心组件,这是本文的重点内容。图片右侧是针对不同NLP任务的输入格式,这些格式是为了将各种任务的输入数据转换为Transformer模型能够处理的序列形式,用于模型与训练的过程。
GPT使用了Transformer的解码器部分,同时舍弃了编码器中的交叉注意力机制层,保留了其余部分。整体上模型结构分为三部分:
输入层(Input Layer):将文本转换为模型可以处理的格式,涉及分词、词嵌入、位置编码等。
隐藏层(Hidden Layer):由多个Transformer的解码器堆叠而成,是GPT的核心,负责模型的理解、思考的过程。
输出层(Output Layer):基于隐藏层的最终输出生成为模型的最终预测,在GPT中,该过程通常是生成下一个词元的概率分布。
在隐藏层中,最核心的两个结构分别是
掩码多头自注意力层(Masked Multi Self Attention Layers,对应Transformer的Masked Multi-Head Attention Layers,简称MHA,也叫MSA)。
前置反馈网络层(Feed Forward Networks Layers,简称FFN,与MLP类似)。
MHA的功能是理解输入内容,它使模型能够在处理序列时捕捉到输入数据之间的依赖关系和上下文信息,类似于我们的大脑在接收到新的信息后进行理解的过程。FFN层会对MHA的输出进行进一步的非线性变换,以提取更高级别的特征,类似于我们的大脑在思考如何回应,进而基于通过训练获得的信息和知识,产生新的内容。
举个例子,当我们输入“美国2024年总统大选胜出的是”时,MHA会理解每个词元的含义及其在序列中的位置,读懂问题的含义,并给出一种中间表示,FFN层则会对这些表示进行进一步的变换,进而从更高级别的特征中得到最相近的信息——“川普”。
MHA和FFN的多层结构,引自3Blue1Brown的视频《GPT是什么?直观解释Transformer》
隐藏层不只有一层,而是一种多层嵌套的结构。如上图,Attention是MHA,Multilayer Perceptron(MLP)是FFN,它们就像奥利奥饼干一样彼此交错。这是为了通过建立更深的网络结构,帮助模型在不同的抽象层次上捕捉序列内部的依赖关系,最终将整段文字的所有关键含义,以某种方式充分融合到最后的输出中。隐藏层的层数并不是越多越好,这取决于模型的设计,可以参考前文贴过的模型参数表,其中的L就代表该模型的隐藏层的层数。较新的Qwen2-72B有80层,GPT-4有120层。
目前主流的大模型,在这两层都进行了不同程度的优化。比如Qwen2使用分组查询注意力(Grouped Multi-Query Attention,简称GQA)替代MHA来提高吞吐量,并在部分模型上尝试使用混合专家模型(Mixture-of-Experts,简称MoE)来替代传统FFN。GPT-4则使用了多查询注意力(Multi-Query Attention)来减少注意力层的KV缓存的内存容量,并使用了具有16个专家的混合专家模型。关于这里提到的较新的技术,在后文中会详细阐述。
编码器-解码器架构与解码器架构,引自Llama的论文
此外,模型还保留了Transformer的其他部分,包括了(参考上图右半部分,该图片的细节更多一些)
词嵌入 (Embedding,对应GPT论文中的Text & Position Embed)。
位置编码(Positional Encodings,简称PE,对应GPT论文中的Text & Position Embed,Rotary Positional Encodings是位置编码的一种技术)。
层归一化(Layer Norm,上图中表示为RMS Norm,通常与残差连接一起用,Layer Norm和RMS Norm是归一化的两种不同技术)。
线性层(Linear,负责将FFN层的输出通过线性变换,通常用于将模型的输出映射到所需的维度)。
Softmax(Softmax层,负责生成概率分布,以便进行最终的预测)。
这些部分单独拿出来看会有些抽象,让我们尝试将一段文本输入给大模型,看一看大模型的整体处理流程
1.分词(Tokenization):首先大模型会进行分词,将文本内容分割成一系列的词元(token)。
2.词嵌入(Embedding):分词后的词元将被转换为高维空间中的向量表示,向量中包含了词元的语义信息。
3.位置编码(PE):将词元的在序列中的位置信息,添加到词嵌入中,以告知模型每个单词在序列中的位置。
4.掩码多头自注意力层(MHA):通过自注意力机制捕捉序列内部词元间的依赖关系,形成对输入内容的理解。
5.前馈反馈网络(FFN):基于MHA的输出,在更高维度的空间中,从预训练过程中学习到的特征中提取新的特征。
6.线性层(Linear):将FFN层的输出映射到词汇表的大小,来将特征与具体的词元关联起来,线性层的输出被称作logits。
7.Softmax:基于logits形成候选词元的概率分布,并基于解码策略选择具体的输出词元。
在该流程中,我故意省略了层归一化,层归一化主要是在模型训练过程中改善训练过程,通过规范化每一层的输出,帮助模型更稳定地学习。而在使用模型时,输入数据会按照训练阶段学到的层归一化参数进行处理,但这个参数是固定的,不会动态调整,从这个意义上说,层归一化不会直接影响模型的使用过程。
分词、词嵌入、位置编码,属于输入层,MHA、FFN属于隐藏层,线性层、Softmax属于输出层。可能读到这里,对于输入层的理解会相对清晰,对其他层的理解还有些模糊。没关系,它们的作用有简单的几句话很难描述清楚,请继续往下读,在读完本文的所有内容后,再回头来看会比较清楚。本文中,我们会围绕着隐藏层和输出层来详细介绍,尤其是其中GPT的核心——隐藏层。
自注意力机制(Attention)
MHA(多头注意力)
MHA,全拼Multi-Head Attention(多头注意力),在GPT等因果解码器架构下模型中,指掩码多头自注意力,全拼Masked Multi Self Attention。“掩码”赋予了GPT单向注意力的特性,这符合因果解码器的架构,“多头”使GPT可以从不同角度发现特征,自注意力中的“自”指的是模型关注的是单一词元序列,而不是不同序列之间的特征,比如RNN的循环注意力围绕的是同一序列的不同时间步。
多头注意力机制的概念,来自于上古时期Google的论文《Attention Is All You Need》 。
缩放点积注意力(左)和多头注意力(右),来自《Attention Is All You Need》
从上图可以看到,多头注意力是由多个并行运行的缩放点积注意力组成,其中缩放点积注意力的目的,是帮助模型在大量数据中快速找到并专注于那些对当前任务最有价值的信息,让我们由此讲起。
原文:An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a weighted sum of the values, where the weight assigned to each value is computed by a compatibility function of the query with the corresponding key. 翻译:注意力函数可以被描述为将一个查询(query)和一组键值对(key-value pairs)映射到一个输出(output)的过程,其中查询、键、值和输出都是向量。输出是通过值的加权和计算得到的,每个值所分配的权重是通过查询与相应键的兼容性函数(compatibility function)计算得出的。
原文:The two most commonly used attention functions are additive attention [ 2], and dot-product (multi-plicative) attention. Dot-product attention is identical to our algorithm, except for the scaling factor. Additive attention computes the compatibility function using a feed-forward network with a single hidden layer. While the two are similar in theoretical complexity, dot-product attention is much faster and more space-efficient in practice, since it can be implemented using highly optimized matrix multiplication code. 翻译:两种最常用的注意力函数是加性注意力[2]和点积(乘法)注意力。点积注意力与我们的算法相同,除了有一个缩放因子。加性注意力使用具有单个隐藏层的前馈网络来计算兼容性函数。虽然两者在理论上的复杂度相似,但在实践中,点积注意力要快得多,也更节省空间,因为它可以利用高度优化的矩阵乘法代码来实现。
一个可能的Softmax后的概率分布(每一列的和都为1,灰色代表掩码)
原文:Instead of performing a single attention function with dmodel-dimensional keys, values and queries, we found it beneficial to linearly project the queries, keys and values h times with different, learned linear projections to dk, dk and dv dimensions, respectively. On each of these projected versions of queries, keys and values we then perform the attention function in parallel, yielding dv-dimensional output values. These are concatenated and once again projected, resulting in the final values, as depicted in Figure 2. Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this. 翻译:我们发现,与其执行一个具有dmodel维键、值和查询的单一注意力函数,不如将查询、键和值线性投影h次,使用不同的、学习得到的线性投影到dk、dk和dv维度。然后我们并行地在这些投影版本的查询、键和值上执行注意力函数,得到dv维的输出值。这些输出值被连接起来,再次被投影,得到最终的值,如图2所示。多头注意力允许模型同时关注不同表示子空间中的信息,以及不同位置的信息。而单一注意力头通过平均操作抑制了这一点。
原文:In this work we employ h = 8 parallel attention layers, or heads. For each of these we use dk = dv = dmodel/h = 64. Due to the reduced dimension of each head, the total computational cost is similar to that of single-head attention with full dimensionality.
翻译:在这项工作中,我们使用了 h=8 个并行的注意力层,或者说是“头”(heads)。对于每一个头,我们设置 dk=dv=dm/h=64 。这里的
分别代表键(keys)和值(values)的维度,而是模型的总维度。 d k和dv
进一步举个例子来解释一下这段内容。下面是节选的GPT-3模型配置,N代表注意力头数,H代表隐藏状态的大小(参数量)。在单头注意力的情况下,每个头都是12288维,而在多头注意力的情况下,头与头之间会均分参数量,每个头的参数量只有12288/96 =128维,并且不同头的注意力计算都是并行的。
KV Cache
MQA
原文1:Transformer relies on attention layers to communicate information between and across sequences. One major challenge with Transformer is the speed of incremental inference. As we will discuss, the speed of incremental Transformer inference on modern computing hardware is limited by the memory bandwidth necessary to reload the large "keys" and "values" tensors which encode the state of the attention layers. 原文2:We propose a variant called multi-query attention, where the keys and values are shared across all of the different attention "heads", greatly reducing the size of these tensors and hence the memory bandwidth requirements of incremental decoding. 翻译1:Transformer依赖于注意力层来在序列之间和内部传递信息。Transformer面临的一个主要挑战是增量推理的速度。正如我们将要讨论的,现代计算硬件上增量Transformer推理的速度受到重新加载注意力层状态所需的大型“键”和“值”张量内存带宽的限制。 翻译2:我们提出了一种变体,称为多查询注意力(Multi-Query Attention),其中键(keys)和值(values)在所有不同的注意力“头”(heads)之间共享,大大减少了这些张量的大小,从而降低了增量解码的内存带宽需求。
GQA
原文:However, multi-query attention (MQA) can lead to quality degradation and training instability, and it may not be feasible to train separate models optimized for quality and inference. Moreover, while some language models already use multiquery attention, such as PaLM (Chowdhery et al., 2022), many do not, including publicly available language models such as T5 (Raffel et al., 2020) and LLaMA (Touvron et al., 2023). 翻译:然而,多查询注意力(MQA)可能导致质量下降和训练不稳定性,并且可能不切实际去训练分别针对质量和推理优化的独立模型。此外,虽然一些语言模型已经采用了多查询注意力,例如PaLM(Chowdhery等人,2022年),但许多模型并没有采用,包括公开可用的语言模型,如T5(Raffel等人,2020年)和LLaMA(Touvron等人,2023年)。
前馈神经网络
输出层
然后将通过归一化操作(Softmax),转换为词元的概率,在此基础上结合解码策略,就可以选择具体的下一个词元进行输出。这个公式非常简单,其中就是某一个词元的分数。通过将指数函数应用于形成,不仅可以确保词元分数的数值为正(便于转换为概率),还能增加不同分数之间的差异性。最后将单个词元的分数,与所有词元的分数之和相除,就能得到单个词元的概率,如此就能获得词汇表中每个词元的概率分布。
写在最后
提示工程
推荐阅读
向量检索与通义千问搭建专属问答服务
本方案介绍如何使用向量检索服务(DashVector)结合通义千问大模型来打造基于垂直领域专属知识等问答服务。
点击阅读原文查看详情。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-08-13
2024-05-28
2024-04-26
2024-08-21
2024-06-13
2024-08-04
2024-09-23
2024-07-09
2024-07-01
2024-07-18