大语言模型:综述 (中)

23年6月人大和蒙特利尔大学的论文“A Survey of Large Language Models”。

继续介绍LLM的预训练和自适配。

预训练


预训练奠定了 LLM 能力的基础。通过在大规模语料库上进行预训练,LLM 可以获得基本的语言理解和生成技能 [55, 56]。在此过程中,预训练语料库的规模和质量对于 LLM 获得强大的能力至关重要。此外,为了有效地预训练 LLM,需要精心设计模型架构、加速方法和优化技术。

数据收集

相较于小规模语言模型,LLM 对模型预训练的高质量数据要求更高,其模型能力很大程度上依赖于预训练语料及其预处理方式。

要开发一个功能强大的 LLM,关键是要从各种数据源收集大量自然语言语料库。现有的 LLM 主要利用各种公共文本数据集作为预训练语料库。如图已经显示许多代表性 LLM 的预训练数据源分布。

收集大量文本数据后,对数据进行预处理对于构建预训练语料库至关重要,尤其是删除噪声、冗余、不相关和潜在有害数据 [56, 59, 168],这些数据可能会极大地影响 LLM 的容量和性能。

如图显示了 LLM 预训练数据的典型预处理流程:包括质量滤波-去重-隐私减弱-token化-准备预处理等。

与小规模的 PLM 不同,由于对计算资源的需求巨大,通常无法多次迭代 LLM 的预训练。因此,在训练 LLM 之前构建一个准备充分的预训练语料库尤为重要。

架构

下表显示公开资料中几个LLM的架构信息(模型卡)。

由于出色的可并行性和能力,Transformer 架构 [22] 已成为开发各种 LLM 的事实上的支柱,使语言模型能够扩展到数百或数千亿个参数。总体而言,现有 LLM 的主流架构大致可分为三大类,即编码器-解码器、因果解码器和前缀解码器,如图所示。

自 Transformer [22] 发布以来,人们提出了各种改进来提高其训练稳定性、性能和计算效率。Transformer 四个主要部分的相应配置,包括规范化、位置嵌入、激活函数以及注意机制和偏差。如表列出了这些配置计算公式。

注意机制是Transformer的一个重要组成部分,它使得序列中的token能够相互交互,并计算输入和输出序列的表示。

• 全注意。在 原始 Transformer [22] 中,注意机制以成对的方式进行,考虑序列中所有token对之间的关系。它采用尺度点积注意,其中隐藏状态被映射到Q、K和V。此外,Transformer 使用多头注意而不是单头注意,将Q、K和V以不同的变换投影到不同的头中。每个头输出的拼接作为最终输出。

• 稀疏注意。全注意的一个关键挑战是二次计算复杂度,这在处理长序列时会成为负担。因此,提出了各种有效的 Transformer 变体来降低注意机制的计算复杂度 [210,211]。例如,GPT-3 [55] 采用了局部带状稀疏注意(即分解注意 [212])。每个查询只能根据位置关注一组 tokens 的子集,而不是整个序列。

• 多查询注意。多查询注意是指注意机制的一种变体,其中不同的头在K和V上共享相同的线性变换矩阵 [213]。它可以显著节省计算成本,而模型质量只会受到轻微影响。具有多查询注意机制的代表性模型包括 PaLM [56] 和 StarCoder [214]。

• Flash Attention。与大多数现有的近似注意方法以牺牲模型质量来提高计算效率不同,Flash Attention [215] 提出从 IO 觉察的角度优化 GPU 上注意模块的速度和内存消耗。现代 GPU 上有不同级别的内存,例如具有快速 IO 的 SRAM 和具有相对较慢 IO 的 HBM。Flash Attention 将输入组织成块并引入必要的重计算,以便更好地利用快速内存 SRAM。Flash Attention 作为 CUDA 中的融合核实现,已集成到 PyTorch [153]、DeepSpeed [65] 和 Megatron-LM [66] 中。

为了获得更强的泛化和训练稳定性,建议选择预先 RMSNorm 进行层归一化,并选择 SwiGLU 或 GeGLU 作为激活函数。此外,在嵌入层之后可能不会立即使用 LN,这可能会导致性能下降。至于位置嵌入,RoPE 或 ALiBi 是更好的选择,因为它在长序列上表现更好。

预训练的关键作用,在于将来自大规模语料库的常识编码到海量模型参数中。对于训练LLM,有两个常用的预训练任务,即语言建模(LM)和去噪自编码(DAE)。

由于大多数语言任务都可以归结为基于输入的预测问题,这些仅使用解码器的 LLM 可能有利于隐式地学习如何以统一的 LM 方式完成这些任务。一些研究还表明,仅使用解码器的 LLM 可以通过自回归预测下一个token [26, 55] 自然地迁移到某些任务,而无需微调。LM 的一个重要变体是前缀语言建模任务,它是为具有前缀解码器架构的预训练模型设计的。随机选择前缀中的tokens不会用于计算前缀语言建模的损失。在预训练期间看到tokens数相同的情况下,前缀语言建模的表现略差于语言建模,因为模型预训练涉及的序列中tokens较少 [29]。

DAE 任务在实现上似乎比 LM 任务更复杂。因此,它尚未被广泛用于预训练大语言模型。现有的以 DAE 为预训练目标的 LLM 包括 T5 [73] 和 GLM-130B [83]。这些模型主要通过自回归的方式训练恢复替换tokens。

混合去噪(MoD) 将 LM 和 DAE 目标视为不同类型的去噪任务,即 S-denoiser(LM)、R-denoiser(DAE,短替换范围和低损坏)和 X-denoiser(DAE,长替换范围或高损坏)。

长上下文。基于 Transformer 的语言模型的主要缺点之一是上下文长度有限,因为涉及时间和内存的二次计算成本。同时,对具有长上下文窗口的 LLM 应用程序的需求日益增加,例如在 PDF 处理和故事写作中 [217]。ChatGPT 最近发布了一个更新版本,其上下文窗口大小高达 16K 个 token,这比最初的 4K 个 token 长得多。此外,GPT-4 推出了上下文窗口为 32K 个 token 的变体 [46]。

模型训练

对于 LLM 的参数优化,包括批量训练、学习率、优化器和训练稳定性的设置。

随着模型和数据规模的增加,在有限的计算资源下高效训练 LLM 变得越来越具有挑战性。特别是,需要解决两个主要技术问题,即提高训练吞吐量和将更大的模型加载到 GPU 内存中。为解决上述两个挑战而广泛使用的几种方法,包括 3D 并行 [66, 229, 230]、ZeRO [231] 和混合精度训练 [232]。

3D并行。其实际上是三种常用的并行训练技术结合,即数据并行、流水线并行[229, 230]、张量并行[66]。

ZeRO 。该技术[231] 由 DeepSpeed [65] 库提出,主要解决数据并行中的内存冗余问题。如前所述,数据并行要求每个 GPU 存储相同的 LLM 副本,包括模型参数、模型梯度和优化器参数。然而,并非所有上述数据都需要保留在每个 GPU 上,这将导致内存冗余问题。为了解决这个问题,ZeRO 技术旨在每个 GPU 上仅保留一小部分数据,而其余数据可以在需要时从其他 GPU 检索。具体来说,ZeRO 提供了三种解决方案,具体取决于数据的三个部分如何存储,即优化器状态分区、梯度分区和参数分区。实证结果表明,前两种解决方案不会增加通信开销,第三种解决方案增加了约 50% 的通信开销,但节省的内存与 GPU 数量成正比。PyTorch 实现了与 ZeRO 类似的技术,称为全分片数据并行(FSDP) [237]。

混合精度训练。在之前的 PLM(例如 BERT [23])中,32 位浮点数(也称为 FP32)主要用于预训练。近年来,为了预训练极大的语言模型,一些研究 [232] 开始使用 16 位浮点数(FP16),以减少内存使用量和通信开销。此外,由于流行的 NVIDIA GPU(例如 A100)的 FP16 计算单元数是 FP32 的两倍,FP16 的计算效率可以进一步提高。然而,现有研究发现 FP16 可能导致计算精度的损失 [59, 69],从而影响最终的模型性能。为了缓解这个问题,一种称为 Brain Floating Point(BF16)的替代方案已用于训练,它分配的指数位比 FP16 多,有效位更少。对于预训练,BF16 在表示精度方面通常比 FP16 表现更好 [69]。

训练建议。在实践中,上述训练技术,尤其是 3D 并行,通常联合使用以提高训练吞吐量和大模型加载。例如,研究人员已经结合了 8 路数据并行、4 路张量并行和 12 路流水线并行,从而能够在 384 个 A100 GPU 上训练 BLOOM [69]。目前,DeepSpeed [65]、Colossal-AI [149] 和 Alpa [238] 等开源库可以很好地支持这三种并行训练方法。为了减少内存冗余,ZeRO、FSDP 和激活重计算技术 [68, 239] 也可用于训练 LLM,这些技术已经集成到 DeepSpeed、PyTorch 和 Megatron-LM 中。此外,混合精度训练技术(如 BF16)也可用于提高训练效率并减少 GPU 内存使用,但它需要硬件(如 A100 GPU)的必要支持。由于训练大模型是一个耗时的过程,因此预测模型性能并在早期阶段检测异常问题将大有裨益。为此,GPT-4 [46] 最近引入了一种基于深度学习堆栈的新机制,称为可预测扩展,能够使用小得多的模型预测大模型的性能,这对于开发 LLM 可能非常有用。在实践中,可以进一步利用主流深度学习框架的支持训练技术。例如,PyTorch 支持数据并行训练算法 FSDP [237],如果需要可以将训练计算部分卸载到 CPU。

自适配


经过预训练后,LLM 可以获得解决各种任务的通用能力。然而,越来越多的研究表明,LLM 的能力可以根据特定目标进一步调优。两种调优预训练 LLM 的主要方法,即指令调优和对齐调优。前一种方法主要旨在增强(或解锁)LLM 的能力,而后一种方法旨在使 LLM 的行为与人类价值观或偏好保持一致。还有一个问题是,在资源有限的情况下模型自适应的有效调优和量化。

指令调优

本质上,指令调优是一种在自然语言形式的格式化实例集合上对预训练的 LLM 进行微调的方法 [62],这与监督微调 [61] 和多任务提示训练 [28] 高度相关。为了执行指令调优,首先需要收集或构建指令格式化的实例。然后,用这些格式化的实例以监督学习的方式对 LLM 进行微调(例如,使用序列-到-序列损失进行训练)。经过指令调优后,LLM 可以表现出卓越的能力来推广到未见的任务 [28, 62, 64],即使在多语言环境中也是如此 [84]。

最近的一项调查 [248] 对指令调优的研究进行了系统的概述。

通常,一个指令式实例由一个任务描述(称为指令)、一个可选的输入、相应的输出和少量的演示(可选)组成。作为重要的公共资源,现有研究已经发布了大量以自然语言格式化的标记数据。如图所示是指令调优实例格式化以及构建指令格式实例的三种不同方法:任务数据集、日常对话数据和合成数据。

如表是指令调优的详细清单:

与预训练不同,指令调优通常更有效,因为仅使用适量实例进行训练。由于指令调优可以被视为有监督训练过程,因此其优化在几个方面与预训练不同 [64],例如训练目标(即序列-到-序列损失)和优化配置(例如较小的批大小和学习率),这在实践中需要特别注意。除了这些优化配置之外,指令调优还需要考虑两个重要方面:平衡数据分布和预训练-指令调优的结合。

要对 LLM 进行指令调优,可以根据下表中关于所需 GPU 数量和调优时间的基本统计数据准备计算资源。设置开发环境后,建议初学者按照 Alpaca 存储库的代码进行指令调优。随后,应该选择基础模型并构建指令数据集。当用于训练的计算资源受限时,用户可以利用 LoRA 进行参数高效调优。至于推理,用户可以进一步使用量化方法在更少或更小的 GPU 上部署 LLM。

如表显示了使用基于 7B LLaMA 的不同指令数据集的实验结果。

• 任务格式的指令更适合 QA 设置,但可能不适用于聊天设置。比较使用 FLAN-T5 与 ShareGPT 和 Self-Instruct-52K 进行指令调优的性能 ,可以观察到 FLAN-T5 在 QA 基准测试中始终取得更好的性能,而在聊天设置上的表现不如 ShareGPT。原因是 FLAN-T5 由现有 NLP 任务(例如翻译和阅读理解)的指令和示例混合组成。因此,使用 FLAN-T5 微调的 LLaMA 在 QA 任务上表现更好,但在用户查询上表现不佳。相比之下,ShareGPT 由现实世界的人与 ChatGPT 对话组成,能够更好地引导 LLaMA 在日常生活中遵循用户指令,但可能不适合完成 QA 任务。

• 混合使用不同类型的指令对提高 LLM 的综合能力非常有帮助。将三种指令混合进行微调后,派生的 LLaMA 变体(使用 FLAN-T5、ShareGPT 和 Self-Instruct-52K)在两种任务设置中都表现良好。在 MMLU 中,其性能可以大大超过使用单个指令集的性能,即 43.69 vs. 38.58(FLAN-T5)。这表明混合多种来源的指令数据集有助于提高指令调优 LLM 的性能,从而扩大指令数量并增加多样性。

• 增强指令的复杂性和多样性可以提高模型性能。分别增加 Self-Instruct-52K 数据集的复杂度和多样性,LLaMA 的聊天和 QA 性能可以持续提高,例如,在 MMLU 中从 37.52 提高到 39.73。这表明这两种策略都有助于提高 LLM 的指令跟随能力。此外,提高复杂度会使 QA 任务的性能提升更大。原因是 QA 任务大多由评估 LLM 的难题组成,这些问题可以在微调阶段学习复杂指令的 LLM 更好地解决。

• 简单地增加指令数量可能没那么有用,平衡难度并不总是有帮助。如上表中的结果所示,实验中平衡难度和增加微调指令的数量并不是很有帮助。特别是对于扩展指令数量,它甚至会损害性能,例如,在 BBH3k 中从 29.81 下降到 26.63。这表明,单纯地扩大合成指令数而不进行质量控制可能无法有效提高性能。此外,使用中等难度的指令进行微调在聊天设置中也表现良好,而在问答设置中则略微降低了性能。一个可能的原因是,过滤了复杂且困难的指令,这些指令具有较大的困惑度分数,这会损害模型在回答复杂问题时的性能。

对齐调优

背景。LLM 在广泛的 NLP 任务中表现出色 [55, 56, 62, 81]。然而,这些模型有时会表现出意想不到的行为,例如捏造虚假信息、追求不准确的目标以及产生有害、误导和有偏见的表达 [61, 266]。对于 LLM,语言建模目标通过单词预测对模型参数进行预训练,而缺乏对人类价值观或偏好的考虑。为了避免这些意外行为,已经提出了人工对齐,以使 LLM 的行为符合人类的期望 [61, 267]。然而,与原有的预训练和适配调优(如指令调优)不同,这种对齐需要考虑非常不同的标准(如有用性、诚实性和无害性)。研究表明,对齐可能会在一定程度上损害 LLM 的一般能力,相关文献中将此称为对齐税 [268]。

对齐标准。近年来,人们越来越关注制定各种各样的标准来规范 LLM 的行为。以三个具有代表性的对齐标准(即有用、诚实和无害)为例,这些标准在现有文献中已被广泛采用 [61, 268]。此外,还有其他从行为、意图、动机和内在方面等不同角度提出的 LLM 对齐标准 [266],它们与上述三个标准基本相似(或至少具有类似的对齐技术)。也可以根据具体需要修改这三个标准,例如用正确性代替诚实 [100]。

• 有用性。为了有用,LLM 应该明确地尝试帮助用户以尽可能简洁高效的方式解决他们的任务或回答问题。在更高的层次上,当需要进一步澄清时,LLM 应该展示通过相关查询获取额外相关信息的能力,并表现出适当的敏感性、洞察力和审慎性 [268]。实现有用行为的对齐对于 LLM 来说具有挑战性,因为很难准确定义和衡量用户的意图 [266]。

• 诚实。从基本层面上讲,一个符合诚实标准的 LLM 应该向用户呈现准确的内容,而不是捏造信息。此外,对于 LLM 来说,在其输出中传达适当程度的不确定性至关重要,以避免任何形式的欺骗或歪曲信息。这要求模型了解其能力和知识水平(例如,“知道未知物”)。根据 [268] 中的讨论,与乐于助人和无害相比,诚实是一个更客观的标准,因此诚实对齐可以减少对人类努力的依赖。

• 无害。为了无害,它要求模型产生的语言不应具有冒犯性或歧视性。在最佳能力范围内,该模型应该能够检测旨在为恶意目的秘密行为。理想情况下,当模型被诱导进行危险行为(例如犯罪)时,LLM 应该礼貌地拒绝。尽管如此,哪些行为被视为有害以及在多大程度上因个人或社会而异 [268] 在很大程度上取决于谁在使用 LLM、提出的问题类型以及使用 LLM 的背景(例如时间)。

这些标准非常主观,并且是基于人类认知开发的。因此,很难直接将它们表述为 LLM 的优化目标。在现有工作中,对齐 LLM 时有很多方法可以满足这些标准。一种有前途的技术是红队(red teaming) [269],它涉及使用手动或自动方式以对抗方式探测 LLM 生成有害输出,然后更新 LLM 以防止此类输出。

在预训练阶段,LLM 使用语言建模目标在大规模语料库上进行训练。然而,它不能考虑到人类对 LLM 输出的主观和定性评价(称为人工反馈)。高质量的人工反馈对于使 LLM 与人类的偏好和价值观保持一致极为重要。

人工标注者选择。在现有工作中,生成人工反馈数据的主要方法是人工标注 [61, 100, 267]。这凸显了选择合适的人工标注者的关键作用。为了提供高质量的反馈,人工标注者应该具有合格的教育水平和出色的英语水平。例如,Sparrow [100] 要求人工标注者是英国以英语为母语的人,并至少获得本科教育资格。即便如此,一些研究[267]发现,研究人员和人工标注者的意图仍然存在不匹配,这可能导致低质量的人工反馈,并导致LLM产生意想不到的输出。为了解决这个问题,InstructGPT[61]进一步进行了筛选,通过评估人工标注者和研究人员之间的一致性来过滤标注者。具体来说,研究人员首先标记少量数据,然后测量他们自己和人工标注者之间的一致性。一致性最高的标注者将被选中进行后续的工作。在其他一些工作[270]中,使用“超级评分者”来确保人工反馈的高质量。研究人员评估人工标注的表现,并选择一组表现良好的人工标注者(例如,一致性高)作为超级评分者。超级评分者将优先考虑与研究人员在后续研究中合作。当人工标注者注释LLM的输出时,为人工标注者指定详细的说明和提供即时指导是有帮助的,这可以进一步规范标注者的注释。

人工反馈收集。在现有工作中,收集人工标注员的反馈和偏好数据的方法主要有三种:基于排名的方法,基于问题的方法和基于规则的方法。

人类反馈中强化学习 (RLHF) 利用收集到的人类反馈数据对 LLM 进行微调,这有助于改善对齐标准(例如,有用性、诚实和无害)。RLHF 采用强化学习 (RL) 算法(例如,近端策略优化 (PPO) [111])通过学习奖励模型使 LLM 适应人类反馈。这种方法将人类纳入训练循环中,开发对齐良好的 LLM,例如 InstructGPT [61]。

RLHF 系统。RLHF 系统主要包括三个关键组件:需要对齐的预训练 LM、从人类反馈中学习的奖励模型和训练 LM 的 RL 算法。具体而言,预训练 LM 通常是一个生成模型,使用现有的预训练 LM 参数进行初始化。例如,OpenAI 将 175B GPT-3 用于其首个流行的 RLHF 模型 InstructGPT [61],而 DeepMind 将 2800 亿个参数模型 Gopher [59] 用于其 GopherCite 模型 [270]。此外,奖励模型 (RM) 提供 (学习的) 指导信号,这些信号反映人类对 LM 生成文本的偏好,通常以标量值的形式出现。奖励模型可以采用两种形式:微调的 LM 或用人类偏好数据监督微调训练的 LM。现有工作通常采用参数尺度不同于对齐 LM 的奖励模型 [61, 270]。例如,OpenAI 使用 6B GPT-3,DeepMind 使用 7B Gopher 作为奖励模型。最后,为了使用来自奖励模型的信号优化预训练的 LM,设计一种特定的 RL 算法来进行大规模模型调优。具体而言,近端策略优化 (PPO) [111] 是一种广泛用于现有工作 [61, 100, 270] 中的 RL 对齐算法(注:目前是直接偏好优化,即DPO)。

RLHF 的关键步骤。如图说明了 RLHF [61] 的整体三步流程。

• 监督微调。为了使 LM 最初执行所需的行为,它通常需要收集一个监督数据集,其中包含输入提示(指令)和所需的输出,以对 LM 进行微调。这些提示和输出可以由人工标注者为某些特定任务编写,同时确保任务的多样性。例如,Instruct-GPT [61] 要求人工标注为几个生成任务(如开放式问答、头脑风暴、聊天和重写)编写提示(例如,“列出五个如何重拾对职业的热情的想法”)和所需的输出。请注意,在特定设置或场景中,第一步是可选的。

• 奖励模型训练。第二步是使用人工反馈数据训练 RM。具体来说,用 LM 生成一定数量的输出文本,并使用采样的提示(来自监督数据集或人工生成的提示)作为输入。然后,请人工标注者对这些输入对的偏好进行注释。注释过程可以以多种形式进行,一种常见的方法是通过对生成的候选文本进行排名来进行注释,这可以减少标注者之间的不一致性。然后,训练 RM 预测人类偏好的输出。在 InstructGPT 中,标注者将模型生成的输出从最好到最差进行排序,并训练 RM(即 6B GPT-3)来预测排名。

• RL 微调。在此步骤中,对齐(即微调)LM 被形式化为 RL 问题。在这种情况下,预训练的 LM 充当策略,以提示为输入并返回输出文本,它的动作空间是词汇表,状态是当前生成的 token 序列,奖励由 RM 提供。为了避免与初始(调优之前)LM 有较大偏差,通常会在奖励函数中加入一个惩罚项。例如,InstructGPT 使用 PPO 算法针对 RM 优化 LM。对于每个输入提示,InstructGPT 计算当前 LM 生成结果与初始 LM 之间的 KL 散度作为惩罚。值得注意的是,第二步和最后一步可以多次迭代更好地对齐 LLM。由于 RL 算法的不稳定性,最近的研究 [271] 通过重用具有更高奖励的最佳排名样本,用另一种监督微调取代 RL 调优。

参数高效适配


参数高效微调

在现有文献中,参数高效微调 [127, 272, 273] 一直是一个重要课题,旨在减少可训练参数的数量,同时尽可能保持良好的性能。Transformer 语言模型有四种参数高效微调方法,包括适配器调优、前缀调优、提示调优和 LoRA。这四种方法的示意图如图所示。

适配器调优。适配器调优将小型神经网络模块(称为适配器)合并到 Transformer 模型中 [274]。为了实现适配器模块,[274, 275] 中提出了一种瓶颈架构,首先将原始特征向量压缩成较小的维度(然后进行非线性变换),然后将其恢复到原始维度。适配器模块将集成到每个 Transformer 层中,通常在 Transformer 层的两个核心部分(即注意层和前馈层)之后串行插入。或者,也可以在 Transformer 层中使用并行适配器 [276],其中它将两个适配器模块与注意层和前馈层并行放置。在微调过程中,适配器模块将根据特定的任务目标进行优化,而原始语言模型的参数在此过程中保持冻结。通过这种方式,可以有效地减少微调过程中可训练参数的数量。

前缀调优。前缀调优[272] 在语言模型中的每个 Transformer 层前面添加一系列前缀,这些前缀是一组可训练的连续向量。这些前缀向量是任务特定的,可以被视为虚拟tokens嵌入。为了优化前缀向量,提出了一种重参数化技巧 [272],学习一个 MLP 函数,将一个较小的矩阵映射到前缀的参数矩阵,而不是直接优化前缀。事实证明,这种技巧对于稳定训练很有用。优化后,映射函数将被丢弃,只保留派生的前缀向量以增强特定任务的性能。由于只训练前缀参数,因此可以实现参数高效的模型优化。与前缀调优类似,p-tuning v2 [277] 将逐层提示向量合并到专门用于自然语言理解的 Transformer 架构中,该架构还利用多任务学习来联合优化共享提示。事实证明,它有助于提高自然语言理解任务中不同参数尺度的模型性能。

提示调优。与前缀调优不同,提示调优 [273, 278] 主要侧重于在输入层合并可训练的 30 个提示向量。基于离散提示方法 [280, 281],它通过包含一组软提示tokens(自由形式 [278] 或前缀形式 [273])来增强输入文本,然后采用提示增强的输入来解决特定的下游任务。在实现过程中,将特定于任务的提示嵌入与输入文本嵌入相结合,随后将其输入到语言模型中。P-tuning [278] 提出了一种自由形式来组合上下文、提示和目标tokens,可将其应用于自然语言理解和生成的体系结构。进一步通过双向 LSTM 学习软提示tokens的表示。另一种代表性方法 [273] 称为提示调优,直接将前缀提示添加到输入中。在训练期间,只会根据特定于任务的监督来学习提示嵌入。由于该方法在输入层仅包含少量可训练参数,因此已发现其性能高度依赖于底层语言模型的模型能力 [273]。

低秩自适应 (LoRA)。LoRA [127] 在每个密集层对近似更新矩阵施加低秩约束,减少可训练参数以适应下游任务。LoRA 的主要优点是它可以大大节省内存和存储使用量(例如 VRAM)。此外,人们只能保留一个大模型副本,同时维护多个特定于任务的低秩分解矩阵以适应不同的下游任务。此外,一些研究还讨论了如何以更具原则性的方式设置秩,例如基于重要性分数的分配 [282] 和无搜索最佳秩选择 [283]。

LLM的参数高效调优

随着 LLM 的兴起,高效调优引起了越来越多的研究关注,旨在为下游任务开发更轻量级的自适应方法。

特别是,LoRA [127] 已广泛应用于开源 LLM(例如 LLaMA 和 BLOOM)进行参数高效微调。在这些研究尝试中,LLaMA 及其变体因参数高效调优而备受关注。例如,Alpaca-LoRA [126] 已使用 LoRA 作为 Alpaca [124](经过微调的 7B LLaMA 模型,具有 52K 人类指令演示)的轻量级调优版本进行训练。对不同语言或模型大小的 Alpaca-LoRA 进行了广泛的探索。最近的一项研究 LLaMA-Adapter [285] 在每个 Transformer 层中插入可学习的提示向量,其中提出了零初始化注意机制,通过减轻欠拟合提示向量的影响来改进训练。他们还将这种方法扩展到多模态设置,例如视觉问答。

此外,一项实证研究 [275] 已开展,检验不同调优方法对语言模型的影响。他们在三个开源 LLM(即 GPT-J (6B)、BLOOM (7.1B) 和 LLaMA (7B))上比较了四种有效的调优方法,包括串行适配器调优 [274]、并行适配器调优 [276, 286] 和 LoRA [127],进行评估。基于在六个数学推理数据集上的实验结果,他们表明这些有效的调优方法在困难任务上的表现不如参考基线 GPT-3.5,但在简单任务上的表现相当。总体而言,LoRA 在这些比较方法中表现相对较好,使用的可训练参数明显较少。

作为一个重要资源,PEFT [287](代表参数高效微调)库已在 GitHub 上发布。它包含了几种广泛使用的高效调优方法,包括 LoRA [127]/AdaLoRA [282]、前缀调优 [272, 277]、P-Tuning [278] 和提示调优 [273]。此外,它支持许多语言模型,如 GPT-2 和 LLaMA,还涵盖了几种代表性的视觉 Transformer 模型(例如 ViT 和 Swin Transformer)。

内存-高效模型适配


由于模型参数数量巨大,LLM 的推理占用大量内存,因此在实际应用中部署成本非常高。一种流行的模型压缩方法(即模型量化)可减少 LLM 的内存占用,以便在资源有限的环境中使用大型 LLM,这也可能减少推理延迟。

量化背景

在神经网络压缩中,量化通常指从浮点数到整数的映射过程 [288],尤其是 8 位整数量化(即 INT8 量化)。对于神经网络模型,通常有两种数据需要量化,即权重(模型参数)和激活(隐藏激活),它们最初以浮点数表示。

LLM 的量化方法

通常有两种主要的模型量化方法,即量化觉察训练 (QAT)(需要额外的全模型再训练)和训练后量化 (PTQ)(不需要模型再训练)。与小型语言模型相比,在设计或选择 LLM 的量化方法时需要考虑两个主要区别。首先,LLM 包含大量参数,因此 PTQ 方法更受青睐,因为它的计算成本比 QAT 方法低得多。其次,LLM 表现出非常不同的激活模式(即大的异常特征),量化 LLM 变得更加困难,尤其是隐藏的激活。

训练后量化 (PTQ)。

第一个是混合精度分解。如[289]中观察到的,当模型大小达到6.7B参数或以上时,隐激活中会出现极大的值(称为异常值的出现)。有趣的是,这些异常值主要分布在Transformer层的一些特定特征维度上。基于这一发现,[289]中提出了一种矢量量化方法,称为LLM.int8(),该方法在矩阵乘法中将具有异常值的特征维度与其余维度分开。然后,分别使用16位浮点数和8位整数对这两部分进行计算,从而以高精度恢复这些异常值。

第二个是细粒度量化。对于Transformer模型,权重和激活通常以张量的形式表示。一种直接的方法是使用粗粒度量化参数来处理整个张量(即每个张量量化)[290]。然而,这通常会导致不准确的重建结果。因此,提出了细粒度的方法来减少量化误差。ZeroQuant [291] 采用带有动态标定的逐token量化方法来压缩激活。而对于权重(更容易量化)用逐组量化。实际上,模型量化通常使用大小为 128 [291, 292] 的组。

第三个是平衡量化难度。考虑到权重比激活更容易量化,SmoothQuant [290] 建议将难度从激活转移到权重。特别地,它们结合了尺度变换来平衡线性层中权重和激活之间的难度。

最后一个是逐层量化。该方法可以找到最小化逐层重建损失的最佳量化权重。为了有效地优化这一目标,GPTQ [293] 通过固定所有行中权重的量化顺序改进了原始的最佳脑量化 (OBQ) [294] 方法。此外,使用专门设计的方法(即惰性的批量更新和 Cholesky 重构),GPTQ 可以以 3 或 4 位精度量化非常大的模型(例如 175B OPT)。

最近,AWQ [292] 通过结合激活-觉察的权重规模化进一步简化了优化形式,这类似于 SmoothQuant [290] 的想法:与异常激活相对应的权重更需要精确量化。它不直接优化重建损失,而是执行简单的超参搜索以实现标定数据上的最小损失。

最近的两项研究,探索用于量化 LLM 的高效微调方法或 QAT 方法。

• 高效微调增强量化。对于训练后量化,直接低位量化(例如,INT4 量化)通常会导致性能大幅下降。为了克服这一挑战,QLoRA [295] 在量化模型中加入了额外的小型可调适配器(16 位精度),实现高效、高精度的模型微调。它结合了 LoRA和量化方法的优点。实验结果表明,4 位量化模型可以通过 QLoRA 实现完整的 16 位微调性能。

• LLM 的量化-觉察训练 (QAT)。最近的一项研究 [296] 通过应用无数据的蒸馏方法来压缩权重、激活以及K-V缓存,探索了 QAT 方法的效果。基于 LLaMA 进行大量实验,他们展示了 4 位量化对权重和K-V缓存的良好结果,但 4 位激活量化则不然,这仍然需要进一步探索。

实证分析和发现

量化目前已成为减少部署中 LLM 的内存占用和延迟的常用技术。特别是,重要的是要了解可以应用什么级别的精度(例如 INT8 或 INT4)来量化 LLM 的不同部分(例如权重或激活),同时保持高精度。

最近,对多种因素(例如模型大小和敏感度)对训练后量化方法的影响进行了非常全面的评估 [297]。另一项研究 [298] 研究了 k-位量化在推理性能中的规模化规律。此外,之前的研究(例如 LLM.int8() [299]、GPTQ [293]、QLoRA [295] 和 GLM [83])也广泛研究了量化方法在各种设置下的性能。

• INT8 权重量化通常可以在 LLM 上产生非常好的结果,而低精度的权重量化性能取决于具体方法 [290、292、293、297]。在大多数情况下,可以有效地应用 INT8 权重量化来减少内存占用,而不会降低性能。而对于 INT4(或 INT3)权重量化,现有方法依靠特定策略来减少性能下降,例如逐层方法 [291, 293]、激活-觉察规模化 [292] 和低秩适配器调优 [295]。有趣的是,LLM 似乎对低位权重量化的敏感度低于小规模语言模型 [297]。实践中,在内存成本相同的情况下,建议使用量化精度较低的较大语言模型,而不是量化精度较高的较小语言模型。例如,4 位 60GB LLM 被证明比 8 位 30GB LLM 具有更好的性能 [298]。

• 激活比权重更难量化 [289, 290, 297]。研究发现,当 Transformer 语言模型的大小为 6.7B 或以上时,会出现较大的异常值 [289]。这个问题一直是量化 LLM 最根本的困难之一。为了解决这个问题,可以采用各种方法来减轻异常值的影响,例如混合精度分解 [289]、细粒度量化 [289, 300] 和难度迁移 [290]。由于较大的异常值主要存在于 LLM 的激活中,因此小型语言模型对激活量化的抵抗力更强 [297]。在实践中,高质量的 INT8 激活量化仍然是一项艰巨的任务,尽管有几种方法可以取得令人满意的结果。此外,即使对于 QAT 方法 [296],较低精度的激活量化仍未成功探索。

• 高效微调增强量化是提高量化 LLM 性能的一个很好的选择 [127, 295]。量化中高效微调方法的好处是双重的。首先,它可以通过更新高精度适配器来增加拟合度,直接补偿低位量化造成的性能下降 [297]。其次,它可以灵活地以轻量级方式支持特定任务或特定目标的 LLM 微调 [295],例如,指令调优或面向聊天的调优,只需调优小适配器即可。总的来说,它在有效性和训练成本之间取得了很好的平衡,为提高量化 LLM 的性能提供了一种有前途的方法。

开源库和量化LLM

有三个主要的LLM量化库,包括:

• Bitsandbytes基于LLM.int8() [289]和8位优化器[301]论文中介绍的方法开发。它专注于LLM的INT8量化,主要提供对8位矩阵乘法和8位优化器的支持。

• GPTQ-for-LLaMA是专门为量化LLaMA模型而开发的。它基于GPTQ算法[293]实现了不同大小的LLaMA模型4位量化。和与bitsandbytes在内存和性能(PPL)方面做了比较。

• AutoGPTQ是一个基于GPTQ算法[293]开发的量化包,支持LLM的INT4量化。该库中包含许多量化模型,并通过与 HuggingFace PEFT 库集成来支持 LoRA。

• llama.cpp使得在 MacBook 设备上运行量化的 LLaMA 模型成为可能。它支持 INT4、INT5 和 INT8 量化,采用高效的 C/C++ 实现开发。它还支持许多基于 LLaMA 的模型,例如 Alpaca 和 Vicuna。

与原始模型相比,量化LLM占用的内存更小,并且推理速度可能更快 [83, 289, 302]。最近,HuggingFace 上发布了几个公开可用语言模型大量量化的模型副本,包括 BLOOM、GPT-J 和 ChatGLM。特别是,GPTQ [293] 已被广泛用于量化生成语言模型,从而产生了 LLaMA 和 OPT 的各种量化变体。此外,它还被应用于量化指令调优模型,例如 Vicuna 和 WizardLM。

待续。。。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

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

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

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

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

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

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

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

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

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

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

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

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

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值