llama

"llama"

Posted by zwt on April 21, 2024

Llama

LLaMA: Open and Efficient Foundation Language Models

数据量为1T到1.5T不等,不同容量的模型不同。数据集都为公开数据。

scaling laws:Hoffmann等人在2022年的工作显示,对于给定的计算预算,最佳性能并不是由最大的模型实现的,而是通过在更多数据上训练的较小模型实现的。这意味着,扩展法则的目标是在考虑推理预算的情况下,找到最佳的模型和数据集规模,以实现目标性能水平。在这种情况下,首选的模型不是训练速度最快的,而是在推理时速度最快的。

LLaMA项目的重点是通过比通常使用的数据更多的标记来训练一系列语言模型,以实现在各种推理预算下的最佳性能。结果表明,即使是在训练了1万亿个标记之后,7B参数的模型性能仍在提高,这表明扩展法则在实际应用中是有效的。

==训练数据只会被使用一遍==

结构

结构如下图所示:

LLaMA模型采用了以下架构改进:

  1. Pre-normalization: 为了提高训练的稳定性,LLaMA模型在每个变换器子层的输入上进行归一化,而不是在输出上。这种方法受到了GPT-3模型的启发。
  2. SwiGLU激活函数: 用SwiGLU激活函数替代了传统的ReLU激活函数。SwiGLU是在PaLM模型中提出的一种激活函数,旨在提高模型性能。
  3. Rotary Embeddings (RoPE): 移除了绝对位置嵌入,而是在网络的每层添加了旋转位置嵌入(Rotary Positional Embeddings),这是由GPTNeo模型引入的技术。
  4. RMSNorm归一化函数,该函数由Zhang和Sennrich在2019年提出。这种归一化方法有助于稳定训练过程,因为它减少了输入数据的方差,使得网络可以更有效地学习。

加速训练

  1. 因果多头注意力的高效实现:使用了一个高效的因果多头注意力(causal multi-head attention)实现,以减少内存使用和运行时间。这个实现利用了语言建模任务的因果性质,通过避免存储注意力权重和不计算由于因果掩蔽而不需要的键/查询分数来实现。
  2. 激活复用的检查点(Checkpointing):为了进一步提高训练效率,研究者减少了在反向传播过程中重新计算的激活数量。具体来说,他们保存了那些计算代价高昂的激活,例如线性层的输出。这是通过手动实现变换器层的反向函数来完成的,而不是依赖于PyTorch的自动梯度计算。
  3. 模型和序列并行:为了减少模型的内存使用,研究者使用了模型并行和序列并行技术,如Korthikanti等人在2022年所描述的那样。
  4. 激活计算与GPU间通信的重叠:研究者尽可能地将激活计算与由于all_reduce操作而产生的GPU间网络通信重叠。
  5. 训练硬件和时间:在训练65B参数模型时,代码能够在具有80GB RAM的2048个A100 GPU上实现大约380个标记/秒/GPU的处理速度。这意味着在包含1.4万亿标记的数据集上进行训练大约需要21天。

指令微调

“Instruction Finetuning”(指令微调)是指对模型进行额外训练的过程,以便它能够更好地理解和执行自然语言指令。这个过程通常涉及到在特定的任务或数据集上对模型进行微调,以便提高其在特定任务上的性能。

对大型语言模型进行少量的指令微调,也能显著提升其在特定任务上的表现。这种方法为未来改进大型语言模型的指令遵循能力提供了一个有前景的方向,并可能有助于解决模型在理解自然语言指令方面的挑战。

Pre-normalization优势

  1. 梯度稳定性:预归一化有助于稳定梯度,因为它减少了层之间潜在的梯度爆炸或消失问题。这使得模型训练更加稳定,并且可以使用更高的学习率,从而加快训练速度。
  2. 训练效率:由于梯度更加稳定,预归一化可以减少训练过程中的调整和正则化需求,例如不需要频繁调整学习率或者使用太多的梯度裁剪。
  3. 层的可解释性:预归一化使得每一层的输出更加独立,因为它们不受前一层输出的影响。这有助于提高模型的可解释性,因为每一层的作用更加清晰。
  4. 模型并行性:在分布式训练中,预归一化可以提高模型的并行性。因为它允许每个处理单元独立地处理数据,而不需要等待其他单元的输出。
  5. 避免内部协变量偏移:预归一化有助于避免内部协变量偏移,这是因为每个层的输入都是归一化的,从而减少了层之间相互依赖的影响。
  6. 提高模型性能:在某些情况下,预归一化可以提高模型的性能,因为它允许模型更有效地学习数据的分布。
  7. 简化模型架构:预归一化可以简化模型架构的设计,因为它减少了对复杂正则化技术的依赖。

其它

  1. 偏见和毒性的评估:作者指出,大型语言模型在生成内容时可能会产生有害的语言,例如侮辱、仇恨言论或威胁。为了评估LLaMA模型在这些方面的潜在风险,研究者使用了不同的基准测试来衡量模型生成有毒内容的倾向。
  2. RealToxicityPrompts:这是一个包含大约100k个提示的基准测试,模型必须完成这些提示,然后通过PerspectiveAPI自动评估其毒性分数。LLaMA模型在这些提示上的毒性分数与文献中观察到的其他模型相当。
  3. CrowS-Pairs:这是一个衡量模型在多个类别(如性别、宗教、种族、性取向等)中偏见水平的数据集。LLaMA模型在这些类别上的偏见评分与GPT-3和OPT-175B相比较,显示出略微有利的结果。
  4. WinoGender:这是一个共指消解数据集,用于评估模型在性别类别上的偏见。LLaMA模型在处理性别代词时的性能表明,模型可能捕捉了与职业相关的社会偏见。
  5. TruthfulQA:这是一个衡量模型辨别真实声明能力的数据集。LLaMA模型在这个问题上的表现表明,尽管得分高于GPT-3,但模型仍有可能生成错误的答案。
  6. 社会偏见的捕捉:论文中提到,尽管采取了多步骤的过滤,但模型可能仍然捕捉到了来自CommonCrawl等数据源的社会偏见。
  7. 性别和职业偏见:在WinoGender基准测试中,LLaMA模型在处理性别代词时的性能下降,这表明模型可能使用职业的多数性别来进行共指消解,而不是使用句子中的证据。
  8. 错误信息的生成:LLaMA模型在TruthfulQA基准测试中的表现表明,模型在生成真实和信息性答案方面仍有改进空间。

Llama2

Llama 2 包括了不同规模的模型,参数数量从7亿到70亿不等。这些模型经过了微调,以优化对话使用场景,被称为 Llama 2-Chat。

数据2万亿token,且都是公开数据,上下文从2048扩展到4096.在34B和70B模型中加入了分组注意力提高推理的可扩展性。

数据清洗

  1. 隐私和法律审查:每个用于训练的数据集都遵循了Meta的标准隐私和法律审查流程。
  2. 不使用Meta用户数据:在训练过程中,没有使用任何来自Meta产品或服务的用户数据。
  3. 排除特定网站数据:作者们避免使用那些已知含有大量个人隐私信息的特定网站的数据。
  4. 数据清洗:尽管没有提供具体的数据清洗规则细节,但可以推测这些规则旨在减少数据集中的偏见、不准确信息和有害内容。
  5. 数据集的多样性:为了提高模型的泛化能力,作者们努力确保预训练数据集具有多样性,并且没有过度清洗数据集,以避免潜在的特定人群的意外排除。
  6. 数据集的代表性:作者们分析了预训练数据中的性别代词和不同人群的代表性,以了解模型可能的学习偏差。
  7. 数据集的毒性:使用HateBERT分类器对预训练语料库的英语部分进行了毒性评估,以确保数据集中的毒性内容处于较低水平。
  8. 语言识别:预训练数据主要是英文,但也包括其他一些语言的文本。作者们使用fastText工具对数据集中的语言分布进行了分析。
  9. 安全性基准测试:对预训练模型在TruthfulQA(真实性)、ToxiGen(毒性)和BOLD(偏见)等安全性基准测试上进行了评估。
  10. 数据集的时效性:预训练数据的截止日期是2022年9月,但一些微调数据可能更近期,直到2023年7月。

改进点

Llama 2 相对于其前身 Llama 1 在以下几个方面进行了优化:

  1. 数据清洗和数据集更新:Llama 2 进行了更健壮的数据清洗,并更新了数据混合,以提高模型的泛化能力和性能。
  2. 更多的训练数据:Llama 2 在总训练数据上增加了40%,这意味着模型能够学习更多的信息,从而提高其在多种任务上的表现。
  3. 上下文长度加倍:Llama 2 将上下文长度从 Llama 1 的2048个令牌增加到4096个令牌。这使得模型能够处理更长的输入序列,对于需要处理长距离依赖的任务(如对话系统和文档理解)非常有帮助。
  4. 分组查询注意力(Grouped-Query Attention, GQA):为了提高大型模型的推理可扩展性,Llama 2 在更大的模型中采用了分组查询注意力机制。这种技术允许模型在保持性能的同时,减少计算和内存需求。
  5. 训练细节:Llama 2 采用了标准的变换器架构,并应用了预归一化、SwiGLU 激活函数和旋转位置嵌入(Rotary Positional Embeddings, RoPE)。这些技术有助于模型更有效地处理序列数据,并提高其对长距离依赖的捕捉能力。
  6. 训练硬件和碳足迹:论文还讨论了训练硬件的选择和对环境的影响,包括使用的 GPU 类型、集群的互连解决方案,以及训练过程中的能耗和碳排放。
  7. 模型评估:Llama 2 在多个学术基准上进行了评估,包括代码生成、常识推理、世界知识、阅读理解和数学问题解决等任务。

SFT

SFT过程涉及以下几个关键环节:

  1. 启动SFT:为了开始SFT阶段,研究团队使用了公开可用的指令调整数据(instruction tuning data),这是之前在其他工作中已经使用过的。
  2. 质量至上:第三方SFT数据来源虽然多样,但很多数据集在多样性和质量方面不足,特别是对于与对话风格指令对齐的LLMs。因此,研究团队首先集中收集了数千个高质量的SFT数据示例。
  3. 数据筛选:研究团队放弃了来自第三方数据集的数百万条示例,转而使用更少但质量更高的自产注释示例。这种对高质量数据的重视显著提高了SFT的结果。
  4. 注释平台和供应商的重要性:不同的注释平台和供应商可能导致显著不同的下游模型性能,这突显了即使在使用供应商获取注释时,数据检查的重要性。
  5. SFT注释:SFT注释包括为给定提示编写提示和答案。注释者被要求编写符合提供的标准的答案,例如使用高质量的SFT数据进行注释。
  6. 迭代改进:通过收集更多的偏好数据,研究团队能够训练更好的奖励模型,并收集更多的提示。因此,他们训练了连续版本的RLHF模型,称为RLHF-V1、…、RLHF-V5。
  7. 数据多样性:在收集人类偏好数据时,研究团队专注于提高数据的多样性,包括不同的任务类型、模型变体和温度设置。
  8. 模型性能评估:使用人类评估作为模型性能的黄金标准,但也使用模型基础评估作为辅助,以节省成本并加快迭代速度。

llama2-chat

  1. 预训练(Pretraining):
    • Llama 2-Chat的基础模型Llama 2在大量公开可用的数据上进行预训练。
    • 预训练数据集包含了2万亿个令牌,旨在提供良好的性能与成本平衡。
    • 预训练过程中,采用了优化的自回归变换器架构,并实施了更严格的数据清洗。
  2. 有监督的微调(Supervised Fine-Tuning, SFT):
    • 初始的SFT阶段使用公开可用的指令调整数据集。
    • 通过收集高质量的SFT数据,模型学会了如何更好地响应指令和生成有用的回答
    • 收集了超过27,540个高质量的SFT注释,这些数据用于微调模型。
  3. 强化学习与人类反馈(Reinforcement Learning with Human Feedback, RLHF):
    • 在SFT之后,使用RLHF进一步微调模型,以更好地与人类偏好对齐。
    • 收集了大量的人类偏好数据,其中包括对模型生成的回答的比较和选择。
    • 使用这些人类偏好数据训练奖励模型(reward models),以评估和改进模型的回答。
    • RLHF过程包括迭代地应用PPO(Proximal Policy Optimization)算法和拒绝采样(Rejection Sampling)。
  4. 系统消息和多轮对话一致性(System Message for Multi-Turn Consistency):
    • 为了保持在多轮对话中的一致性,引入了“幽灵注意力”(Ghost Attention, GAtt)技术。
    • GAtt通过在训练数据中合成系统消息来帮助模型记住对话的上下文和指令。
  5. 安全性评估(Safety Evaluation):
    • 在模型训练的每个阶段,都进行了安全性评估,以确保生成的内容既安全又有帮助。
    • 使用了多种自动基准测试来评估模型在真实性、毒性和偏见方面的表现。
  6. 红队测试(Red Teaming):
    • 进行了红队测试,以识别和缓解潜在的风险和漏洞。
    • 红队测试涉及内部和外部专家,他们尝试从不同的角度攻击模型,以评估其鲁棒性。
  7. 负责任的发布策略(Responsible Release Strategy):
    • 为了确保模型的负责任使用,制定了详细的发布策略和使用指南。
    • 提供了代码示例和安全指南,以帮助开发者安全地部署Llama 2-Chat。

      reward model

  8. 目的:奖励模型的目的是提供一个可量化的指标,用以指导和优化模型在与人类偏好对齐方面的表现。
  9. 输入和输出:奖励模型接收模型的回答及其对应的提示(prompt)作为输入,并输出一个标量分数,该分数表示模型生成的回答的质量。
  10. 训练:奖励模型使用人类比较数据进行训练,这些数据是通过人类标注者对两个模型输出的回答进行比较和选择得到的。
  11. 损失函数:为了训练奖励模型,研究者使用了==二元排名损失函数==,确保被标注者选择的回答获得更高的分数。
  12. 安全和有用性:由于有用性和安全性有时可能存在权衡,研究者训练了两个独立的奖励模型,==一个针对有用性(Helpfulness RM),另一个针对安全性(Safety RM)==。
  13. 数据组合:奖励模型的训练数据包括新收集的数据和现有的开源偏好数据集,以提高奖励模型的泛化能力。
  14. 训练细节:奖励模型使用与基础模型相同的优化器参数,采用余弦学习率调度,并在训练过程中逐渐降低学习率。
  15. 模型性能:奖励模型在内部测试集上的表现通过与其他公开可用的基线模型进行比较来评估。
  16. 迭代微调:随着人类偏好数据的不断收集,研究者能够训练更好的奖励模型,并使用这些模型来微调Llama 2-Chat模型。
  17. 温度参数:在RLHF中,温度参数(temperature parameter)用于控制模型输出的多样性。研究者发现,随着模型的迭代更新,最优温度参数会发生变化。

多轮对话一致性

Ghost Attention(GAtt)是论文中提出的一种技术,旨在解决对话模型在多轮对话中保持一致性和上下文记忆的问题。在多轮对话中,尤其是在长对话中,模型需要记住之前的交流内容以生成连贯和相关的回答。GAtt通过以下方式帮助实现这一目标:

  1. 系统消息合成:GAtt通过将特定的系统消息(例如,对话中的指令或约束)合成到所有用户消息中来增强模型的上下文记忆。例如,如果模型被指示“始终表现得像莎士比亚”,那么这个指令就会被附加到每个用户消息上。
  2. 注意力引导:在对话过程中,GAtt通过设置特殊的标记或提示来引导模型的注意力,使其关注这些系统消息,从而帮助模型在整个对话中保持一致性。
  3. 训练数据的调整:在训练数据中,GAtt通过将系统消息添加到用户消息的前面来创建合成的对话上下文。这样,模型在生成回答时会考虑到这些上下文信息。
  4. 迭代改进:GAtt在RLHF(Reinforcement Learning with Human Feedback)的多个迭代中被应用和改进。通过这种方式,模型学会了更好地处理多轮对话,并在长时间内保持对话的一致性。
  5. 零样本学习:GAtt还能够在没有特定系统消息训练的情况下工作,这意味着即使在训练数据中没有出现过的约束,模型也能够在推理时适应并保持一致性。

参考

  1. 知乎
  2. llama2
  3. llama