用基础模型构建应用(第七章)AI Engineering: Building Applications with Foundation Models学习笔记

发布于:2025-07-09 ⋅ 阅读:(28) ⋅ 点赞:(0)

如何让通用 AI 模型更好地适配特定业务场景?比如让大模型精准生成符合格式要求的 JSON 数据,或是在医疗、法律等专业领域给出更可靠的回答?究竟该选择微调(Finetuning)还是RAG,或者提示工程?当模型内存占用过高、硬件资源有限时,该如何高效完成定制化训练?本章(Finetuning 微调)聚焦模型微调(Finetuning)这一 AI 工程的核心技术,提供系统性的解决方案。

微调是通过进一步训练整个模型或部分模型,使模型适应特定任务的过程。第5章(Prompt Engineering 提示工程)和第6章(RAG and Agents RAG与智能体)讨论了基于提示的方法,通过向模型提供指令、上下文和工具来使其适应。微调则是通过调整模型的权重来使其适应。本章系统梳理了微调技术的核心逻辑、适用场景与实践方案,从基础概念到进阶技巧,全方位解答了 “是否需要微调”“何时微调”“如何高效微调” 等关键问题。解锁模型定制化,深入梳理微调技术与实战策略。

目录

1 Finetuning Overview(微调概览)

2 When to Finetune(何时进行微调)

2.1 Reasons to Finetune(进行微调的原因)

2.2 Reasons Not to Finetune(不进行微调的原因)

2.3 Finetuning and RAG(微调与 RAG)

3 Memory Bottlenecks(内存瓶颈)

3.1 Backpropagation and Trainable Parameters(反向传播与可训练参数)

3.2 Memory Math(内存计算)

3.3 Numerical Representations(数值表示)

3.4 Quantization(量化)

4 Finetuning Techniques(微调技术)

4.1 Parameter-Efficient Finetuning(参数高效微调,PEFT)

4.2 Model Merging and Multi-Task Finetuning(模型合并与多任务微调)

4.3 Finetuning Tactics(微调策略)


1 Finetuning Overview(微调概览)

1. 微调的定义与目标

微调是通过进一步训练模型整体或部分参数,使其适应特定任务的过程。与基于提示的方法(通过指令适配模型)不同,微调通过调整权重实现适配。

  • 目标:从一个具备部分所需能力的基础模型出发,通过训练使其适应特定任务。
  • 本质:属于迁移学习(Transfer Learning)的一种方式,目标是将已有知识迁移到新任务中。微调利用预训练模型的知识,通过少量数据即可优化特定任务表现,例如 Google 的多语言翻译系统通过迁移学习实现跨语言翻译。
  • 优势
    • 基础模型已具备部分所需知识,微调只需 “优化” 其行为,而非从头学习。相比 “从零训练”,微调可大幅减少所需数据量。
    • 微调可 “解锁” 模型已具备但难以通过提示词直接调用的能力。提升模型的领域特定能力(如编程、医疗问答)、增强安全性,以及优化指令遵循能力(如输出格式)。

2. 迁移学习的概念与案例

1)迁移学习的背景

  • 起源:Bozinovski & Fulgosi (1976) 首次提出。核心是 “将从一个任务中获得的知识迁移到相关新任务,加速学习”。就像会弹钢琴的人更容易学习其他乐器。
  • 早期成功案例:Google 2016 年的多语言翻译系统,通过葡萄牙语→英语、英语→西班牙语知识,实现葡萄牙语→西班牙语零样本翻译(即使训练数据中没有该语言对)。

2)迁移学习的价值

  • 解决训练数据有限或昂贵的问题:通过预训练(如文本补全)获取通用知识 → 再迁移到法律问答、文本转 SQL 等专业任务(这些任务数据通常较少)。
    • 基础模型预训练(数据丰富) → 微调(少量任务数据即可适配)。
    • 例:法律问答模型从零训练需百万样本,微调仅需数百样本。

3)迁移学习的其他方式:特征迁移(Feature-Based Transfer)

  • 机制:复用预训练模型的特征提取层(如输出Embedding向量),再将特征输入其他模型(如添加分类头)。

  • 应用领域:计算机视觉中常见,如用 ImageNet 预训练模型提取图像特征,再用于目标检测或图像分割。

  • 与微调的区别:微调是 “优化整个模型”,而特征迁移是 “复用部分模型能力”。

3. 微调的类型与方法

1)自监督微调(Self-Supervised Finetuning,也称为继续预训练 Continued Pre-training)

  • 预训练模型 → 用廉价的任务相关未标注数据微调,先让模型适应领域特征 → 再用标注数据微调
  • 例:先用原始法律文档微调法律问答模型,再用昂贵的(问题,答案)数据微调。

2)监督微调(Supervised Finetuning)

  • 使用高质量标注的(输入,输出)对训练,使模型对齐人类偏好和任务需求。
  • 输入可以是指令(如 “总结这本书”),输出可以是开放式回答(如总结文本)或封闭式回答(如分类)。
  • 挑战:高质量标注数据成本高(尤其需领域知识或事实一致性时)。

3)偏好微调(Preference Finetuning)

  • 通过强化学习(RL)训练,目标是最大化人类偏好。
  • 需要对比数据(指令,优质回答,劣质回答),让模型学习 “什么回答更符合人类预期”。

4)特殊场景:长上下文微调(Long-Context Finetuning)

  • 目标:扩展模型上下文长度(如Code Llama从4K→16K tokens)。
  • 方法:修改模型架构(如调整位置嵌入)以支持更多 token 位置。
  • 挑战:可能导致模型在短序列任务上性能下降。

 关于监督微调与偏好微调,详见第二章:Understanding Foundation Models 理解基础模型

上图展示了基于 Llama 2 基础模型,通过不同微调技术构建各类 Code Llama 模型的流程(基础模型 → 代码适配 → 场景细分),核心是 “数据训练 + 针对性微调” 的技术路径。

Llama 2 → 先学通用代码 → 再分两条路:一条专攻 Python + 长代码,一条强化长代码 + 听懂人类指令 → 变成 Code Llama 家族 ,适配不同代码需求。

ps:微调既可以由模型开发者完成,也可以由应用开发者完成。

角色 职责 输出
模型开发者 发布经多阶段微调的模型(如Code Llama) 不同能力的预微调模型版本
应用开发者 基于任务选择合适模型进一步微调 任务专用模型
  • 关键原则:基础模型与任务越相关,应用开发者所需微调工作越少。

2 When to Finetune(何时进行微调)

相比于提示工程,微调资源消耗大,成本更高,应在充分尝试提示方法后考虑。但两者并非互斥,实际应用常需结合使用。

2.1 Reasons to Finetune(进行微调的原因)

1. 微调的核心目的:提升模型质量

1)提升模型特定任务性能:通用模型在广泛基准测试中表现好,但针对具体任务可能欠佳。若模型在目标任务上训练不足,使用相关数据微调就很有用。

  • 示例:模型在标准 SQL 转换中表现良好,但在处理非标准SQL方言(不同数据库对SQL的扩展实现)或客户特定查询时可能失败,使用领域数据(非标准 SQL 数据、客户专属查询数据)微调模型可改善。

2)优化输出格式与结构:微调可强化模型生成特定格式输出的能力(如 JSON、YAML),确保输出符合业务需求。

3)偏见修正:若基础模型存在训练数据带来的偏见(如 CEO 名称偏向男性),可通过微调在精心筛选的数据上(如包含大量女性 CEO 的数据集)减轻偏见。

2. 小模型微调优势

  • 优势:内存占用低、微调成本低、推理速度快,因此微调小模型更常见。

  • 方法知识蒸馏(Distillation)(第八章会结合其他数据合成技术探讨)

    • 用小模型模仿大模型行为(利用大模型生成的数据训练小模型)。

  • 案例:Grammarly 的微调实践

    • 微调后的 Flan-T5(比 GPT-3 小 60 倍) 在写作辅助任务上超越 GPT-3 变体。

    • 仅需 82000 组指令-输出对(远低于从头训练所需数据量)。

3. 微调可行性的演变

  • 早期限制:顶级模型多为商用,微调权限受限。

  • 当前趋势:随着高质量开源模型增多,微调成为更具吸引力的选择,开发者可基于领域适配模型。

2.2 Reasons Not to Finetune(不进行微调的原因)

1. 替代方案的有效性:微调虽能优化模型,但精心设计提示词和上下文、其他技术(如第二章所述)在一定程度上也可实现性能提升、生成结构化输出等效果。

2. 微调的潜在风险--任务性能退化(Catastrophic Forgetting)

  • 问题:针对单一任务微调可能损害模型在其他任务上的表现。

  • 案例:模型用于产品推荐、订单修改、反馈处理三类任务。原始模型在产品推荐反馈处理表现好,但订单修改差。微调订单修改数据后,该任务提升,但另两项任务性能下降。

  • 解决方案:①投入更多资源,在微调时覆盖所有关键任务。②为不同任务部署独立模型,或后期尝试模型合并(Model Merging)。

3. 微调的高成本与门槛

1)前期投入与维护:刚开始项目实验时,微调很少是首选,因需高额前期投入和持续维护。

环节 挑战
数据获取 标注数据成本高,且尤其需要领域专业知识;开源/AI成本略低,但生成数据效果不稳定。
技术能力 需掌握模型评估、超参调优(如优化器、学习率)、过拟合/欠拟合处理等技能。
部署运维 自建服务需推理优化能力(LLM较复杂);API服务依赖第三方。

2)持续维护负担

  • 模型迭代压力:基础模型快速更新,需持续评估新模型是否优于当前微调版本。

  • 决策成本:性能提升多少才值得切换?是否为新基础模型投入二次微调资源?

  • 机会成本:微调项目可能优先级低于高回报新用例开发。若微调带来的收益不足以抵消成本(如计算资源、人力),则并非最优选择。

4. 微调在 token 使用上的优劣势变化

  • 优势(提示词缓存出现前):微调可优化 token 使用,避免提示词中加大量示例增加 token 消耗( latency 和成本上升 ),微调后能用更短提示词。
  • 变化(提示词缓存出现后):因重复提示片段可缓存复用,该优势减弱,但提示词示例数仍受最大上下文长度限制,微调则无此限制。

5. 微调的适用场景建议

1)优先尝试提示工程:避免因提示实验不充分(如指令模糊、样本无代表性)误判需微调。

2)微调的价值场景

  • 突破上下文长度限制:提示受最大上下文长度制约,微调可注入无限样本知识。

  • 特定需求无法通过提示解决:如极度专业化或低资源任务。

6. 避免微调的场景

避免微调的场景 根本原因 推荐替代方案
多任务需求 单任务微调致性能退化 多模型部署/模型合并
早期实验阶段 提示工程可满足需求 系统化提示优化
资源有限(数据/技术/运维) 标注成本高;技术门槛高;模型迭代压力大 优先使用API服务或基础模型
Token节省为主要目标 提示缓存技术已解决该问题 实施Prompt Caching
  • 微调应作为最后手段而非起点,需建立在充分验证提示工程无效、且具备长期资源投入的基础上。

带例子提问(提示工程) vs 用例子训模型(微调)

下图对比了提示工程和微调两种让模型工作的核心逻辑。

  • 提示工程流程:每次用模型时,把「任务要求 + 示例 + 新输入」全塞给预训练模型。示例每次都要放 prompt 里,占 token 多(尤其示例多的时候)。
  • 微调流程:先把「示例」塞进预训练模型里 “特训”,得到微调后的模型。之后用的时候,直接给「新输入」就能输出结果。后续用模型时,不用重复带示例,省 token。

  • 提示工程是 “每次提问都带教学案例”,微调是 “先拿案例把模型教一遍,之后提问不用带案例”, 本质是 “示例是临时塞给模型” vs “示例永久教给模型” 的区别。

7. 特定领域任务的微调

1)通用模型与特定领域任务的关系

  • 核心论点:领域专用模型的必要性正在弱化,微调/训练专用模型并非绝对必要。
  • 趋势驱动:通用模型能力持续提升,逐渐覆盖甚至超越领域专用模型表现。

2)以金融领域模型为例:BloombergGPT 与 GPT-4 在金融领域的表现

  • BloombergGPT 虽为金融定制,但其性能被 GPT-4 超越,且训练成本高昂(130 万至 260 万美元)。

2.3 Finetuning and RAG(微调与 RAG)

1. 核心决策逻辑:依据问题类型选方法

问题类型 特征 推荐方案 典型案例
信息型缺陷 输出事实错误/过时信息 ✅ RAG 私有数据缺失(如企业内控文件);动态信息(如泰勒·斯威夫特最新专辑数量)
行为型缺陷 输出格式错误/风格不符/内容无关 ✅ 微调 技术文档缺失细节;HTML代码编译失败;JSON/YAML格式错误

关键研究佐证:Ovadia et al. (2024) 实验证明

  • 时效性任务(如时事问答)中:RAG > 微调模型

  • 微调可能损害其他能力:基础模型+RAG > 微调模型+RAG

2. RAG vs 微调

  • RAG:给模型外接知识,解决事实性问题,能减少模型幻觉。
  • 微调:让模型理解并遵循格式、风格,用高质量数据可能减少幻觉,但低质量数据会让幻觉更严重。
维度 RAG 微调
核心价值 注入外部知识,减少幻觉 修正输出格式与风格
数据依赖 无需标注数据,依赖检索库 需高质量标注数据
部署复杂度 增加检索组件(如BM25/向量库) 需托管微调模型,推理结构不变
迭代成本 更新检索库即可 需重新训练模型
副作用风险 检索噪声可能干扰输出 低质量数据加剧幻觉
突破性限制 受限于上下文长度 可学习复杂语法(如小众DSL)

3. 协同应用策略:先 RAG 再微调

  • 结合场景
    若模型同时存在信息与行为问题,先通过 RAG 补充知识,再用微调优化输出形式。例如,先检索法律条文(RAG),再微调模型生成标准化法律文书格式。
  • 性能互补性
    Ovadia 等人的实验显示,43% 的情况下,RAG + 微调模型可提升 MMLU 基准性能,但 57% 的情况仅 RAG 即可满足需求,需根据任务定制。

4. 模型适配任务的工作流(建议步骤)

 上图展示了模型适配任务的流程,核心是 “从简单到复杂,按问题类型选方案”,分层拆解:

  1. 先用提示词(Prompting):按第五章最佳实践,系统版本化管理提示词,尝试让模型直接完成任务。
  2. 扩展提示词示例:根据场景加 1 - 50 个示例(微调前需尽量尝试更多的提示工程可能性)。
  3. 信息型失效 → 接 RAG:用基础检索(如关键词搜索)补充知识,提升性能(RAG从简单检索开始,避免过早引入复杂组件)。
  4. 进一步优化(二选一)
    • 信息型问题持续 → 升级 RAG(如用向量检索,更复杂但精准)。
    • 行为型问题持续 → 选微调(解决格式、相关性问题,增加模型开发复杂度,但推理流程不变)。
  5. 终极组合:RAG + 微调,最大化性,但需平衡复杂度。
  • 完整流程:提示词 → 加示例 → 补知识(RAG)→ 调行为(微调)→ 组合放大招

5. 关键前提:评估贯穿全程

  • 在所有适配步骤前,需按第四章设计评估标准和流程,并在每一步验证效果(不是只在开头做评估)。
  • RAG 更易实施且常带来更大性能提升,而微调需谨慎评估长期维护成本。组合方案是终极手段,但需实证收益。
  • 总结:信息问题找 RAG,行为问题用微调,复杂情况可组合,评估需全程 。

3 Memory Bottlenecks(内存瓶颈)

微调对内存要求高,理解内存瓶颈成因,有助于明白相关技术原理,进而选合适微调方法。

关键要点

  • 基础模型的内存瓶颈现状:因基础模型规模大,推理和微调时内存都是瓶颈。且微调所需内存通常远高于推理,源于神经网络训练方式 。
  • 微调时模型内存占用的关键影响因素:模型参数数量、可训练参数数量、数值表示方式,是微调时影响模型内存占用的关键。
  • 可训练参数与内存的关系及优化方向:可训练参数越多,内存占用越高。减少可训练参数能降低微调内存需求,参数高效微调(PEFT)的动机就在于此 。
  • 量化(Quantization)的作用:量化指将模型从高比特格式转换为低比特格式,是简单高效减少模型内存占用的方式。如 130 亿参数模型,FP32(4 字节 / 权重)需 52GB,转 2 字节 / 权重则只需 26GB 。
  • 推理与训练的比特精度差异
    • 推理通常用尽可能少的比特,如 16 位、8 位甚至 4 位 。
    • 训练对数值精度更敏感,难用低精度训练,一般用混合精度(部分操作高精度如 32 位,部分低精度如 16 位、8 位 )。

3.1 Backpropagation and Trainable Parameters(反向传播与可训练参数)

1. 核心问题:微调时的内存占用

  • 关键因素:可训练参数(Trainable Parameters)的数量

  • 可训练参数:在微调阶段可以被更新(调整)的模型参数。

  • 对比其他阶段:预训练(Pre-training)时所有参数都是可训练的(被更新);推理(Inference)时没有参数被更新;微调(Finetuning)时部分或全部参数是可训练的。

  • 冻结参数(Frozen Parameters):在微调阶段不被更新的参数(不参与反向传播,不计算梯度,不更新)。

2. 内存占用的原因:反向传播(Backpropagation)

  • 训练(包括微调)需要执行反向传播机制,这会产生额外的内存需求。

  • 训练步骤的两个阶段

    • 前向传播(Forward Pass):输入数据通过网络计算得到输出(推理时只执行这一步)。

    • 反向传播(Backward Pass):利用前向传播的信号更新模型权重(训练/微调特有)。

3. 反向传播的详细过程
反向传播的目的是找出错误并调整参数以减少错误。

1)计算损失(Loss):比较模型前向传播的输出与真实值(ground truth)的差异。这个差异量化为损失(Loss)。损失大表示错误大。

2)计算梯度(Gradients):针对每一个可训练参数,计算其对最终损失值贡献了多少(即该参数对错误负多大责任)。数学上,梯度是损失函数(Loss)关于该参数的偏导数(∂Loss/∂w)

  • 每个可训练参数对应一个梯度值高梯度意味着该参数对当前错误贡献大,需要更大的调整。

3)更新参数(Parameter Update):使用优化器(Optimizer)(如 SGD, Adam)根据计算出的梯度来决定每个参数具体更新的方向和步长。对于Transformer模型,Adam是最主流的优化器。

下图用一个简化的3参数网络可视化了前向传播和反向传播的过程,说明了梯度如何沿着网络反向计算。

4. 可训练参数如何增加内存占用

  • 在反向传播阶段,每个可训练参数不仅需要存储其自身的值(权重),还需要存储①它的梯度值(Gradient)(∂Loss/∂w);②优化器的状态(Optimizer States)(例如,Adam优化器会为每个参数维护一阶矩估计和二阶矩估计)。

  • 结论:微调时需要更多内存,主要是因为反向传播过程中要为每一个想更新的参数(可训练参数)计算并存储梯度以及优化器状态。更新的参数越多,这些额外需要存储的东西就越多,内存占用就越大。

3.2 Memory Math(内存计算)

内存计算的核心目的:明确模型推理和训练时的内存需求,辅助选择适配硬件,判断现有有硬件能否运行特定模型。因优化技术和工作负载多样,本章节聚焦近似计算公式,提供大致内存需求参考。

1. 推理(Inference)时的内存需求

1)基础构成:推理时仅执行前向传播,需存储模型权重的内存,以及激活值、注意力机制键值向量(Transformer 模型)的内存。

  • 模型权重内存:设模型参数数量为 N,每个参数内存为 M,则权重内存为 N×M 。
  • 激活值和键值向量内存:通常约为模型权重内存的 20%(若序列长度长、批次大,实际占比更高 )。

2)核心公式:推理内存 = 模型权重内存 + 激活值内存(约为权重的 20%)。

  • 用公式表示为:Memory=N×M×1.2,其中 N 为参数数量,M 为单个参数的内存占用(单位:字节)。
  • 示例
    • 130 亿参数模型(N=13B),每参数占2字节(如 FP16):权重内存 = 13B×2B=26GB,总推理内存 = 26GB×1.2=31.2GB。
    • 700 亿参数模型(N=70B)使用 2 字节 / 参数时,仅权重内存就需 140GB,凸显大模型的内存瓶颈。

2. 训练(Training)的内存需求

1)内存构成:除模型权重、激活值内存,还需存储梯度和优化器状态的内存,与可训练参数数量相关。

2)核心公式:总训练内存(Training memory) = 模型权重(model weights) + 激活值(activations) + 梯度(gradients) + 优化器状态(optimizer states)。

  • 模型权重与激活值:同推理内存,但激活值可能因序列长度增加而显著增大(如 Transformer 的 KV 缓存)。
  • 梯度与优化器状态:与可训练参数数量直接相关,其中每可训练参数需1个梯度值。反向传播时,不同优化器对可训练参数的状态存储不同:
    • Adam:需梯度 + 一阶矩 + 二阶矩(3 值 / 参数)。
    • SGD:仅需梯度(1 值 / 参数)。
  • 示例
    • 130 亿参数模型全量微调(Adam 优化器,FP16):梯度与优化器状态内存= 13B×3×2B=78GB,加上权重内存 26GB,总内存需求超 100GB(未含激活值)。
    • 仅微调 10 亿参数时,该部分内存降至 6GB,凸显参数高效微调(PEFT)的优势。

3)激活值内存的特殊情况

  • 存储原因:反向传播需用激活值计算梯度。
  • 占比可能超过权重大模型训练时,激活值内存可能比权重内存更 “吃资源”,模型越大越明显 。激活值内存的爆炸式增长导致总内存需求远超预期。对于 Transformer 模型,激活值内存(如注意力机制的中间状态)随序列长度线性增长,可能远超权重内存。例如下图,Megatron 模型在 1T 参数规模下,激活值内存是权重的数倍。

  • 优化技术梯度检查点(Gradient Checkpointing)
    • 牺牲时间换空间:重算激活值,减少存储 → 内存↓,训练时间↑。

总结:

  • 内存瓶颈的核心原因:大模型参数规模与训练时的额外状态(梯度、优化器)共同导致高内存需求,普通硬件难以支撑全量微调。
  • 降低训练内存的关键:减少可训练参数(如 PEFT)、使用梯度检查点(牺牲时间换空间)、选择轻量优化器(如SGD代替Adam)。

3.3 Numerical Representations(数值表示)

1. 降低内存的核心路径:使用低精度格式(如FP16→2字节,INT4→0.5字节)。减少单个值内存占用,模型权重内存也会相应降低(如内存减半 → 权重内存减半)。

2. 神经网络中的数值表示类型

1)浮点数格式(IEEE 754标准)

格式 总位数 别称 内存/参数 特点
FP64 64 bits Double 8 bytes 计算默认(如NumPy),少用于NN
FP32 32 bits Single单精度 4 bytes 传统主流,高精度
FP16 16 bits Half半精度 2 bytes 内存减半,易溢出/精度损失
BF16 16 bits BFloat16 2 bytes 指数位≈FP32,但精度更低
TF32 19 bits TensorFloat-32 2.375 bytes 精度接近 FP32 ,但计算更快

​​​​​2)整数格式(新兴趋势)

格式 总位数 内存/参数 应用场景
INT8 8 bits 1 byte 低精度推理
INT4 4 bits 0.5 byte 进一步压缩内存(如QLoRA),但精度损失更大

3)关键权衡范围(Range) vs 精度(Precision)

  • 范围:数值可表示的最小/最大值(由指数位决定)。

  • 精度:数值表示的精细度(由尾数位决定)。

    • 高精密格式转低精密格式(如 FP32 转 FP16 )会降低精度,可能导致数值变化或误差。如 10.1234 转成仅支持两位小数的格式,变为 10.12,精度下降。

    • BF16 和 FP16 位数相同,但 BF16 范围位多、精度位少,能表示 FP16 超范围的大值,但精度更低。如 1234.56789 转 FP16 为 1235.0(变化 0.035% ),转 BF16 为 1232.0(变化 0.208% )。
  • 格式选择依据:在范围精度硬件支持间权衡。

3. 实际应用与影响

1)精度与内存的权衡:低精度格式(如 FP16、INT8)可减少内存(如 130 亿参数模型从 FP32 的 52GB 降至 INT8 的 13GB),但可能损失精度,导致数值误差累积,影响模型性能。

  • 案例:Llama 2 初始权重为 BF16,若错误加载为 FP16 会导致性能下降,凸显格式匹配的重要性。

2)训练与推理的差异

  • 训练:对精度更敏感,常使用混合精度(如 FP16 计算 + FP32 权重备份),避免梯度误差。
  • 推理:可接受更低精度(如 4 位量化),牺牲少量精度换取内存与速度优化。

3)硬件支持:NVIDIA GPU → 原生支持 TF32/BF16/FP16;TPU → 优化 BF16

3.4 Quantization(量化)

1. 量化的核心目标与定义

  • 降低内存占用:通过减少表示模型参数的位数,显著降低内存需求。例如100 亿参数模型:FP32(32 位)需 40GB,FP16(16 位)需 20GB,INT8(8 位)仅需 10GB。
  • 量化定义:狭义仅指转换为整数格式(如 INT8);广义泛指所有精度降低技术(如 FP32→FP16),本文采用广义定义。

2. 量化的关键维度:“量化什么” 与 “何时量化”

  • 量化对象
    • 权重:最常用:对精度影响小,稳定性高(如 LLM.int8 () 技术)。
    • 激活值:较少用,难度较高,因动态范围大,可能显著影响精度。
  • 量化时机
    • 训练后量化(PTQ):模型训练完成后进行,应用广泛(如 Hugging Face Transformers 支持 PTQ)。最常用,对不训练模型的 AI 应用开发者更相关。
    • 训练中量化:包括量化感知训练(QAT)和直接低精度训练,前者模拟低精度行为(不减少训练时间,甚至增加),后者难度高但可兼顾性能与效率,常结合混合精度(部分高、部分低),部分框架(如 PyTorch)支持自动混合精度(AMP)。

3. 推理量化:从高精度到极致压缩(低精度部署)

1)精度演进:早期训练和推理均用 FP32;现在推理普遍采用 8 位、4 位,甚至 1 位。

2)代表性方案

  • 极低比特:LLM.int8()(8位)、QLoRA(4位);BitNet b1.58(2024)。

    • QLoRA(Dettmers et al., 2023):使用 4 位 NF4 格式,结合分页优化器,使 650 亿参数模型可在单 48GB GPU 上微调,生成 Guanaco 模型家族,性能接近 GPT-4。

  • 混合精度:Apple方案 - 2/4位混合(平均3.5比特/权重);NVIDIA Blackwell GPU - 原生支持4位推理。

3)数值格式:浮点微型化:FP8、FP4(较少用于≤4位);整型主流:INT8、INT4(≤8位常用)。

4. 训练量化:挑战与优化策略

1)核心目标:生成低精度下高性能的模型;减少训练内存与时间(如 Character.AI 用 INT8 训练,消除训练 / 推理精度不匹配)。

2)技术难点:反向传播对低精度更敏感,梯度误差易累积,导致模型性能下降。

3)解决方案

  • 混合精度训练:权重保持高精度(如 FP32),激活值和梯度用低精度(如 FP16/INT8),如 LLM-QAT 量化权重和激活值为 4 位,但保留嵌入层为 16 位。
  • 自动混合精度(AMP):框架自动选择精度,平衡精度与效率。
  • 分阶段量化:预训练用高精度,微调用低精度(如基础模型发布后,开发者用 PEFT + 量化微调)。

5. 量化的优缺点与应用权衡

1)优势:减少模型存储与推理内存,加速计算;支持边缘设备(如手机、IoT)离线运行,降低隐私数据泄露风险。

2)风险:精度损失,累积误差导致精度下降;超范围值转为INF/NaN(模型崩溃);低精度格式(如 INT4)需特定硬件支持,否则可能增加转换开销。

3)实践建议:优先尝试 PTQ(简单高效),若精度不足再考虑 QAT 或混合精度训练;关键任务(如医疗、金融)谨慎使用低精度(如≤4 位),需充分测试误差影响。

4 Finetuning Techniques(微调技术)

4.1 Parameter-Efficient Finetuning(参数高效微调,PEFT)

相比全量微调(更新所有参数),PEFT 通过减少可训练参数降低内存需求。例如适配器方法(如 LoRA)仅更新少量附加参数,性能接近全量微调。

1. 全量微调(Full Finetuning)的挑战

  • 定义:指更新模型的全部参数以实现任务适应,类似于训练,区别在于微调是从预训练开始,而训练是从随机权重开始。(早期模型较小,可以对整个模型进行微调)
  • 问题
    • 内存消耗大:以 7B 参数的模型为例,模型权重(16-bit FP16 格式),需 14GB 内存(7B×2 字节);优化器状态与梯度(Adam 优化器)需42GB内存(7B×3×2 字节)。总内存需求达 56GB(还不包括激活值所需的内存),远超消费级 GPU(通常 12-48GB)的容量。
    • 数据需求高:需大量高质量标注数据(监督/偏好学习)。

2. 部分微调(Partial Finetuning)的局限性

  • 方法:只更新模型部分参数,比如冻结前 9 层,只微调最后 1 层,减少可训练参数数量(仅剩 10% 的参数)。
  • 局限
    • 参数效率低,无法显著降低资源需求:虽然减少了内存占用,但参数效率低,需较多参数才能达到接近全量微调的性能。
    • Houlsby et al.(2019):BERT 模型需更新约 25% 的参数才能达到与全量微调相当的性能。
  • 如下图所示:
    • Adapters 适配器方法(橙色曲线):准确率变化小,即使用很少的参数,也能达到与全量微调相近的性能。
    • Fine-tune top layers 微调顶层(蓝色曲线):随着参数数量增加,性能逐渐提升,最终在参数较多时接近全量微调的性能。

3. PEFT 的提出与核心思想

  • 目标:在显著减少可训练参数的同时,达到接近全量微调的性能。
  • 关键突破(Houlsby et al., 2019):通过在模型合适的位置插入额外参数,可以用少量可训练参数获得出色的微调效果。
  • 以 BERT 模型为例:在每个 Transformer 层中插入两个适配器模块(见下图)。在 GLUE 基准测试中,仅训练适配器参数(占总参数 3%),达到与全量微调性能相差不到 0.4% 的效果。

  • PEFT 优势:①硬件成本低:可在消费级GPU上完成大模型微调。②样本效率高:仅需数千样本即可显著提升性能(全量微调需上万至数百万样本)。
  • 推理延迟问题:适配器等模块会增加额外计算步骤,导致延迟略高。

4. 缓解内存压力的方法

1)减少内存占用:①量化:降低权重/激活值精度。②QLoRA(量化LoRA):通过4-bit存储权重,实现65B模型单卡(48GB GPU)微调。

2)高效利用内存:CPU Offloading:将模型部分数据卸载至CPU内存(如DeepSpeed技术)。

 4.1.1 PEFT 两大类方法

1. 适配器(Adapter-based)方法

  • 定义:通过向模型权重添加额外可训练模块来实现微调,属于“加法(additive)”方法。
  • 代表技术
    • LoRA:当前最主流技术,分解权重矩阵为小矩阵乘积,仅更新小矩阵,不增加推理延迟。
    • BitFit:仅微调模型偏置参数。
    • IA3:引入任务特定激活向量,支持多任务混合批处理,某些场景超越全量微调。
    • LongLoRA:LoRA的变体,通过注意力机制修改扩展上下文长度。
  • 优势:灵活性高,模块化设计便于复用。

2. 软提示(Soft prompt-based)方法

  • 定义:通过可训练的特殊token(软提示)调整输入处理方式,无需修改模型架构。
  • 特点:①软提示为连续向量(非人类可读),而硬提示为离散自然语言。②软提示可通过反向传播优化,硬提示静态不可训练。

  • 代表技术
    • Prefix-Tuning:在每个Transformer层前添加软提示。
    • Prompt Tuning:只在嵌入层前添加软提示。
  • 应用场景:软提示被视为提示工程和微调的结合,适合想要比提示工程更灵活但又不想做全量微调的用户。

3. 应用趋势:LoRA因其高效和易用性成为当前PEFT领域的主流方法。软提示方法作为一种轻量级冠军微调手段,适合特定需求,目前使用较少。

4.1.2 LoRA(Low-Rank Adaptation,低秩适应)

  • LoRA(低秩适应):分解权重矩阵为小矩阵乘积,仅更新小矩阵,不增加推理延迟。
  • 原理:将权重矩阵 W 分解为 A 和 B(低秩矩阵),仅更新 A 和 B,合并后不影响推理。
  • 配置:通过调整秩 r(如 r=2-64)和超参数 α 控制更新幅度,通常 r=8 时效果平衡。
  • 服务部署:可合并权重或分离存储适配器,后者支持多任务高效部署。
  • 7.6.4 Quantized LoRA(量化 LoRA)
    如 QLoRA 结合 4 位量化与 LoRA,使用 NormalFloat-4(NF4)格式,在减少内存的同时保持性能,如 Guanaco 模型通过 QLoRA 达到接近 GPT-4 的表现。

1. LoRA 的基本原理

1)核心特点与优势

LoRA 是一种参数高效的微调方法,区别于传统适配器方法(Houlsby et al., 2019,需额外计算层),不增加推理延迟 。它通过低秩分解权重矩阵,引入可合并回原层的模块,而非给基础模型加新层,实现参数高效、样本高效的微调。

  • 核心创新:不修改原模型结构,而是分解权重矩阵并注入可训练参数;微调后,新参数可直接与原权重合并,不增加推理计算量

2)技术原理与流程

LoRA 流程(以权重矩阵\( W \in \mathbb{R}^{n \times m} \)为例):LoRA 通过在不改变基础模型架构的前提下,对特定权重矩阵进行低秩分解,将权重矩阵W(维度为 n×m)分解为两个较小矩阵A和B的乘积,并仅对A和B进行训练,从而减少可训练参数的数量。训练时,冻结预训练模型的原始权重,仅更新A和B,推理时可将A和B与原始权重合并,避免引入额外推理延迟。

步骤

操作

数学表示

1. 低秩分解

选择秩 \( r \)(\( r \ll \min(n,m) \)),创建两个小矩阵:

\( A \in \mathbb{R}^{n \times r} \)(随机初始化)

\( B \in \mathbb{R}^{r \times m} \)(初始化为0)

\( W_{AB} = A \cdot B \)

2. 构建新权重

将低秩矩阵叠加到原权重,通过超参数 \( \alpha \) 控制贡献比例:

\( W' = W + \frac{\alpha}{r} \cdot W_{AB} \)

3. 微调训练

冻结 \( W\),仅更新 \( A \) 和 \( B \) 的参数。

梯度仅反向传播至 \( A, B \)

4. 合并权重

训练完成后,将 \( W_{AB} \) 永久合并到 \( W \) 中:

\( W_{\text{final}} = W + \frac{\alpha}{r} \cdot A \cdot B \)

3)低秩分解(Low-Rank Factorization)

基于 低秩矩阵分解(long-standing 降维技术):大矩阵可分解为两个小矩阵乘积,减少参数、计算和内存需求。

  • 例:9×9 矩阵分解为 9×1 和 1×9 矩阵,参数从 81 减到 18 。
  • 分解秩(factorization rank)由两小矩阵列数决定,原矩阵是满秩,小矩阵是低秩近似。
  • 分解是 “有损” 的(近似原矩阵),秩越高保留原矩阵信息越多。

4)与传统适配器(Adapter)的对比

特性 LoRA 传统适配器
模型修改 无新增层(仅权重叠加) 插入额外网络层
推理延迟 无增加 显著增加
参数效率 ✅ 极高效(仅微调0.01%参数) ❌ 需更多参数(新增层)
任务通用性 ✅ 支持多任务切换(矩阵合并/分离) ❌ 需保留多个适配器

2. Why does LoRA work?(LoRA 为何有效)

1)核心矛盾:大模型为何能「小调」?

问题本质:预训练需海量参数/数据 → 为何微调只需极少量参数/数据即可改变模型行为?

核心理论支持

低内在维度(Intrinsic Dimension)假设:LLM虽参数量巨大,但其有效信息维度极低

②预训练本质是隐式压缩过程:预训练过程通过海量数据将模型“压缩”到适用于下游任务的低维空间。模型预训练得越好,模型的适应性越强,微调时越易通过少量可训练参数和数据实现。

  • 实验证据:模型规模↑ → 内在维度↓ → 微调效率↑(Hu et al. 2021)

  • 类比解释:预训练如同建造高维知识网络,但真正关键信息存在于少数核心路径(低内在维度)。微调只需调整这些核心路径,而非重构整个网络。如同「雕刻大师完成毛坯」→「学徒精细修整」。

2)低秩预训练的挑战与探索

矛盾点:若低秩结构高效 → 为什么不直接用LoRA进行预训练?

①性能局限:低秩分解在训练早期会导致信息丢失,难以直接支持模型从0开始学习复杂语义。

②现有研究结论

  1. 小规模场景成功:卷积网络SqueezeNet(1×1卷积替代3×3)参数量降50倍,精度无损;语音模型Sainath (2013)、Povey (2018) 验证低秩训练有效性。

  2. 大模型瓶颈:预训练需先通过全秩训练充分压缩至低内在维度(Aghajanyan假说)。

    直接低秩预训练 → 模型表达能力受限 → 难以学习复杂泛化能力

当前进展:目前主流做法是先进行全秩预训练,再用LoRA进行微调。研究者正探索如何将低秩预训练扩展到更大规模模型。ReLoRA (2023) 支持 1.3B 参数的 Transformer 模型低秩训练;GaLore (2024) 在 1B 参数模型上解决全秩性能,7B 参数模型初步验证可行性。

3. LoRA configurations(LoRA 配置关键决策)

1)LoRA 应用的权重矩阵选择:LoRA 可以应用于模型中的任意权重矩阵,但效率与效果受模型架构影响较大。目前LoRA主要用于 Transformer 模型,最常应用于注意力模块的四个权重矩阵:Query \( W_{q} \) , Key \( W_{k} \), Value \( W_{v} \), Output \( W_{o} \)。

  • 通常对同类型的矩阵采用统一的 LoRA 配置,如决定给查询矩阵用LoRA,那模型里所有的查询矩阵都用同样的 LoRA 配置。

2)参数预算与矩阵选择:在硬件内存有限,只能容纳固定数量的可训练参数时,需考虑对哪些矩阵应用 LoRA 以最大化性能。

参数预算约束下的策略:以 GPT-3 175B 模型为例,当可训练参数预算为 1800 万(占模型总参数的 0.01%)时,将 LoRA 应用于所有四个注意力矩阵且秩为 2 时,在 WikiSQL 和 MultiNLI 基准测试中表现最佳。

矩阵选择优先级:预算受限时优先选 Query + Value 矩阵(效果通常最佳)。

  • 将 LoRA 应用于更多权重矩阵(包括前馈矩阵)能带来更好的结果,前馈层的 LoRA 可与注意力层的 LoRA 互补。

3)秩(r)的选择:LoRA 的性能与其秩相关,较小的秩意味着更少的 LoRA 参数和更低的内存占用。

低秩分解原理:对原始权重矩阵 \( W \in \mathbb{R}^{n \times m} \)(含 \( n \times m \) 个参数)进行分解:\[W \approx A \cdot B \quad \text{其中} \quad A \in \mathbb{R}^{n \times r}, \ B \in \mathbb{R}^{r \times m}\]

秩 \( r \) 的物理意义分解后矩阵 \( A \) 和 \( B \) 的共享维度,决定参数量与表达能力。

参数量压缩

  1. 原始参数量:\( n \times m \)

  2. LoRA参数量:\( \underbrace{n \times r}_{A} + \underbrace{r \times m}_{B} = r(n + m) \)

  3. 压缩比:当 \( r \ll \min(n, m) \) 时,参数量从 \( O(nm) \) 降至 \( O(r(n+m)) \)。例如:当 \( n=1000, m=1000 \),原始参数100万;若 \( r=8 \),LoRA参数仅 \( 8 \times (1000+1000)=16,000 \)

秩 \( r \) 的技术意义

维度

说明

控制近似能力

\( r \) 越大 → \( A \cdot B \) 越接近原始矩阵 \( W \) → 微调表达能力越强

平衡效果与效率

\( r \) 越小 → 参数量越少、训练越快,但可能欠拟合; \( r \) 越大 → 效果越好,但计算成本增加

决定信息瓶颈

秩 \( r \) 本质是低秩更新的自由度:相当于用 \( r \) 个“核心方向”编码任务特定知识

将秩 \( r \) 理解为任务知识的“压缩率”:

  • 高秩(\( r \) 大):像高清图片,细节丰富但占用空间大;低秩(\( r \) 小):像压缩图片,体积小但可能丢失细节。

秩 \( r \) 的工程选择(经验法则)

  • 典型取值范围:常见值为\( r \in [4, 64] \)(小秩已能满足多数场景)

    • 主流推荐:小模型(<1B参数):\( r=8 \);大模型(>1B参数):\( r=16 \) 或 \( r=32 \)

    • 关键发现:增加\( r \) 不一定提升性能(可能饱和甚至过拟合);极低秩(如 \( r=2 \))在高预算层数下可有效工作;特殊任务可能需要高秩(如 \( r=256 \) 在特定任务最优)。

4)超参数 α 的选择:\( \alpha/r \) 通常在 1:8 到 8:1 之间,最优比例因情况而异,例如秩较小时可能需要较大的 \( \alpha \) ,秩较大时可能需要较小的 \( \alpha \) ,需通过实验确定适合特定使用场景的组合。

配置项

推荐策略

目标矩阵

优先注意力矩阵四组 → 预算受限选 Q+V → 性能敏感任务加入前馈层矩阵

秩 (\( r \) )

从较小值开始(4-64),按任务调整,避免盲目增大

缩放比 (\( \alpha/r \))

初始设为 1:1(如 \( r \)=8,\( \alpha \) =8),根据效果在 1:8 ~ 8:1 范围微调

参数预算

通过调整 \( r \) 和覆盖矩阵数量控制总参数量(例:GPT-3 中\( r \)=2 覆盖四矩阵达 18M)

4. Serving LoRA adapters(LoRA 部署)

LoRA 微调后的模型部署方式,需权衡内存占用、推理延迟和多模型服务需求,主要分为两种核心方式。

1)部署方式

  1. 合并权重后部署:在推理前,将 LoRA 的权重矩阵 A、B 与原始模型矩阵 W 合并,生成新矩阵 W' 。推理时只用合并后的 W',不需额外计算,推理速度快且无延迟增加。

  2. 保持权重分离部署:部署时保留原始矩阵 W 及 LoRA 的 A、B 矩阵,推理过程中实时计算W + BA。这样可以节省存储空间,方便多模型共享同一个基础权重 W,但会带来一定的推理延迟。下图为保持LoRA适配器相互独立,可在多LoRA服务中复用相同的W。

维度

合并权重后部署

保持权重分离部署

原理

微调后合并 W' = W + BA 形成新模型

推理时实时计算 W + BA

延迟

无额外计算延迟

增加实时计算开销

存储开销

每个模型独立存储完整W'(冗余高)

单份W + N套(A,B)轻量适配器

适用场景

单个模型部署

多客户/多任务场景(共享基础模型)

模型切换速度

需加载整个W'(慢)

仅加载新(A,B)(极快)

2)多 LoRA 部署的优势(分离部署的核心价值)

  • 存储效率:以 100 个基于同一基础模型的 LoRA 适配器为例:原始矩阵 W 为 4096×4096(16.8M 参数),LoRA 秩为 8(A、B 合计 65,536 参数)。
    • 合并部署需存储 100 个完整矩阵 W',总计 1.68B 参数。
    • 分离部署仅需存储 1 个基础矩阵 W + 100 组小型矩阵(A、B),总计 23.3M 参数,大幅节省存储空间
  • 切换效率:使用分离部署,切换不同 LoRA 模型(如不同客户的模型)时,无需加载完整模型,仅需替换 A、B 矩阵,节省切换时间。

3)LoRA 的局限性:性能略逊于全量微调;实现难度较高,需修改模型架构(但主流基础模型可通过 PEFT 框架(如 Hugging Face PEFT)直接支持)。

4)优化方向

  • 针对分离部署的延迟问题,可通过技术优化(如预计算、硬件加速)减少实时合并的耗时。
  • 结合量化技术进一步降低基础模型和适配器的内存占用,支持在设备端部署(如 Apple 利用该方式适配 iPhone 功能)。

5)生态支持:公开可用的 LoRA 适配器可通过 Hugging Face、AdapterHub 等平台共享复用,类似预训练模型的使用方式。

5. Quantized LoRA(量化LoRA)

LoRA 的快速发展催生了多种变体,部分尝试进一步减少可训练参数,但效果有限(因 LoRA 适配器本身内存占比远低于模型权重)。更有效的优化方式是在微调时对模型权重、激活值、梯度进行量化,其中 QLoRA 是早期代表性技术。与单纯减少 LoRA 参数数量相比,量化模型权重能更显著地降低整体内存需求。

1)量化 LoRA(4-bit权重量化)

  • 权重存储:模型权重以 4 位 NF4(NormalFloat-4)格式存储,NF4 基于预训练权重通常呈正态分布(中位数为 0)的特性设计。
  • 计算处理:前向和反向传播时,将 4 位权重反量化为 BF16 格式进行计算。
  • 存储机制
    • 运行时计算:实时反量化至BF16精度进行前向/反向传播。

    • 持久化存储:4-bit量化权重(原16-bit的1/4体积)。

  • 局限性:NF4 量化成本高,量化和反量化步骤会增加训练时间,抵消部分内存节省的优势。

2)辅助技术:结合分页优化器(paged optimizers),在 GPU 内存不足时自动在 CPU 和 GPU 之间传输数据,尤其适用于长序列场景,使 65B 参数模型能在单个 48GB GPU 上进行微调。

4.2 Model Merging and Multi-Task Finetuning(模型合并与多任务微调)

1. 模型合并(Model Merging):通过组合多个模型(通常是微调后的模型)创建一个新模型,目标是生成比单独使用各组成模型更有价值的模型。

1)提升性能:例如合并两个擅长不同子任务的模型,得到在整体任务上表现更优的模型。

2)减少内存占用:将多个单任务模型合并为一个多任务模型,合并后模型参数更少,降低部署成本。

2. 与模型集成(Ensembling)的区别

  • 模型集成:仅组合多个模型的输出,各模型参数保持独立,推理成本高(需多次调用模型)。
  • 模型合并:直接组合多个模型的参数,生成单个模型,推理成本低(仅需一次调用),但可能需要进一步微调优化性能。

方面

模型集成

模型合并

运行时模型数量

多个模型同时运行

单一合并模型运行

参数处理方式

保持各模型独立,仅组合输出结果

混合多个模型的参数

推理计算成本

高(多次推理)

低(一次推理)

模型结构

保持不变

生成新模型,结构可能变化

灵活性

高,易于添加/移除模型

需重新合并和微调

适用场景

追求最高准确率,资源充足(如 Hugging Face LLM 榜)

资源受限环境(如设备部署),需多任务合一

  • 下图对比了两者的工作流程。

  • 示例:假设有 3 个模型 A、B、C,都能对同一个输入问题给出答案,但各自擅长不同方面。用户提问“这张图片里有几只猫?”
  • 模型集成:保持模型 A、B、C 各自独立运行,分别输出答案。通过投票、加权平均或训练一个小模型来综合这 3 个答案,输出最终答案。A、B、C 的回答分别为 2 只、3 只、2 只,通过多数投票,最终输出答案 2 只。
  • 模型合并:将 A、B、C 的参数通过合并方法(如线性组合、层堆叠)融合成一个新的模型D。D 同时具备 A、B、C 的能力,推理时只运行模型 D,直接输出答案 2 只。

3. 多任务微调中的模型合并应用

1)传统多任务微调存在局限:

  • 同时微调:需大量数据和训练资源,难以平衡多个任务;
  • 顺序微调:易导致 “灾难性遗忘”(模型学习新任务时忘记旧任务)。

2)模型合并提供了更优方案--模型合并:

  • 并行微调:针对不同任务分别微调模型,得到多个单任务模型;
  • 合并模型:将这些单任务模型合并,避免顺序学习导致的遗忘,同时保留各任务的优化效果。

4. 模型合并的应用场景

1)设备端部署:将多个单任务模型合并为一个多任务模型,适配设备有限的内存(如手机、智能手表)。单个合并模型比多个独立模型更省内存,支持隐私数据本地处理,降低云端推理成本。
2)联邦学习:多个设备可以使用各自的数据(如本地数据)对同一个模型进行微调,最终合并这些模型。

3)多任务处理:合并不同任务专用模型,避免多模型切换的复杂度,且在不增加计算资源的情况下处理多个任务。

5. 模型合并方法

  • 求和:通过求和合并参数。最常用简单的方法,适合结构相似的模型,且可以结合剪枝提升效果。
  • 层堆叠:将多个模型的层堆叠在一起。适合构建更大/复杂的模型,需后续微调,适合模型扩展和混合专家模型。
  • 拼接:将不同模型的参数连接在一起。虽能融合更多信息,但资源消耗大,实际应用较少。
  • 三种方法可以混用,比如部分层求和,部分层堆叠,达到更灵活的合并效果。

(1)求和(Summing):通过相加组成模型的权重值实现合并。

求和方法的2种主要方法:

1)线性组合:通过加权平均合并两个模型的参数 

$$\text{Merge}(A, B) = \frac{w_a \cdot A + w_b \cdot B}{w_a + w_b}$$

  • 适用于基于同一基础模型微调的模型,可通过 “任务向量”(task vectors,微调后模型与基础模型的参数差)实现 “任务算术”(如相加任务向量组合能力,相减去除冗余能力)。对于结构或大小不一致的模型,可以通过投影将参数对齐到相同维度后再合并。
  • 下图显示了当 \( w_{a} \)  = \( w_{b} \) = 1 时 → 标准平均

  • 求和合并中最常用且效果良好的方法,适合同基模型微调的模型合并,支持任务向量算术。

2)球面线性插值(SLERP):将模型参数视为球面上的点,沿最短路径插值合并,仅支持两个模型的合并,插值因子决定各模型的贡献权重(0-1 之间)。

  • 应用限制:只能两两合并,多模型合并可通过顺序多次 SLERP 实现。
  • 提供另一种插值方式,适合需要更平滑合并的场景。

优化技巧合并前修剪冗余参数(如仅保留任务向量中对性能影响最大的 20% 参数),可减少参数干扰,提升合并后模型性能(如 TIES、DARE 方法)。

  • 剪枝:将微调参数恢复为基础模型对应参数,任务向量对应参数置零。
  • 剪枝后合并模型效果更好,尤其是合并多个模型时,剪枝能减少任务间的干扰。

(2)层堆叠(Layer Stacking):选取不同模型的层进行堆叠组合(如取模型 1 的第一层和模型 2 的第二层),也称为 “frankenmerging”。

流程:①通过组合不同模型的层,生成独特架构的模型。②与求和合并不同,层堆叠合成的模型需要进一步微调才能达到良好性能。③适合构建混合专家模型和模型扩展,有效利用已有模型和资源。

1)Frankenmerging 实践:抽取层→堆叠→微调

Goliath-120B 由两个 Llama 2-70B 模型的层堆叠而成,分别取了每个模型的 72 层共同组成新模型。

2)层堆叠在混合专家模型(MoE)中的应用:复制层→加路由→联合训练

方法:①通过复制预训练模型的某些层或模块,构建多个专家副本。②添加路由器(router)将输入分配给最合适的专家层。③进一步训练合并后的模型和路由器以提升性能。

该方法能训练出性能优于从零开始训练的MoE模型。

应用:Together AI 利用此方法将 6 个较弱的开源模型合并,在基准测试中性能接近GPT-4o。

下图展示了如何用已有的预训练模型,通过复制和添加路由器,快速构建一个性能更强的混合专家模型。

3)层堆叠在模型扩展(upscaling)中的应用:复制→层合并→堆叠→微调

通过堆叠现有模型层生成更大模型,避免从头训练。例如原模型适配 40GB 显存,现有 80GB 显存,可以用层堆叠扩展模型规模。

深度扩展示例(Kim et al., 2023):①复制原始预训练模型。②对两份模型的部分层进行求和合并(将两层合为一层),其余层进行堆叠。③通过微调使扩展后的模型达到目标性能。

以 SOLAR 10.7B 为例(下图):原模型为 7B 参数、32层。合并时 16 层求和,其余层堆叠,最终得到 48 层模型(32×2-16=48)。

(3)拼接(Concatenation):将组成模型的参数直接拼接,合并后参数数量为各模型参数之和。如合并两个秩为 r₁和 r₂的 LoRA 适配器,得到秩为 r₁+r₂的适配器,下图展示了这种拼接方式。但该方法不减少内存占用,性能提升有限,通常不推荐。

4.3 Finetuning Tactics(微调策略)

4.3.1 Finetuning frameworks and base models(微调框架与基础模型选择)

1. 基础模型选择

  • 选择依据需参考模型大小、许可证、基准测试性能等(第 4 章Evaluate AI Systems 评估 AI 系统已提及相关标准)。
  • 项目初期可从最强大的模型入手:若其表现不佳,较弱模型更难满足需求;若其表现达标,可再尝试较弱模型作为替代,以平衡成本与性能。
  • 两种开发路径参考:
    • 渐进路径:先以廉价模型测试代码,再用中等模型验证数据,最后用最优模型优化性能,最终选择性价比最高的模型。
    • 蒸馏路径:先用强模型在小数据集上训练,再用其生成更多数据,最后训练更廉价的模型。

2. 微调方法选择

  • 入门推荐使用 LoRA 等适配器技术,因其成本低;全量微调虽性能可能更优,但需更多数据(通常数千例以上),适合后期尝试。
  • 若需部署多个微调模型,优先选择 LoRA,可共享基础模型,降低存储和切换成本;全量微调则需存储多个完整模型,资源消耗更高。

3. 微调框架选择

  • API 方式:适合快速实现,无需关注底层细节,但受限于支持的基础模型和可配置参数。
  • 开源框架:如 LLaMA-Factory、unsloth、PEFT 等,支持多种微调方法(尤其适配器技术);全量微调可参考基础模型的开源训练代码。
  • 分布式训练需搭配 DeepSpeed、PyTorch Distributed 等框架,适用于多机器协同微调。

4.3.2 Finetuning hyperparameters(微调超参数)

1. 学习率(Learning rate)

  • 决定参数更新的步长:过小会延长训练时间,过大会导致模型难以收敛。通常需在 1e-7 至 1e-3 范围内实验。
  • 可通过损失曲线判断合理性:波动大说明学习率过大,下降缓慢说明过小;可采用学习率调度策略(如前期大、后期小)。

2. 批次大小(Batch size)

  • 每步训练的样本数量:过小(如少于 8)可能导致训练不稳定,过大会受硬件内存限制。
  • 内存不足时可采用梯度累积:累计多批次梯度后再更新参数,平衡稳定性与内存约束。

3. 训练轮次(Number of epochs)

  • 完整遍历训练数据的次数:小数据集可能需要 4-10 轮,大数据集 1-2 轮可能足够。
  • 可通过训练损失与验证损失判断:两者均下降说明需更多轮次;训练损失下降但验证损失上升,说明过拟合,需减少轮次。

4. 提示损失权重(Prompt loss weight)

  • 控制微调中提示(prompt)与响应(response)对损失的贡献比例:默认设为 10%,即模型主要从响应中学习,兼顾提示。

网站公告

今日签到

点亮在社区的每一天
去签到