多年来,深度学习界一直倡导开放和透明,这导致了像HuggingFace这样的大型开源项目的出现。深度学习中许多最深刻的思想(如Transformer [2]、自监督学习等)都可以在互联网上公开获取,无论是通过公共代码仓库还是Arxiv预印本。尽管开源已经成为一种常态已有一段时间,但最近大型语言模型(LLM)的受欢迎程度(以及商业应用价值)对这种趋势提出了挑战。
如今,许多最强大的大型语言模型(LLM)只能通过API(例如OpenAI或Anthropic提供的)进行访问,使得研究人员和开发者无法获得其源代码和模型参数。虽然我并不打算引发关于当前LLM领域趋势的道德讨论,但这些信息与本帖子的主题——公开可用的LLM——相关。有趣的是,并非所有强大的语言基础模型都隐藏在付费墙后面。一些模型,例如LLaMA,既是公开可用的,又具有非常高的性能,从而在深度学习研究社区保持了开放性的精神。
LLaMA并不是单一的模型,而是一组具有不同参数规模的大型语言模型(LLM)套件,参数规模从70亿到650亿不等。LLaMA的设计灵感源自Chinchilla [3],这些LLM比它们的同类模型稍小,但经过了广泛的预训练(即较小的模型,更多的标记),并旨在提供一组具有不同性能和推理效率之间不同权衡的模型。LLaMA模型的表现令人惊讶,例如,130亿参数的模型与GPT-3 [4]大致相当,而650亿参数的模型往往超过了PaLM [5]的性能。
“GPT-4从各种经过许可、创建和公开可用的数据源中进行了学习,这些数据源可能包括公开可获取的个人信息。”
除了令人印象深刻的性能之外,LLaMA仅使用公开可用的数据进行预训练。在LLM领域中,LLaMA在一定程度上迈出了(回归)开源的步伐,LLaMA模型可以完全通过在线资源进行再现。而像GPT-4这样的最新模型已知是通过公开数据和专有/私有数据的组合进行训练的。尽管这可能有助于模型性能的提升,但LLaMA表明我们可以利用在线可获得的数据做很多事情,从而为与LLM相关的开放性研究倡议提供了一种希望的来源。
LLaMA的LLM采用了许多在先前的工作中提出的思想和技术。在本节中,我们将介绍一些有用的背景信息,有助于更深入地理解LLaMA及其组成部分。
关于LLM的简要说明。首先,了解LLM的基础知识是有帮助的,包括它们的架构、训练过程和一般方法。我们在先前的概述中对这个主题进行了广泛的探讨。因此,在此处我们不会详细介绍这个主题,下面是提供我们进一步阅读和学习的文章和链接。
LLM (Decoder-Only) Architecture
Language Model Pre-Training
Explanation of LLMs
LLM History
LLM Basics
通常,Transformer架构(包括仅使用解码器的Transformer架构,如LLMs所使用的)使用LayerNorm来对每个层的激活值进行归一化处理。然而,使用不同的归一化技术已被证明可以稳定训练并提高泛化性能。例如,均方根层归一化(RMSNorm)的定义如下所示。
RMSNorm与LayerNorm在某种程度上相似,但在对神经网络的激活值进行归一化时,它去除了均值居中操作(并使用稍微修改的分母)。与LayerNorm相比,RMSNorm在计算效率和简单性上更高,使其能够以相当的性能水平实现10-50%的效率提升。
LLM的解码器架构中的每个块都包含一个两层的前馈神经网络(即,不使用偏置,并且分别应用于每个标记向量),在两层之间使用非线性激活函数。最初,这个非线性激活函数是修正线性单元(ReLU)。然而,最近的研究[15]揭示了这不是最优的选择。
特别是LLaMA(以及其他类似的LLM,如PaLM)选择使用SwiGLU激活函数,其在上述方程中进行了定义。在这里,我们将Swish激活定义如下。
SwiGLU是输入x的两个线性变换的逐元素乘积,其中一个经过了Swish激活函数的处理。虽然这个激活函数需要进行三次矩阵乘法运算,但研究发现,即使使用的计算量保持不变,相对于其他激活函数,SwiGLU在性能上也有所提升。
Rematerialization,也被称为重新计算,是在LLM(以及其他大型神经网络)的训练中使用的一种技术,以牺牲额外的计算量来减少内存消耗。通常,在计算神经网络的前向传播时,我们会存储/保留网络在每一层的激活值,以便在反向传播过程中使用(这对于计算权重更新是必要的!)但是,这需要大量的内存!
Rematerialization的基本思想是在反向传播过程中重新计算某些中间激活值,而不是在前向传播过程中将它们存储在内存中。这有助于减少训练过程中的峰值内存使用量,使得可以在可用内存限制下训练更大的模型或使用更大的批次大小。对于LLM来说,这一点尤为重要,因为它们很大并且消耗大量内存。
现在我们已经掌握了一些有用的概念,让我们更多地了解LLaMA中的LLM集合及其工作方式。由于这些模型在很大程度上受到Chinchilla提出的预训练策略的启发(简而言之,就是对更多数据进行小型LLM的预训练)[3],在深入研究LLaMA之前,我们将简要概述这些想法。总的来说,LLaMA对于庞大的LLM趋势提出了质疑,声称(如果进行了足够的预训练!)更小的LLM可以在显著降低推理预算的情况下实现令人印象深刻的性能。
在最近LLM的发展历程中,Chinchilla [3]的提议尤为引人注目。在GPT-3之后,深度学习研究界对足够大的语言模型展现出的令人印象深刻的少样本学习能力感到惊叹。因此,我们开始测试比GPT-3还要庞大的模型。然而,结果并不那么好!
Hoffmann等人(2022年)的最新研究表明,在给定的计算预算下,最佳性能并不是由最大的模型实现的,而是由更小的模型在更多数据上进行训练的。
要创建比GPT-3更好的LLM,我们不能仅仅使用更大的模型,而是需要更多的预训练数据!具体而言,Chinchilla的分析表明,如果我们对稍小的LLM进行更广泛的预训练,可以实现更高水平的性能。
这是完整的情况吗?尽管我们知道如果进行广泛的预训练,较小的LLM可以表现出色,但是即使在[3]中进行的分析也表明,训练相对较大的LLM是达到高性能水平最高效的方式。这个观点是完全正确的,但它只考虑了训练效率。因此,我们必须问自己一个问题:训练效率是我们唯一关心的吗?对于大多数从业者来说,毫无疑问,答案是否定的!
“本研究的重点是通过在比通常使用的更多标记上进行训练,训练一系列语言模型,在各种推理预算下实现最佳性能。”
训练成本只是与LLM相关的全部成本中的一小部分。我们还必须考虑托管成本,因此推理预算是一个巨大的考虑因素。LLaMA接受了这个观点,强调在达到目标性能水平的情况下,对较小的LLM进行更长时间的预训练最终在推理过程中更经济,并且随着时间的推移节省了大量成本。尽管在需要性能提升时我们可能会使用较大的模型,但通过广泛的预训练,我们应该尽量减小模型的大小(从而降低托管成本)。
数据集。我们知道LLaMA的预训练数据集是基于公开数据的,但这些数据具体来自哪里呢?上面概述了用于LLaMA的预训练数据集的内容。可以看出,预训练数据(尽管完全公开)具有相当多的多样性,来源包括StackExchange和古腾堡计划等。经过标记化处理后,完整数据集大约包含1.4T个标记。这与Chinchilla [3]进行预训练的标记数量相同,请参见下文。
考虑到LLaMA对透明度和可重复性的强调,在[1]中提供了大量关于构建预训练数据集的见解。讨论中最有趣的方面之一是我们可以通过它了解在对LLM进行预训练之前如何对数据进行过滤。例如,从CommonCrawl获取的文本数据会进行过滤,排除以下内容:
- 重复的文档(使用CCNet管道[7]进行过滤)
- 非英语数据(通过训练fastText线性分类器进行过滤)
- 低质量内容(使用n-gram语言模型进行过滤)
此外,[1]中的作者还训练了一个线性分类器,用于区分在维基百科中用作参考的页面和随机抽样的页面,然后丢弃未被分类为参考的页面。所有这些步骤都是为了对CommonCrawl进行过滤!根据之前的工作,我们知道正确过滤预训练数据集对LLM的性能至关重要。在[1]中,我们可以更深入地了解实施有效过滤管道的具体细节。
LLaMA套件采用了很多流行的LLM(如GPT-3 [4]和PaLM [5])中常见的架构技巧。例如,LLaMA在每个层内部执行预归一化,这意味着在变换器中,归一化应用于每个层的输入而不是输出;请参见上文。此外,RMSNorm、SwiGLU激活函数和旋转位置嵌入(RoPE)[10](一种绝对位置嵌入和相对位置嵌入的混合形式)在每个变换器层中都被使用。
在[1]中,使用了四种不同规模的模型,参数数量从67亿到652亿不等;请参见上文。这些模型构成了被称为LLaMA的LLM集合,并在性能、模型大小和推理预算之间提供了各种不同的权衡。值得注意的是,LLaMA-13B在性能上与GPT-3相媲美,并且可以在单个V100 GPU上运行。与之前的模型相比,这是一个巨大的成就,使得这些模型对大多数从业者来说更易于使用(例如,PaLM的训练使用了>6K个加速器)。
更好的效率。[1]中的作者采用了一些有趣的技巧来提高LLM的训练效率。首先,我们应该回忆一下,基于仅解码器的Transformer模型的现代LLM在每个层中使用因果多头注意力。为了提高这种因果多头注意力操作的效率,LLaMA使用一种高效的实现,不存储注意力权重,也不为被屏蔽的标记计算键/查询分数。通过这样做,我们可以节省大量计算,通常浪费在被因果自注意力忽略的屏蔽标记上。这种方法受到[9]中的思想启发,但我们可以在xformers库中找到一个开源实现。
除了高效的因果自注意力实现外,与大多数LLM训练策略相比,LLaMA在重计算方面采用了略有不同的方法。在前向传播过程中保存计算成本最高的激活值(例如线性层的输出),从而减少在反向传播过程中需要重新计算的激活值的数量。这种改变需要手动重新实现LLM的反向传播(而不是使用PyTorch中的自动求导),是一种混合的重计算方法,显著提高了整体训练吞吐量。
“当训练一个65B参数的模型时,我们的代码在拥有2048个A100 GPU和80GB内存的环境下,每秒处理约380个标记/秒/GPU。这意味着在包含1.4T个标记的数据集上训练大约需要21天。” — 来自[1]
考虑到LLaMA为提高训练效率所采用的修改,我们可能会想知道:这实际上使训练速度加快了多少?嗯,这在很大程度上取决于训练基础设施。然而,当使用2048个A100 GPU时,LLaMA-65B大约需要21天的时间完成对包含1.4T个标记的数据集的预训练。
尽管开源和可重复性很重要,但如果模型表现不佳,人们就不会关心LLaMA!以前曾尝试过开源LLM(例如OPT和BLOOM [11, 12]),但这些模型在性能方面无法与现代LLM竞争。在本节中,我们将分析LLaMA模型相对于流行的LLM(如GPT-3和PaLM [4, 5])的性能。
我们如何评估呢?如前文所述,LLaMA的评估方式与大多数语言基础模型类似:通过零样本和少样本学习。值得注意的是,LLaMA模型仅作为预训练的基础模型进行评估,这意味着不进行微调(无论是通过SFT还是RLHF)。LLaMA与流行的闭源LLM(如GPT-3、Gopher、Chinchilla和PaLM [3, 4, 5, 13])以及以前的开源LLM(如OPT、GPT-J和GPT-Neo [11, 14])在自由生成和多选题任务上进行比较。测试了各种领域(如常识和数学推理、代码生成、问答等)的性能。
在闭卷问答和阅读理解任务中,我们发现LLaMA-65B取得了最先进的零样本和少样本性能,在性能上持续超过了PaLM和Chinchilla等更大的模型。更进一步,LLaMA-13B的表现令人惊讶地出色,甚至在大多数情况下优于GPT-3(后者的规模是其10倍!)。基本结论是,i)较大的LLaMA模型具有与最先进模型相竞争的能力,ii)相对于其规模而言,较小的LLaMA模型表现出色。
LLaMA套件还在常识推理和数学推理任务上进行了评估。在常识推理任务中,LLaMA超过了多个强大基线模型的零样本推理性能;请参见上文。然而,需要注意的是,在这里没有采用特殊的提示方法(例如思路链提示)来促进推理能力的提升。先前的研究[5]表明,在没有正确的提示方法的情况下,LLM的“推理”能力可能随着规模的增大而降低。
尽管这种分析存在一定的局限性,但与基线模型相比,LLaMA在推理能力上仍然表现相对出色。特别是,在数学推理数据集上,LLaMA模型与多个基线模型具有相当的竞争力(在某些情况下甚至更好)。事实上,LLaMA-65B甚至在数学数据上的表现超过了类似规模的Minerva模型,后者经过明确的微调以提高在此类任务上的性能。
“Minerva是一系列在ArXiv和数学网页中提取的38.5B标记上进行微调的PaLM模型...在GSM8k数据集上,我们观察到LLaMA65B优于Minerva-62B,尽管它没有在数学数据上进行过微调。” — 来自[1]
代码生成。除了基本的推理能力外,代码生成是LLaMA模型的另一个技能。尽管从未对代码进行微调(即代码在LLaMA的预训练数据中占比不到5%),LLaMA-65B在代码生成任务上表现优于PaLM,并且LLaMA-13B的代码生成性能超过了GPT-3(但是...GPT-3在生成代码方面的表现确实较差)。
在MMLU基准测试中,LLaMA模型在大多数情况下的性能落后于Chinchilla和PaLM等LLM模型。这个基准测试是LLaMA性能明显被当前替代方案超越的少数情况之一。[1]中的作者声称,这种性能下降是由于LLaMA的预训练数据集中书籍和学术论文的数量有限(与最先进的LLM相比,这种预训练数据减少了>10倍)所导致的。
在整个预训练过程中,当跟踪LLaMA模型的性能时,我们可以观察到性能明显且稳定地改善的趋势;请参见上文。尽管并非所有任务的表现都相似,但我们可以看到LLaMA采用的预训练策略整体上相对稳定。
简而言之,LLaMA是一个具有令人震惊的出色性能的开源LLM。自LLaMA的提出以来,研究界已经充分利用了这个令人印象深刻的开放模型。例如,以下研究工作已经在LLaMA的基础上展开:
- Vicuna:对LLaMA进行微调,性能(几乎)可与GPT-4相媲美 [链接]
- Koala:基于互联网对话数据对LLaMA进行微调 [链接]
- ChatLLaMA:使用最少的计算资源在自己的数据上创建个性化的ChatGPT版本 [链接]
- ColossalChat:类似于ChatGPT的模型,基于LLaMA构建的RLHF流程 [链接]
LLaMA的影响力很可能会显著增加。个人而言,我对开放LLM的研究持续进展感到非常兴奋。我希望使这些模型更易于使用将促使更广泛的研究界进行更深入的调查和开发。以下是一些基本的要点:
开源LLM。目前,LLM生态系统正面临一个有趣的冲突,两种不同的方法被用来向公众展示这些强大的基础模型。一方面,像ChatGPT和GPT-4这样的模型仅通过付费API发布,阻止研究界详细访问这些模型。而像LLaMA这样的贡献则反对这种趋势,为研究界提供了完整的模型访问权限。
最佳规模是多少?LLaMA不仅仅发布单个模型,而是提供了一系列不同规模的LLM。以往对LLM的研究往往倡导使用更大的模型,因为更大的LLM在训练过程中通常能够以更少的计算成本达到令人印象深刻的性能水平。然而,如果我们对较小的模型进行更全面的预训练,LLaMA表明我们可以在显著减少推理成本的同时达到可比较的性能水平。因此,考虑使用较小的LLM是有意义的,尤其是当我们需要部署它们时。值得注意的是,LLaMA中的某些模型可以在单个GPU上运行,这大大提高了对这些LLM的可访问性。
令人印象深刻的性能。在LLaMA提出之前,许多研究团队尝试发布流行LLM的开源版本(例如,OPT基本上是一个开源的GPT-3)。但是,这些模型的性能要远远逊于通过API可访问的付费模型。尽管LLaMA在某些情况下性能不如理想,但它是一个巨大的进步,因为它经常在性能上超过了流行的最先进LLM(具体取决于所使用的模型规模)。