大模型入门必看-LLM大语言模型导读,零基础入门到精通,看这篇就够了!赶紧收藏!

前言

在规模扩展定律(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 相似的效果。

常用的预训练数据集

常用的预训练语料库可以划分为网页、书籍、维基百科、代码以及混合型数据集。

**网页:**网页是大语言模型训练语料中最主要的数据来源,包含新闻报道、博客文章、论坛讨论等各种内容,这些广泛且多元的数据为大语言模型深入理解人类语言提供了重要资源。常用的网页语料库有:

Common Crawl:(https://commoncrawl.org/)

一个规模庞大、非结构化、多语言的网页数据集,从 2008 年至今一直在定期更新,总数据量达到 PB 级别。一般仅提取特定时间段或者符合特殊要求的子集进行使用。但是该数据集充斥着噪声和低质量数据,在使用前必须进行有效的数据清洗,常用的自动清洗工具有 CCNet 等。

C4:(https://www.tensorflow.org/datasets/catalog/c4)

Google 构建,基于 2019 年 4 月的 Common Crawl 语料,包括超过 365M 个互联网域,超过 156B 词元,数据量约 800GB。使用该数据集的代表模型有 UL2 和 LLaMA。

RedPajama-Data:(https://github.com/togethercomputer/RedPajama-Data)

Together AI 构建,包含了来自 Common Crawl 的 100B 份文档,包含英语、法语、西班牙语、德语和意大利语,经过过滤和去重得到约 30T 词元。提供 40 余种预先标注好的数据注释,方便用户根据实际需求筛选数据集。

RefinedWeb:(https://proceedings.neurips.cc/paper_files/paper/2023/hash/fa3ed726cc5073b9c31e3e49a807789c-Abstract-Datasets_and_Benchmarks.html)

TII 构建,在 2008 年到 2023 年 6 月 Common Crawl 数据上通过筛选和去重构建,共约 5T 词元,开源部分有 600B 词元。是开源大语言模型 Falcon 的主要训练数据集。

OpenWebText:(https://skylion007.github.io/OpenWebTextCorpus/)

OpenAI WebText 数据集(GPT-2、GPT-3 和 InstructGPT 等均基于该数据集训练)的复现开源版本,首先从 Reddit 上提取网页链接,经过去重、过滤等处理,最终保留来自约 8M 份文档的 38GB 文本数据。

在上述网页数据集中,中文网页占比通常非常低,因此不足以训练中文大语言模型。下面介绍一些具有代表性的中文网页数据集。

ChineseWebText:(https://arxiv.org/abs/2311.01149)

中科院自动化所构建,从 Common Crawl 数据中精心筛选的中文数据集。汇集了 2021 年至 2023 年间的网页快照,总计 1.42TB 数据量。还特别发布了一个 600GB 大小的中文数据子集,并配套推出了一 款名为 EvalWeb 的数据清洗工具

WanJuan:(https://arxiv.org/abs/2308.10755)

上海人工智能实验室构建,由网页、书籍等数据组成,约 500M 个文档,数据大小超过 1TB。将多种格式的数据进行了统 一,并进行了细粒度的清洗和去重。

**书籍:**书籍是人类知识与文化的重要载体,并且内容主要是长文本,能够帮助语言模型学习语言的长程依赖关系,并深入理解语言的内在逻辑与表达习惯。书籍的语言表达通常更为严谨,整体上质量较高,并且能够覆盖多元化的知识体系。常用的书籍语料库有:

BookCorpusOpen:(https://openaccess.thecvf.com/content_iccv_2015/papers/Zhu_Aligning_Books_and_ICCV_2015_paper.pdf)

University of Toronto & MIT 构建的 BookCorpus 数据集(被 GPT、GPT-2、LLaMA 等模型使用)的镜像版本,包含了共计 17,868 本书籍。

arXiv Dataset:(https://arxiv.org/abs/1905.00075)

arXiv 官方发布的论文数据集,广泛涵盖了物理、数学和计算机科学等领域的论文,共包含约 1.7M 篇预印本文章,总数据量约为 1.1TB。

S2ORC:(https://aclanthology.org/2020.acl-main.447/)

Allen Institute for AI 基于学术搜索引擎 Semantic Scholar 上的论文构建,论文经过了清洗、过滤并被处理成适合预训练的格式。该数据集还有一个衍生数据集 peS2o(https://github.com/allenai/pes2o),v2 版本共计包含了约 42B 词元。

**维基百科:**维基百科(Wikipedia)是一个综合性的在线百科全书,提供了高质量的知识信息文章。维基百科数据具有以下几个特点:(1)专业性:维基百科条目通常具有良好的结构性和权威性,不仅对于各种专业术语和概念进行了阐释,还揭示了它们在不同领域的应用和联系;(2)多语性:维基百科支持英语、汉语、 法语、德语等一共 300 多种语言,是一个宝贵的多语言平行语料库;(3)实时性:维基百科的内容在不断更新,对于知识信息的实时性维护较为及时,并且会定期发布其数据库的打包副本(https://dumps.wikimedia.org/)。

**代码:**代码具有高度结构化与专业性,引入包含代码的数据集可以增强模型的结构化推理能力与长程逻辑关系,能够提升模型理解和生成编程语言的能力。现有的工作主要从互联网上爬取具有开源许可的代码,两个主要来源是公共代码仓库(例如 GitHub)和代码相关的问答平台(例如 StackOverflow)。常用的代码语料库有:

BigQuery:(https://cloud.google.com/bigquery/public-data?hl=zh-cn)

谷歌构建的企业数据仓库,包含了众多领域的公共数据集,其中的代码类数据覆盖各种编程语言。CodeGen 即抽取了其中的公开代码数据子集进行训练。

The Stack:(https://arxiv.org/abs/2211.15533v1)

Hugging Face 构建,涵盖了 30 种编程语言,数据来源于 GHArchive 项目中的 GitHub 活跃仓库,经过数据筛选、过滤以及许可证检测等处理后,最终数据量约为 3TB。v1.2 版本已扩展到 358 种编程语言,数据量约为 6TB。

StarCoder:(https://arxiv.org/abs/2305.06161)

BigCode 基于 The Stack v1.2 进一步处理后的代码数据集,筛选出了 86 种语言,同时还进行了人工抽样审核以确认数据为人类编写的正常代码,最终数据总量约为 783GB。

**混合型数据集:**为了便于研发人员使用,很多研究机构对于多种来源的数据集合进行了混合,发布了一系列包括多来源的文本数据集合。这些混合数据集往往融合了新闻、社交媒体内容、维基百科条目等各种类型的文本,减少了重复清洗数据、选择数据的繁重工程。常用的混合语料库有:

The Pile:(https://arxiv.org/abs/2101.00027)

EleutherAI 构建,数据包括书籍、网站、代码、科学论文和社交媒体等。由 22 个多样化的高质量子集混合而成,包括OpenWebText、维基百科等,最终总数据量约为 825GB。GPT-J、CodeGen、Megatron-Turing NLG 等模型都用到该数据集。

ROOTS:(https://proceedings.neurips.cc/paper_files/paper/2022/hash/ce9e92e3de2372a4b93353eb7f3dc0bd-Abstract-Datasets_and_Benchmarks.html)

BigScience 构建,约 62% 的数据来源于整理好的自然语言处理数据集及相关文档、利用 Common Crawl 收集的网页数据以及 GitHub 代码数据,约 38% 的数据来源于一个网页爬虫项目 OSCAR,并对其进行了过滤、去重和个人信息移除。包含 46 种自然语言(英语占比约为 30%)以及 13 种编程语言(Java、PHP 和 C++ 占比过半),总数据量约为 1.6TB。

Dolma:(https://arxiv.org/abs/2402.00159)

Allen Institute for AI 构建,包括来自 Common Crawl 的网页、Semantic Scholar 学术论文、GitHub 代码、书籍、Reddit 的社交媒体帖子以及维基百科数据,由来自大约 200TB 原始文本的 3T 个词元组成。v1.6 的版本文件大小约为 5.4TB。开源大语言模型 OLMo 即使用该数据训练。

常用微调数据集

微调主要涉及指令微调(有监督微调)和对齐微调,下面将列举一些可用于微调的数据集。

微调主要涉及指令微调(有监督微调)和对齐微调,下面将列举一些可用于微调的数据集。

指令微调数据集:按照指令实例的构建方法可以将指令微调数据集分为自然语言处理任务数据集、日常对话数据集和合成数据集。(1)自然语言处理任务数据集一般是在有监督的多任务训练数据集(包含多个自然语言处理任务实例)上通过人工编写任务描述来构建;(2)日常对话数据集则是基于真实用户对话构建,其中查询主要由真实用户提出、回复则由人类标注或者语言模型生成,对话类型通常包括开放式生成、问答、头脑风暴和聊天;(3)合成数据集则通常是使用大语言模型基于预定义的规则或方法进行构建。一些具有代表性的指令微调数据集如表 14-2 所示。常用的指令微调数据集有:

P3(Public Pool of Prompts):

BigScience 构建,由超过 270 个自然语言处理任务数据集和 2000 多种提示整合而成(每个任务可能不止一种提示),全面涵盖多选问答、提取式问答、情感分类、文本摘要、自然语言推断等任务。其子集被用来训练 T0 模型。

FLAN:

Google 构建,v2 版本主要由 Muffin、NIV2、T0-SF 和 CoT 四个子集构成。其中 Muffin 由 v1 版本的 62 个任务和新加入的 26 个任务组成(包括对话数据和代码合成数据);T0-SF 则是从 T0 模型的数据中抽取出来,同时确保与 Muffin 不重叠;NIV2 指的是数据集 Natural-Instructions v2;CoT 则是为了增强模型的推理能力而加入的九种不同推理任务的组合。FLAN-v2 对每项任务都设置了最大上限,防止某些任务在采样中占主导地位。FLAN 论文显示使用 52% Muffin、15% T0-SF、3% CoT 以及 30% NIV2 这一混合比例通常能够使得模型具有较好表现。

ShareGPT:

TechCrunch 发布的对话数据集,数据来源于开源平台 ShareGPT,语种主要为英语和其他西方语言,其中查询来自于用户的真实提问或指令,回复则是 ChatGPT 对此生成的回答。

OpenAssistant:

LAION-AI 人工构建的多语言对话语料库,共有 91,829 条用户提示,69,614 条回复,包含 35 种语言并且附有人工标注的质量评级(例如回复的有用性、无害性等)。

Dolly:

Databricks 构建的对话数据集,包含 15000 个人类生成的数据实例,主题涉及 InstructGPT 论文中提到的 7 个领域,包括头脑风暴、分类、封闭/开放式质量保证、生成、信息提取等。

Self-Instruct-52K:

University of Washington 使用 Self-Instruct 方法生成的英语指令数据集,包含 52K 条指令以及 82K 个实例输入和输出。最初由人工收集创建了 175 个种子任务,每个任务包括 1 个指令和 1 个包含输入输出的实例。然后,每次随机抽取 8 个指令作为示例,引导 GPT-3 模型生成新的指令以及对应的输入和输出,经过滤后添加到数据集中。迭代上述过程,最终获得了 52K 条指令和 82K 个实例数据。

Alpaca-52K:

同样基于 Self-Instruct 方法进行构建的,在 Self-Instruct-52K 的 175 个种子任务上利用 OpenAI 的 text-davinci-003 模型获得了 52K 个不重复的指令,并根据指令和输入生成输出,每条指令仅对应于一个输入输出实例(输入可选,最终数据中只有 40% 具有输入)。

如果你不了解 Self-Instruct 方法不用着急,本文的后面会对其进行讲解。

**人类对齐数据集:**对齐目标一般聚焦于有用性、诚实性和无害性三个方面,下面将介绍几个代表性的对齐微调数据集,它们各自针对上 述对齐目标进行了标注。

HH-RLHF:

Anthropic 构建,关注大语言模型的有用性和无害性。包含约 169K 个开放式对话,涉及人类向智能助手寻求帮助、建议或请求完成任务等情景。信息助手将为每个查询提供两个回复,一个回复被选择而另一个被拒绝。有用性相关数据中,被认为更有用的回复将被选择;而无害性相关数据中,被认为更有害的回复将被选择。

SHP:

Standfordnlp 构建,关注模型的有用性。包含 385K 个数据实例,对从烹饪到法律建议等 18 个不同主题领域中问题/指令的人类偏好进行标注,每个实例都基于寻求帮助的 Reddit 帖子构建的,包含问题以及帖子下两个排名较高的评论,其中一个被 Reddit 用户认为更有用,另一个被认为不太有帮助。

Stack Exchange Preferences:

HuggingFace 构建,关注模型的有用性。涵盖来自编程问答社区 Stack Overflow 的约 10M 个问题和答案,每个实例均包含一个问题以及不少于两个候选答案,每个答案都附有一个根据投票数计算出的分数并附带是否被选中的标签。

Sandbox Alignment Data:

Google 构建,致力于运用模型自身的反馈机制标注数据,关注模型的有用性、诚实性、无害性。数据源自模拟人类社交互动场景的 SANDBOX 虚拟环境,在该环境中,多个大语言模型根据问题给出回复然后互相“交流”,并根据彼此的反馈来不断修正和完善自己的回复。该数据集涵盖 169K 个实例,每个实例均包含一个查询、多个回复选项以及由其他模型给出的相应评分。

开发大语言模型

开发大语言模型是一项复杂的工程,涉及到包括并行策略以及效率优化方法在内的各种工程技巧,因此一些公司以及研究机构推出了专用于开发大语言模型的代码库以推动该领域的发展。下面将介绍具有代表性的两个代码库。

DeepSpeed 库

DeepSpeed(https://dl.acm.org/doi/abs/10.1145/3394486.3406703) 由微软公司开发,是一个旨在加速模型训练的高性能库,被广泛用于大语言模型的分布式训练。

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 库

Megatron-LM 是由 NVIDIA 公司开发的一款专门为训练大语言模型而设计的代码库,旨在解决大型模型训练过程中所遇到的一系列技术挑战,包括显存限制、 计算效率以及不同的并行策略带来的通信问题。

Megatron-LM (https://arxiv.org/abs/1909.08053)引入了一系列分布式训练的优化技巧,支持多种并行策略,包括(1)数据并行,通过在每个工作节点复制模型,并将输入数据切分多份分配给多个节点,定期同步所有梯度来提升 GPU 的使用效率;(2)模型并行,包括张量并行和流水线并行,通过在多个工作节点上分配模型和计算来克服单个 GPU 容量限制的问题。此外,Megatron-LM 还支持混合精度训练和 FlashAttention 功能。这些优 化技术可以在很大程度上提高训练效率和速度,实现跨 GPU 的高效分布式训练。

预训练大语言模型

大语言模型的构建过程可以分为预训练和微调两个阶段。通过在大规模语料上进行预训练,大语言模型可以获得通用的语言理解与生成能力,并且学习到较为广泛的世界知识。

本章将按顺序依次介绍预训练中的各个步骤,包含原始数据的收集、数据预处理、分词、以及预训练过程中的数据调度方法。

数据准备

现有的大语言模型主要将各种公开的文本数据进行混合作为预训练语料。预训练数据可以分为通用文本数据和专用文本数据,其中通用文本数据规模较大,涵盖了网页、书籍和对话等内容,用以增强模型的语言建模能力;专用文本数据则是为了进一步提升大语言模型在特定任务上的表现,如多语数据、科学数据和代码数据等。

常用的专用文本数据分为三种:

**多语文本:**多语文本数据可以帮助模型更好地建立多语言间的语义关联,增强模型的多语理解与生成能力,为跨语言理解与对话任务提供支持。此外,多语言数据还能有效增加数据的多样性,从而有助于提升模型的综合性能。

**科学文本:**科学文本数据可以增强大语言模型对科学知识的理解,从而提高科学问答与推理等任务的性能。常用方法是收集 arXiv 论文、科学教材、数学网页等。但是由于科学文本数据中包含数学公式、蛋白质序列等特殊符号,通常需要采用特定的分词和预处理技术将数据转化为大语言模型能够处理的统一格式。

**代码:**代码语料可以提高其模型生成的程序质量,其来源主要是 Stack Exchange 等编程问答社区的数据以及 GitHub 等开源项目仓库。由于代码主要以结构化的编程语言形式呈现,在代码数据上训练能够提升模型的结构化语义理解与逻辑推理能力。同时,代码中的函数调用关系还有助于增强模型的工具使用与学习能力。将推理任务格式化为代码通常可以得到更准确的结果。

数据预处理

在收集了丰富的文本数据之后,就需要对数据进行预处理,消除低质量、冗余、无关甚可能有害的数据。一般来说,需要构建并使用系统化的数据处理框架,例如开源库 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(https://www.kaggle.com/competitions/jigsaw-toxic-comment-classification-challenge)评论数据集训练分类器。而过滤隐私内容则主要使用启发式方法(如关键字识别),例如 Dolma 采用规则方法来过滤邮箱地址、IP 地址以及电话号码,如果文档中的隐私信息少于五条则使用使用特定的词元进行替换(如“[EMAIL_ADDRESS]”),如果隐私信息达到六条则直接删除整个文档。

步骤三:数据去重

数据去重同样是一个重要步骤。由于大语言模型具有较强的数据拟合与记忆能力,很容易习得训练数据中的重复模式,可能导致对这些模式的过度学习。研究发现(https://arxiv.org/abs/2205.10487),预训练语料中出现的重复低质量数据可能诱导模型在生成时频繁输出类似数据。此外,这些数据也可能导致训练过程不稳定(训练损失震荡)甚至导致训练崩溃。目前数据去重主要关注计算粒度以及匹配方法两个方面:

**计算粒度:**去重可以在句子、文档等多种粒度上进行。在句子级别上,可以删除包含重复单词和短语的句子;在文档级别上,可以依靠单词或 n 元词组的重叠等表层特征来衡量文档的重叠比率;数据集级别往往采用多阶段、多粒度的方式来进行。一般首先在数据集和文档级别进行去重(去除高度相似甚至完全一致文档),然后在句子级别实现更为精细的去重,例如当两个句子公共子串的长度过长时直接删除某一个句子。

**匹配方法:**在去重过程中,可以使用精确匹配算法(即每个字符完全相同)或近似匹配算法(基于相似度)。对于精确匹配,通常使用后缀数组来匹配最小长度的完全相同子串;对于近似匹配,可以采用局部敏感哈希(Locality-Sensitive Hashing, LSH)算法,如最小哈希(MinHash) 来实现。为了平衡去重效率和效果,实际操作通常会结合多种匹配方法,例如在文档层面采用近似匹配而在句子层面采用精确匹配。

延伸

MinHash 是一种估计两个集合之间相似度的技术,可以迅速判断文档间的相似性。其核心思想是通过哈希处理集合元素,并选择最小的哈希值作为集合表示,然后通过比较两个集合的最小哈希值估算相似度。 为了提升估计精确度还可以采用不同的哈希函数为每个集合生成多个 MinHash 值。

MinHash 技术只需比较那些更为简洁、易于对比的哈希值,可以避免对集合中所有元素进行逐一比较,使得其在处理超大型集合时具有较好的计算效率。

现有的研究证明,预训练数据的数量和质量都对训练效果具有重大影响。

早期的研究工作认为增加模型参数更为重要,而最近的研究表明扩展训练数据量对于提升大语言模型的性能同样非常关键,整体上语言模型的性能会随着训练数据量的增加而提升。

在获取充足的预训练数据后,数据质量直接决定了模型的实际性能。通过提升数据质量,语言模型就能展现出与更大规模模型相匹敌甚至更为优异的性能。相反,使用大量低质量数据会导致模型训练过程不稳定,容易造成模型训练不收敛等问题。而且如果模型在包含事实性错误的、过时的数据上进行训练,那么它在处理相关主题时就可能会产生不准确或虚假的信息,这种现象被称为“幻觉”(Hallucination)。

此外,已有研究普遍认为重复数据对于模型训练及最终性能会带来不良影响,例如导致模型训练损失出现“双下降”现象(先下降然后升高再下降)。而且重复数据可能会降低模型利用上下文信息的能力,从而削弱模型在上下文学习中的泛化能力。因此通常的建议是对于预训练数据进行精细的去重操作。

最后,数据中包含有偏、有毒、隐私的内容将会对于模型造成严重的不良影响。例如如果训练数据中包含有毒内容,模型就可能会产生侮辱性、攻击性或其他有害的输出;而在含有隐私内容的数据上训练可能会导致模型在输出中泄露或利用个人数据。

步骤四:分词

分词(Tokenization)步骤负责将原始文本分割成模型可识别和建模的词元序列,作为大语言模型的输入数据。如5.2.1节分词策略中介绍的那样,当前基于 Transformer 的语言模型大多采用子词分词器(Subword Tokenizer)进行分词,常见方法有 BPE 分词、WordPiece 分词和 Unigram 分词三种。

虽然直接使用已有的分词器较为方便(例如 GPT-3 模型使用了 GPT-2 的分词器),但是使用为语料专门设计的分词器会更加有效,尤其对于混合了多领域、多语言和多种格式的语料。最近的工作通常使用 SentencePiece 代码库定制化分词器。

数据调度

完成数据预处理之后,需要设计合适的调度策略来安排这些多来源的数据。数据调度(Data Scheduling)主要关注两个方面:各个数据源的混合比例以及各数据源用于训练的顺序(称为数据课程,Data Curriculum),具体的数据调度流程如图 所示。

数据混合

由于数据源与大语言模型某些特定能力的学习具有紧密的联系,因此设置合适的数据混合比例非常重要。

数据混合通常设置的是预训练数据的整体分布,在预训练期间,将根据混合比例从不同数据源中采样数据,也可以在不同训练阶段采用 不同的混合比例。如图 15-1 所示,代表性大语言模型 LLaMA 的预训练数据主要包括超过 80% 的网页数据、来自 GitHub 和 StackExchange 的 6.5% 代码密集型数据、4.5% 的书籍数据,以及来自 arXiv 的 2.5% 科学数据,这个数据配比可以作为训练大语言模型的一个重要参考。

注意

即使是训练专业模型(例如代码模型 CodeGen)时,依然需要混合一定比例的网页数据来提供或者保留通用的语义知识。

在实践中,数据混合通常是根据经验确定的,下面汇总了几种常见的数据混合策略。

增加数据源的多样性:多样化的数据(如网页、书籍、代码等)能够改进大语言模型在下游任务中的综合表现。

优化数据混合:除了手动设置数据混合配比外,还可以使用可学习的方法来优化数据组成。实践中通常采用不同的数据混合从头开始训练几个小型语言模型(例如 1.3B 规模),然后选择获得最理想性能的数据混合配比。但是这个方法假设以类似方式训练出的小模型与大模型会表现出相似的模型能力或行为,在实际中并不总是成立。

优化特定能力:可以通过增加特定数据源的比例来增强某些对应的模型能力,例如使用更多的数学和代码数据可以增强大语言模型的数学推理和编程能力。常见做法是采用多阶段训练方法,例如在连续的两个阶段分别安排通用数据和任务特定数据,这种在多个阶段使用不同数据源混合配比进行训练的方法被称为“数据课程”。

数据课程

除了设置数据混合配比,在训练过程中对数据顺序进行合适的安排也很重要。一种实用方法是基于专门构建的评测基准监控大语言模型关键能力的学习过程,然后在预训练期间动态调整数据的混合配比。

由于预训练阶段需要耗费大量的计算资源,目前针对数据课程的研究工作主要集中在继续预训练(Continual Pre-training)。研究表明,为了学习某些特定的技能,按照技能依赖顺序编排对应数据集的学习方法(例如从基本技能到目标技能)比直接在相关语料上学习效果更好。

下面将以三种常见能力为例,介绍具体的数据课程在继续预训练中的应用。

**代码能力:**为了提高模型的代码生成能力,研究人员基于 LLaMA-2 开发了 CodeLLaMA,采用的数据课程为:2T 通用词元 → 500B 代码密集型词元。CodeLLaMA 还提供了一个面向 Python 语言的特定代码大模型 CodeLLaMA-Python,采用的数据课程为:2T 通用词元 → 500B 代码相关词元 → 100B Python 代码相关词元。

**数学能力:**Llemma 选择 CodeLLaMA 作为基座,进一步在包含论文、数学和代码的混合数据集合上进行继续预训练,采用的数据课程为:2T 通用词元 → 500B 代码相关词元 → 50∼200B 数学相关词元。特别地,Llemma 在继续预训练数据中还包含 5%的通用领域数据,这可以看做一种模型能力的“正则化”技术,加强对于基座模型通用能力的保持。

**长文本能力:**很多工作通过继续预训练有效扩展了大语言模型的上下文窗口,主要是针对 RoPE 中的位置嵌入编码进行修改。例如 CodeLLaMA 将 LLaMA-2 的上下文窗口从 4K 扩展到了 100K,采用的数据课程为:4K 上下文窗口的 2.5T 词元 → 16K 上下文窗口的 20B 词元。

模型架构

主流架构

语言模型大致可以分为三种架构:以 BERT 为代表的编码器(Encoder-only)架构、以 GPT 为代表的解码 器(Decoder-only)架构和以 T5 为代表的编码器-解码器(Encoder-decoder)架构。近年来,随着 GPT 系列模型取得重大成功,解码器架构已经成为了大语言模型的主流架构。特别地,解码器架构还可以细分为因果解码器(Causal Decoder)和前缀解码器(Prefix Decoder),默认情况下指的就是因果解码器架构。

这几种架构的对比如图所示,其中蓝色、绿色、黄色和灰色矩形分别表示前缀词元之间的注意力、前缀词元和目标词元之间的注意力、目标词元之间的注意力以及掩码注意力。

编码器-解码器架构是一种经典的模型结构。

该架构在编码器端采用了双向自注意力机制对输入信息进行编码,而在解码器端则使用了交叉注意力与掩码自注意力机制,进而通过自回归的方式对输出进行生成。目前只有如 Flan-T5 等少数大语言模型是基于编码器-解码器架构构建的。

因果解码器架构没有显式地区分输入和输出部分。

该架构采用单向掩码注意力机制,使得每个输入的词元只关注序列中位于它前面的词元和它本身,进而自回归地预测输出的词元。目前绝大部分大语言模型都采用因果解码器架构,最具有代表性的模型就是 OpenAI 推出的 GPT 系列模型。

前缀解码器架构参考了编码器-解码器的设计。该架构对于输入(前缀)部分使用双向注意力进行编码,对于输出部分利用单向的掩码注意力利用该词元本身和前面的词元进行自回归地预测。当前基于前缀解码器架构的代表性大语言模型包括 GLM-130B 和 U-PaLM。

长上下文模型

实际应用中,大语言模型对于长文本的处理需求日益凸显。为此,多家机构已推出了具有超长上下文窗口的大语言模型或 API,例如支持 128K 上下文窗口的 GPT-4 Turbo、具有 200K 上下文窗口的 Claude-2.1等。目前,增强大语言模型长文本建模能力的研究主要集中在扩展位置编码和调整上下文窗口两个方向。

扩展位置编码

大语言模型的上下文建模能力通常受到训练集中文本数据长度分布的限制。一旦超出这个分布范围,模型的位置编码往往无法得到充分训练而导致模型处理长文本的性能下降。因此,需要对于位置编码进行扩展。

目前主流的位置编码方法 RoPE 在未经特殊修改的情况下并不具备良好的外推能力。因此,很多研究工作在 RoPE 的基础上进行了重要改进,旨在提升其在不经过训练或继续训练的情况下对于长文本的建模能力,例如通过位置内插、位置截断等方式修改位置索引来调整所有子空间的旋转角度,从而保证其不超过原始上下文窗口所允许的最大值。

延伸

某些特定的位置编码在超出原始上下文窗口的文本上也能表现出较好的建模能力,这种能力被称为外推(Extrapolation),例如 T5 偏置、ALiBi 以及 xPos 等方法都展现出了不同程度的外推能力。

尽管外推能力使得模型在长文本上继续生成流畅的文本,但模型对长文本本身的理解能力可能无法达到与短文本相同的水平。为了真正增强长文本建模能力,通常还需要在更长的文本上进行一定训练。

调整上下文窗口

除了使用扩展位置编码来拓宽上下文窗口外,另一种行之有效的策略是采用受限的注意力机制来调整原始的上下文窗口,从而实现对更长文本的有效建模。常见的三种方法为并行上下文窗口、Λ 形上下文窗口和词元选择,如图所示,其中白色表示被掩盖的词元、蓝色表示进行注意力计算的词元,块上面的数字表示位置编码的相对位置。

并行上下文窗口:将输入文本划分为若干个片段,每个片段都进行独立的编码处理,并共享相同的位置编码信息。在生成阶段,通过调整注意力掩码,使得后续生成的词元能够访问到前序的所有词元。然而,该方法无法有效地区分不同段落之间的顺序关系,在某些特定任务上可能表现不佳。

Λ 形上下文窗口:有选择性地关注每个查询的邻近词元以及序列起始的词元,同时忽略超出这一范围的其他词元。然而,由于无法有效利用被忽略的词元信息,这种方法无法充分利用所有的上下文信息。

词元选择:挑选出最重要的 k 个词元,以实现对于完整注意力的有效拟合。词元选择方法可以通过查询与词元的相似度和查询词元所在分块的相似度实现。其中(1)查询与词元相似度方法根据位置索引和上下文窗口,将词元划分为窗口内的近距离词元和窗口外的远距离词元。对于上下文窗口外的远距离词元,利用外部存储保存它们的键值对,并采用 k 近邻搜索方法来获取当前生成所需的最相关词元;(2)查询与分块相似度方法将序列划分为不同的长度固定的分块,并从分块序列中选择出最相关的部分分块。

模型预训练

预训练任务

目前,大语言模型常用的预训练任务可以分为三类:语言建模(Language Modeling, LM)、去噪自编码(Denoising Autoencoding, DAE)以及混合去噪器(Mixture-of-Denoisers, MoD),语言建模和去噪自编码的输入输出对比如下:

语言建模(Language Modeling, LM)

可以发现,语言建模任务与人类生成语言数据(如口语表达、书面写作等)的方式十分相似,都是基于前序内容生成(或预测)后续的内容。尽管这种方式形式简单,但当预训练数据足够丰富时,大语言模型便能够学习到自然语言的生成规律与表达模式。

此外,语言建模任务还可以看作是一种多任务学习过程。例如,在预测前缀“这部电影剧情饱满,演员表演得也很棒,非常”中的“好看”时,模型实际上在进行情感分析任务;而预测句子前缀“小明有三块糖,给了小红两块糖,还剩下”中的“一块糖”时,则是在进行数学算术任务。

但是,由于前缀语言建模任务并未将所有词元的损失都纳入计算,当使用相同规模的数据集进行训练时,采用前缀语言建模训练的模型在性能上通常会稍逊于使用标准语言建模任务训练的模型。

中间填充任务经常被用于训练代码预训练模型以提升模型在代码补全等实际应用场景中的表现。

去噪自编码(Denoising Autoencoding, DAE)

与语言建模相比,去噪自编码任务的实现更为复杂,需要设定额外的优化策略,如词元替换策略、替换片段长度、替换词元比例等。这些策略的选择会直接影响模型的训练效果。目前使用去噪自编码进行预训练的大语言模型较为有限,代表性模型包括 Flan-T5。

混合去噪器(Mixture-of-Denoisers, MoD)

混合去噪器,又称 UL2 损失,通过将语言建模和去噪自编码的目标均视为不同类型的去噪任务,对预训练任务进行了统一建模。具体来说,混合去噪器定义了三种去噪器:S-去噪器、R-去噪器和 X-去噪器。

S-去噪器与前缀语言建模的目标相同 ,旨在学习基于给定前缀信息生成合理后缀文本的能力。而 R-去噪器和 X-去噪器 与去噪自编码任务的优化目标更为相似( ,二者仅在被掩盖片段的跨度和损坏比例上有所区别。混合去噪器被应用于训练 UL2 和 PaLM-2 等大语言模型。

优化参数设置

与传统神经网络的优化类似,大语言模型通常使用批次梯度下降算法来进行模型参数的调优。同时,通过调整学习率以及优化器中的梯度修正策略,可以进一步提升训练的稳定性。为了防止模型对数据产生过度拟合,训练中还需要引入一系列正则化方法。

基于批次数据的训练

在大语言模型预训练中,通常将批次大小(Batch Size)设置为较大的数值,例如 1M 到 4M 个词元以提高训练的稳定性和吞吐量。现在很多工作都采用了动态批次调整策略,即在训练过程中逐渐增加批次大小,最终达到百万级别。例如,GPT-3 的批次大小从 32K 个词元逐渐增加到 3.2M 个词元。研究表明,动态调整批次大小的策略可以有效地稳定大语言模型的训练过程。

学习率

现有的大语言模型在预训练阶段通常采用相似的学习率调整策略,包括预热阶段和衰减阶段。预热阶段一般占整个训练步骤的 0.1% 至 0.5%,然后学习率便开始进行衰减。

在训练初始阶段,由于参数是随机初始化的,梯度通常也比较大,因此需要使用较小的学习率使得训练较为稳定。训练中通常采用线性预热策略来逐步调整学习率,即学习率将从一个非常小的数值(例如 0 或 1×10−8)线性平稳增加,直到达到预设的最大阈值(通常设定在 5×10−5 到 1×10−4 之间),例如,GPT-3 的最大阈值被设定为 6×10−5、LLaMA 的最大阈值被设定为 1.5×10−4。

学习率达到最大阈值之后就会开始逐渐衰减,以避免在较优点附近来回震荡,最后一般会衰减到最大阈值的 10%。常见的衰减策略有线性衰减、余弦衰减、平方根倒数衰减,它们的学习率变化如图 所示。

优化器

已有大语言模型通常采用 Adam 及其变种 AdamW 作为优化器。Adam 在优化中引入了三个超参数,在大模型训练中通常采用以下设置:β1= 0.9,β2= 0.95 和 ϵ = 10−8。此外,谷歌公司提出了 Adafactor 优化器,引入了特殊设计可以在训练过程中节省显存,被用于 PaLM 和 Flan-T5 等大语言模型的训练。Adafactor 常见的超参数设置如下:β1 = 0.9,β2 = 1.0−k−0.8,其中 k 表示训练步数。

稳定优化技术

在大语言模型的训练过程中,经常会遇到训练不稳定的问题,可以使用下面几种稳定训练技术:

**梯度裁剪:**训练中一种常见的现象是损失的突增。为了解决这一问题,可以采取梯度裁剪(Gradient Clipping),把梯度限制在一个较小的区间内。当梯度的模长超过给定的阈值后,便按照这个阈值进行截断。在大语言模型训练中,这个阈值通常设置为 1.0。

训练恢复:为了避免训练过程的异常情况,一种常用的策略是每隔固定的步数设置一些模型存档点。当模型发生了训练异常时,便可以选择前一个存档点重启训练过程。

权重衰减:引入正则化技术来稳定训练过程以提高模型的泛化能力。AdamW 优化器中采用了权重衰减(Weight Decay)方法,在每次更新模型参数的时候引入衰减系数,这个系数通常设置为 0.1。

可扩展的训练技术

大语言模型的训练主要面临着两个技术问题:一是如何提高训练效率;二是如何将庞大的模型有效地加载到不同的处理器中。常见的高效训练技术包括 3D 并行训练、零冗余优化器和混合精度训练

3D 并行训练

3D 并行策略是三种并行训练技术的组合,即数据并行(Data Parallelism)、流水线并行(Pipeline Parallelism)和张量并行(Tensor Parallelism)。

**数据并行:**将模型参数和优化器状态复制到多个 GPU 上,然后将训练数据平均分配给这些 GPU,当所有 GPU 都执行前向传播和反向传播以获取梯度后,再将不同 GPU 的梯度进行平均,以得到整体的梯度来统一更新所有 GPU 上的模型参数。如图 (a) 所示,四条数据被分成两份, 由两张卡分别计算,这样便等效于执行了批次为 4 的梯度更新。

由于梯度在不同 GPU 上是独立计算的,数据并行机制展现出高度的可扩展性,可以通过增加 GPU 数量来提高训练效率。数据并行技术的实现相对简便,目前 TensorFlow、PyTorch 等深度学习库均已内置了对数据并行策略的支持。

**流水线并行:**将大语言模型不同层的参数分配到不同的 GPU 上。如图 (d) 中,Transformer 的第 1-2 层部署在 GPU1,将 3-4 层部署在 GPU2。但是 GPU1 在前向传播后需要等待 GPU2 反向传播的结果才能进行梯度传播,即整个流程是“GPU1 前向,GPU2 前向,GPU2 反向,GPU1 反向”,并不能达到真正的并行效果。因此流水线并行通常需要配合梯度累积技术进行优化,例如 GPU1 前向传播完第一个批次后,可以不用等待,继续传播第二个和后续的批次。

延伸

梯度累积(Gradient Accumulation)的主要思想是在计算一个批次的梯度后不立刻更新模型参数,而是累积几个批次后再更新,这样便可以在不增加显存消耗的情况下模拟更大的批次。

**张量并行:**同样将大模型参数加载到多个 GPU 上,但是分配粒度更细,进一步分解了模型的参数张量(即参数矩阵),以便更高效地利用多个 GPU 的并行计算能力。例如对于矩阵乘法操作 WH,参数矩阵 W 可以按列分成两个子矩阵 W1 和 W2,进而原式可以表示为 [W1H,W2H],然后将参数矩阵 W1 和 W2 放置在两张不同的 GPU 上以并行地执行矩阵乘法,最后通过跨 GPU 通信将两个 GPU 的输出组合成最终结果。

目前张量并行已经在多个开源库中得到支持,例如 Megatron-LM 支持对参数矩阵按行按列分块进行张量并行。

零冗余优化器

零冗余优化器(Zero Redundancy Optimizer, ZeRO)技术由 DeepSpeed 代码库提出,用于解决数据并行中的模型冗余问题。从图 (a) 中可以看到,每个 GPU 都需要存储大语言模型的相同副本,包括模型参数和优化器参数等。但是对于每个 GPU,在模型传播到某一层时,其他层的模型和优化器参数并不参与计算,这导致了严重的显存冗余现象。

ZeRO 技术仅在每个 GPU 上保留部分模型参数和优化器参数,当需要时再从其它 GPU 中读取。如图 15-8 (b) 所示,模型被均分在两张 GPU 上,当需要使用第一层计算时,两张卡分别从对方获取相应的模型参数进行计算,使用完之后便可以释放相应显存。

延伸

PyTorch 中也实现了与 ZeRO 相似的技术,称为完全分片数据并行(Fully Sharded Data Parallel, FSDP)。

混合精度训练

早期的预训练语言模型(例如 BERT)主要使用单精度浮点数(FP32)表示模型参数并进行优化计算。近年来,为了训练超大规模参数的语言模型,研发人员提出了混合精度训练(Mixed Precision Training)技术,通过同时使用半精度浮点数(2 个字节)和单精度浮点数(4 个字节)进行运算,以实现显存开销减半、训练效率翻倍的效果。

具体来说,为了保证表示精度,需要保留原始 32 位模型的参数副本。但在训练过程中,会先将这些 32 位参数转换为 16 位参数,随后以 16 位精度执行前向传播和反向传播等操作,最后在参数更新时再对 32 位模型进行优化。由于前向传播和反向传播占用了绝大部分的优化时间,混合精度训练能够显著提升模型的训练效率。

常见的半精度浮点数表示方式为 FP16,其包含 1 位符号位、5 位指数位和 10 位尾数位,表示范围为 −65504 到 65504。谷歌后来提出了新的半精度浮点数表示 BF16,其包含 1 位符 号位、8 位指数位和 7 位尾数位,表示范围可达 1038 数量级。

目前较为主流的 GPU(例如 Nvidia A100)都支持 16 位计算单元运算,因此混合精度训练能够被硬件很好地支持。

使用大语言模型

在上一章中我们讨论了预训练阶段的技术细节,本章将关注大语言模型构建过程的第二个阶段——微调(包括指令微调与人类对齐),以及最终的实际使用方法。

指令微调

指令微调首先收集或构建自然语言形式的指令实例,然后通过有监督的方式对大语言模型的参数进行微调,因此又被称为有监督微调(Supervised Fine-tuning, SFT)或多任务提示训练(Multitask Prompted Training)。指令微调后的大语言模型能够具有较强的指令遵循能力,从而可以通过零样本学习的方式解决多种下游任务。

本节将首先介绍指令数据的构建方法和相应的训练策略,然后介绍低资源场景下的参数高效微调方法。

指令数据的构建

指令格式化的数据实例一般包括任务描述(也称为指令)、任务输入-任务输出以及可选的示例。本教程已经在之前常用微调数据集中介绍了一些代表性的指令数据集。下面将介绍三种构建格式化指令数据的方法。

基于现有的 NLP 任务数据集构建

已有的 NLP 任务数据集是非常重要的数据资源,可以用于构造指令数据集。这些集合中的数据一般包括输入和输出两个部分,例如在中英翻译任务中,输入是“大语言模型…”、输出则是“Large language models…”。因此,生成指令化数据的关键步骤就是为“输入-输出”添加任务描述信息(指令),用于指导模型理解任务目标。例如对于前面的翻译任务,就可以添加指令“请把这个中文句子翻译成英文”。

相关

研究表明在现有 NLP 数据集的“输入-输出”数据中添加合适的任务描述是提升大模型指令跟随能力的关键。如果去除任务描述,仅使用“输入-输出”数据对模型进行微调,性能会出现显著下降。

为此,研究者开发了众包平台 PromptSource(https://github.com/bigscience-workshop/promptsource),能够高效地支持标注人员为不同数据集创建、共享及验证任务描述,如图 16-1 所示。此外,还可以设计特定的任务描述来翻转现有实例的“输入-输出”对,例如,对于“问题-答案”对,既可以基于问题预测答案,也可以基于答案生成问题,比如使用指令“请基于以下答案生成一个问题:”。

延伸

谷歌按照一定的比例混合了 FLAN、P3、SuperNatural Instructions 等集合以及思维链数据,推出了包含约 20M 条实例的指令微调数据集 FLAN v2,该数据集目前是微调大语言模型的首选指令集合。

基于日常对话数据构建

指令格式化已有的 NLP 数据集虽然能够获得大量实例,但是数据多样性比较小而且也不能很好匹配人类的真实需求。因此另一种方式是使用用户在日常对话中的实际需求作为任务描述,例如 InstructGPT 将用户提交给 OpenAI API 的查询作为任务描述。

最近研究者开源了一些由人工精心标注的日常对话指令集,例如 Dolly 和 OpenAssistant。此外,研究者还尝试通过自行构建的开放平台收集大量的用户对话请求作为输入数据,并使用 ChatGPT 或 GPT-4 生成回复作为输出,ShareGPT 数据集便是一个代表。为此,研究者开发了众包平台 PromptSource,能够高效地支持标注人员为不同数据集创建、共享及验证任务描述,如图 所示。此外,还可以设计特定的任务描述来翻转现有实例的“输入-输出”对,例如,对于“问题-答案”对,既可以基于问题预测答案,也可以基于答案生成问题,比如使用指令“请基于以下答案生成一个问题:”。

延伸

如 14.2.4 节常用微调数据集中所述,谷歌按照一定的比例混合了 FLAN、P3、SuperNatural Instructions 等集合以及思维链数据,推出了包含约 20M 条实例的指令微调数据集 FLAN v2,该数据集目前是微调大语言模型的首选指令集合。

基于日常对话数据构建

指令格式化已有的 NLP 数据集虽然能够获得大量实例,但是数据多样性比较小而且也不能很好匹配人类的真实需求。因此另一种方式是使用用户在日常对话中的实际需求作为任务描述,例如 InstructGPT 将用户提交给 OpenAI API 的查询作为任务描述。

最近研究者开源了一些由人工精心标注的日常对话指令集,例如 Dolly 和 OpenAssistant。此外,研究者还尝试通过自行构建的开放平台收集大量的用户对话请求作为输入数据,并使用 ChatGPT 或 GPT-4 生成回复作为输出,ShareGPT 数据集便是一个代表。

基于合成数据构建

为了减轻人工收集与标注数据的负担,研究者进一步提出半自动化的数据合成方法,将已有的高质量指令数据作为上下文学习示例输入大语言模型, 然后生成大量多样化的任务描述和输入-输出数据,如图 所示。代表性方法 Self-Instruct 仅需要使用 100 多个人工撰写的实例作为初始任务池,然后随机选择数据作为示例,就可以通过大语言模型生成新的指令微调数据。

考虑到 Self-Instruct 生成的实例可能过于简单或缺乏多样性,研究者还提出了改进的指令数据合成方法 Evol-Instruct,该方法通过基于深度和广度的演化来提高实例的复杂性和多样性。

延伸

研究表明一定数量的高质量指令就可以激活大语言模型的对话能力。例如 Alpaca 使用了 52K 条 合成数据来指令微调 LLaMA (7B),在 179 条日常对话数据的评测中到达了接近 text-davinci-003 的效果。LIMA 仅使用了一千条人工标注的高质量指令数据来微调 LLaMA (65B),就在 300 条日常对话测试中取得了较好的模型表现。

因此,指**令的质量比数量更为重要。**指令微调中应优先使用人工标注的多样性指令数据。在实践中可以使用 ChatGPT、GPT-4 等闭源大语言模型来合成、重写、筛选现有指令。例如 Alpagasus 从原始的 52K 条 Alpaca 数据中筛选出 GPT-4 评分较高的 9 千条进行指令微调训练,便可达到与原始 52K 条数据接近的效果。

参数高效微调方法 LoRA

通过指令微调,大语言模型能够更好地遵循和执行人类指令。但是,由于大语言模型的参数量巨大,进行全参数微调需要较多的算力资源。因此研究者提出了参数高效微调(Parameter-efficient Fine-tuning),也称为轻量化微调(Lightweight Fine-tuning),在减少训练参数量的同时使得模型性能能够与全量微调相媲美。

其中,低秩适配(Low-Rank Adaptation, LoRA)是大语言模型最常用的参数高效微调方法,其通过在模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新

给定一个参数矩阵 W,其更新过程可以一般性地表达为

LoRA 微调方法还存在一些变种。例如 AdaLoRA 引入了动态低秩适应技术,在训练过程中动态调整每个参数矩阵需要训练的秩同时控制训练的参数总量。QLoRA 将原始的参数矩阵量化为 4 比特,而低秩参数部分仍使用 16 比特进行训练,在保持微调效果的同时进一步节省了显存开销。

人类对齐

经过预训练和指令微调后,大语言模型具备了解决各种任务的通用能力和指令遵循能力,但是受到数据质量、数据来源以及具体创作者等多方面的影响,也可能生成有偏见的、冒犯的以及事实错误的文本内容。因此,如何确保大语言模型的行为与人类价值观、人类真实意图和社会伦理相一致成为了一个重要问题,称为人类对齐(Human Alignment)。

基于人类反馈的强化学习

由于有用性(Helpfulness)、诚实性(Honesty)和无害性(Harmlessness)等对齐标准难以通过形式化的优化目标进行建模,因此研究者提出了基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF),引入人类反馈对大语言模型的行为进行指导。

RLHF 首先使用收集到的人类偏好数据训练奖励模型,最后基于奖励模型使用强化学习算法(例如 Proximal Policy Optimization, PPO(https://arxiv.org/abs/1707.06347))微调大语言模型。RLHF 的完整工作流程可以分为监督微调、奖励模型训练、强化学习微调三个阶段,如图 所示。

阶段一、监督微调

为了让待对齐语言模型具有较好的指令遵循能力,首先需要收集高质量的指令数据进行监督微调,即 指令微调。

阶段二、奖励模型训练

第二步是使用人类反馈数据训练奖励模型。具体来说,首先使用模型对任务指令生成一定数量的候选输出;然后邀请标注员对输出文本进行偏好标注,可以采用多种形式,最常用的是对候选文本进行排序标注(可以有效减少多个标注员之间的不一致情况);最后使用人工标注的偏好数据训练奖励模型,使其能够建模人类偏好。例如在 InstructGPT 中,标注员将模型生成的输出按照最佳到最差的顺序进行排序,然后训练奖励模型来预测这个排序。

延伸

在现有工作中,主要有两种人类反馈数据的形式:基于评分的人类反馈和基于排序的人类反馈。

最直接的标注方式是根据预设的标准邀请标注人员对模型的输出进行打分,例如遵守某条规则记 1 分而违反某条规则扣 1 分。除了人工标注外,还可以使用经过对齐的大语言模型对于特定对齐标准进行标注。

排序是另一种典型的人类偏好标注形式。最简单的方式是要求标注人员根据自身偏好对大语言模型的输出进行全排序,但是这种方 式需要花费较多的人力成本。目前更常见的做法是引入竞技比赛中衡量参与者相对实力的 Elo 评分系统,通过对模型输出进行两两比较,进而计算每个输出的综合得分并获得最终的输出排序。

奖励模型的训练方式主要包括如下三种形式:

打分式:对给定的输入问题,为相应的输出赋予反馈分数,通常是离散的数值,用于表示输出与人类偏好的契合程度。一般采用均方误差(Mean Square Error, MSE)作为打分式训练方法的目标函数。

对比式:仅需对两条输出进行排序,排序在前的输出被视为正例(更符合人类偏好),另一条输出则被视为负例。这种标注方式不仅降低了标注难度,还提高了不同标注者之间的一致性。通常采用对比学习方法训练奖励模型。

排序式:可以被视为对比式训练方法的增强形式。对于一个给定的输入,对多个模型回复进行排序。通过标注的顺序,可以获得回复之间的相对优劣关系,即哪些回复更符合人类价值观。通常采用与对比式方法类似的学习策略训练奖励模型。

步骤三:强化学习训练

待对齐语言模型担任策略实施者(称为策略模型),它接收提示作为输入并返回输出文本,其动作空间是词汇表中的所有词元,状态指的是当前已生成的词元序列。奖励模型则根据当前语言模型的状态提供相应的奖励分数,用于指导策略模型的优化。为了避免语言模型明显偏离初始模型,通常会在优化目标中加入一个惩罚项,如当前语言模型与初始语言模型生成结果之间的 KL 散度。这个对齐过程可以进行多次迭代,从而更好地对齐大语言模型。

延伸

目前 RLHF 中最常使用的是近端策略优化(Proximal Policy Optimization, PPO)算法,在策略梯度(Policy Gradient)算法的基础上,使用优势估计来更加准确的评估决策轨迹能获得的奖励,并且使用重要性采样来进行离线策略训练。此外,为了保证重要性采样的稳定性,PPO 算法通过在目标函数中加入梯度裁剪以及相关的惩罚项来减小采样误差。

为了能够实现上述优化过程,PPO 算法在策略模型和奖励模型的基础上,还引入了参考模型和评价模型。

非强化学习的对齐方法

尽管 RLHF 是一种有效的对齐技术,但是它也存在一 些局限性:首先,RLHF 训练过程中需要同时维护和更新多个模型,包括策略模型、奖励模型、参考模型以及评价模型,不仅会占用大量的内存,而且算法的执行过程也相对复杂;其次,RLHF 中常用的 PPO 算法在优化过程中稳定性不佳,对超参数的取值较为敏感,进一步增加了模型训练的难度和不确定性。

为此,研究人员提出了一系列直接基于监督微调的对齐方法,以避免复杂的强化学习算法所带来的种种问题。

非强化学习的对齐方法旨在利用高质量的对齐数据集,通过特定的监督学习算法对大语言模型进行微调。这类方法需要建立精心构造的高质量对齐数据集,利用其中蕴含的人类价值观信息来指导模型正确地响应人类指令或规避生成不安全内容。与指令微调方法不同,基于监督微调的对齐方法需要在优化过程中使得模型能够区分对齐的数据和未对齐的数据(或者对齐质量的高低),进而直接从这些数据中学习到人类期望的行为模式。

对齐数据的收集

为了构建有效的对齐数据集,一些方法尝试利用训练好的奖励模型对众多候选输出进行打分或者排序,筛选出最符合人类偏好的数据;其他方法则利用经过对齐的大语言模型(例如 ChatGPT)来构造训练数据。

代表性监督对齐算法 DPO

直接偏好优化(Direct Preference Optimization, DPO)是一种不需要强化学习的对齐算法,其主要思想是建立决策函数与奖励函数之间的关系,以规避奖励建模的过程。这样,大语言模型就能够通过与强化学习等价的形式学习到人类的价值观和偏好。

SFT 和 RLHF 的进一步讨论

指令微调是一种基于格式化的指令示例数据(即任务描述与期望输出相配对的数据)对大语言模型进行训练的过程,也被称为监督微调(Supervised Fine-Tuning, SFT),而 RLHF 算法的第一个步骤就是监督微调(SFT)。本节将深入探讨这两者之间的联系与差异。

学习方式

在学习方式方面,RLHF 首先学习一个奖励模型,然后利用该奖励模型通过强化学习算法(如 PPO)来改进大语言模型。而 SFT 则采用了 Teacher-Forcing 的方法,直接优化模型对实例输出的预测概率。从本质上说,SFT 这种词元级别的训练方式是一种“行为克隆”,它利用教师的行为数据(即每个步骤的目标词元)作为监督标签,来直接训练大语言模型模仿教师的行为。

SFT 的优缺点

SFT 在实现上简单、灵活、可拓展性较强,还可以用于构建很多特定功能,例如帮助大语言模型建立聊天机器人的身份。但是其作用在于“解锁”大语言模型的能力,而非向大语言模型“注入”新能力。因此,试图通过 SFT 激发大语言模型的非内生能力时,可能会出现一些负面问题。当待学习的标注指令数据超出了大语言模型的知识或能力范围,例如训练大语言模型回答关于模型未知事实的问题时,可能会加重模型的幻觉(Hallucination)行为。此外,作为一种基于行为克隆的学习方法,SFT 旨在模仿构建标注数据的教师的行为,而无法在这一过程中进行有效的行为探索。因此,高质量的指令数据(而非数量)是影响大语言模型训练的主要因素。

RLHF 的优缺点

在数据标注阶段,RLHF 相比 SFT 具有两项潜在优势:首先,RLHF 算法的标注员主要为训练过程提供偏好标注数据,而不是直接生成示例数据,因此它可以减少标注员之间的不一致;其次,与编写示例数据相比,偏好标注更为简单易行,标注员甚至可以评估超出自己创作水平模型的输出质量,使得模型能够探索标注员能力之外的状态空间,而不用受限于给定的教师示例。

在模型学习阶段,RLHF 通过对比模型的输出数据(区分“好”输出与“坏” 输出)来指导大语言模型学习正确的生成策略,它不再强迫大语言模型模仿教师的示例数据,因此可以缓解 SFT 所导致的幻觉问题。然而,RLHF 也继承了经典强化学习算法的缺点,如样本学习效率低和训练过程不稳定等问题。 因此,RLHF 需要依赖经过 SFT 的模型作为策略模型的初始模型,从而快速达到较好的表现。此外,RLHF 的过程通常会持续多轮,其中涉及了很多重要细节的设定(例如提示选择、奖励模型训练、PPO 的超参数设置以及训练过程中对超参数的调整),都会影响整个模型的性能,对于复现提出了较大挑战。

总的来说,SFT 特别适合预训练后增强模型的性能,具有实现简单、快速高效等优点;而 RLHF 可在此基础上规避可能的有害行为并进一步提高模型性能,但是实现较为困难,不易进行高效优化。

使用大语言模型

解码加速算法

大语言模型是通过文本生成的方式进行工作的。在自回归架构中,模型针对输入内容 (即提示文本)逐个单词生成输出内容的文本,这个过程被称为解码。

需要束搜索、Top-k 采样、Top-p 采样等解码策略来生成输出内容。但是由于自回归算法的序列化生成的特点,解码算法存在效率较低的问题。目前一般通过系统级优化方法以及解码策略优化方法来缓解这一问题。

系统级优化

一些研究工作提出了系统级优化方法来实现减少访存量的目的。

FlashAttention(https://arxiv.org/abs/2307.08691):一种针对原始注意力模块的优化方案,可以大幅减少注意力计算中的访存量,其核心思路是尽可能减少对于中间结果的保存,进而直接得到最终结果。FlashAttention 通过矩阵分块和算子融合等方法,将中间结果一直保留在缓存中,直到获得最终结果后再写回显存中,从而减少了显存读写量。

延伸

FlashAttention 有效地减少了访存量,同时也降低了峰值显存的占用量。使用了 FlashAttention 的 LLaMA-2 (7B) 在序列长度为 2048、批次大小为 8 的情况下,注意力操作的时间仅需传统注意力的十分之一。

PagedAttention(https://dl.acm.org/doi/abs/10.1145/3600006.3613165):针对键值缓存拼接和注意力计算的优化方案,能够有效降低这两个运算部分的访存量。在键值缓存拼接方面,PagedAttention 引入了操作系统中显存分页管理的方法,预先将显存划分成若干块给之后的键值缓存“预留空间”,从而显著减少了拼接时反复分配显存的操作。在注意力计算方面,PagedAttention 使用算子融合的方法将查询向量与多个分页的键值缓存并行地进行计算,从而减少其访存量。

批次管理优化:一个代表性的方法连续批处理(Continuous Batching)技术,通过启发式算法选择部分请求进行全量解码操作,或者选择一些请求进行单步增量解码操作,从而在一步操作中能够容纳更多的请求(相当于提高批次大小)。此外,DeepSpeed-MII 提出了动态分割技术,将全量解码部分进一步拆分为多个子操作,可以在一次计算中选择一些请求同时进行全量解码和增量解码操作,进而获得更大的批次和更高的解码吞吐量。

通过批次管理优化技术细粒度地分割不同请求的处理阶段,使得不同请求的处理过程可以同时进行,从而实现更为高效的线上服务。

解码策略优化

还有许多研究工作提出了针对自回归解码策略的改进方法以提高解码效率。

推测解码(https://proceedings.mlr.press/v202/leviathan23a.html):首先使用相对较小但解码更为高效的模型(例如 n 元统计模型或者小型预训练模型)自回归地生成若干个词元,然后再由大模型对这个片段进行一次验证(大模型一次验证与一次解码的时间消耗相当)来判断是否每个词元都是当前步骤概率最高的输出,随后大小模型持续迭代此过程直到解码结束。

推测解码不会降低大模型解码的质量, 实验测试表明能够带来约两倍左右的解码加速,是目前使用较多的解码策略优化方案。

级联解码(https://arxiv.org/abs/2305.05176):

使用不同规模的模型来处理难易度不同的请求。引入一系列效率从高到低的模型,然后将请求依次给这些模型进行生成,再由一个专门训练的二分类模型来判断生成结果是否符合要求,如果结果可靠就不需要再给之后的模型进行生成。

非自回归解码:机器翻译领域的研究人员提出了非自回归解码机制,可以基于输入并行地一次性生成所有的词元。但是这种方法的生成质量往往与自回归方法有一定差距,因此有研究工作提出了半自回归解码,每一次生成一组词元(例如 3 至 10 个),再以这些词元作为输入继续生成下一组。

然而,现有的大模型都是预测下一个词进行预训练的, 无法直接进行非(半)自回归生成。为此,Medusa 在 Vicuna 模型的基础上,额外训练了两个预测头来分别预测第二个词和第三个词,因此可以一次生成三个词元。

注意

尽管非(半)自回归策略在效率上有所提升,但仍然不能达到自回归解码的效果,因此其很少单独使用。通常用于推测解码中生成候选片段。

低资源部署策略

由于大模型参数量巨大,在解码阶段需要占用大量的显存资源,因而在实际应用中的部署代价非常高。为此,研究者提出了模型量化(Model Quantization)技术来减少大模型的显存占用。

量化(https://arxiv.org/abs/2103.13630)是指从浮点数到整数的映射过程,比较常用的是 8 比特整数量化,即 INT8 量化。神经网络模型通常有两种类型的数据需要进行量化,分别为权重量化(也称模型参数量化)和激活值量化。量化的过程可以表示为一个函数,该函数将连续的输入映射到离散的输出集合。一般来说,这个过程涉及到四舍五入或截断等近似操作。作为上述变换的逆过程,反量化(Dequantization)对应地从量化值中恢复原始值。

大语言模型相关的量化方法大致上可以分为两大类:量化感知训练(Quantization-Aware Training, QAT)和训练后量化(Post-Training Quantization, PTQ)。其中量化感知训练方法需要更新权重进而完成模型量化,而训练后量化方法则无需更新模型权重。一般来说,训练后量化方法需要更少的算力开销,实践中应用更为广泛。

针对大语言模型的量化研究受到了学术界的广泛关注,涌现了一批经验性的研究工作。下面针对目前的研究结论进行简要汇总:

**INT8 权重量化通常对于大语言模型性能的影响较小,更低精度权重量化的效果取决于具体的量化方法。**在大多数情况下,INT8 权重量化可以有效地减小显存占用而不显著影响模型性能。对于 INT4(或 INT3)权重量化,现有的方法通常使用不同策略(例如激活感知缩放)来减少性能下降。

低比特权重量化对于大语言模型的影响通常较小。因此,在相同显存开销的情况下,建议优先使用参数规模较大的语言模型,而不是表示精度较高的语言模型。例如量化精度为 4 比特的 60GB 语言模型在性能上往往会优于量化精度 8 比特的 30GB 语言模型。

**轻量化微调方法可以用于补偿量化大语言模型的性能损失。**大语言模型在超低比特权重量化时(如 2 比特量化),可能会出现预测精度的大幅下 降,此时可以通过轻量化微调(如 LoRA )的方式来进行性能补偿。具体来说,对不微调的模型权重进行低比特量化,而对于微调的适配器参数则使用 16 比特浮点数表示并使用 LoRA 算法进行微调。在推理时,量化部分的模型权重会先反量化为 16 比特浮点数,再与适配器权重相加进行融合使用。此外,QLoRA 更为针对性地设计了面向量化模型的性能补偿方法,在轻量化微调的同时还考虑了显存优化。实验表明,QLoRA 在基于 4 比特量化模型的微调后,能够获得与 16 比特模型全参数微调以及 LoRA 微调相似的效果。

模型蒸馏和模型剪枝

除了模型量化之外,模型蒸馏和模型剪枝也是常用的模型压缩方法,它们通过直接精简模型结构以减少参数数量。

模型蒸馏

模型蒸馏(Model Distillation)的目标是将复杂模型(称为教师模型)包含的知识迁移到简单模型(称为学生模型)中。以分类问题 为例,模型蒸馏的核心思想是引入额外的损失函数(称为蒸馏损失函数),训练学生模型的输出尽可能接近教师模型的输出。在实际应用中,蒸馏损失函数通常与分类损失函数(交叉熵损失函数)联合用于训练学生模型。

传统的模型蒸馏方法包括两种:基于反馈的知识蒸馏方法和基于特征的知识蒸馏方法。

基于反馈的知识蒸馏主要关注教师模型最后一层输出的 logits,这些 logits 经过 softmax 变换后作为学生模型的“软标签”进行学习,优化目标是让学生模型输出的 logits 去近似教师模型输出的 logits,从而学习到教师模型的特有知识;而基于特征的知识蒸馏则关注教师模型的中间层输出的激活值,并使用这些激活值作为监督信息训练学生模型。相较于最终的预测分布,中间层特征提供了更为丰富的模型信息,有助于在模型蒸馏过程中实现更为有效的知识迁移。然而,这种方法也存在一些技术难点,如消除架构不一致的影响、目标层自动化选择等。

面向大语言模型的知识蒸馏旨在将大语言模型(教师模型)包含的知识迁移到小模型(学生模型)中。根据大语言模型权重是否可以获得,可以分别使用白盒模型蒸馏方法和黑盒模型蒸馏方法。其中,白盒模型蒸馏方法可以获取模型的权重来指导学生模型,典型的方法为 MINILLM(https://arxiv.org/abs/2306.08543);而黑盒模型蒸馏方法无法获得模型权重,只能使用大语言模型的输出信息来训练小模型,目前主要关注于蒸馏大模型的关键 能力,如上下文学习能力、思维链推理能力以及指令遵循能力。

相关

以思维链推理能力的蒸馏为例(https://aclanthology.org/2023.findings-acl.507/),可以利用大语言模型生成输入样本的思维链推理过程,作为标签以外的额外补充信息来帮助引导小模型学习。这种方法通过引入大模型对于问题的求解思路来提供额外的监督信息,从而让学生模型同时学习预测标签以及大模型生成的推理过程解释。

模型剪枝

模型剪枝(Model Pruning)的目标是在尽可能不损失模型性能的情况下,努力消减模型的参数数量。

传统模型剪枝方法一般可以被分为结构化剪枝和非结构化剪枝。结构化剪枝(Structured Pruning)旨在去除对于性能影响较小的模型组件,可以删除神经元、通道甚至中间层。其核心思想是在尽量保持模型预测精度的条件下,去除那些对于结果影响不大的结构单元,如注意力机制中的注意力头、前馈层权重中的特定维度等。而非结构化剪枝(Unstructured Pruning) 则主要关注去除模型权重矩阵中不重要的数值(不修改模型结构)。一般来说,非结构化剪枝会创建一个包含 0/1 的掩码矩阵,并将其与原始的权重相乘,其中 0 所在位置的权重则不会在模型的计算中产生作用。当剪枝完成后,那些被剪枝掉的位置只会存储数值 0,从而节省存储空间。

延伸

在实际应用中,非结构化剪枝一般可以实现更高的剪枝比率,但是不会显著加速模型的计算过程,因为被掩码的部分可能仍然需要参与计算。而结构化剪枝通过去除结构单元,可以显著减少所需的矩阵乘法次数,实现模型的压缩和加速。

与传统的模型剪枝类似,大语言模型的剪枝方法分为结构化和非结构化剪枝两类。其中,非结构化剪枝一般容易获得更高的压缩率,典型工作包括 SparseGPT,其可以实现 60% 模型参数的剪枝并较好保持困惑度。大模型结构化剪枝的研究也取得了较好的模型压缩效果,例如 LLM-prune(https://proceedings.neurips.cc/paper_files/paper/2023/hash/44956951349095f74492a5471128a7e0-Abstract-Conference.html) 在 LLaMA (7B) 上剪枝了 20% 的参数并保持 93.6% 的预测精度、Sheared LLaMA 则将 LLaMA-2 (7B) 剪枝到 2.7B 参数规模并保持 87.8% 的预测精度。

提示学习

使用大语言模型解决实际任务常用的方法是设计合适的提示(Prompting),通过自然语言接口与大模型进行交互。目前,提示的设计主要依靠人工设计和自动优化两种策略来实现。为了更好地解决未见过的任务,一种典型的提示方法是上下文学习(In-context Learning, ICL),它将任务描述与示例以自然语言文本形式加入到提示中。此外,思维链提示(Chain-of-Thought, CoT)作为一种增强技术,将一系列中间推理步骤加入 到提示中,以增强复杂推理任务的解决效果。

大模型应用

本节将围绕具有代表性的自然语言处理和信息检索领域介绍大模型的应用。

自然语言处理

下面简要介绍一下大语言模型在三大经典任务上的应用,包括序列标注、关系抽取以及文本生成,这些任务构成了许多自然语言处理系统和应用的基础

对于序列标注任务,大语言模型只需通过上下文学习或构建特殊提示就能解决,而无须使用 B-I-O 标记(BIO标记详见【token】系列文章)。例如,仅需要给出提示(如“请识别出句子中包含的实体”)或任务示例(如“输入文本‘中华人民共和国今天成立了’,请抽取出其所包含的命名实体:‘中华人民共和国’”)即可自动抽取出实体。

对于关系抽取任务,大语言模型同样能够借助特定提示方法(如上下文学习等)来完成。但是,当关系标签规模较为庞大时,这些知识信息难以完全通过上下文学习的方式注入到大语言模型中,可能会导致效果较差。此时可以结合大语言模型和小模型,例如先利用小模型进行候选关系的初筛,再利用大模型进一步从初筛后的候选关系中推理出最合适关系;也可以采用大语言模型对数据进行初步标注,从而丰富可用于训练的小模型的标注数据。

文本生成任务,只需通过适当的提示方法,大语言模型就能展现出接近人类的表现。然而,大语言模型难以有效处理低资源语言或领域下的文本生成任务,例如马拉地语到英语的翻译。

信息检索

大语言模型拥有强大的语言理解、推理与生成能力,能够助力构建更为智能的信息检索系统;而信息检索技术能够高效地从外界获取所需要的相关信息,可以为大语言模型提供更为精确、可靠的上下文信息。

在大语言模型提升信息检索任务方面,主要包括利用大语言模型进行信息检索和大语言模型增强的信息检索模型。

**利用大语言模型进行信息检索:**现代信息检索系统通常采用“检索-重排序”的流水线框架。利用大语言模型改进信息检索系统的工作可以分为两类。第一类在检索数据上微调大语言模型以构建检索器或重排序器,利用大语言模型的语义理解能力提高检索效果;第二类通过设计特殊的指令(例如“请判断下述查询和文档的相关程度”),直接引导大语言模型生成两者的相关程度(如相关度分类或者打分),用于对候选文档集合进行排序。出于效率考虑,大多数工作将大语言模型应用于重排序阶段。

**大语言模型增强的信息检索模型:**大语言模型出色的语义理解与生成能力可以为信息检索模型补充相关性信息。一类方法通过构造特殊的提示,使得大语言模型能够充当标注者的角色,以较低成本完成大规模训练数据的标注工作,为传统检索模型补充高质量标注数据;第二类方法同样通过设计特殊的提示,利用大语言模型对输入查询进行改写,辅助信息检索模型精准理解用户的需求。此外,还可以利用大语言模型对查询进行详细解释和扩充。

在检索增强的大语言模型方面,考虑到大语言模型受限于训练数据的时效性和局限性,研究者提出了检索增强生成(Retrieval-Augmented Generation, RAG)技术。该技术旨在通过信息检索系统从外部知识库中获取相关信息,为大语言模型提供时效性强、领域相关的外部知识。然而,检索返回的结果可能由于检索质量、呈现格式、输入长度等问题,导致大语言模型不能很好地利用这些信息。此时,可以通过输入优化、指令微调和预训练策略进行缓解。

**输入优化策略:**在检索增强生成的场景中,大语言模型主要面临两个挑战。首先,当处理包含多个参考文档的长文本时,其信息利用能力往往会下降;其次,检索到的结果中可能包含与任务无关的文档,这可能会干扰模型对关键信息的识别和处理。为此,可以使用过滤、压缩、摘要等技术,在文档和词元两个层级优化模型输入。

**指令微调策略:**构造面向检索文档利用的指令数据,通过对大语言模型进行微调,提升其对文档信息的处理和理解能力。首先,需要确保模型能够平等地关注输入中不同位置(如开头、中间、结尾)的内容,以缓解某些位置的信息容易被忽略的问题;其次,当存在不相关信息时,大语言模型应尽可能地避免被这些信息干扰。

**预训练策略:**如果大语言模型最终主要用于信息检索任务,还可以在预训练阶段采用特殊的学习任务对其检索生成能力进行针对性的加强。一种常见的策略是将语料库中文档的标题或第一段文字作为查询,其余内容作为期望的生成结果。也有一些工作将每段话分为长度相等的两部分,其中前半部分作为查询,后半部分作为期望的生成结果。

零基础入门AI大模型

今天贴心为大家准备好了一系列AI大模型资源,包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

有需要的小伙伴,可以点击下方链接免费领取【保证100%免费

点击领取 《AI大模型&人工智能&入门进阶学习资源包》

1.学习路线图

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
在这里插入图片描述

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

5.免费获取

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码或者点击以下链接都可以免费领取【保证100%免费】

点击领取 《AI大模型&人工智能&入门进阶学习资源包》

在这里插入图片描述

参考书籍

1. 《LLMBOOK》

2. 《统计自然语言处理基础》-计算机科学教材系列

参考书籍E-book及资料获取请公众号后台联系作者。

本文转自 https://mp.weixin.qq.com/s/zGbvumD0GZB48Vc7poTiQA,如有侵权,请联系删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值