大语言模型(LLM)综述(四):如何适应预训练后的大语言模型

A Survey of Large Language Models

  • 前言
  • 5. ADAPTATION OF LLMS
    • 5.1 指导调优
      • 5.1.1 格式化实例构建
      • 5.1.2 指导调优策略
      • 5.1.3 指导调优的效果
      • 5.1.4 指导调优的实证分析
    • 5.2 对齐调优
      • 5.2.1 Alignment的背景和标准
      • 5.2.2 收集人类反馈
      • 5.2.3 根据人类反馈进行强化学习
      • 5.2.4 无需 RLHF 的对齐
      • 5.2.5 对于SFT和RLHF的评论
    • 5.3 参数高效的模型适应
      • 5.3.1 参数高效的微调方法
      • 5.3.2 LLM的参数高效微调
    • 5.4 内存高效的模型适应
      • 5.4.1 量化的背景
      • 5.4.2 LLM的量化方法
      • 5.4.3 实证分析与发现
      • 5.4.4 开源库和量化的LLMs

前言

随着人工智能和机器学习领域的迅速发展,语言模型已经从简单的词袋模型(Bag-of-Words)和N-gram模型演变为更为复杂和强大的神经网络模型。在这一进程中,大型语言模型(LLM)尤为引人注目,它们不仅在自然语言处理(NLP)任务中表现出色,而且在各种跨领域应用中也展示了惊人的潜力。从生成文本和对话系统到更为复杂的任务,如文本摘要、机器翻译和情感分析,LLM正在逐渐改变我们与数字世界的互动方式。

然而,随着模型规模的增加,也出现了一系列挑战和问题,包括但不限于计算复杂性、数据偏见以及模型可解释性。因此,对这些模型进行全面而深入的了解变得至关重要。

本博客旨在提供一个全面的大型语言模型综述,探讨其工作原理、应用范围、优点与局限,以及未来的发展趋势。无论您是该领域的研究者、开发者,还是对人工智能有广泛兴趣的读者,这篇综述都将为您提供宝贵的洞见。

本系列文章内容大部分来自论文《A Survey of Large Language Models》,旨在使读者对大模型系列有一个比较程序化的认识。

论文地址:https://arxiv.org/abs/2303.18223

大型语言模型(LLMs)的适应是指对这些模型进行微调或修改,以执行特定任务或适应特定领域的过程。LLMs,如GPT-3或类似的模型,通常在大型文本语料库上进行预训练,然后可以进一步用于各种自然语言处理任务的适应。

5. ADAPTATION OF LLMS

在预训练之后,语言模型(LLMs)可以获得解决各种任务的一般能力。然而,越来越多的研究表明,LLMs的能力可以根据具体目标进一步适应。在本节中,我们介绍了适应预训练LLMs的两种主要方法,即指导调优和对齐调优。前一种方法主要旨在增强(或解锁)LLMs的能力,而后一种方法旨在将LLMs的行为与人类价值观或偏好对齐。此外,我们还将讨论在资源有限的情况下用于模型适应的高效调优和量化方法。接下来,我们将详细介绍这四个部分。

5.1 指导调优

实质上,指导调优是对预训练LLMs进行微调的方法,使用自然语言形式的一组格式化实例 [62],这与监督微调 [61] 和多任务提示训练 [28] 高度相关。为了执行指导调优,我们首先需要收集或构建指导格式化的实例。然后,我们使用这些格式化的实例以监督学习的方式对LLMs进行微调(例如,使用序列到序列的损失进行训练)。经过指导调优后,LLMs可以展示出在未见过的任务上具有卓越的泛化能力 [28, 62, 64],甚至在多语言环境中也能如此 [85]。

一份最近的调查报告[272]提供了对指导调优研究的系统概述。与此相比,我们主要关注指导调优对LLMs的影响,并提供了详细的实例收集和调优指南或策略。此外,我们还讨论了使用指导调优来满足用户的实际需求,这在现有的LLMs中广泛应用,例如InstructGPT [61] 和 GPT-4 [46]。

5.1.1 格式化实例构建

一般来说,指导格式化实例包括任务描述(称为指导)、可选的输入、相应的输出以及少量示范(可选)。作为重要的公共资源,现有研究已发布了大量以自然语言格式化的标记数据(请参阅表6中可用资源的列表)。接下来,我们将介绍构建格式化实例的三种主要方法(请参见图9中的示例),然后讨论实例构建的若干关键因素。

image-20231026163824713

表 6:可用于指令调整的集合的详细列表。

image-20231026164007845

图 9:实例格式化和构造指令格式化实例的三种不同方法的图示。

格式化任务数据集

在提出指导调优之前,一些早期的研究[266, 273, 274]从各种各样的任务中收集了实例(例如,文本摘要、文本分类和翻译),以创建监督多任务训练数据集。作为指导调优实例的主要来源,将这些多任务训练数据集用自然语言任务描述格式化非常方便。具体来说,最近的工作[28, 61, 62, 79]使用人工编写的任务描述来扩充标记数据集,这些描述指导LLMs通过解释任务目标来理解任务。例如,在图9(a)中,对于每个问题回答任务的示例,都添加了任务描述“请回答这个问题”。经过指导调优后,LLMs可以通过遵循它们的任务描述很好地推广到其他未见过的任务[28, 62, 64]。特别是已经显示,对于LLMs的任务泛化能力来说,指导是关键因素[62]:通过在去除任务描述的标记数据集上对模型进行微调,会导致模型性能大幅下降。为了更好地为指导调优生成标记实例,提出了一种 PromptSource [265],用于有效创建、共享和验证不同数据集的任务描述。为了丰富训练实例,一些研究[28, 266, 275]还尝试使用专门设计的任务描述来反转现有实例的输入-输出对,以用于指导调优。例如,给定一个问题-答案对,我们可以通过预测以答案为条件的问题(例如,“请根据答案生成一个问题”)来创建一个新的实例。

格式化日常聊天数据

尽管已经有大量的训练实例经过指导格式化,但它们主要来自公共NLP数据集,要么缺乏指导多样性,要么与真实人类需求不匹配[61]。为了解决这个问题,InstructGPT [61] 提出将用户提交给OpenAI API的查询作为任务描述。用户查询以自然语言表达,特别适合引发LLMs的指导遵循能力。此外,为了丰富任务多样性,还要求人类标注者为真实生活任务撰写指导,包括开放式生成、开放问题回答、头脑风暴和聊天。然后,他们让另一组标注者直接回答这些指导。最后,他们将一个指导(即收集的用户查询)与期望的输出(即人工编写的答案)配对成为一个训练实例。需要注意的是,InstructGPT还使用这些以自然语言格式化的真实世界任务进行了对齐调优(在第5.2节中讨论)。此外,GPT-4 [46] 设计了潜在高风险的指导,并通过监督微调引导模型拒绝这些指导,出于安全考虑。最近,研究人员还收集用户的聊天请求作为输入数据,并使用ChatGPT或GPT-4来作为输出数据响应这些请求。其中一个代表性的数据集是来自ShareGPT的对话数据。

格式化合成数据

为了减轻人工标注或手动收集的负担,已经提出了一些半自动化方法 [129] 通过将现有实例输入到LLMs中来合成各种任务描述和实例。如图9©所示,Self-Instruct方法只需要大约100个实例作为初始任务池。然后,他们从池中随机选择几个实例作为示范,并提示LLMs生成新的指导和相应的输入-输出对。经过质量和多样性过滤后,新生成的实例将被添加到任务池中。因此,合成方法是生成大规模LLMs指导数据的有效和经济的方式。

实例构建的关键因素。指导实例的质量对模型的性能有重要影响。在这里,我们讨论一些实例构建的基本因素。

• 扩展指导。已经广泛证明,扩展任务数量可以大大增强LLMs的泛化能力[28, 62, 79]。随着任务数量的增加,模型性能最初呈现出连续增长的趋势,但当达到一定水平时,收益变得微不足道[64, 79]。一个合理的推测是,一定数量的代表性任务可以提供相对充足的知识,而添加更多任务可能不会带来额外的收益[64]。此外,从多个方面增强任务描述的多样性,如长度、结构和创造性,也是有益的[28]。至于每个任务的实例数量,已经发现一小部分实例通常可以饱和模型的泛化性能[62, 64]。然而,将某些任务的实例数量增加到较大数量(例如几百个)可能会导致过拟合问题,并影响模型性能[79, 276]。

• 格式化设计。作为一个重要因素,自然语言格式的设计也极大影响了LLMs的泛化性能[79]。通常情况下,我们可以在现有数据集的输入-输出对中添加任务描述和可选示范,其中任务描述是LLMs理解任务最关键的部分[79]。此外,使用适当数量的示范作为演示也可以带来显著的改进[64],这也减轻了模型对指导工程的敏感性[62, 64]。然而,将其他组成部分(例如要避免的事情、原因和建议)纳入指导可能对LLMs的性能影响微乎其微,甚至产生负面影响[79, 264]。最近,为了引发LLMs的逐步推理能力,一些工作[64]提出在某些推理数据集中(如算术推理)包括思维链(CoT)示例。已经显示,使用CoT和非CoT示例对LLMs进行微调可以在各种推理任务中取得良好的性能,包括需要多跳推理能力的任务(例如常识问题回答和算术推理)以及不需要这种推理方式的任务(例如情感分析和提取式问题回答)[64, 86]。

总结一下,多样性和指导的质量似乎比实例数量更重要[277],因为表现良好的InstructGPT [61] 和 Alpaca [128] 使用的指导(或实例)数量较少,但更多样化,而不像Flan系列LLMs [62, 64] 那样多。此外,邀请标注者撰写满足人类需求的任务比使用特定数据集的任务更有用。然而,目前仍缺乏关于注释人类需求实例的通用指导方针,使任务构建在某种程度上成为一种启发式方法。为了减少人力工作,我们可以重复使用现有的格式化数据集(表6),或者使用现有的LLMs自动构建指导[129]。我们在第5.1.4节中进行了初步实验,以展示不同构建方法的有效性。

5.1.2 指导调优策略

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

平衡数据分布

由于指导调优涉及多种不同的任务混合在一起,因此在微调期间平衡不同任务的比例非常重要。一个广泛使用的方法是示例比例混合策略 [73],即将所有数据集合并,从混合数据集中均匀抽样每个实例。此外,根据最近的研究发现[64, 86],增加高质量数据集(例如FLAN [62] 和P3 [265])的采样比例通常可以提高性能。此外,在指导调优期间通常设置一个最大限制,以控制数据集在其中包含的示例的最大数量 [73],这是为了防止更大的数据集压倒整个分布[73, 86]。在实践中,根据不同的数据集,最大限制通常设置为几千或几万个示例。

结合指导调优和预训练

为了使调优过程更加有效和稳定,OPT-IML [86] 在指导调优过程中加入了预训练数据,这可以看作是对模型调优的正则化。此外,一些研究尝试使用多任务学习,而不是使用独立的两阶段过程(预训练然后指导调优),从头开始训练模型,使用预训练数据(即纯文本)和指导调优数据(即格式化数据集)的混合数据 [73]。具体来说,GLM-130B [84] 和Galactica [35] 将指导格式化的数据集集成为预训练语料库的一小部分,用于预训练LLMs,从而可能同时实现预训练和指导调优的优势。

多阶段指导调优

对于指导调优,有两种重要的指导数据,即任务格式化指导和日常聊天指导。一般来说,前者的数量明显大于后者。在两种指导数据的训练中保持平衡非常重要。除了仔细混合不同的指导数据之外,我们还可以采用多阶段指导调优策略,其中LLMs首先使用大规模任务格式化指导进行微调,然后再对日常聊天指导进行微调。为了避免容量遗忘问题,在第二阶段添加一定数量的任务格式化指导也是有用的。实际上,这种多阶段调优策略也可以应用于指导调优的其他设置。例如,我们可以安排不同的微调阶段,逐渐增加难度和复杂性的水平,并逐渐提高LLMs遵循复杂指导的能力。

其他实用技巧

在实践中,还有一些有用的策略和技巧可以帮助提高LLMs的微调性能。我们列举一些代表性的如下:

• 高效训练多轮聊天数据。对于多轮聊天示例(用户和聊天机器人之间的对话),一个直接的微调方法是将其分割成多个上下文-响应对进行训练:LLMs被微调以根据对应的上下文生成响应,对于从用户每一轮发出的言辞都要进行微调。在这种微调方式中,显然在对话中的分割示例中存在重叠的言辞。为了节省训练成本,Vicuna [124] 采用了一种高效的方式,将整个对话提供给LLMs,但依赖于一个只在训练时计算聊天机器人响应的损失掩码。这可以显著减少由重叠言辞引起的计算成本。

• 使用LLMs过滤低质量指导。在指导数据收集之后,通常会包含低质量的指导,这可能降低模型性能并增加训练成本。为了解决这个问题,现有的工作[278] 通常使用强大的LLMs(例如ChatGPT和GPT-4)来注释一部分指导。它利用了诸如“确定其对于一个目标是学习世界知识的学生的教育价值”之类的提示来指导LLMs注释指导的质量,例如高、中和低。然后,这些LLMs注释的指导将用于训练一个分类器,以预测所有其余指导的质量,并最终过滤掉被预测为低质量的指导。

• 建立LLMs的自我识别。为了将LLMs部署到实际应用中,有必要建立其身份,并使LLMs意识到这些身份信息,例如名称、开发者和隶属关系。一个实际的方法是为微调LLMs创建与身份相关的指导。还可以在输入中加入自我识别提示,例如:“以下是一个人类和由开发者开发的名为CHATBOTNAME的AI助手之间的对话。”,其中CHATBOTNAME和DEVELOPER分别指代聊天机器人的名称和开发者。

除了上述的实用策略和技巧之外,现有的工作还使用了其他技巧,例如将多个示例连接成单个序列以接近最大长度[279],使用推理损失来评估指导的质量[280],以及将指导重写为更复杂的指导[281]。

image-20231026170955133

表 7:所需 GPU 数量、调优时间、每个设备的批量大小(表示为 BS)(完全调优和 LoRA 调优)以及推理率(每秒生成的Token数量)的基本统计数据。我们的实验是在两台 Linux 服务器上进行的,两台 Linux 服务器分别具有 8 个 A800-80G SXM4 GPU、6 个 NVSwitch 和 8 个 3090-24G GPU。 A800 和 A100 之间的主要区别在于 NVLink 互连速度。因此,我们对 A100 的训练和推理效率的估计将略有提高,而其余内存消耗将保持不变。完整的调优实验是使用数据并行训练、ZeRO Stage 3、BF16 和梯度检查点进行的。此外,LoRA 调整可以在一个 80G GPU 上使用 INT8 量化执行,等级设置设置为 16。两种训练设置的最大序列长度设置为 512。推理实验在批量大小设置为 1 的情况下执行。

5.1.3 指导调优的效果

在这一部分中,我们从三个主要方面讨论指导调优对LLM的影响。

性能改进

尽管指导调优是在适度数量的实例上进行微调,但它已经成为提高或解锁LLMs能力的重要方式[64]。最近的研究在多个规模的语言模型上进行了实验(从77M到540B不等),显示不同规模的模型都可以从指导调优中受益[64, 275],随着参数规模的增加,性能也得到了提高[85]。此外,经过指导调优的较小模型甚至可以比未经微调的较大模型表现更好[28, 64]。除了模型规模,指导调优在各种模型架构、预训练目标和模型适应方法中都表现出一致的改进[64]。在实践中,指导调优提供了一种通用方法,可以增强现有语言模型(包括小型PLMs)的能力[64]。此外,与预训练相比,指导调优成本要低得多,因为LLMs所需的指导数据数量明显小于预训练数据。

任务泛化

指导调优鼓励模型理解任务完成的自然语言指导。它赋予LLMs能够遵循人类指令[31]执行特定任务的能力,即使没有示范,甚至在未知任务上[64]。大量研究已经确认指导调优的有效性,可以在已知和未知任务上实现更好的性能[86, 275]。此外,已经显示指导调优对缓解LLMs的一些弱点(例如重复生成或补充输入而不完成某个任务)是有用的[61, 64],从而提高了LLMs解决真实任务的能力。此外,使用指导调优训练的LLMs可以泛化到跨语言的相关任务。例如,BLOOMZ-P3 [85] 基于BLOOM [69] 使用仅包含英文任务的P3 [265] 进行微调。有趣的是,与BLOOM相比,BLOOMZ-P3在多语言句子完成任务中取得了50%以上的提高,这表明指导调优可以帮助LLMs从仅包含英文的数据集中获得一般任务技能,并将这些技能转移到其他语言[85]。此外,已经发现使用仅包含英文指导可以在多语言任务上产生满意的结果[85],这有助于减少特定语言的指导工程的工作量。

领域专业化

现有的LLMs在传统的自然语言处理任务(例如生成和推理)和日常问题上展示出卓越的能力。但是,它们可能仍然缺乏完成特定任务(如医学、法律和金融)所需的领域知识(详见第9节,讨论了不同应用中的LLMs)。指导调优是将现有的通用LLMs调整为特定领域专家的有效方法。例如,研究人员提出使用医学数据对Flan-PaLM [64] 进行微调,创建了Med-PaLM [282],一款医学知识助手,其性能水平可与专业临床医生相媲美。此外,最近的研究[283] 对FLAN-T5进行微调,以支持自然语言指导的电子商务推荐系统,在各种推荐任务中表现出强大的性能。还有一些基于LLaMA [57] 的开源医学模型进行了指导调优,如BenTsao [284]。此外,研究人员还探索了在法律[285]、金

5.1.4 指导调优的实证分析

使用不同类型的指导集来微调LLMs往往会导致在下游任务上性能不同的模型变种。在本节中,我们将探讨不同类型指导在微调LLMs(即LLaMA(7B)和LLaMA(13B))时的影响,以及检查一些指导改进策略的有效性。

指导数据集

根据第5.1.1节的讨论,我们主要考虑以下三种常见类型的指导:

• 任务特定指导。对于第一种类型的指导,我们采用最常用的多任务指导数据集,FLAN-T5 [64],它包含1,836个任务和超过15M条指导,通过合并来自先前工作的四个数据混合而成。

• 每日聊天指导。这种类型的指导是用户关于日常生活的对话,更与实际场景相关。我们采用了ShareGPT指导集,其中包含63K条真实用户指导。它已被用作Vicuna的核心指导。

• 合成指导。除了重用现有指导,我们还可以使用LLMs自动合成大量指导。我们采用了流行的合成指导数据集Self-Instruct-52K [129],其中包含52K条指导,配对约82K个实例输入和输出。这些生成的指导具有与人类编写的种子任务(例如语法检查、头脑风暴)相似的数据分布。

由于原始的FLAN-T5数据集非常庞大(即超过15M),我们从中随机抽取了80,000条指导,以便与其他指导数据集(即ShareGPT和Self-Instruct-52K)进行公平比较,这些数据集具有类似的规模。在我们的实验中,我们对每个单独的指导集进行测试,以探讨它们各自的影响,同时还检查它们对模型性能的组合影响。

改进策略

尽管来自人类用户的真实世界指导更适合用于微调LLMs,但大规模收集它们很困难。作为人工生成指导的替代方法,大多数现有研究主要采用LLMs生成的合成指导。然而,合成指导存在一些潜在问题,例如主题多样性不足和指导难度不均匀(要么太简单,要么太难)。因此,有必要提高合成指导的质量。接下来,我们总结了现有研究中广泛使用的四种主要改进策略如下:

• 提高指导复杂性。正如现有工作所讨论的[281],提高指导的复杂性可以提高LLMs模型在遵循复杂指导方面的能力,例如包含更多任务要求或需要更多推理步骤。为了验证这一策略,我们遵循WizardLM [281],逐渐提高复杂性水平,例如添加约束、增加推理步骤和复杂化输入。我们利用公开发布的WizardLM-70K指导作为复杂性增强指导数据集,该数据集是通过以上增强方法基于Self-Instruct52K数据集[281]生成的。

• 增加主题多样性。除了复杂性,提高指导数据集的主题多样性可以帮助激发LLMs在真实世界各种任务上的不同能力[288]。然而,直接控制生成多样指导的自我指导过程很困难。与YuLan-Chat [289]一样,我们使用ChatGPT重新编写Self-Instruct-52K数据集中的指导,通过特定提示将它们适应为293个主题。最终,我们获得了70K个指导,作为增加多样性的数据集。

• 扩大指导数量。除了上述方面,指导数量也是可能影响模型性能的重要因素。特别是,使用更多的指导可以扩展任务知识,提高LLMs的指导遵循能力[64]。为了检查这一策略,我们从MOSS项目发布的合成指导集中抽样新的指导,因为它们也是使用相同的自我指导方法[129]合成的。我们将它们与Self-Instruct52K数据集混合,组成一个包含220K个指导的更大数据集。

• 平衡指导难度。由于合成指导往往包含过于简单或过于困难的指导,可能导致LLMs的训练不稳定甚至过拟合。为了探索潜在的影响,我们利用LLMs的困惑度分数来估算指导的难度,并删除过于简单或过于困难的指导。为了进行公平比较,我们采用LLaMA(7B)模型来计算来自大型指导数据集的220K个指导的困惑度分数,然后保留70K个具有中等困惑度分数的指导,作为平衡难度的数据集。

实验设置

为了进行关于指导数据影响的实验,我们使用了这些新的指导数据集来微调LLaMA,这是一个广泛用于指导微调的热门LLM基础架构。我们使用了YuLan-Chat [289]的代码进行实验,并在具有8个A80080G GPU的服务器上训练LLaMA(7B)和LLaMA(13B)。所有超参数设置与Stanford Alpaca保持相同。为了更好地评估经过微调模型的指导遵循能力,我们考虑了两种设置,即聊天设置和问答设置。聊天设置主要利用来自日常聊天的用户指导和查询,而问答设置主要利用现有NLP数据集中的问答示例。对于聊天设置的评估是基于AlpacaFarm评估集[290]进行的。我们选择了LLaMA(7B)和LLaMA(13B)模型,它们在Self-Instruct-52K上进行了微调,作为参考基线,然后分别将它们与使用不同指导进行微调的其他LLaMA(7B)和LLaMA(13B)模型进行比较。由于我们的重点是检查生成指导的不同策略的实用性,微调在Self-Instruct-52K上的模型可以作为一个很好的参考。按照AlpacaFarm [290]的方法,对于每个比较,我们使用ChatGPT自动注释每次两个比较模型中哪一个对于用户查询的响应最佳,并报告胜率(%)作为评估指标。对于问答设置,我们选择了两个基准,MMLU [291]和BBH3k(由YuLan-Chat发布的BBH基准的子集),并根据它们的默认设置使用启发式规则解析这些LLMs的答案来评估准确性。

对于指导微调和评估,我们采用以下提示:“The following is a conversation between a human and an AI assistant. The AI assistant gives helpful, detailed, and polite answers to the user’s questions.\n [|Human|]:{input}\n[|AI|]:”。为了重现我们的结果,我们在以下链接发布了代码和数据:https://github.com/RUCAIBox/LLMSurvey/tree/main/Experiments。

结果与分析

基于7B和13B LLaMA的不同指令数据集的结果如表8所示。接下来,我们详细总结和分析了我们的发现。

image-20231026172218288

表8:基于LLaMA(7B)和LLaMA(13B)模型在聊天和问答环境下的指令调整实验结果(均为单轮对话)。我们在Self-Instruct-52K数据集上采用了四种指令改进策略,即提高复杂性(w/ complexity)、增加多样性(w/ diversity)、平衡困难度(w/ difficulty)和扩展指令数量(w/ scaling)。∗由于我们选择了在Self-Instruct-52K上微调的LLaMA(7B)/(13B)模型作为基线,我们省略了与自身微调的Self-Instruct-52K模型的胜率。

• 任务格式化的指令更适用于问答环境,但对于聊天环境可能不太有用。通过比较使用FLAN-T5进行指令调整与ShareGPT和Self-Instruct-52K进行指令调整的性能,我们可以观察到FLAN-T5在问答基准上表现更好,但在聊天环境中不如ShareGPT。原因是FLAN-T5由来自现有自然语言处理任务(例如翻译和阅读理解)的指令和示例混合组成。因此,LLaMA经过FLAN-T5的微调在问答任务上表现更好,但在用户查询方面表现不佳。相比之下,ShareGPT由真实的人类-ChatGPT对话组成,能够更好地引导LLaMA遵循用户在日常生活中的指令,但可能不适用于完成问答任务。

• 不同类型指令的混合有助于提高LLM(语言模型)的综合能力。在对微调进行三种类型指令混合后,我们可以看到由此衍生的LLaMA变体(包括FLAN-T5、ShareGPT和Self-Instruct-52K)在两种任务环境中表现良好。在MMLU中,LLaMA(7B)的性能可以远远超过使用单独指令集的性能,例如,43.69 vs. 38.58(FLAN-T5)。这表明混合多个来源的指令数据集有助于提高指令调整LLM的性能,这增加了指令数量和多样性。

• 提高指令的复杂性和多样性可以提高模型性能。通过分别增加Self-Instruct-52K数据集的复杂性和多样性,LLaMA的聊天和问答性能可以持续改善,例如,LLaMA(7B)在MMLU中从37.52提高到39.73。这表明这两种策略都有助于提高LLM的指令遵循能力。此外,我们可以看到提高复杂性对问答任务的性能改善更大。原因是问答任务主要包含用于评估LLM的困难问题,而已经在微调阶段学习了复杂指令的LLM可以更好地解决这些问题。

• 简单地增加指令数量可能并不那么有用,平衡困难度也不一定有帮助。如表8所示的结果表明,在我们的实验中,平衡困难度和增加微调指令数量并不是非常有帮助的。特别是对于扩展指令数量,它甚至会损害性能,例如,LLaMA(7B)在BBH3k中从29.81下降到26.63。这表明简单地扩展合成指令数量而不进行质量控制可能不是提高性能的有效方法。此外,使用中等难度的指令进行微调在聊天环境中表现良好,但在问答环境中略微降低性能。可能的原因是我们使用大的困惑度分数来过滤复杂和难的指令,这会损害模型在回答复杂问题方面的性能。

• 更大的模型规模导致更好的指令遵循性能。通过比较使用相同指令数据集对LLaMA(7B)和LLaMA(13B)模型进行微调后的性能,我们可以看到LLaMA(13B)通常表现更好。这表明扩展模型规模有助于提高指令遵循能力。此外,我们可以看到问答性能得到了很大的改善,例如,在MMLU中从38.11提高到47.49。这可能是因为较大的模型通常具有更好的知识利用和推理能力,能够更准确地回答更复杂的问题。

指导调优建议

要对LLM(语言模型)进行指令调整,可以根据表7中所提供的有关所需GPU数量和调整时间的基本统计信息来准备计算资源。在设置开发环境之后,我们建议初学者按照Alpaca存储库中的指令调整代码进行操作。随后,用户应该选择基础模型并按照本节中讨论的方式构建指令数据集。当训练的计算资源受限时,用户可以使用LoRA进行参数高效的调整(请参阅第5.3节)。至于推理阶段,用户可以进一步使用量化方法将LLM部署在较少或较小的GPU上(请参阅第5.4节)。

5.2 对齐调优

这部分首先介绍了与对齐相关的背景,包括其定义和标准,然后重点讨论了为了对齐LLM(语言模型)而收集人类反馈数据的过程,最后讨论了通过人类反馈进行强化学习(Reinforcement Learning from Human Feedback,RLHF)的关键技术,用于对齐调整。

5.2.1 Alignment的背景和标准

背景

LLM(语言模型)在各种自然语言处理任务中展现出了显著的能力[55, 56, 62, 81]。然而,这些模型有时可能会表现出意外的行为,例如,制造虚假信息、追求不准确的目标,以及产生有害、误导和带有偏见的表达[61, 293]。对于LLM来说,语言建模的目标是通过单词预测来预训练模型参数,但缺乏考虑人类价值观或偏好。为了避免这些意外行为,人类对齐已被提出,以使LLM按照人类期望行事[61, 294]。然而,与原始的预训练和适应性调整(例如指令调整)不同,这种对齐需要考虑非常不同的标准(例如,帮助性、诚实性和无害性)。研究已经表明,对齐可能在一定程度上损害了LLM的通用能力,这在相关文献中被称为“对齐税”[295]。

对齐标准

最近,越来越多的关注点集中在开发多样化的标准来规范LLM(语言模型)的行为。在这里,我们以三个代表性的对齐标准(即帮助性、诚实性和无害性)作为例子进行讨论,这些标准已广泛采用于现有文献中[61, 295]。此外,还有其他来自不同角度的LLM对齐标准,包括行为、意图、激励和内在方面[293],它们本质上与上述三个标准相似(或至少具有相似的对齐技术)。根据特定需求修改这三个标准也是可行的,例如,将诚实性替换为正确性[103]。接下来,我们对这三个代表性的对齐标准进行简要解释:

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

• 诚实性。在基本水平上,对齐为诚实的LLM应该向用户呈现准确的内容,而不是虚构信息。此外,对于LLM来说,向输出中传达适当的不确定度程度非常重要,以避免任何形式的欺骗或信息歪曲。这要求模型了解自己的能力和知识水平(例如,“知道自己不知道的”)。根据[295]的讨论,诚实性是一个相对较客观的标准,因此诚实性的对齐可能可以在更少依赖人力努力的情况下开发。

• 无害性。为了做到无害,模型产生的语言不应该具有冒犯性或歧视性。在其能力范围内,模型应该能够检测到旨在恶意请求的隐秘行为。理想情况下,当模型被诱导执行危险行为(例如,犯罪行为)时,LLM应该礼貌地拒绝。然而,什么行为被视为有害,以及在何种程度上视为有害,高度取决于使用LLM的个体或社会[295],还取决于谁在使用LLM,提出问题的类型以及LLM的使用环境(例如,时间)。

正如我们所看到的,这些标准相当主观,并基于人类认知进行开发。因此,很难直接将它们制定为LLM的优化目标。在现有工作中,在对齐LLM时有许多实现这些标准的方法。一种有前途的技术是红队测试[296],它涉及使用手动或自动化手段以对抗性方式探测LLM以生成有害的输出,然后更新LLM以防止这种输出。

5.2.2 收集人类反馈

在预训练阶段,LLM(语言模型)是在大规模语料库上使用语言建模目标进行训练的。然而,它无法考虑到人类对LLM输出的主观和定性评估(在本次调查中称为人类反馈)。高质量的人类反馈对于将LLM与人类偏好和价值观对齐非常重要。在这部分中,我们将讨论如何选择一组人类标注员进行反馈数据收集。

人类标注员的选择

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

人类反馈收集

在现有工作中,主要有三种方法来从人类标注员那里收集反馈和偏好数据。

• 基于排名的方法。在早期的工作中[294],人类标注员通常以粗略的方式评估模型生成的输出(即只选择最佳的),而不考虑更精细的对齐标准。然而,不同的标注员可能对最佳候选输出的选择持不同意见,而且这种方法忽视了未被选择的样本,可能导致不准确或不完整的人类反馈。为了解决这个问题,后续研究[103]引入了Elo评分系统,通过比较候选输出来得出偏好排名。输出的排名作为训练信号,引导模型更喜欢某些输出而不是其他输出,从而产生更可靠和更安全的输出。

• 基于问题的方法。此外,人类标注员可以通过回答研究人员设计的特定问题[72]提供更详细的反馈,这些问题涵盖了对LLM的对齐标准以及额外的约束条件。特别地,在WebGPT [72]中,为了帮助模型筛选和利用来自检索文档的相关信息,要求人类标注员回答关于检索文档是否有助于回答给定输入的多个选项问题。

• 基于规则的方法。许多研究还开发了基于规则的方法来提供更详细的人类反馈。以Sparrow [103]为代表,不仅选择标注员认为最好的响应,还使用一系列规则来测试模型生成的响应是否符合帮助性、正确性和无害性等对齐标准。通过这种方式,可以获得两种类型的人类反馈数据:(1)通过比较成对模型生成输出的质量来获得响应偏好反馈,(2)通过收集来自人类标注员的评估(即得分,表示生成的输出在多大程度上违反了规则)来获得规则违反反馈。此外,GPT-4 [46] 利用了一组零样本分类器(基于GPT-4本身)作为基于规则的奖励模型,可以自动确定模型生成的输出是否违反了一组人类编写的规则。

接下来,我们将重点关注一种广泛应用于最近强大的LLM(如ChatGPT)中的知名技术,即从人类反馈中进行强化学习(RLHF)。如下所讨论的,第5.2.1节介绍的对齐标准可以通过从人类反馈中学习LLM对用户查询的响应来实现。

5.2.3 根据人类反馈进行强化学习

要使LLMs与人类价值观保持一致,已经提出了从人类反馈中进行强化学习(RLHF)[70, 294]的方法,该方法旨在使用收集到的人类反馈数据对LLMs进行微调,有助于改善对齐标准(例如,帮助性、诚实性和无害性)。RLHF使用强化学习(RL)算法(例如,Proximal Policy Optimization(PPO)[115])来通过学习奖励模型来调整LLMs以适应人类反馈。这种方法将人类纳入培训过程中,以开发与人类价值观良好一致的LLMs,正如InstructGPT [61]所示。

RLHF系统

RLHF系统主要由三个关键组件组成:待对齐的预训练LM、从人类反馈中学习的奖励模型,以及用于训练LM的RL算法。具体而言,预训练的LM通常是一个生成模型,其参数是使用现有的预训练LM参数初始化的。例如,OpenAI在其第一个流行的RLHF模型InstructGPT [61]中使用了175B GPT-3,而DeepMind在其GopherCite模型[297]中使用了2800亿参数的模型Gopher [59]。此外,奖励模型(RM)提供(学习的)指导信号,反映了人们对LM生成的文本的偏好,通常以标量值的形式表示。奖励模型可以采用两种形式:一个是经过微调的LM,另一个是使用人类偏好数据从头开始训练的LM。现有的工作通常使用具有不同参数规模的奖励模型来对齐LM [61, 297]。例如,OpenAI分别使用6B GPT-3和DeepMind使用7B Gopher作为奖励模型。最后,为了使用奖励模型的信号优化预训练LM,需要为大规模模型调整设计特定的RL算法。具体而言,Proximal Policy Optimization(PPO)[115]是现有工作中广泛使用的RL算法,用于对齐LM [61, 103, 297]。

RLHF 的关键步骤

图 10 说明了 RLHF [61] 的整体三步过程,如下所述。

image-20231026183652993

图 10:RLHF 算法的工作流程。

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

• 奖励模型训练。第二步是使用人类反馈数据训练RM。具体而言,我们使用LM生成一定数量的输出文本,使用采样的提示(可以来自监督数据集或人类生成的提示)作为输入。然后,我们邀请人类标注者对这些配对进行偏好注释。注释过程可以以多种形式进行,常见的方法是通过对生成的候选文本进行排名注释,这可以减少标注者之间的不一致性。然后,RM被训练以预测人类首选输出。在InstructGPT中,标注者对模型生成的输出进行排名,RM(即6B GPT-3)被训练以预测排名。请注意,在最近的工作中[298],对响应配对的偏好注释是由AI代理(通常是对齐的LLM)而不是人类进行的,这被称为“从AI反馈中进行强化学习(RLAIF)”。

• RL微调。在这一步中,将LM的对齐(即微调)形式化为RL问题。在这种情况下,预训练的LM充当策略,接受提示作为输入并返回输出文本,其行动空间是词汇表,状态是当前生成的标记序列,奖励由RM提供。为了避免显著偏离初始(调整前)LM,通常在奖励函数中加入了一个惩罚项。例如,InstructGPT使用PPO算法优化LM以对抗RM。对于每个输入提示,InstructGPT计算了当前LM生成的结果与初始LM之间的KL散度作为惩罚。值得注意的是,第二和最后两个步骤可以迭代多次以更好地对齐LLMs。由于RL算法的不稳定性,最近的工作[299]将RL调整替换为通过重用奖励较高的最佳排名样本进行的另一轮监督微调。

RLHF的实用策略

尽管RLHF有望有效改善LLM与人类的一致性,但研究人员成功实施它实际上具有挑战性。在这一部分中,我们将重点讨论提高RLHF有效性和效率的几种有用策略和技巧。具体来说,我们专注于奖励模型的有效训练,分别是高效和有效的强化学习训练。

• 有效的奖励模型训练。尽管InstructGPT使用了一个小的奖励模型(6B GPT模型),但越来越多的工作[90]表明,使用一个大的奖励模型(例如,等于或大于原始模型大小)通常更有效,因为大型奖励模型通常在判断LLM生成的输出的质量方面表现更好。在LLaMa 2 [90]中,预训练聊天模型检查点用于初始化奖励模型,他们认为这种方法可以通过共享相同的预训练知识来有效减少要对齐的模型与奖励模型之间的信息不匹配。然而,在训练大规模奖励模型时经常会遇到过拟合问题。作为一种简单而有效的解决方案,现有工作[300,301]在人工注释的对齐数据集的输入提示的首选响应上引入了LM损失作为正则化器,这减轻了二元分类任务上奖励模型的过度拟合。此外,由于有多个对齐标准(例如,乐于助人和诚实),通常很难训练出一个能够满足所有对齐标准的单一奖励模型。因此,训练关注不同对齐标准的多个奖励模型[90]是有用的,并通过特殊的组合策略(例如,均值池和加权和)基于它们产生的奖励来计算最终奖励。这种方式可以在多个标准上制定更灵活的规则或标准,例如,放宽对有益性的要求,同时对危害性提出更严格的限制。

• 有效的强化学习训练。由于强化学习训练过程趋于不稳定和超参数敏感,建议在强化学习训练前对语言模型进行良好的监督微调,以达到良好的模型容量。一种常用的方法是在对齐数据集中提示的最佳输出(称为拒绝采样或 N 最佳)上微调 LLM,直到 RL 之前收敛。给定提示,LLM将首先通过采样算法产生N个输出,然后由奖励模型从模型中选择最佳候选者进行学习。在最佳样本上微调LLM直到收敛后,将执行RL过程以进一步提高性能。LLaMA 2 [90] 先后训练了五个版本的 RLHF 模型,其中 LLM 随着奖励模型的改进而逐步改进。这样,收集到的人类偏好数据的提示和标注可以更好地反映当前模型检查点的问题,从而做出特殊调整来解决这些问题。此外,LLaMA 2 还将先前迭代的样本添加到后续迭代中,以缓解迭代优化过程中可能出现的容量回归问题。

•高效的RL训练。由于RL训练需要迭代LLM和奖励模型的推理过程,这将大大增加总内存和计算成本,尤其是对于较大的奖励模型和LLM。作为一个实用技巧,我们可以在单独的服务器上部署奖励模型,并调用相应的API在其自己的服务器上使用LLM。此外,由于RLHF需要LLM生成多个候选输出,因此不需要多次调用样本解码过程,而是更有效地利用波束搜索解码算法31。它只需要执行单程解码即可生成响应,同时这种策略还可以增强生成的响应的多样性

5.2.4 无需 RLHF 的对齐

尽管RLHF在使LLM的行为与人类价值观和偏好保持一致方面取得了巨大成功,但它也存在明显的局限性。首先,RLHF需要同时训练多个LM,包括被对齐的模型、奖励模型和参考模型,这在算法过程中是繁琐的,在实践中是占用内存的。此外,RLHF中常用的PPO算法相当复杂,并且通常对超参数敏感。作为替代方案,越来越多的研究探索直接优化LLM以遵守人类偏好,使用监督微调而不进行强化学习。

概述

非RL对齐方法的基本思想是在高质量对齐数据集上通过监督学习直接微调LLM。它基本上假设响应反馈或避免不安全行为的黄金法则已被注入或包含在专门策划的对齐数据集中,因此LLM可以通过适当的微调策略直接从这些演示数据中学习对齐行为。因此,要实现这种方法,两个关键问题是对齐数据集的构建和微调损失的设计。对于第一个问题,对齐数据集可以由对齐的LLM根据人类编写的安全原则[288]自动构建,或者使用编辑操作[302]完善现有示例。此外,我们还可以重用现有的奖励模型,从现有的人类反馈数据中选择高评价的响应[299]。对于第二个问题,非RL对齐方法主要在高质量对齐数据集上以监督学习方式(与原始指令调整损失相同)微调LLM,同时可以使用辅助学习目标来提高对齐性能,例如排名响应或对比指令-响应对。

对齐数据收集

对齐数据的构建对于有效地将LLM的行为与人类偏好保持一致非常重要。为了收集高质量的对齐数据,一些工作试图重用现有的奖励模型来选择高评级的响应,而另一些工作则探索利用强大的LLM(例如ChatGPT)或构建模拟环境来生成合成对齐示例。接下来,我们将讨论这三条研究方向。

• 基于奖励模型的方法。RLHF奖励模型已经被训练去评估大模型回应的对齐度。利用现有的奖励模型来选择高质量的响应作为后续微调的对齐数据非常简单。基于这一想法,RAFT[299]采用基于人类偏好数据训练的奖励模型来对LLM的反应进行排名,并收集那些具有更高奖励的LLMs进行监督微调。此外,奖励模型还可用于对模型响应进行评分,并将其分配到不同的质量组中。Quark [303] 根据奖励分数将LLM的响应分类为不同的分位数。每个分位数都附有一个特殊的奖励令牌,以表示分位数的奖励水平。以最高奖励代币为条件,LLM随后被提示生成高质量的响应。作为调整LLM的宝贵资源,已经发布了几种奖励模型,包括OpenAssistant的DeBERTabase/large/xxlarge,Fudan的Moss-7B和斯坦福大学的Flan-T5-xl。

• 基于LLM的生成方法。奖励模型有助于从模型响应中选择对齐的数据。然而,训练奖励模型本身需要大量高质量的人工标记数据,这些数据通常价格昂贵且供不应求。此外,尽管现有的奖励模型可以重用,但它们可能无法在另一个单独训练的LLM中准确捕获不对齐行为。因此,一些工作探索了利用强大的LLM自动生成人类对齐的数据。作为一部代表著作,宪法人工智能[298]提出,人类监督来自一套管理人工智能行为的原则(即自然语言指令)。基于这些原则,LLM将批评自己的有害反应,并反复修改为最终一致的反应。类似地,自对齐[288]首先采用自指示[129]来生成专注于涵盖不同主题的指令。然后,还提示模型使用多个人类编写的原则来描述预期模型行为的规则(也有几个上下文示例),以生成有用、合乎道德和可靠的响应作为对齐数据。

• 基于LLM的互动方法。大多数现有方法孤立地训练LLM,其中LLM不存在于实际环境中,以通过外部反馈信号进行自我改进。相比之下,人类从社会环境中与他人的互动中学习社会规范和价值观[304]。为了模仿这种学习方法,Stable Align[305]构建了一个由许多LLM代理组成的模拟交互环境,其中AI代理不断相互交互,接收有关改进的反馈。一旦中央代理收到指令,它就会生成响应并与附近的代理共享。这些评论代理生成反馈,包括有关响应和修订建议的评级。然后,中央代理将根据这些建议修改原始响应。这种对齐方法也可以扩展到与人类的现实世界环境。

监督对齐调整

在获得对准数据后,设计用于直接对齐的合适的微调策略也是关键。一种简单的方法是使用基于比对数据的传统序列间目标来优化LLM。除了传统的优化目标外,一些研究还进一步探索了辅助损耗,以增强从对齐数据中学习的能力。

• 主要训练目标。由于对齐数据通常由输入指令和输出响应组成,因此主要训练损失仍然是序列到序列学习的传统交叉熵损失。基于这种损失,许多研究提出了许多改进变体来增强监督对齐调整。例如,CoH [306] 通过分别在注释的好响应和坏响应前面加上“有用的答案:”和“无用的答案:”来构造训练数据,并且仅计算具有特殊掩码的响应令牌的损失。Quark [303] 将模型响应分类为具有不同对齐质量的不同分位数,它在每个模型响应前面附加一个特殊的奖励令牌来表示响应的奖励水平。此外,为了通过最大似然目标实现偏好建模,DPO [307]首先使用策略模型(即,正在优化的语言模型)重新参数化响应奖励,然后原始奖励建模目标只能基于策略模型重新制定。这样,DPO去掉了显式的奖励建模步骤,优化仅涉及策略模型的新学习目标就相当于优化了奖励。

• 辅助优化目标。除了初级交叉熵损失外,一些研究还提出了辅助训练损失,以增强从对齐数据中学习。首先,由于每条指令的响应都可以由奖励模型评分,因此可以使用排名损失来训练模型以保持这些响应的排名顺序。例如,该研究[308]对来自多个来源的响应进行采样,包括模型生成的响应,例如源自模型本身,ChatGPT和GPT-4的响应,以及人类编写的响应,跨越高质量和低质量实例。为了与奖励模型的分数保持一致,它通过鼓励模型对具有更高排名的响应具有更高的条件对数概率来进一步优化排名损失。其次,为了增强响应和指令之间的相关性,一些工作采用对比学习来提高正确指令-响应对的概率,同时推低不正确的指令-响应对。特别是,对于输出响应,[309]中提出的方法将目标指令与其他不相关的指令进行对比。通过这样做,它可以使模型学习指令和响应之间的正确相关性。

5.2.5 对于SFT和RLHF的评论

如第 5.1 节所述,指令调优是使用格式化的演示数据(与所需输出配对的指令)训练预训练语言模型的过程。在早期的探索中,指令数据主要从NLP任务中收集[62],而现在已经扩展到更多样化的监督数据,将输入和输出文本配对(例如,开放式对话的话语)。在LLM的背景下,使用这种配对文本进行训练也称为监督微调(SFT)[61]。在这节,我们主要使用缩写SFT进行讨论,但由于简单性和流行性,不使用指导调优。

由于SFT和RLHF是LLM的两种主要适应调谐方法,因此了解它们之间的联系和差异非常重要。接下来,我们将就此问题进行一些讨论。

关于与强化学习(RL)公式的整体比较

根据第5.2.3节中的讨论(与RL训练相关的部分),文本生成问题可以被制定为基于RL的决策过程。以提示作为输入,LLM的任务是生成一个适当回应提示的文本完成。这个任务将逐步完成。在每一步中,一个代理(即LLM)将根据策略(即LLM的生成概率分布,在当前状态下,即当前生成的令牌序列和其他可用的上下文信息条件下)执行一个动作(即生成一个令牌)。预期LLM将产生高质量的输出文本,根据整个回应的完整性可以获得大量奖励分数。总的来说,RLHF和SFT可以被看作是优化LLM上述决策过程的两种不同训练方法。特别是,RLHF首先学习奖励模型,然后利用它来改进LLM的RL训练(例如,PPO)。相比之下,SFT采用了一种教师强制方法,直接优化演示输出的可能性。这种令牌级别的训练方式本质上是行为克隆(模仿学习的一种特殊算法[310]):它利用专家的动作(即每一步的目标令牌)作为监督标签,直接学习模仿专家的演示,而不像典型的RL算法那样指定奖励模型。为了学习所需的策略,SFT采用了一种基于演示数据的“局部”优化方式(即令牌级别的损失),而RLHF采用了一种涉及人类偏好的“全局”优化方式(即文本级别的损失)。有关模仿学习和强化学习的更多理论分析可以参考相关的RL文献[310, 311]。

SFT的优点和缺点

已经证明SFT是提高LLM在各种基准测试中性能的有效方法[62, 64, 123, 124],这可以大大增强任务的泛化能力,并为特定功能(例如建立聊天机器人的身份)提供灵活性。关于SFT的有用性的更多讨论可以在第5.1.3节中找到。众所周知,SFT主要释放了LLM的能力,而不是为LLM注入新的能力。因此,当试图通过SFT激发LLM的非内生能力时,可能会出现问题。作为一个具体的情景,当演示数据超出LLM的知识或能力范围时,它有可能提倡产生幻觉行为,例如训练LLM回答关于其未知事实的问题。关于John Schulman关于RLHF的讲话[312]中的一个有趣观点是,提取出优越模型以训练能力较差的模型(例如,提示GPT-4生成响应作为微调数据)可能会增加产生幻觉文本的可能性,从而可能影响LLM的事实准确性。此外,作为一种行为克隆方法,SFT旨在模仿构建演示数据的专家的行为(无需探索)。然而,不同的注释者在演示数据的写作风格、质量和偏好方面常常存在差异,这往往会影响SFT的学习性能。因此,在SFT阶段,高质量的指导数据(而不是数量)是有效训练LLM的主要因素[90]。

RLHF的优点和缺点

RLHF早在深度RL文献中就被探索了[70],然后被借用来提高语言模型的能力(例如总结[116]),随后被采用为开发InstructGPT[61]的基本技术。最近的增加的证据[90, 298]已经证明了RLHF在减轻有害回应和增强模型容量方面的有效性。特别是,LLaMA 2已经证明RLHF可以提高帮助性和无害性评分[90],并将其归因于更好的人-LLM协同作用用于数据注释。他们在两个主要方面解释了这个原因如下。首先,由于人类注释者主要为RLHF提供了偏好注释,因此它可以很大程度上减轻了像SFT中那样的注释者之间的差异。其次,偏好注释比编写演示数据要容易得多,注释者甚至可以判断比他们创建的更高质量的生成品的质量,从而可以探索超出人类注释者所能展示的更广阔的状态空间。另一个关键点是,RLHF本质上鼓励LLM通过对比自生成的回应(区分好坏回应)来学习正确的策略。它不再强迫模型模仿外部演示数据,因此可以减轻上面讨论的SFT中的幻觉问题。事实上,已经证明RLHF是减少GPT-4中幻觉行为的重要方法[46]。

然而,RLHF继承了经典RL算法的缺点,例如样本效率低和训练不稳定。当适应LLMs时,RLHF进一步依赖于强大的SFT模型作为初始模型检查点,以有效地实现良好的性能。此外,人类注释者参与了一个复杂的迭代优化过程,其中许多重要的细节(例如提示选择、奖励模型训练和PPO训练的时间表,以及超参数的设置)对整个模型性能有重要影响。

总的来说,SFT在预训练后的模型检查点上特别有用,可以增加模型的容量,而RLHF有望进一步提高SFT模型的容量。然而,RLHF的实现一直很困难,并且在公开文献中还没有得到充分的探索(根据公开文献)。还需要更多的改进(例如,高效可靠的注释[298]和简化的优化[307])以进行进一步的研究。

5.3 参数高效的模型适应

“Parameter-Efficient Model Adaptation”(参数高效的模型适应)是一个涉及模型调整的领域,通常用于改进预训练的模型以适应特定任务或数据集。在这个领域中,研究人员致力于寻找方法,可以在保持模型参数数量相对较少的情况下,有效地调整模型以适应新任务或数据。

在上文中,我们已经讨论了指导调优和对齐调优的方法,以根据特定目标调整LLMs。由于LLMs包含大量模型参数,执行全参数调整将会非常昂贵。在本节中,我们将讨论如何对LLMs进行高效调整。首先,我们将回顾一些用于Transformer语言模型的代表性参数高效微调方法,然后总结了现有关于参数高效微调的LLMs的工作。

5.3.1 参数高效的微调方法

在现有文献中,参数高效微调[131, 313, 314]一直是一个重要的主题,旨在减少可训练参数的数量,同时尽可能保持良好的性能。接下来,我们将简要回顾用于Transformer语言模型的四种参数高效微调方法,包括适配器调优、前缀调优、提示调优和LoRA。这四种方法的示意图如图11所示。

image-20231027171345375

图11:四种不同的参数高效微调方法示例。MHA和FFN分别代表Transformer层中的多头注意力和前馈网络。

Adapter调整

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

前缀调整

前缀调整[313]在语言模型的每个Transformer层之前添加了一系列前缀,这些前缀是一组可训练的连续向量。这些前缀向量是任务特定的,可以被视为虚拟标记嵌入。为了优化前缀向量,提出了一种重新参数化技巧[313],通过学习一个将较小矩阵映射到前缀参数矩阵的MLP函数,而不是直接优化前缀。已经证明这个技巧对稳定训练是有用的。在优化之后,映射函数将被丢弃,只有派生的前缀向量被保留用于增强任务特定性能。由于只有前缀参数会被训练,这可以导致参数高效的模型优化。类似于前缀调整,ptuning v2 [318]专门为自然语言理解将逐层提示向量合并到Transformer体系结构中,还利用多任务学习来联合优化共享提示。已经证明在提高不同参数规模的模型在自然语言理解任务上的性能方面是有用的。

提示调整

与前缀调整不同,提示调整[314, 319]主要侧重于在输入层37中引入可训练的提示向量。基于离散提示方法[321, 322],它通过包括一组软提示标记(可以是自由形式[319]或前缀形式[314])来扩充输入文本,然后将扩充后的输入用于解决特定的下游任务。在实现中,任务特定的提示嵌入与输入文本嵌入相结合,然后馈送到语言模型中。P-tuning [319]提出了一种自由形式来结合上下文、提示和目标标记,适用于自然语言理解和生成的架构。他们进一步通过双向LSTM学习软提示标记的表示。另一种代表性方法[314]称为提示调整,直接在输入前面添加前缀提示。在训练期间,只有提示嵌入会根据任务特定的监督进行学习。由于这种方法只在输入层包含少量可训练参数,因此发现性能高度依赖底层语言模型的模型容量[314]。

低秩适应(LoRA)

LoRA [131]对于在每个密集层中近似更新矩阵都施加了低秩约束,以减少适应下游任务所需的可训练参数。考虑优化参数矩阵 W W W的情况。更新过程可以以一般形式写成: W ← W + ∆ W W ← W + ∆W WW+W。LoRA的基本思想是冻结原始矩阵 W ∈ R m × n W ∈ R^{m×n} WRm×n,同时通过低秩分解矩阵来近似参数更新 ∆ W ∆W W,即 ∆ W = A ⋅ B ⊤ ∆W = A · B^⊤ W=AB,其中 A ∈ R m × k A ∈ R^{m×k} ARm×k B ∈ R n × k B ∈ R^{n×k} BRn×k是用于任务适应的可训练参数, k < < m i n ( m , n ) k<< min(m, n) k<<min(m,n)是降低的秩。LoRA的主要优点在于它可以大大节省内存和存储使用(例如,VRAM)。此外,可以仅保留一个单一的大型模型副本,同时保留一些用于适应不同下游任务的任务特定低秩分解矩阵。此外,一些研究还讨论了如何以更有原则的方法设置秩,例如基于重要性分数的分配[323]和无需搜索的最优秩选择[324]。

除了上述方法,关于Transformer语言模型的高效微调还有大量的研究。然而,对于高效微调的更全面讨论超出了本文的范围,可以在相关论文中找到有关这一主题的信息[317, 325]。

5.3.2 LLM的参数高效微调

随着大型语言模型的崛起,高效微调吸引了越来越多的研究关注,以开发更轻量级的适应方法来应对下游任务。

特别是,LoRA [131]已被广泛应用于开源的大型语言模型(例如,LLaMA和BLOOM)进行参数高效微调。在这些研究尝试中,LLaMA及其变种因其参数高效微调而引起了广泛关注。例如,AlpacaLoRA [130]已经使用LoRA对Alpaca [128](一个经过微调的7B LLaMA模型,具有52K个人类遵循指令的演示)进行了轻量级微调版本的训练。对Alpaca-LoRA进行了广泛的研究探索,涵盖了不同语言或模型规模的范围,可以在收藏页面38中找到。最近的研究LLaMAAdapter [326]将可学习的提示向量插入到每个Transformer层中,其中提出了零初始化的注意力以改善训练,减轻了欠拟合提示向量的影响。他们还将这种方法扩展到多模态设置,例如视觉问答。

此外,已经进行了一项实证研究[316],以检验不同微调方法对语言模型的影响。他们比较了四种高效微调方法,包括串行adapter微调[315]、并行adapter微调[317, 327]和LoRA [131],对三个开源的大型语言模型进行了评估,分别是GPT-J(6B)、BLOOM(7.1B)和LLaMA(7B)。基于对六个数学推理数据集的实验结果,他们表明,这些高效微调方法在困难任务上表现不如参考基线GPT-3.5,而在简单任务上表现相当。总体而言,LoRA在这些比较方法中表现相对较好,同时使用明显较少的可训练参数。

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

正如在第5.3.1节中讨论的那样,在现有文献中提出了大量高效微调方法。然而,大多数这些方法都是在小型预训练语言模型上进行测试,而不是在大型语言模型上进行测试。到目前为止,还缺乏对不同高效微调方法在不同设置或任务下对大型语言模型的影响进行彻底调查的研究。

5.4 内存高效的模型适应

由于模型参数的巨大数量,大型语言模型在推理时占用大量内存,这使得在实际应用中部署它们非常昂贵。在本节中,我们将讨论如何通过一种流行的模型压缩方法(即模型量化)来减少大型语言模型的内存占用,以便在资源有限的环境中使用大型语言模型,这也可能降低推理延迟。

5.4.1 量化的背景

在这一部分中,我们将介绍神经网络的量化技术。

在神经网络压缩中,量化通常指的是从浮点数到整数的映射过程[329],尤其是8位整数量化(即INT8量化)。对于神经网络模型,通常有两种数据需要量化,即权重(模型参数)和激活(隐藏激活),这些数据最初以浮点数表示。为了阐述模型量化的基本思想,我们介绍一个简单但流行的量化函数: x q = R ( x / S ) − Z x_q = R(x/S)−Z xq=R(x/S)Z,它将浮点数 x x x转化为量化值 x q x_q xq。在这个函数中, S S S Z Z Z分别表示缩放因子(涉及两个参数 α α α β β β,确定剪切范围)和零点因子(确定对称或非对称量化),而 R ( ⋅ ) R(·) R()表示将缩放的浮点值映射到近似整数的舍入操作。

作为反向过程,反量化从相应的量化值中恢复原始值: x ~ = S ⋅ ( x q + Z ) x̃ = S · (xq + Z) x~=S(xq+Z)。量化误差是原始值 x x x与恢复值 x ~ x̃ x~之间的数值差异。范围参数 α α α β β β对于量化性能有很大影响,通常需要根据实际数据分布进行校准,可以通过静态(离线)或动态(运行时)方式进行。

关于神经网络上的量化方法,我们建议读者参考优秀的调查[329]以获取更多详细信息。

5.4.2 LLM的量化方法

通常有两种主要的模型量化方法,即量化感知训练(Quantization-Aware Training,QAT)(需要额外的完整模型重新训练)和后训练量化(Post-Training Quantization,PTQ)(不需要模型重新训练)。与小型语言模型相比,在设计或选择用于大型语言模型的量化方法时需要考虑两个主要区别。首先,大型语言模型包含大量参数,因此由于计算成本要低得多,更倾向于使用PTQ方法而不是QAT方法。其次,大型语言模型展示出非常不同的激活模式(即,大量的离群特征),因此对于大型语言模型,尤其是隐藏激活,量化变得更加困难。接下来,我们将简要回顾几种代表性的大型语言模型的PTQ方法。

后训练量化(PTQ)

我们首先介绍针对大型语言模型的PTQ方法。

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

• 精细粒度量化。对于Transformer模型,权重和激活通常以张量的形式表示。一个直接的方法是为整个张量使用粗粒度量化参数(即每张量量化)[331]。然而,这通常会导致不准确的重构结果。因此,提出了精细粒度方法来减少量化误差。ZeroQuant [332]采用了一种基于标记的激活压缩方法,具有动态校准。而对于权重(更容易量化),它使用了一种分组量化。在实践中,通常使用128的分组大小[332, 333]进行模型量化。

• 平衡量化难度。考虑到权重比激活更容易被量化,SmoothQuant [331]提出将难度从激活迁移到权重上。具体来说,他们在线性层中引入了一个缩放变换,以平衡权重和激活之间的难度: Y = ( X d i a g ( s ) − 1 ) ⋅ ( d i a g ( s ) W ) Y = (Xdiag(s)^{−1} )· (diag(s)W) Y=(Xdiag(s)1)(diag(s)W)。通过引入一个数学上等效的变换,这个公式通过缩放因子 s s s来控制量化难度。为了设置 s s s,它还引入了一个迁移强度参数 α α α来平衡难度,其中每个条目 s j = m a x ( x j ) α / m a x ( w j ) ( 1 − α ) s_j = max(x_j)^α/ max(w_j)^{(1−α)} sj=max(xj)α/max(wj)(1α)由迁移强度决定。

• 逐层量化。这种方法寻找最小化逐层重构损失的最优量化权重: a r g m i n W − ∥ W X − W − X ∥ 2 2 arg\ min_{\overset{-}{W}} ∥ WX− \overset{-}{W}X ∥^2_2 arg minWWXWX22。为了有效地优化这个目标,GPTQ [334]通过固定所有行的权重的量化顺序,改进了原始的最优脑量化(OBQ)[335]方法。此外,通过特别设计的方法(即,延迟批量更新和Cholesky重构),GPTQ能够以3位或4位精度量化非常大的模型(例如,175B OPT)。最近,AWQ [333]通过为权重引入激活感知的缩放进一步简化了优化形式,类似于SmoothQuant [331]的思想:与离群激活对应的权重更重要,需要精确量化。它不直接优化重构损失,而是执行简单的超参数搜索,以在校准数据上实现最小损失。

上述方法中的这些策略可以联合使用以提高量化性能。为了实现高效的实现,量化方法还依赖于硬件或系统级别的支持(例如,高效的GPU内核或硬件友好的分组分区)。

其他量化方法

在上述内容中,我们主要关注了PTQ方法,并介绍了两项最近的研究,探讨了用于量化大型语言模型的高效微调方法或QAT方法。

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

• 用于LLMs的量化感知训练(QAT)。最近的一项研究[337]通过将无数据蒸馏方法应用于压缩权重、激活以及键值缓存,探讨了QAT方法的效果。通过基于LLaMA进行大量实验,他们展示了在权重和键值缓存上使用4位量化取得了令人满意的结果,但在4位激活量化上效果不佳,仍需要进一步探索。

5.4.3 实证分析与发现

量化目前已经成为减小大型语言模型在部署中内存占用和延迟的常见技术。特别重要的是要了解可以应用于量化大型语言模型不同部分(例如权重或激活)的精度水平(例如INT8或INT4),同时保持高精度。

最近进行了一项非常全面的评估[338],研究了多种因素(例如模型大小和灵敏度)对后训练量化方法的影响。另一项研究[339]研究了推理性能中k位量化的规模定律。除了总体性能,研究[340]特别关注了量化对新兴能力的潜在影响,以及在各种位精度水平上可以实现的性能水平。此外,以往的工作(例如LLM.int8() [341]、GPTQ [334]、QLoRA [336]和GLM [84])还广泛地研究了不同设置中量化方法的性能。接下来,我们总结了这些研究中的一些重要发现,这些发现对于那些可能不想深入了解量化方法的技术细节的人可能会很有用。

• INT8权重量化通常在大型语言模型上可以取得很好的结果,而较低精度的权重量化性能依赖于具体的方法[331, 333, 334, 338]。在大多数情况下,INT8权重量化可以有效应用以减小内存占用,而不降低性能。对于INT4(或INT3)权重量化,现有方法依赖于特定策略来减少性能下降,例如,逐层方法[332, 334]、激活感知缩放[333]和低秩适配器微调[336]。有趣的是,大型语言模型似乎对低位权重量化的敏感性较小,而小型语言模型[338]的敏感性较大。在实践中,建议在相同的内存成本下,使用较低的量化精度的较大语言模型,而不是较高量化精度的较小语言模型。例如,一个4位的60GB大型语言模型被证明在性能上优于一个8位的30GB大型语言模型[339]。此外,关于新兴能力的研究[340]发现,在上下文学习、逐步推理和指令遵循方面,4位权重量化似乎很少受到影响。这个结果表明,INT4量化在总位数和新兴能力的性能方面展现出了有利的权衡。

• 激活比权重更难量化[330, 331, 338]。已经发现,当Transformer语言模型的大小达到6.7B或更大时,会出现大的离群值[330]。这个问题是量化大型语言模型的最基本困难之一。为了克服这个问题,可以采用各种方法,例如混合精度分解[330]、精细粒度量化[330, 342]和难度迁移[331],以减轻离群值的影响。由于大的离群值主要存在于大型语言模型的激活中,小型语言模型更抵抗激活量化[338, 340]。在实践中,高质量的INT8激活量化仍然是一项困难的任务,尽管一些方法可以获得令人满意的结果。此外,即使对于QAT方法[337],低精度激活量化仍然没有成功探索。

• 高效微调增强的量化是增强量化大型语言模型性能的好选择[131, 336]。高效微调方法在量化中的好处可以有两方面。首先,它可以通过更新高精度适配器来直接补偿低位量化所带来的性能下降[338, 340],从而增加拟合能力。其次,它具有灵活性,可以以轻量级的方式支持LLMs的任务特定或目标特定的微调[336],例如,指令微调或面向聊天的微调,只需微调小型适配器。总的来说,它在效果和训练成本之间取得了良好的平衡,为增强量化大型语言模型性能提供了一种有前景的方法。

5.4.4 开源库和量化的LLMs

在这部分,我们简要介绍了可用的开源量化库和量化的LLMs。

量化库。接下来,我们介绍了用于LLMs的三个主要量化库,包括:

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

• GPTQ-for-LLaMA是专门为量化LLaMA模型而开发的。它基于GPTQ算法[334]实现了LLaMA模型不同大小的4位量化。此外,它在项目网站上提供了与bitsandbytes在内存和性能(PPL)方面的比较。

• AutoGPTQ是基于GPTQ算法[334]开发的量化包,支持LLMs的INT4量化。它在库中包含了许多量化模型,并通过与HuggingFace PEFT库集成支持了LoRA。

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

量化的LLMs

与原始模型相比,量化语言模型占用更小的内存占用,可能具有更快的推理速度[84, 330, 344]。最近,HuggingFace上发布了一些公开可用语言模型的量化模型副本,包括BLOOM、GPT-J和ChatGLM。特别是,GPTQ [334]已广泛用于量化生成式语言模型,导致了LLaMA和OPT的各种量化变体。此外,它还被应用于量化经过指令微调的模型,如Vicuna和WizardLM。由于存在大量的量化LLMs,我们没有直接提供这些模型的链接。读者可以通过在HuggingFace上搜索轻松找到它们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/121020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个比较特别的串口工具

这是08年写的一个 并网带电池逆变器 的通讯工具&#xff0c;和普通的串口调试器相比&#xff0c;多了一个【脚本】功能。能够通过【脚本】完成通讯测试。 PC发给DSP的01命令 01 10 1B 00 CF A3 00 00 90 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 电…

小程序开发——小程序的事件

1.事件对象 事件与事件对象概述 事件是一种用户行为&#xff0c;用户的点击、滑动等操作都可以成为事件。事件也是一种通信方式&#xff0c;能够完成视图层&#xff08;WXML页面文件&#xff09;与逻辑层&#xff08;JS逻辑文件&#xff09;之间的通信。 事件对象是指用户在点…

uniapp开发app,在ios真机上出现的css样式问题

比如下面的问题&#xff0c;在iphone 13上出现&#xff0c;在iphone xR上正常。 问题一&#xff1a;border:1rpx造成边框显示不全 在iphone13上border边框有一部分不显示&#xff1a; 在iphone xR上显示正常&#xff1a; 解决办法是&#xff1a; 将border边框设置中的1rpx改…

分享一款基于 AI 的 Chrome 插件

最近使用大模型比较多&#xff0c;公司虽然提供了免费的 ChatGPT 但是需要跳转特定页面才能访问&#xff0c;比较麻烦&#xff0c;于是就想到是否可以开发一款类似于有道词典一样的 Chrome 插件&#xff0c;可以在任意页面使用&#xff0c;虽然市面上也有类似的插件&#xff0c…

【ROS入门】机器人系统仿真——URDF集成Gazebo

文章结构 URDF与Gazebo基本集成流程创建功能包编写URDF或Xacro文件启动 Gazebo 并显示机器人模型 URDF集成Gazebo相关设置collisioninertial颜色设置 URDF集成Gazebo实操编写封装惯性矩阵算法的 xacro 文件复制相关 xacro 文件&#xff0c;并设置 collision inertial 以及 colo…

一文搞懂 MineCraft 服务器启动操作和常见问题 2023年10月

文章目录 前言1. 新建文件夹2. 创建 bat 文件3. 编辑 bat 文件4. 启动服务器5. 恭喜完成 文章持续更新中&#xff0c;如果你有问题可以通过 qq 1317699264 获取免费协助&#xff0c;解决的问题将会被更新到本文章中 前言 无论你是使用服务端整合包&#xff0c;还是从上一篇我的…

【开源】基于SpringBoot的天然气工程业务管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

通过el-tree 懒加载树,创建国家地区四级树

全国四级行政地区树数据库sql下载路径&#xff1a;【免费】全国四级地区(省市县)数据表sql资源-CSDN文库https://download.csdn.net/download/weixin_51722520/88469807?spm1001.2014.3001.5503 我在后台获取地区信息添加了限制&#xff0c;只获取parentid为当前的地…

LeetCode题:70爬楼梯,126斐波那契数

目录 70&#xff1a;爬楼梯 题目要求&#xff1a; 解题思路&#xff1a;&#xff08;类似斐波那契数&#xff09; 递归解法&#xff1a; 非递归解法&#xff1a; 126&#xff1a;斐波那契数 题目要求&#xff1a; 解题思路&#xff1a; 递归解法&#xff1a; 非递归解…

python—openpyxl操作excel详解

前言 openpyxl属于第三方模块&#xff0c;在python中用来处理excel文件。 可以对excel进行的操作有&#xff1a;读写、修改、调整样式及插入图片等。 但只能用来处理【 .xlsx】 后缀的excel文件。 使用前需要先安装&#xff0c;安装方法&#xff1a; pip install openpyxl…

Doceker-compose——容器群集编排管理工具

目录 Docker-compose 1、Docker-compose 的三大概念 2、YAML文件格式及编写注意事项 1&#xff09;使用 YAML 时需要注意下面事项 2&#xff09;ymal文件格式 3&#xff09;json格式 3、Docker Compose配置常用字段 4、Docker-compose的四种重启策略 5、Docker Compos…

k8s statefulSet 学习笔记

文章目录 缩写: stsweb-sts.yaml创建sts扩缩容金丝雀发布OnDelete 删除时更新 缩写: sts 通过 kubectl api-resources 可以查到&#xff1a; NAMESHORTNAMESAPIVERSIONNAMESPACEDKINDstatefulsetsstsapps/v1trueStatefulSet web-sts.yaml apiVersion: v1 kind: Service met…

Canal整合SpringBoot详解(一)

文章目录 Canal整合SpringBoot详解&#xff08;一&#xff09;什么是canal搭建Kafka3.2.1集群⭐Kafka集群机器规划创建3台虚拟机&#xff08;centos7系统&#xff09;必要的环境准备&#xff08;3台虚拟机都要执行如下操作&#xff09;⭐分别修改每个服务器的hosts文件&#xf…

docker - window Docker Desktop升级

文章目录 前言docker - window Docker Desktop升级 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来…

【python画画】蘑菇云爱心

来源于网上短视频 数学原理不懂&#xff0c;图个乐 import math from turtle import *def x(i):return 15 * math.sin(i) ** 3 * 20def y(i):return 20 * (12 * math.cos(i) - 5 * math.cos(2 * i) - 2 * math.cos(4 * i))speed(0) color(red) pensize(10) for i in range(51…

C++设计模式_14_Facade门面模式

本篇介绍的Facade门面模式属于“接口隔离”模式的一种&#xff0c;以下进行详细介绍。 文章目录 1. “接口隔离”模式1. 1 典型模式 2. 系统间耦合的复杂度3. 动机(Motivation)4. 模式定义5. Facade门面模式的代码实现6. 结构7. 要点总结8. 其他参考 1. “接口隔离”模式 在组…

笔记44:Batch_Normlization 过程详解

笔记本地地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\2.图像处理任务\BN a a a a a a a a a a a a a a a a a

抖音上怎么挂小程序?制作小程序挂载抖音视频

公司企业商家现在已经把抖音作为营销的渠道之一&#xff0c;目前抖音支持短视频挂载小程序&#xff0c;可方便做营销。以下给大家分享这一操作流程。 一、申请自主挂载能力 首先需要在抖音开放平台官网注册一个抖音小程序账号&#xff0c;然后申请短视频自主挂载能力。 二、搭…

Liunx两台服务器实现相互SSH免密登录

一、首先准备两台Linux虚拟机当作此次实验的两台服务器 服务器1&#xff1a;server IPV4&#xff1a;192.168.110.136 服务器2&#xff1a;client IPV4&#xff1a; 192.168.110.134 二、准备阶段 [rootserver ~]# systemctl disable firewalld #关…

Umijs创建一个antd+Ts项目环境

上文搭建Umijs环境并创建一个项目 介绍基本操作中 我们构建了一个Umijs环境的环境 但也只创建了一个页面 真正开发来讲 也不可能只创建几个界面这么简单 这里面的创建 还是非常完整的 这里 我创建一个文件夹 主要是做我们的项目目录 然后 我们在终端输入命令 然后 打开目录终…