前言

在2023年2月之前,大语言模型的世界完全被闭源巨头垄断。GPT-3、PaLM、Chinchilla这些动辄千亿参数的模型,不仅训练成本高达数千万美元,就连普通研究者想调用一下API都要排队付费。就在所有人都以为大模型会成为少数科技公司的私产时,Meta AI发布了LLaMA系列模型,彻底改变了整个行业的格局。

LLaMA用70亿参数就接近了GPT-3 1750亿的性能,130亿参数直接全面超越了GPT-3,而650亿参数的版本更是能和当时最强的Chinchilla-70B、PaLM-540B平起平坐。更重要的是,它是完全开源的(研究许可),任何人都可以下载使用。今天我们就来深度拆解这篇改变了AI历史的论文,看看Meta是如何用更少的参数、更少的计算,训练出更强的大模型的。


论文信息

  • 标题:LLaMA: Open and Efficient Foundation Language Models
  • 会议:arXiv预印本 2023
  • 单位:Meta AI
  • 代码:github.com/facebookresearch/llama
  • 论文:https://arxiv.org/pdf/2302.13971

一、为什么我们需要LLaMA?

在LLaMA出现之前,整个行业都陷入了一个误区:参数越大,模型越强。大家都在疯狂堆参数,从GPT-3的175B到PaLM的540B,再到Gopher的280B,参数越来越大,训练成本越来越高,但推理速度却越来越慢。

直到2022年,DeepMind的Chinchilla论文提出了著名的"计算最优缩放定律":对于给定的计算预算,最优的模型大小和训练数据量应该成正比。也就是说,与其训练一个超大模型用少量数据,不如训练一个小一点的模型用更多的数据。

但Chinchilla的研究只考虑了训练成本,完全忽略了推理成本。而在实际应用中,推理成本才是大头。一个模型可能只需要训练一次,但会被调用数十亿次。LLaMA的作者们问了一个简单的问题:如果我们的目标是得到一个推理速度最快、性能最好的模型,而不是训练最快的模型,我们应该怎么做?

答案就是:把小模型训练到极致。作者们发现,虽然Chinchilla定律说10B模型应该训练200B tokens,但7B模型的性能在训练到1T tokens时还在稳步提升。最终得到的7B模型,不仅性能超过了训练200B tokens的10B模型,而且推理速度快了近一倍。

这就是LLaMA的核心思想:用更多的训练数据来换取更小的模型参数,从而在保持性能的同时大幅降低推理成本


二、LLaMA是怎么炼成的?

2.1 训练数据:只用公开数据,也能训练出SOTA模型

LLaMA最了不起的一点是,它完全使用公开可用的数据集进行训练,没有使用任何私有数据。这也是它能够开源的关键。整个训练数据集包含约1.4T个tokens,覆盖了多个领域。

数据集 采样比例 训练轮数 磁盘大小
CommonCrawl 67.0% 1.10 3.3 TB
C4 15.0% 1.06 783 GB
Github 4.5% 0.64 328 GB
Wikipedia 4.5% 2.45 83 GB
Books 4.5% 2.23 85 GB
ArXiv 2.5% 1.06 92 GB
StackExchange 2.0% 1.03 78 GB

表1:LLaMA训练数据混合(出处:原文Table 1)

通俗解释:训练大模型就像做饭,食材的质量直接决定了菜品的好坏。LLaMA没有用什么神秘的"秘制食材",只是把市面上能买到的最好的公开食材买了回来,然后仔细清洗、切配、调味,最终做出了一道比那些用了昂贵私藏食材的大厨做的还要好吃的菜。

作者们对每个数据集都做了严格的预处理:

  • 对CommonCrawl使用CCNet流水线进行去重、语言识别和质量过滤
  • 对Github过滤掉了低质量文件和重复代码
  • 对Wikipedia去除了超链接、注释和格式模板
  • 对ArXiv去除了前言、参考文献和LaTeX注释

2.2 模型架构:站在巨人肩膀上的改进

LLaMA没有发明新的架构,而是在标准Transformer的基础上,整合了当时所有最好的改进:

参数规模 隐藏层维度 注意力头数 层数 学习率 批量大小 训练tokens数
6.7B 4096 32 32 3.0e-4 4M 1.0T
13.0B 5120 40 40 3.0e-4 4M 1.0T
32.5B 6656 52 60 1.5e-4 4M 1.4T
65.2B 8192 64 80 1.5e-4 4M 1.4T

表2:LLaMA模型架构与超参数(出处:原文Table 2)

三个关键改进:

  1. 预归一化(RMSNorm):对每个子层的输入进行归一化,而不是输出。这提高了训练稳定性,同时比LayerNorm计算更快。
  2. SwiGLU激活函数:替换了传统的ReLU,将前馈网络的中间维度从4d减少到了(2/3)*4d,在提高性能的同时减少了计算量。
  3. 旋转位置嵌入(RoPE):移除了绝对位置嵌入,改用旋转位置嵌入。这让模型能更好地泛化到比训练时更长的序列上。

2.3 优化器与训练策略

LLaMA使用AdamW优化器,超参数如下:

  • β₁=0.9,β₂=0.95
  • 余弦学习率调度,最终学习率为峰值的10%
  • 权重衰减0.1,梯度裁剪1.0
  • 2000步线性warmup

2.4 高效实现:让大模型训练成为可能

为了在合理的时间内训练这些大模型,作者们做了大量的工程优化:

  • 使用xformers库的高效因果注意力实现,不存储注意力权重,不计算被掩码的部分
  • 使用激活检查点技术,减少反向传播时需要保存的激活值
  • 使用模型并行和序列并行,将模型拆分到多个GPU上
  • 尽可能重叠计算和通信,减少等待时间

最终,65B模型在2048个A100 80GB GPU上的训练速度达到了380 tokens/sec/GPU,训练完1.4T tokens只需要21天。

在这里插入图片描述

图1:LLaMA训练损失随训练token数的变化(出处:原文Figure 1)

从图中可以看到,四个模型的训练损失都在稳步下降,即使在训练了1T tokens之后也没有饱和的迹象。这说明如果继续训练,性能还能进一步提升。


三、用数据说话:LLaMA到底有多强?

作者们在20多个标准基准上对LLaMA进行了全面的评估,涵盖了常识推理、问答、阅读理解、数学、代码等多个领域。

3.1 常识推理:13B击败175B GPT-3

模型 参数 BoolQ PIQA HellaSwag WinoGrande ARC-e ARC-c OBQA
GPT-3 175B 60.5 81.0 78.9 70.2 68.8 51.4 57.6
Chinchilla 70B 83.7 81.8 80.8 74.9 - - -
PaLM 540B 88.0 82.3 83.4 81.1 76.6 53.0 53.4
LLaMA-7B 7B 76.5 79.8 76.1 70.1 72.8 47.6 57.2
LLaMA-13B 13B 78.1 80.1 79.2 73.0 74.8 52.7 56.4
LLaMA-33B 33B 83.1 82.3 82.8 76.0 80.0 57.8 58.6
LLaMA-65B 65B 85.3 82.8 84.2 77.0 78.9 56.0 60.2

表3:零样本常识推理性能(出处:原文Table 3)

这是最震撼的一个结果:LLaMA-13B在大多数常识推理任务上都超过了参数是它10倍多的GPT-3!而LLaMA-65B更是全面超过了Chinchilla-70B,和PaLM-540B不相上下。

3.2 闭卷问答:不用搜索引擎也能回答问题

模型 参数 0-shot 1-shot 5-shot 64-shot
GPT-3 175B 14.6 23.0 - 29.9
Chinchilla 70B 16.6 - 31.5 35.5
PaLM 540B 21.2 29.3 - 39.6
LLaMA-7B 7B 16.8 18.7 22.0 26.1
LLaMA-13B 13B 20.1 23.4 28.1 31.9
LLaMA-33B 33B 24.9 28.3 32.9 36.0
LLaMA-65B 65B 23.8 31.0 35.0 39.9

表4:NaturalQuestions精确匹配率(出处:原文Table 4)

在闭卷问答任务上,LLaMA-65B达到了和PaLM-540B几乎相同的性能。更重要的是,LLaMA-13B可以在单张V100 GPU上运行,这意味着任何人都可以在自己的电脑上拥有一个接近GPT-3水平的问答系统。

3.3 数学推理:未经微调也能超过Minerva

模型 参数 MATH GSM8k GSM8k + maj1@100
PaLM 540B 8.8 56.5 -
Minerva-62B 62B 27.6 52.4 68.5
LLaMA-7B 7B 2.9 11.0 18.1
LLaMA-13B 13B 3.9 17.8 29.3
LLaMA-33B 33B 7.1 35.6 53.1
LLaMA-65B 65B 10.6 50.9 69.7

表5:数学推理性能(出处:原文Table 7)

这个结果最让人惊讶:LLaMA-65B在GSM8k基准上超过了专门在数学数据上微调的Minerva-62B,而它完全没有经过任何数学领域的微调!这说明LLaMA的基础推理能力非常强,只要稍微微调一下就能在特定领域取得惊人的效果。

3.4 代码生成:4.5%的代码数据也能写好程序

模型 参数 HumanEval pass@1 MBPP pass@1
LaMDA 137B 14.0 14.8
PaLM 62B 15.9 21.4
PaLM 540B 26.2 36.8
LLaMA-7B 7B 10.5 17.7
LLaMA-13B 13B 15.8 22.0
LLaMA-33B 33B 21.7 30.2
LLaMA-65B 65B 23.7 37.7

表6:代码生成性能(出处:原文Table 8)

LLaMA的训练数据中只有4.5%是Github代码,但它的代码生成能力却非常出色。LLaMA-13B就超过了参数是它10倍的LaMDA-137B,而LLaMA-65B超过了PaLM-62B,和PaLM-540B相当。


四、指令微调:让LLaMA学会听从指令

虽然基础版的LLaMA已经很强了,但它还不太擅长听从人类的指令。作者们做了一个简单的实验:用少量的指令数据对LLaMA-65B进行微调,得到了LLaMA-I。

模型 参数 MMLU 5-shot
OPT 30B 26.1
Flan-T5-XXL 11B 55.1
Flan-PaLM 62B 59.6
LLaMA 65B 63.4
LLaMA-I 65B 68.9

表7:指令微调后的MMLU性能(出处:原文Table 10)

只用了非常简单的指令微调,LLaMA-I的MMLU准确率就从63.4%提升到了68.9%,超过了Flan-PaLM-62B的66.1%。这个发现直接催生了后来的Alpaca、Vicuna等一系列指令微调模型,证明了开源大模型也能拥有接近ChatGPT的对话能力。


五、LLaMA的阴暗面:偏见、毒性与幻觉

大模型不是完美的,LLaMA也不例外。作者们对LLaMA的偏见、毒性和真实性进行了全面的评估。

5.1 毒性:模型越大越有毒

模型 Basic prompts Respectful prompts
LLaMA-7B 0.106 0.081
LLaMA-13B 0.104 0.095
LLaMA-33B 0.107 0.087
LLaMA-65B 0.128 0.141

表8:RealToxicityPrompts毒性得分(出处:原文Table 11)

得分越高表示越有毒。可以看到,随着模型规模的增大,毒性也在增加。尤其是在"礼貌"提示下,LLaMA-65B的毒性得分高达0.141,比小模型高很多。

5.2 偏见:存在明显的社会偏见

作者们使用CrowS-Pairs基准评估了LLaMA在9个维度上的偏见:

偏见维度 LLaMA-65B GPT-3 OPT-175B
性别 70.6 62.6 65.7
宗教 79.0 73.3 68.6
种族 57.0 64.7 68.6
性取向 81.0 76.2 78.6
平均 66.6 67.2 69.5

表9:CrowS-Pairs偏见得分(出处:原文Table 12)

得分越高表示偏见越严重。LLaMA的平均偏见略低于GPT-3和OPT-175B,但在宗教、性别和年龄维度上的偏见比较明显。

5.3 真实性:容易产生幻觉

模型 参数 Truthful Truthful*Informative
GPT-3 175B 0.28 0.25
LLaMA-7B 7B 0.33 0.29
LLaMA-13B 13B 0.47 0.41
LLaMA-33B 33B 0.52 0.48
LLaMA-65B 65B 0.57 0.53

表10:TruthfulQA性能(出处:原文Table 14)

虽然LLaMA比GPT-3更真实,但正确率仍然只有57%,这意味着它有接近一半的概率会生成虚假信息。这是所有大模型都面临的共同问题,也是未来需要重点解决的方向。


六、碳足迹:大模型的环境代价

训练大模型需要消耗大量的能源,产生大量的碳排放。作者们计算了LLaMA系列模型的碳足迹,并和其他模型进行了对比。

碳足迹的计算公式如下:
Wh=GPU−h×(GPU power consumption)×PUEWh = GPU-h \times (GPU \text{ power consumption}) \times PUEWh=GPUh×(GPU power consumption)×PUE
tCO2eq=MWh×0.385tCO_2 eq = MWh \times 0.385tCO2eq=MWh×0.385

  • WhWhWh:总能耗,单位瓦时
  • GPU−hGPU-hGPUh:训练过程消耗的总GPU小时数
  • GPU power consumptionGPU \text{ power consumption}GPU power consumption:单个GPU的功耗,A100为400W
  • PUEPUEPUE:数据中心的电源使用效率,这里取1.1
  • tCO2eqtCO_2 eqtCO2eq:二氧化碳当量排放量,单位吨
  • MWhMWhMWh:总能耗,单位兆瓦时
  • 0.3850.3850.385:美国电网的平均碳强度,单位kg CO₂e/kWh
模型 GPU类型 GPU功耗 GPU小时数 总能耗 碳排放(tCO₂eq)
OPT-175B A100-80GB 400W 809,472 356 MWh 137
BLOOM-175B A100-80GB 400W 1,082,880 475 MWh 183
LLaMA-7B A100-80GB 400W 82,432 36 MWh 14
LLaMA-13B A100-80GB 400W 135,168 59 MWh 23
LLaMA-33B A100-80GB 400W 530,432 233 MWh 90
LLaMA-65B A100-80GB 400W 1,022,362 449 MWh 173

表11:不同模型的碳足迹对比(出处:原文Table 15)

可以看到,LLaMA的碳排放显著低于其他相同规模的模型。LLaMA-7B的碳排放只有14吨,而OPT-175B高达137吨。作者们指出,发布这些预训练模型可以大幅减少未来的碳排放,因为全世界的研究者不用再重新训练这些模型了。


七、动手实践:5行代码运行LLaMA

现在,我们可以用Hugging Face的Transformers库,只用几行代码就能加载并运行LLaMA模型:

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# 加载模型和分词器(这里以Llama-2-7b-chat为例,LLaMA-1也可以用同样的方式加载)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf")
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-chat-hf",
    torch_dtype=torch.bfloat16,
    device_map="auto"  # 自动将模型拆分到可用的GPU上
)

# 生成文本
prompt = "Explain quantum computing to a 10-year-old."
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(
    **inputs,
    max_new_tokens=200,
    temperature=0.7,
    top_p=0.9
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

LLaMA的生成能力非常强,它可以写代码、写故事、写邮件、解答问题,甚至还能写剧本。比如原文中LLaMA-65B生成的这个有趣的例子:

这里是我为魔法独角兽公司的龙饲养员职位写的推荐信:

亲爱的招聘官:

我认识___已经两年了,我相信她会成为魔法独角兽公司优秀的龙饲养员。___拥有记住和处理大量信息的能力,这是龙饲养员的重要技能。

作为一名出色的骑士,___深知如何杀死龙以及如何利用每条龙的弱点。这意味着她知道每条龙喜欢吃什么食物,什么食物对它们是危险的。这些知识和经验对她饲养龙来说将是无价的。

我相信___的能力、技巧和经验会让她成为一名优秀的员工。如果您有任何问题,请随时联系我()-___。期待您的回复。

此致
敬礼
尊敬的骑士
乔治爵士


总结

LLaMA是大语言模型发展史上的一个里程碑。它的核心贡献可以总结为三点:

  1. 证明了只用公开数据就能训练出SOTA级别的大模型,打破了闭源巨头的垄断
  2. 颠覆了"参数越大越好"的传统观念,展示了"小模型+更多数据"的巨大潜力
  3. 开启了开源大模型的时代,催生了Alpaca、Vicuna、Llama 2、Llama 3等一系列优秀的开源模型

在LLaMA发布之前,大模型是少数科技公司的特权。在LLaMA发布之后,任何人都可以在自己的电脑上运行、研究和修改大模型。这极大地加速了大模型技术的发展,也让更多人能够享受到AI技术带来的便利。

更多推荐