本文内容:解读论文 《LLaMA: Open and Efficient Foundation Language Models》,一起来揭秘。
《LLaMA: Open and Efficient Foundation Language Models》
本文重点:
- Abstract(摘要):
LLaMA是一个
开源的
基础语言模型系列,参数范围从
70亿到650亿
不等。
- Introduction(引言):
LLaMA发现最佳性能并非由最大的模型实现,而是由在更多数据上训练的小型模型实现 。
- Approach(方法):
LLaMA训练方法与前人的一些工作类似,也是使用一个标准的优化器在大量文本数据上训练大型 Transformer 。
摘要
我们介绍了LLaMA,这是一个参数从70亿到650亿不等的基础语言模型系列。我们在数万亿个token上训练我们的模型,并证明只使用公开可用的数据集就可以训练出最先进的模型,而无需依赖专有且无法访问的数据集。具体来说,LLaMA-13B在大多数基准测试中的表现优于GPT-3(1750亿),而LLaMA-65B则与最佳模型Chinchilla-70B和PaLM-540B具有竞争力。我们向研究界发布了所有模型。
LLaMA
敲黑板,划重点
LLaMA系列语言模型以公开数据集训练,性能比肩GPT-3,兼具高效能与先进性,且已开源供研究界使用。
-
模型介绍: LLaMA是一个基础语言模型系列,参数范围从70亿到650亿不等。
-
训练数据 : LLaMA模型是在数万亿个token上进行训练的,且仅使用公开可用的数据集,没有依赖专有或无法访问的数据集。
-
性能表现:
-
LLaMA-13B在大多数基准测试中优于GPT-3(1750亿参数)。
-
LLaMA-65B与最佳模型Chinchilla-70B和PaLM-540B具有竞争力。
-
开源共享: LLaMA的所有模型都向研究界发布,意味着研究者可以访问和使用这些模型进行进一步的研究或应用。
Meta LLaMA
在大量文本语料库上训练的大型语言模型(LLMs)已经展现出了其根据文本指令或少数示例执行新任务的能力(Brown等人,2020)。这些少量样本学习的特性最初在模型规模扩大到足够大时出现(Kaplan等人,2020),这引发了一系列专注于进一步扩展这些模型的研究工作(Chowdhery等人,2022;Rae等人,2021)。这些努力基于一个假设, 即更多的参数将导致更好的性能 。然而,Hoffmann等人(2022)的近期工作表明,在给定计算预算的情况下, 最佳性能并非由最大的模型实现,而是由在更多数据上训练的小型模型实现 。
Hoffmann等人(2022)的缩放定律的目标是确定在给定的训练计算预算下,如何最佳地缩放数据集和模型大小。然而,这一目标忽略了推理预算,这在大规模部署语言模型时变得至关重要。在这种情况下,给定目标性能水平, 首选的模型并不是训练速度最快的模型,而是推理速度最快的模型 。尽管训练一个大型模型以达到一定的性能水平可能更便宜,但一个经过更长时间训练的小型模型在推理时最终会更经济。例如,虽然Hoffmann等人(2022)建议在一个包含200B个标记的数据集上训练一个10B模型,但我们发现, 一个7B模型的性能在超过1T个标记之后仍在持续提高。
本项工作的重点是通过对更多标记进行训练,从而得到一系列在语言推理预算不同时能达到最佳性能的语言模型。 这些模型被称为LLaMA,参数范围从7B到65B,与现有最佳的大型语言模型(LLMs)相比具有竞争力。例如,尽管LLaMA-13B的规模仅为GPT-3的十分之一,但在大多数基准测试中,其性能却优于GPT-3。我们相信,这个模型将有助于使LLMs的访问和研究更加民主化,因为它可以在单个GPU上运行。在更高参数的模型方面,我们的65B参数模型也与最佳的大型语言模型(如Chinchilla或PaLM-540B)具有竞争力。
与Chinchilla、PaLM或GPT-3不同, 我们仅使用公开可用的数据,这使得我们的工作可以与开源兼容。 而大多数现有模型所依赖的数据要么不公开可用,要么没有记录(例如“书籍-2TB”或“社交媒体对话”)。当然也存在一些例外,特别是OPT(Zhang等人,2022)、GPT-NeoX(Black等人,2022)、BLOOM(Scao等人,2022)和GLM(Zeng等人,2022),但它们在性能上并不与PaLM-62B或Chinchilla相竞争。
在本文的其余部分, 我们将概述我们对Transformer架构(Vaswani等人,2017)所做的修改,以及我们的训练方法。 然后,我们将报告我们模型的性能,并将其与其他LLMs在一系列标准基准上进行比较。最后,我们将使用负责任的AI社区的最新基准,揭示我们模型中存在的一些偏见和毒性。
敲黑板,划重点
- 大模型 训练:更多参数 vs 更大的数据集
- 更多参数: LLMs通过在大量文本语料库上的训练,已经具备了根据文本指令或少数示例执行新任务的能力。 OpenAI 的核心,即传说中的大力出奇迹。
- 更大的数据集: 与传统的观念相反,LLaMA系列模型的研究表明,在给定计算预算的情况下,通过在更多数据上训练的小型模型同样能够实现出色的性能。这一发现不仅打破了“模型越大性能越好”的刻板印象,还提供了更加高效且经济的模型训练策略。 算力 紧缺的今天,性能优秀的小模型显得尤为可贵。
- LLaMA:减少参数,增大数据集,开源数据集
- 推理速度 vs 训练速度: 首选的模型并 不是训练速度最快的模型 , 而是推理速度最快的模型 。尽管训练一个大型模型以达到一定的性能水平可能更便宜,但一个经过更长时间训练的小型模型在推理时最终会更经济。
- LLaMA-13B vs GPT-3: 尽管LLaMA-13B(130亿)的规模仅为GPT-3(1750亿参数)的十分之一,但在大多数 基准测试 中,其性能却优于GPT-3。
- LLaMA-7B: 可以在 单个 GPU 上运行 , 使大模型的获取和研究更容易,而不再只是少数几个大厂的专利。
- LLaMA-65B: 在高端系列上,LLaMA-65B 也与最佳的大语言模型(如 Chinchilla 或 PaLM-540B)性能相当。
- 训练数据: 只使用公开数据,没有依赖专有或无法访问的数据集, 使得LLama的工作可以与开源兼容 。
我们的训练方法与之前的工作(Brown等人,2020;Chowdhery等人,2022)中描述的方法类似,并受到Chinchilla缩放定律(Hoffmann等人,2022)的启发。我们使用标准优化器在大量文本数据上训练大型转换器模型。
敲黑板,划重点
-
LLaMA训练方法与前人的一些工作(Brown 等,2020;Chowdhery 等,2022)类似 , 并受到 Chinchilla scaling laws(Hoffmann 等,2022)的启发。
-
LLaMA 使用一个标准的优化器在大量文本数据上训练大型 Transformer。
2.1 Pre-training Data(预训练数据)
我们的训练数据集由多个来源组成,如表1所示,这些来源覆盖了多样化的领域。在大多数情况下,我们重新使用了已经用于训练其他LLMs的数据源,但限制条件是仅使用公开可用的、与开源兼容的数据。这导致以下的数据混合和它们在训练集中的占比:
表1: LLaMA训练数据集
- 英文CommonCrawl [67%]
我们使用CCNet流水线(Wenzek等人,2020)预处理了从2017年到2020年的五个CommonCrawl转储。此过程在行级别对数据进行去重,使用fastText线性分类器进行语言识别以移除非英语页面,并使用n-gram语言模型过滤低质量内容。此外,我们还训练了一个线性模型来分类用作维基百科参考的页面与随机采样的页面,并丢弃未被分类为参考的页面。
- C4 [15%]
在探索性实验中,我们观察到使用多样化的预处理过的CommonCrawl数据集可以提高性能。因此,我们在数据中加入了公开可用的C4数据集(Raffel等人,2020)。C4的预处理也包括去重和语言识别步骤:与CCNet的主要区别在于质量过滤,这主要依赖于诸如标点符号的存在或网页中单词和句子的数量等启发式方法。
- Wikipedia [4.5%]
我们添加了2022年6月至8月期间的Wikipedia转储数据,涵盖使用拉丁或西里尔字母的20种语言:bg、ca、cs、da、de、en、es、fr、hr、hu、it、nl、pl、pt、ro、ru、sl、sr、sv、uk。我们对数据进行了处理,移除了超链接、注释和其他格式化模板内容。
- Gutenberg和Books3 [4.5%]
我们的训练数据集中包含两个书籍语料库:Gutenberg项目和ThePile的Books3部分(Gao等人,2020)。Gutenberg项目包含公共领域的书籍,而Books3是一个公开可用的数据集,用于训练大型语言模型。我们在书籍级别进行了去重,移除了内容重叠超过90%的书籍。
- ArXiv [2.5%]
为了向数据集中添加科学数据,我们处理了ArXiv的Latex文件。我们遵循Lewkowycz等人(2022)的做法,移除了第一节之前的所有内容以及参考文献。我们还移除了.tex文件中的注释,并扩展了用户编写的内联定义和宏,以增加论文之间的一致性。
- Stack Exchange [2%]
我们包含了Stack Exchange的转储数据,这是一个包含高质量问题和答案的网站,涵盖从计算机科学到化学等多个领域。我们保留了来自28个最大网站的数据,从文本中移除了HTML标签,并按得分对答案进行了排序(从高到低)。
- 分词器
我们使用字节对编码(BPE)算法(Sennrich等人,2015)对数据进行分词,具体使用了SentencePiece(Kudo和Richardson,2018)的实现。值得注意的是,我们将所有数字拆分为单个数字,并使用字节来分解未知的UTF-8字符。
敲黑板,划重点
- 训练数据 集有几种不同来源,涵盖了多个领域。
- 整个 训练数据 集在 tokenization 后包含大约 1.4T 个 token。
-
对于大多数训练数据,每个 token 在训练期间仅使用一次;
-
维基百科和书籍是个例外,会被使用两次(two epochs)。
2.2 Architecture(架构)
在大型语言模型最近工作的基础上,我们的网络采用了转换器(transformer)架构(Vaswani等人,2017)。我们借鉴了随后提出并用于不同模型(如PaLM)中的各种改进。以下是我们的模型与原始架构的主要差异,以及我们进行这些更改的灵感来源(括号内标注):
- 预归一化 [GPT3] 。
为提高训练稳定性,我们对每个转换器子层的输入进行归一化,而不是对输出进行归一化。我们使用RMSNorm归一化函数,这是由Zhang和Sennrich(2019)引入的。
- SwiGLU激活函数 [PaLM] 。
我们用SwiGLU激活函数替代ReLU非线性函数,这是由Shazeer(2020)提出的,旨在提高性能。我们使用的维度是2/3*4d,而不是PaLM中的4d。
- 旋转嵌入 [GPTNeo] 。
我们移除了绝对位置嵌入,并在网络的每一层添加了旋转位置嵌入(RoPE),这是由Su等人(2021)提出的。关于我们不同模型的超参数详情,请参阅表2。
敲黑板,划重点
- 预 归一化 (Pre-normalization):受 GPT3 启发
- 为了提高训练稳定性, 对每个 Transformer sub-layer 的输入进行归一化,而不是对输出进行归一化 。
- 这里使用由 Zhang 和 Sennrich(2019)提出的 RMSNorm 归一化函数 。
- SwiGLU 激活函数 :受 PaLM 启发
- 激活函数用 SwiGLU 替换 ReLU ,该函数由 Shazeer(2020)提出,目的是提升性能。
- LLaMA 使用的维度是
2/3 * 4d
,而不是 PaLM 中的4d
。
- 旋转嵌入(Rotary Embeddings):受 GPTNeo 启发
-
去掉了 绝对位置嵌入( absolute positional embeddings),并在每个网络层中添加 旋转位置嵌入 (rotary positional embeddings,RoPE)。
-
旋转位置嵌入 RoPE 由 Su 等(2021)提出。
2.3 Optimizer(优化器)
我们的模型使用AdamW优化器(Loshchilov和Hutter,2017)进行训练,其超参数设置如下:β1 = 0.9,β2 = 0.95。我们采用余弦学习率调度,确保最终学习率等于最大学习率的10%。我们设置权重衰减为0.1,梯度裁剪为1.0。同时,我们使用2000步的预热步骤,并根据模型的大小调整学习率和批次大小(具体细节见表2)。
表2: 不同LLaMA模型的超参数
敲黑板,划重点
- 使用 AdamW 优化器(Loshchilov 和 Hutter,2017)对模型进行训练,具体 超参数 :β1=0.9,β2=0.95。
- 使用一个 cosine
learning rate schedule,最终的 学习率 达到了最大学习率的 10%。
-
使用 0.1 的权重衰减(weight decay)和 1.0 的梯度裁剪( gradient clipping )。
-
使用 2,000 个 warmup steps,并根据模型大小来调整 learning rate 和 batch size。
2.4 Efficient implementation(高效实现)
为了提高模型的训练速度,我们进行了几项优化。首先,我们使用高效的因果多头注意力实现来减少内存使用和运行时间。这种实现方式在xformers库中可用,它受到Rabe和Staats(2021)的启发,并使用了Dao等人(2022)的逆向方法。这是通过不存储注意力权重以及不计算由于语言建模任务的因果性质而被屏蔽的键/查询得分来实现的。
为了进一步提高训练效率,我们通过检查点减少了在反向传播过程中需要重新计算的激活量。更具体地说,我们保存了计算成本较高的激活,例如线性层的输出。这是通过手动实现转换器层的反向函数来实现的,而不是依赖PyTorch的自动微分。为了充分利用这一优化,我们需要使用模型和序列并行性来减少模型的内存使用,如Korthikanti等人(2022)所述。此外,我们还尽可能重叠激活的计算和GPU之间通过网络进行的通信(由于all_reduce操作)。
在训练一个拥有650亿参数的模型时,我们的代码在2048个拥有80GB内存的A100 GPU上,每GPU每秒能处理约380个令牌。这意味着,在我们的包含1.4万亿令牌的数据集上进行训练大约需要21天。
敲黑板,划重点
- 多项优化提高模型训练速度:
- 首先,使用 causal multi-head attention 的一个高效实现来减少内存占用和运行时。这种实现是受 Rabe 和 Staats(2021)的启发,并使用 Dao 等(2022)的反向传播,现在 xformers 库 中已经提供了。
优化原理:由于语言建模任务存在因果特性,因此可以不存储注意力权重(attention weights),不计算那些已经被掩码(masked)的 key/query scores。
- 为进一步提高训练效率,我们通过 checkpoint 技术, 减少了在反向传播期间需要重新计算的激活数量。
保存了计算成本高昂的激活,例如线性层的输出。实现方式是 手动实现 Transformer 层的反向函数 ,而不用 PyTorch autograd。
为了充分受益于这种优化,需要通过模型和序列并行(model and sequence parallelism)来 减少模型的 内存 使用。
- 模型训练优化后的成果:
- 这些优化使得在训练 65B 参数的模型时,代码在 2048 个 A100 80GB GPU 上能处理约
380 tokens/second/GPU
。 - 这意味着 1.4T token 的数据集上训练大约需要 21 天 。