-
摘要
-
1 引言
- 语言建模的研究可以分为四个主要发展阶段:统计语言模型(SLM)、神经语言模型(NLM)、预训练语言模型(PLM)、大语言模型(LLM)
- ·统计语言模型(SLM):基本思想是基于马尔可夫假设建立词预测模型,例如根据最近的上下文预测下一个词。
- ·神经语言模型(NLM):引入了词的分布式表示这一概念,并在聚合上下文特征(即分布式词向量)的条件下构建词预测函数。开创了将语言模型用于表示学习(超越词序列建模)的应用
- ·预训练语言模型(PLM):基于自注意力机制的高度并行化Transformer架构。确立了“预训练和微调”学习范式。
- ·大语言模型(LLM):在解决一系列复杂任务中展示了惊人的能力(称为涌现能力)
- LLM和PLM之间的三个主要区别:
- LLM表现出一些令人惊讶的涌现能力
- 与小型PLM不同,访问LLM的主要方法是通过提示接口(例如GPT-4API)
- LLM的发展不再明确区分研究和工程。
- 这一新技术浪潮可能会带来一个基于LLM的实际应用的繁荣生态系统。
基本原理尚未得到充分探索的挑战:- 为什么涌现能力会出现在LLM中
- 研究界很难训练出有能力的LLM
- 将LLM与人类价值观或偏好保持一致是具有挑战性的
- 从四个主要方面对LLM的最近进展进行文献综述:
- 预训练(如何预训练出一个有能力的LLM)
- 适配微调(如何从有效性和安全性两个角度有效地微调预训练的LLM)
- 使用(如何利用LLM解决各种下游任务)
- 能力评估(如何评估LLM的能力和现有的经验性发现)
- 语言建模的研究可以分为四个主要发展阶段:统计语言模型(SLM)、神经语言模型(NLM)、预训练语言模型(PLM)、大语言模型(LLM)
-
2 概述
- 2.1 大语言模型的背景
- LLM是指包含数千亿(或更多)参数的Transformer 语言模型
- 本部分将介绍LLM的基本背景,包括扩展法则、涌现能力和关键技术。
- 大语言模型的扩展法则:LLM大幅度扩展了模型规模、数据规模和总计算量(数量级)。
- KM扩展法则:(OpenAI 团队)这三个规律是通过拟合模型在不同数据大小(2200万到230亿个token)、模型大小(7.68亿到15亿个非嵌入参数)和训练计算量下的性能得出的。结果表明,模型性能与这三个因素存在着强依赖关系。
- Chinchilla扩展法则:(Google DeepMind团队) 随着给定计算预算的增加,KM扩展法则更偏向于将更大的预算分配给模型大小,而Chinchilla扩展法则则认为模型大小和数据大小应该以相同的比例增加
- 大语言模型的涌现能力:
- 在小型模型中不存在但在大型模型中产生的能力。当规模达到一定水平时,性能显著提高,超出随机水平。
- 简要介绍了LLM的三种典型涌现能力和具备这种能力的代表性模型:
- 上下文学习:ICL能力,假设已经为语言模型提供了一个自然语言指令和/或几个任务演示,它可以通过完成输入文本的单词序列的方式来为测试实例生成预期的输出,而无需额外的训练或梯度更新
- 指令遵循:通过指令微调,LLM能够在没有使用显式示例的情况下遵循新的任务指令,因此它具有更好的泛化能力。
- 逐步推理:对于小型语言模型而言,通常很难解决涉及多个推理步骤的复杂任务,例如数学问题。然而,通过使用思维链(Chain-of-Thought,.CoT)提示策略[32,LLM可以通过利用包含中间推理步骤的提示机制来解决这类任务,从而得出最终答案。
- 大语言模型的关键技术:
- ●扩展:Transformer语言模型存在明显的扩展效应:更大的模型/数据规模和更多的训练计算通常会导致模型能力的提升。然而, 需要注意的是,数据扩展应该经过谨慎的清理过程,因为预训练数据的质量在模型能力中起着关键作用。
- ●训练:分布式训练算法是学习LLM网络参数所必需的,其中通常联合使用各种并行策略。此外,优化技巧对于训练稳定性和模型性能也很重要
- ●能力引导:作为技术手段,设计合适的任务指令或具体的ICL策略可以激发这些能力。例如,通过包含中间推理步骤,CoT提示已被证明对解决复杂的推理任务有效。此外,我们还可以使用自然语言表达的任务描述对LLM进行指令微调,以提高LLM在未见任务上的泛化能力。
- ●对齐微调:有必要使LLM与人类价值观保持一致,例如有用性、诚实性和无害性。为此, InstructGPT[61]设计了一种有效的微调方法,使LLM能够按照期望的指令进行操作,其中利用了基于人类反馈的强化学习技术
- ●工具操作:外部插件(现有或新创建的应用程序)的机制,可以广泛扩展LLM的能力范围。
- 2.2 GPT 系列模型的技术演进
- 早期探索
- • GPT-1
- 2018 年发布
- 生成式预训练(Generative Pre-Training)
- 。GPT-1 是基于生成型的、仅解码器的 Transformer 架构开发的,并采用了无监督预训练和有监督微调的混合方法。
- GPT-1 为 GPT 系列模型建立了核心架构,并确立了对自然语言文本进行建模的基本原则,即预测下一个单词。
- • GPT-2
- 将参数规模增加到了 15 亿, 并使用大规模的网页数据集 WebText 进行训练。
- 旨在通过无监督语言建模来执行任务,而无需使用标记数据进行显式微调。
- 引入了多任务求解的概率形式,即p(output|input, task)
- 解决任务的过程可以被视为生成解决方案文本的单词预测问题。
- • GPT-1
- 能力飞跃
- 尽管 GPT-2 旨在成为一个“无监督的多任务学习器” ,但与监督微调的 SOTA 方法相比,其整体性能仍然较差。但 GPT-2 模型规模相对较小,在下游任务中得到了广泛微调,尤其是对话任务 [76, 77]。基于 GPT-2,GPT-3 通过扩展(几乎相同的)生成式预训练架构展现出重要的能力飞跃。
- • GPT-3
- 1750 亿
- GPT-3 的论文正式介绍了 ICL 的概念,它是以小样本或零样本的方式使用 LLM。
- ICL 可以指导 LLM 理解以自然语言文本的形式给出的任务。
- 预训练预测给定上下文条件下的后续文本序列,而 ICL 预测正确的任务解决方案,该解决方案可以被格式化为给定任务描述和示范下的文本序列。
- GPT-3 可以被视为从 PLM 到 LLM 进化过程中的一个重要里程碑。它通过实证证明,将神经网络扩展到大的规模可以大幅增加模型的能力。
- 能力增强
- OpenAI 探索了两种主要方法来进一步改进 GPT-3 模型,即使用代码数据进行训练以及与人类偏好的对齐
- • 使用代码数据进行训练:
- GPT-3.5 模型是在基于代码的 GPT 模型(code-davinci-002)的基础上开发的, 这表明使用代码数据进行训练是改善 GPT 模型能力(尤其是推理能力)的一种非常有用的实践。
- 此外,还有一种猜测称使用代码数据进行训练可以极大地增加 LLM 的CoT 提示能力 ,尽管这仍然需要更全面的验证。
- • 与人类对齐:
- 应用强化学习(RL)来学习由人类标注的偏好比较的工作,类似于InstructGPT 在图 6中的对齐算法的奖励训练步骤
- 近端策略优化 (Proximal Policy Optimization, PPO)
- ,现在已经成为从人类偏好中学习的基础 RL 算法
- 基于这些先前的工作,InstructGPT[61] 在 2022 年 1 月提出,以改进 GPT-3 模型的与人类对齐能力,正式建立了一个三阶段的基于人类反馈的强化学习(RLHF)算法
- 除了提高指令遵循能力之外,RLHF 算法对于缓解有害或有毒内容的生成问题十分有效, 这对于 LLM 在实践中的安全部署至关重要。
- 这些增强技术引出了具有更强能力的改进型 GPT-3 模型,OpenAI 称其为 GPT-3.5 模型
- 语言模型的重要里程碑:
- 基于所有的探索工作,OpenAI 取得了两个重要的里程碑:ChatGPT 和 GPT-4,这两个模型大大提升了现有 AI 系统的能力水平。
- • ChatGPT:
- 在 2022 年 11 月,OpenAI 发布了对话语言模型 ChatGPT, 它是基于 GPT 模型 (GPT-3.5 和 GPT-4) 开发。
- ChatGPT 是以类似 InstructGPT 的方式进行训练的,但专门针对对话能力进行了优化。
- 在 ChatGPT 和 InstructGPT 的数据收集上,他们指出了一个不同之处:
- ChatGPT 训练数据是通过将人类生成的对话(扮演用户和AI 两个角色)与 InstructGPT 数据集结合起来以对话形式生成。
- ChatGPT 支持了插件机制,进一步通过已有工具或应用扩展了 ChatGPT 的功能。
- • GPT-4:
- GPT-4于 2023 年3 月发布,将文本输入扩展到多模态信号。
- GPT-4 具有比之前的 GPT 模型如 ChatGPT 更出色的性能。
- 由于经过为期六个月的迭代对齐(在 RLHF 训练中加入了额外的安全奖励信号) ,GPT-4 对于具有恶意或挑衅的提问的响应更加安全。
- 在技术报告中,OpenAI 强调了如何安全开发 GPT-4, 并采用了多种干预策略来减轻语言模型的可能问题,如幻觉、隐私和过度依赖。
- 红队评估(red teaming)
- 采用了改进的优化方法。他们引入了一种称为可预测扩展(predictable scaling)的新机制,可以使用模型训练期间一小部分的计算量来准确预测最终性能。
- 尽管取得了巨大的进展,这些优秀的 LLM 仍然存在局限性,例如在某些特定上下文中生成错误的幻觉或存在潜在风险的回应
- 从工程的角度来看,OpenAI 采用了一种迭代部署策略 [86],通过遵循五阶段的开发和部署生命周期来开发模型和产品, 以有效降低使用模型带来的潜在风险。
- 早期探索
- 2.1 大语言模型的背景
-
3 大语言模型资源
- 3.1 公开可用的模型检查点或 API
- 百亿参数量级别的模型:
- LLaMA (最大版本 650 亿参数)
- NLLB(最大版本 545 亿参数)
- 大多在 100 亿至 200 亿之间
- Flan-T5 (110 亿版本) 可以作为研究指令微调的首选模型
- CodeGen(11B)是一个为生成代码设计的自回归语言模型,可用作探索代码生成能力的候选模型。
- 对于多语言任务,mT0(13B)可能是一个比较好的候选模型
- 对于中文的下游任务,PanGu-α具有较好的表现
- 百亿参数量级别的模型通常需要数百甚至上千个 GPU 或 TPU。
- 千亿参数量级别的模型:
- 参数量几乎与 GPT-3(175B)大致相同
- GLM1300 亿
- Galactica1200 亿
- OPT(175B)专注于复现和开源,旨在使研究人员能够进行大规模可重复研究。
- 对于跨语言泛化研究, 可以将 BLOOM(176B)和 BLOOMZ(176B)用作基础模型, 因为其在多语言语言建模任务中具有较好的能力。
- OPT-IML 进行了指令微调,是研究指令微调效果的较好选择。
- 千亿参数量级别的模型通常需要数千个 GPU 或TPU 进行训练。
- 大语言模型的公共 API:
- OpenAI 提供了七个主要的 GPT-3 系列模型接口:
- ada、babbage、curie、davinci(GPT-3 系列中最强大的版本)、text-ada-001、text-babbage-001 和text-curie-001。
- 前四个接口可以在 OpenAI 的主机服务器上进一步进行微调
- babbage、curie 和 davinci 分别对应于 GPT-3 (1B)、GPT-3 (6.7B) 和 GPT-3 (175B) 模型
- 还有两个与 Codex 有关的 API
- code-cushman-001(Codex (12B) 的强大多语言版本
- code-davinci-002
- GPT-3.5 系列包括一个基础模型code-davinci-002 和三个增强版本
- text-davinci-002
- text-davinci-003
- gpt-3.5-turbo-0301
- GPT-4 相应的 API
- gpt-4
- gpt-4-0314
- gpt-4-32k
- gpt-4-32k-0314
- 总体而言, API 接口的选择取决于具体的应用场景和响应需求。
- OpenAI 提供了七个主要的 GPT-3 系列模型接口:
- 百亿参数量级别的模型:
- 3.2 常用语料库
- 在本节, 我们将简要总结一些常用于训练 LLM 的语料库。 基于它们的内容类型, 我们将这些语料库分为六个组别进行介绍: Books、CommonCrawl、Reddit Links、Wikipedia、Code、Others
- Books:
- CommonCrawl
- Reddit Links:
- Wikipedia:
- Code:
- Others:
- The Pile [130] 是一个大规模、多样化、开源的文本数据集,有超过 800GB 数据,内容包括书籍、网站、代码、科学论文和社交媒体平台等。
- ROOTS [131] 由各种较小的数据集(总共 1.61 TB 的文本)组成,覆盖 59 种不同的语言(包括自然语言和编程语言) ,它被用于训练 BLOOM [69]。
- 实际上,为了预训练 LLM,通常需要混合使用不同的数据源(见图 2) ,而不是单一的语料库。
- 为了快速了解现有 LLM 使用的数据来源, 我们介绍三个代表性 LLM 的预训练语料库:
- 3.3 代码库资源
- 在这部分,我们简要介绍了一些可用于开发 LLM 的代码库。
- Transformers
- DeepSpeed
- Megatron-LM
- JAX
- Colossal-AI
- BMTrain
- FastMoE
- 其他深度学习框架
- PyTorch
- TensorFlow
- MXNet
- PaddlePaddle
- MindSpore
- OneFlow
- 3.1 公开可用的模型检查点或 API
-
4 预训练
- 预训练为 LLM 的能力奠定了基础。 通过在大规模语料库上进行预训练, LLM 可以获得基本的语言理解和生成能力 [55, 56]。在这个过程中, 预训练语料库的规模和质量对于 LLM 获得强大的能力至关重要。
- 此外,为了有效地预训练 LLM,也需要设计好模型架构、 加速方法和优化技术。
- 第 4.1节讨论数据收集和处理
- 第 4.2节介绍常用的模型架构
- 第 4.3节介绍用于稳定高效地优化 LLM 的训练技巧。
- 4.1 数据收集
- 相比小规模语言模型, LLM 更需要高质量数据来预训练模型, 并且它们的模型能力很大程度上依赖于预训练语料库及其预处理方式。
- 4.1.1 数据来源
- 要开发出一个有能力的 LLM,其关键在于从各种数据来源中收集大量的自然语言语料库。
- 预训练语料库的来源可以广义地分为两种类型:通用文本数据和专用文本数据。
- 通用文本数据:
- 绝大多数的 LLM 采用了通用的预训练数据, 比如网页、 书籍和对话文本等, 这些数据源提供了丰富的文本资源, 并且涉及了多种主题。
- , 我们简要总结三种重要的通用文本数据。
- 网页:
- 对话文本:
- 书籍:
- 专用文本数据:
- 专用数据集对于提高 LLM 在特定下游任务中的能力非常有用。接下来,我们介绍三种专用数据类型。
- 多语言文本:
- 科学文本:
- 代码:
- 4.1.2 数据预处理
- 在这部分中,我们将细致地回顾提高收集数据质量的数据预处理策略 [59, 69, 109]。预处理 LLM 的预训练数据的典型流程已在图 3中说明。
- 质量过滤:
- (1) 基于分类器的方法
- 基于高质量文本训练选择分类器, 并利用它来识别和过滤低质量数据。
- 使用高质量数据 (例如维基百科页面) 作为正样本, 采样候选数据作为负样本来训练二元分类器,并预测衡量每个数据的质量的分数。
- 基于分类器的方法可能会删除方言、 口语和社会语言的高质量文本, 从而可能导致有偏的预训练语料库,并减少语料库的多样性。
- (2) 基于启发式的方法
- 通过设计一组精心设计的规则来消除低质量文本,这些规则可以总结如下
- 基于语言的过滤:
- 基于度量的过滤:
- 基于统计的过滤:
- 基于关键词的过滤:
- (1) 基于分类器的方法
- 去重:
- 语料库中的重复数据会降低语言模型的多样性,可能导致训练过程不稳定,从而影响模型性能。
- 可以在句子级、文档级和数据集级等不同粒度上去重。
- 在句子级别上, 应删除包含重复单词和短语的低质量句子, 因为它们可能会在语言建模中引入重复模式
- 在文档级别上,现有研究主要依靠文档之间的表层特征(例如单词和 n 元的重叠)的重叠比率来检测和删除包含相似内容的重复文档
- 为了避免数据集污染问题,还必须通过从训练集中删除测试集可能出现的重复文本,来防止训练集和评估集之间的重叠
- 隐私去除:
- 从预训练语料库中删除可识别个人信息(PII)
- 直接有效的方法是采用基于规则的方法
- 例如关键字识别,来检测和删除 PII,例如姓名、地址和电话号码
- 分词:
- 目的是将原始文本分割成词序列,随后用作 LLM 的输入。
- 使用专门为预训练语料库设计的分词器可能会更加有效 [69],特别是对于由多种领域、语言和格式组成的语料库。
- 最近的几个 LLM 使用SentencePiece [164] 为预训练语料库训练定制化的分词器。 同时利用字节级的 Byte Pair Encoding (BPE) 算法 [165] 来确保分词后的信息不会丢失 [56, 59]。然而需要注意的是,BPE 中的归一化技术,例如 NFKC [166],可能会降低分词性能
- 4.1.3 预训练数据对大语言模型的影响
- 由于对计算资源的巨大需求,通常不可能对 LLM 进行多次预训练迭代。因此,在训练 LLM 之前构建一个准备充分的预训练语料库尤为重要。
- 混合来源:
- 预训练数据的数量:
- 预训练数据的质量:
- 4.2架构
- 本节中,我们将回顾 LLM 的架构设计,包括主流架构、预训练目标和详细配置。
- 4.2.1 主流架构
- 现有 LLM 的主流架构可以大致分为三种类型,即编码器-解码器、因果解码器和前缀解码器
- 编码器-解码器架构:
- 因果解码器架构:
- 前缀解码器架构:
- 对于这三种类型的架构,我们也可以考虑通过混合专家(MoE)扩展它们
- 4.2.2 详细配置
- 在这部分中, 我们将讨论Transformer 的四个主要部分的相应配置,包括标准化、位置编码、 激活函数、 注意力和偏置。
- 标准化:
- 激活函数:
- 位置编码:
- 注意力机制和偏置:
- 综合上述讨论,我们总结了现有文献中的详细配置建议。
- 为了有更强的泛化能力和训练稳定性,建议选择前置的 RMS 进行层标准化, 并选择 SwiGLU 或 GeGLU 作为激活函数。 此外, 在位置编码方面, RoPE 或 ALiBi 是更好的选择, 因为它们在长序列上表现更好。
- 4.2.3 预训练任务
- 预训练在将大规模语料库中的通用知识编码到巨大的模型参数中起着关键作用。
- 对于训练 LLM,有两个常用的预训练任务,即语言建模和去噪自编码。
- 语言建模:
- 去噪自编码:
- 4.2.4 总结与讨论
- 选择架构和预训练任务可能会对 LLM 的归纳偏差产生不同影响, 从而导致不同的模型性能。
- 在本部分中, 我们总结了现有文献中关于这个问题的一些重要发现或讨论。
- 通过使用语言模型目标进行预训练,因果解码器架构似乎可以实现更优越的零样本和小样本泛化能力。
- 因果解码器中已经广泛观察到了扩展法则。 通过扩展模型大小、数据集大小和总计算量,可以大幅提高因果解码器的性能
- 4.3 模型训练
- 在这一部分中,我们回顾了训练 LLM 的重要设置、技巧或诀窍。
- 4.3.1 优化设置
- 为了进行 LLM 的参数优化,我们介绍了批量训练、学习率、优化器和训练稳定性的常用设置。
- 批量训练:
- 学习率:
- 优化器:
- 稳定训练:
- 4.3.2 可扩展的训练技术
- 随着模型和数据规模的增加,有限的计算资源下高效地训练LLM 变得具有挑战性。 尤其是两个主要的技术问题需要解决, 即提高训练吞吐量和加载更大模型到显存中。
- 回顾了已有工作中广泛用于解决上述两个挑战的几种方法
- 3D 并行
- ZeRO
- 混合精度训练
- 3D 并行:
- 三种常用并行训练技术的组合
- 数据并行
- 流水线并行
- 张量并行
- ZeRO:
- 混合精度训练:
- 整体训练建议:
- 在实践中,上述训练技术,特别是 3D 并行技术,通常会联合使用以提高训练吞吐量和大模型加载。
- 为了减少内存冗余, 可以使用 ZeRO、 FSDP 和激活 c 重计算 (activation recomputation) 技术 [68, 203] 来训练 LLM
- ,混合精度训练技术,如 BF16,也可以利用来提高训练效率和减少显存使用,但需要硬件的必要支持(如 A100 GPU) 。
- 由于训练大模型是一个耗时的过程,因此在早期阶段预测模型性能并检测异常问题将非常有用。为此,GPT-4 [45] 最近引入了一种基于深度学习堆栈的新机制,称为可预测扩展,可以使用更小的模型对大模型进行性能预测, 这对于开发 LLM 可能非常有用。
- 例如, PyTorch 支持完全分片数据并行训练算法 FSDP [201](即 fully sharded data parallel) ,如果需要,可以将部分训练计算卸载到 CPU 上。
- 除了上述训练策略,提高使用 LLM 的推理速度也很重要。通常,量化技术被广泛用于减少 LLM 推理阶段的时间和空间开销
- 虽然会损失一些模型性能,但量化语言模型具有更小的模型大小和更快的推理速度 [97, 205, 206]。对于模型量化,INT8 量化是一个流行的选择
- 预训练为 LLM 的能力奠定了基础。 通过在大规模语料库上进行预训练, LLM 可以获得基本的语言理解和生成能力 [55, 56]。在这个过程中, 预训练语料库的规模和质量对于 LLM 获得强大的能力至关重要。
笔记-《A Survey of Large Language Models》
于 2024-03-20 09:22:04 首次发布