在规模扩展定律(Scaling Laws)被证明对语言模型有效之后,研究者构建出了许多大语言模型。尤其是 2022 年底面向普通消费者的 ChatGPT 模型的出现,正式标志着自然语言处理进入大语言模型时代。
本章将简要梳理大语言模型的技术要点以及构建过程,并且列举了可用于预训练以及微调模型的常用数据集,介绍了目前开发大语言模型常用的代码库、预训练大语言模型的步骤以及涉及的关键技术,包括数据准备阶段、模型架构以及实际的预训练操作。
全文大概28000字,涵盖了大语言模型使用过程中涉及到的RLHF、DPO、指令微调、数据课程、DeepSpeed、提示学习、模型蒸馏、模型剪枝、LoRA/QLoRA、量化技术、FlashAttention、RAG等相关技术,由于篇幅所限,仅介绍了这些内容的大概原理,对于详细原理有机会的话会在后续一一叙述。
方便读者快速了解如何训练以及使用大语言模型。
规模扩展:只有规模达到一定程度模型才会展现出上下文学习、思维链推理等小规模模型不具备的能力。早期的研究主要关注参数规模,例如 OpenAI、Google 等公司提出了一系列分析参数、数据、算力等因素对性能影响的扩展定律(Scaling Laws),并且通过 GPT、PaLM 等模型进行了验证。考虑到使用超大规模数据(如 2T 或 3T 词元)训练十亿级别的模型(如 2B 或 7B)仍然无法达到模型的最大数据容量,最近的工作专注于加大对高质量数据的规模扩展。
数据工程:大语言模型的训练方式实际上非常简单,即通过在海量文本上进行下一个词预测的优化,使得模型学习到丰富的语义知识,进而通过文本补全的方式解决各种下游任务,因此模型能力本质上来源于所见过的训练数据。目前数据工程主要关注三个方面:(1)拓宽数据来源;(2)数据清洗;(3)设计有效的数据配比与数据课程,加强对于数据语义信息的利用效率。这三个方面的数据工程技术直接决定了最后大语言模型的性能水平。
高效预训练:由于参数规模巨大,大语言模型需要使用各种并行策略以及效率优化方法进行训练,包括 3D 并行(数据并行、流水线并行、张量并行)、ZeRO 内存冗余消除技术等,代表性的分布式训练软件包括 DeepSpeed [4] 和 Megatron-LM [5],它们能够有效支持千卡甚至万卡的联合训练。此外,在正式训练前通常会开展基于小模型的沙盒测试实验以确定最终的训练策略,并且还需要关注优化技巧以提升训练稳定性和优化效率,如混合精度训练。
研究各种训练策略的效果并进行消融实验的成本非常高昂,学术界难以获得充分的算力来系统性研究大语言模型。虽然工业界不断推出开源大模型, 但是对训练过程的开源程度还不够充分,无法了解到许多重要的训练细节。大语言模型非常依赖于工程方法的优化,但是这些技术的理论支撑还比较缺乏。
能力激发:为了提升模型的任务求解能力,需要设计合适的指令微调以及提示策略进行激发或诱导。在指令微调方面,可以使用自然语言表达的任务描述以及期望的任务输出对模型进行微调,从而增强模型的通用任务求解能力,提升在未见任务上的泛化能力。在提示学习方面,需要设计合适的提示策略去诱导大语言模型生成正确的问题答案,例如上下文学习、思维链推理等。
现有的研究大多认为指令微调无法向大语言模型注入新的知识,而是训练大语言模型学会利用自身所掌握的知识与信息进行任务的求解。
人类对齐:由于大语言模型可能会生成有偏见、泄露隐私甚至对有害的内容,在实践应用中需要保证大语言模型能够较好地符合人类的价值观。代表性的做法是 OpenAI 公司提出的基于人类反馈的强化学习算法 RLHF(Reinforcement Learning from Human Feedback),将人类偏好引入到大模型的对齐过程中。但是由于强化学习算法的优化过程较为复杂,最近提出了许多监督微调的对齐方式,例如 DPO 算法。最近,OpenAI 公司还发布了“超级对齐”(Super-alignment)项目,研究如何监管具有强人工智能的算法。
基于人类反馈的强化学习算法(RLHF)的具体做法是:首先训练能够区分模型输出质量好坏的奖励模型,进而使用强化学习算法来指导语言模型对输出行为进行调整,让大语言模型能够生成符合人类预期的输出。
工具使用:由于大语言模型在非自然语言形式任务上的能力较为有限,因此可以让模型学会使用各种工具的调用方式,利用合适的工具去实现特定的功能需求,例如可以利用计算器进行精确的数值计算、利用搜索引擎检索最新的时效信息等。在技术路径上,工具调用能力主要是通过指令微调以及提示学习两种途径实现。
大语言模型的训练过程可以分为大规模预训练和指令微调与人类对齐两个阶段。
在 BERT 等传统预训练模型中采用的模型架构以及训练任务还比较多样。随着 GPT 模型的成功,“解码器架构 + 预测下一个词”的有效性得到了充分验证,已经成为当前主要的技术路径。
预训练大语言模型需要准备大规模的文本数据,并且进行严格的清洗。由于大语言模型的能力基础主要来源于预训练数据,因此数据的收集(高质量、多源化)与清洗对于模型性能具有重要影响。目前的开源模型大多采用 2∼3T 规模的词元进行预训练,并且正在进一步扩大规模。
预训练过程对于算力的需求量极高,百亿规模的模型一般需要百卡规模的算力集群(如 A100-80G)联合训练数月时间,而千亿模型则需要千卡甚至万卡规模的算力集群。此外,实施过程中涉及到大量经验性技术,如数据如何配比、如何调整学习率、如何及早发现模型的异常行为等,这些细节很多并没有公开发表的经验可循,因此需要研发人员具有丰富的训练经验和异常处理能力。
由于预训练任务形式所限,预训练后的大语言模型更擅长进行文本补全,并不适合直接解决具体的任务,因此通常还需要对大语言模型进行微调与对齐,使之具备更好的任务求解能力。
目前广泛使用的微调技术是指令微调(Instruction Tuning),又称监督微调(Supervised Fine-tuning, SFT),即通过使用任务输入与输出的配对数据进行训练, 使得语言模型掌握通过问答形式进行任务求解的能力。一般来说,指令微调很难教会大语言模型预训练阶段没有学习到的知识与能力,它主要起到了对于模型能力的激发作用。
与预训练相比,指令微调需要的指令数据规模要小的多,通常数十万到百万规模的指令微调数据就能够有效地激发语言模型的通用任务求解能力,部分工作甚至认为数千条或者数万条高质量指令数据也能达到不错的微调效果。因此,若干台单机八卡(A100-80G)的服务器就能在一天或数天的时间内完成百亿模型的指令微调。这个过程还可以加入多轮次的对话数据来增强模型的人机对话能力。
除了提升任务的解决能力外,还需要将大语言模型与人类的期望、需求以及价值观对齐(Alignment)。代表性方法是 OpenAI 公司提出的基于人类反馈的强化学习对齐方法 RLHF,在指令微调后使用强化学习加强模型的对齐能力。RLHF 算法需要训练一个符合人类价值观的奖励模型(Reward Model),为此需要标注人员针对大语言模型所生成的多条输出进行偏好排序,然后使用偏好数据训练奖励模型。由于强化学习需要维护多个辅助模型进行训练,计算资源消耗通常会多于指令微调, 但是也远小于预训练。目前还有很多工作试图简化对齐过程,通过去除奖励模型或其他使用 SFT 方式来达到与 RLHF 相似的效果。
常用的预训练语料库可以划分为网页、书籍、维基百科、代码以及混合型数据集。
网页:网页是大语言模型训练语料中最主要的数据来源,包含新闻报道、博客文章、论坛讨论等各种内容,这些广泛且多元的数据为大语言模型深入理解人类语言提供了重要资源。常用的网页语料库有:
在上述网页数据集中,中文网页占比通常非常低,因此不足以训练中文大语言模型。下面介绍一些具有代表性的中文网页数据集。
- ChineseWebText:中科院自动化所构建,从 Common Crawl 数据中精心筛选的中文数据集。汇集了 2021 年至 2023 年间的网页快照,总计 1.42TB 数据量。还特别发布了一个 600GB 大小的中文数据子集,并配套推出了一 款名为 EvalWeb 的数据清洗工具
- WanJuan:上海人工智能实验室构建,由网页、书籍等数据组成,约 500M 个文档,数据大小超过 1TB。将多种格式的数据进行了统 一,并进行了细粒度的清洗和去重。
书籍:书籍是人类知识与文化的重要载体,并且内容主要是长文本,能够帮助语言模型学习语言的长程依赖关系,并深入理解语言的内在逻辑与表达习惯。书籍的语言表达通常更为严谨,整体上质量较高,并且能够覆盖多元化的知识体系。常用的书籍语料库有:
维基百科:维基百科(Wikipedia)是一个综合性的在线百科全书,提供了高质量的知识信息文章。维基百科数据具有以下几个特点:(1)专业性:维基百科条目通常具有良好的结构性和权威性,不仅对于各种专业术语和概念进行了阐释,还揭示了它们在不同领域的应用和联系;(2)多语性:维基百科支持英语、汉语、 法语、德语等一共 300 多种语言,是一个宝贵的多语言平行语料库;(3)实时性:维基百科的内容在不断更新,对于知识信息的实时性维护较为及时,并且会定期发布其数据库的打包副本。
代码:代码具有高度结构化与专业性,引入包含代码的数据集可以增强模型的结构化推理能力与长程逻辑关系,能够提升模型理解和生成编程语言的能力。现有的工作主要从互联网上爬取具有开源许可的代码,两个主要来源是公共代码仓库(例如 GitHub)和代码相关的问答平台(例如 StackOverflow)。常用的代码语料库有:
混合型数据集:为了便于研发人员使用,很多研究机构对于多种来源的数据集合进行了混合,发布了一系列包括多来源的文本数据集合。这些混合数据集往往融合了新闻、社交媒体内容、维基百科条目等各种类型的文本,减少了重复清洗数据、选择数据的繁重工程。常用的混合语料库有:
微调主要涉及指令微调(有监督微调)和对齐微调,下面将列举一些可用于微调的数据集。
微调主要涉及指令微调(有监督微调)和对齐微调,下面将列举一些可用于微调的数据集。
指令微调数据集:按照指令实例的构建方法可以将指令微调数据集分为自然语言处理任务数据集、日常对话数据集和合成数据集。(1)自然语言处理任务数据集一般是在有监督的多任务训练数据集(包含多个自然语言处理任务实例)上通过人工编写任务描述来构建;(2)日常对话数据集则是基于真实用户对话构建,其中查询主要由真实用户提出、回复则由人类标注或者语言模型生成,对话类型通常包括开放式生成、问答、头脑风暴和聊天;(3)合成数据集则通常是使用大语言模型基于预定义的规则或方法进行构建。一些具有代表性的指令微调数据集如表 14-2 所示。常用的指令微调数据集有:
如果你不了解 Self-Instruct 方法不用着急,本文的后面会对其进行讲解。
人类对齐数据集:对齐目标一般聚焦于有用性、诚实性和无害性三个方面,下面将介绍几个代表性的对齐微调数据集,它们各自针对上 述对齐目标进行了标注。
开发大语言模型是一项复杂的工程,涉及到包括并行策略以及效率优化方法在内的各种工程技巧,因此一些公司以及研究机构推出了专用于开发大语言模型的代码库以推动该领域的发展。下面将介绍具有代表性的两个代码库。
DeepSpeed 由微软公司开发,是一个旨在加速模型训练的高性能库,被广泛用于大语言模型的分布式训练。
DeepSpeed 为分布式训练提供了各种优化技术支持,如内存优化(ZeRO 技术、梯度检查点)、数据并行、混合精度训练等,使得整个训练过程变得更加高效和稳定。为了更适配用户需求,DeepSpeed 针对模型生成和强化学习分别开发了特制的优化框架:DeepSpeed-MII 和 DeepSpeed-Chat。
DeepSpeed-MII:通过提高吞吐量、降低延迟等方式来降低大模型解码生成的运行成本。DeepSpeed-MII 首先实现了块状键值缓存和连续批处理技术加速文本生成过程,然后又提出了 SplitFuse 技术将提示和生成结果进行动态分解以进一步改善连续批处理和系统吞吐量。目前已支持包括 LLaMA 、Mistral 、Falcon、 Mixtral 和 Qwen 在内的多个模型。
DeepSpeed-Chat:用于训练类 ChatGPT 模型的开发工具,完整集成了包括基于人类反馈的强化学习(RLHF)算法在内的训练过程。它具有三个主要功能:(1)简化了类 ChatGPT 模型的训练和生成过程,用户可以用简单的脚本实现多个训练步骤,并且提供了用于测试对话式交互的 API;(2)复现了 InstructGPT 的训练过程,包括有监督微调、奖励模型训练和基于人类反馈的强化学习,还提供了数据抽象和混合功能;(3)将训练和生成集成到了统一框架中,实现了在 RLHF 中训练和生成模式之间的无缝切换。
Megatron-LM 是由 NVIDIA 公司开发的一款专门为训练大语言模型而设计的代码库,旨在解决大型模型训练过程中所遇到的一系列技术挑战,包括显存限制、 计算效率以及不同的并行策略带来的通信问题。
Megatron-LM 引入了一系列分布式训练的优化技巧,支持多种并行策略,包括(1)数据并行,通过在每个工作节点复制模型,并将输入数据切分多份分配给多个节点,定期同步所有梯度来提升 GPU 的使用效率;(2)模型并行,包括张量并行和流水线并行,通过在多个工作节点上分配模型和计算来克服单个 GPU 容量限制的问题。此外,Megatron-LM 还支持混合精度训练和 FlashAttention 功能。这些优 化技术可以在很大程度上提高训练效率和速度,实现跨 GPU 的高效分布式训练。
大语言模型的构建过程可以分为预训练和微调两个阶段。通过在大规模语料上进行预训练,大语言模型可以获得通用的语言理解与生成能力,并且学习到较为广泛的世界知识。
本章将按顺序依次介绍预训练中的各个步骤,包含原始数据的收集、数据预处理、分词、以及预训练过程中的数据调度方法。
现有的大语言模型主要将各种公开的文本数据进行混合作为预训练语料。预训练数据可以分为通用文本数据和专用文本数据,其中通用文本数据规模较大,涵盖了网页、书籍和对话等内容,用以增强模型的语言建模能力;专用文本数据则是为了进一步提升大语言模型在特定任务上的表现,如多语数据、科学数据和代码数据等。
常用的专用文本数据分为三种:
在收集了丰富的文本数据之后,就需要对数据进行预处理,消除低质量、冗余、无关甚可能有害的数据。一般来说,需要构建并使用系统化的数据处理框架,例如开源库 Data-Juicer。典型的数据预处理流程如图 所示,包括质量过滤、敏感内容过滤、数据去重等步骤。
步骤一:质量过滤
在质量过滤方面,目前主要使用以下两种数据清洗方法:
基于启发式规则的方法:通过精心设计的规则有针对性地识别和剔除低质量数据。例如(1)为了训练特定目标语言的模型可以过滤掉其他语言的文本。(2)使用单词比率等统计特征来衡量文本质量。还可以利用困惑度(Perplexity)等文本生成评估指标来检测和删除表达不自然的句子,以及训练 FastText 分类器来检测有毒或仇恨言论。(3)制定精准的清洗规则,结合关键词集合进行过滤。
延伸
常用的统计指标过滤规则有:对于网页数据,过滤任何具有超过 100 个重复单词或句子的文档,以及过滤符号和词元比大于 0.1 的文档;对于论坛数据,过滤掉任何点赞数少于 3 的用户评论。
常用的关键词过滤规则有:对于维基百科数据,过滤掉任何拥有少于 25 个 UTF-8 单词的页面;对于网页数据,过滤掉 HTML 标签,以及过滤掉任何不含有 the, be, to, of, and, that, have, with 词汇的文档;对于所有数据,过滤掉电话号码,邮箱地址、IP 地址等隐私信息。
基于分类器的方法:训练判别数据质量的文本分类器进行数据清洗。具体来说,可以选取部分代表性的数据进行质量标注以训练分类器,例如将维基百科等高质量数据作为正样本、将筛选出含有不良内容或低质量数据的样本作为负样本。文本过滤的粒度可以是文档级别也可以是句子级别。为了减少误筛,可以使用多个分类器进行联合过滤或召回,还可以针对不同的评估维度训练不同的分类器。
目前常用方法包括轻量级模型(如 FastText)、可微调的预训练模型(如 BERT)以及闭源大语言模型 API(如 GPT-4)。轻量级模型效率较高,但是分类的准确率和精度受限于模型能力;预训练模型可以针对性微调, 但是通用性和泛化性具有限制;闭源大语言模型的能力较强, 但是无法灵活针对任务进行适配而且成本较高。
延伸
过滤效率也是预处理需要考虑的核心要素。基于启发式的方法效率较高,能够迅速过滤 10M 乃至 100M 级别的庞大文档集,而基于分类器的方法虽然精度更高,但是效率较低。因此可以结合多种策略平衡效率与准确性,例如首先利用启发式规则进行初步筛选,然后再采用分类器方法进行精细过滤。此外,还可以同时应用多种分类器,例如使用更为有效但是资源消耗更高的分类器在轻量级分类器粗滤后的数据上再次进行选择。
步骤二:敏感内容过滤
在敏感内容过滤方面,目前主要关注对有毒内容和隐私信息的过滤方法。为了精确过滤含有有毒内容的文本,通常采用基于分类器的过滤方法,例如基于 Jigsaw 评论数据集训练分类器。而过滤隐私内容则主要使用启发式方法(如关键字识别),例如 Dolma 采用规则方法来过滤邮箱地址、IP 地址以及电话号码,如果文档中的隐私信息少于五条则使用使用特定的词元进行替换(如“[EMAIL_ADDRESS]”),如果隐私信息达到六条则直接删除整个文档。
步骤三:数据去重
数据去重同样是一个重要步骤。由于大语言模型具有较强的数据拟合与记忆能力,很容易习得训练数据中的重复模式,可能导致对这些模式的过度学习。研究发现,预训练语料中出现的重复低质量数据可能诱导模型在生成时频繁输出类似数据。此外,这些数据也可能导致训练过程不稳定(训练损失震荡)甚至导致训练崩溃。目前数据去重主要关注计算粒度以及匹配方法两个方面:
点击【大模型入门必看】LLM大语言模型导读查看全文。