微调方法学习总结(万字长文!)

1 什么是微调?

  • 微调是基于已训练好的模型(通常是大型预训练模型)作为基础,在新的数据集上进一步训练模型,以适应特定应用场景
  • 非必要不微调:
    • 成本高:需要大量GPU资源和时间
    • 技术门槛高:需要懂机器学习、数据处理、模型训练
    • 数据要求严格:需要高质量、大量的训练数据
    • 维护复杂:模型更新后需要重新微调

2 为什么要微调?

  • 预训练模型是 "通用学习,普而不精",微调可以将处理通用任务的能力在特定领域上增强
  • 弥补预训练的 "知识滞后",预训练模型有 "知识截止日期"(比如 GPT-4 截止 2023 年),没法知道最新信息(比如 2025 年新法规、新产品);通过微调灌入最新数据,就能让模型掌握实时知识,不用等模型重新预训练。
  • 数据安全方面:很多企业数据不能外传,没法用公有云大模型;微调可以把预训练模型部署在本地,用私有数据微调,全程数据不外流,符合合规要求
  • 降低成本:
    • 从零开始训练大模型成本会非常巨大,而基于现成预训练模型,只优化少量参数(尤其 PEFT),单张 4090 就能调 7B 模型,几天就能落地,成本极低。
    • prompt 工程终究是有上限的,当遇到小样本场景,专业场景,复杂对话情况时候,prompt 很难包含所有情况和细节,输出也不稳定
    • 微调能精准定制模型的输出风格、能力边界,满足个性化需求。

3 微调方法:

  1. 全参数微调:full fine turning 涉及调整所有层和参数,以适配特定任务。此过程通常采用较小的学习率和特定任务的数据,可以充分利用预训练模型的通用特征,但可能需要更多计算资源。

  2. 参数高效微调PEFT: parameterEffecict tuning 旨在通过最小化微调参数数量和计算复杂度,提升预训练模型在新任务上的表现,从而减轻大型预训练模型的训练负担。即使在计算资源受限的情况下,PEFT技术也能够利用预训练模型的知识快速适应新任务,实现有效的迁移学习

    1 LoRA(Low-Rank Adaptation,PEFT的代表,全场景通用,推理最快,分类 / 生成效果都好):

    1. 是一种旨在微调大型预训练语言模型(如GPT-3或BERT)的技术。其核心理念在于,在模型的决定性层次中引入小型、低秩的矩阵来实现模型行为的微调,而无需对整个模型结构进行大幅度修改(精准打补丁)。这种方法的优势在于,在不显著增加额外计算负担的前提下,能够有效地微调模型,同时保留模型原有的性能水准。
    2. 操作流程如下:
      1. 确定预训练模型中,要插入 loRA 矩阵的位置:
        1. 一般插入都在 Q/V 层,Q 决定 "关注什么",V 决定 "怎么用关注到的信息",两者直接控制注意力输出;K 仅影响匹配方式,调整 Q/V 通常已足够,通常:先试 Q+V → 效果不够再加 K → 仍不足再加 FFN,逐步验证收益
      2. 引入两个低秩矩阵:
        1. 引入两个维度较小的低秩矩阵A和B(初始的 A 和 B 是随机的)。假设原始权重矩阵的尺寸为dd,则A和B的尺寸可能为dr和rd,其中r远小于d。
        2. r 的取值通常根据任务难度,从简单->通用->复杂:4,8,16
      3. 低秩更新:通过这两个低秩矩阵的乘积AB来生成一个新矩阵,其秩(即r)远小于原始权重矩阵的秩。这个乘积实际上是对原始权重矩阵的一种低秩近似调整。
        1. 使用 LoRA 微调的时候,冻结预训练模型所有权重参数保证模型本身能力不受影响,使用新生成的标注数据训练模型,这样就可以秩训练引入的两个低秩矩阵。
      4. 最终输出所用权重:新权重 = 原始权重 + A * B * α/r。 [ r≪min(d,k) ],r 就是低秩矩阵的r,阿尔法是缩放系数,通常是 r 的 2-4 倍
      5. 调参技巧:
        1. r 过大:参数增多、过拟合风险上升,显存占用增加
        2. r 过小:表达能力不足,任务适配效果差
        3. α/r 异常:过大易梯度爆炸,过小 LoRA 更新被忽略;建议固定 α/r≈2,再调 r
    3. 主要优势: 具有极高的参数效率,训练参数量可降至全量微调的0.01%甚至更少,不会产生推理延迟,同时支持多任务快速切换,可以为不同任务训练不同的LoRA"补丁"实现快速加载。
    4. 适用场景:当我们想在单张消费级显卡上,使用几千条指令数据将一个7B规模的模型微调成一个遵从人类指令的对话助手时,使用LoRA可以在几个小时内高效完成,并获得媲美全参数微调的效果。(典型数据:RTX 4090训练7B模型约2小时。)

    2 QLoRA(极致压缩方案):一种结合了LoRA(Low-Rank Adaptation)方法与深度量化技术的高效模型微调手段

    1. QLoRA = 4bit/8bit 量化 + LoRA ,本质就是先把原模型 "压缩瘦身",再插 LoRA 低秩矩阵微调,既继承 LoRA "只练小矩阵" 的优点,又进一步砍显存占用,门槛直接降到普通人能承受
      1. 只压缩原模型、不碰 LoRA 精度、不改变权重形状
      2. 4 bit 的时候是 NF4(NormalFloat 4:正太分档),8bit 的时候是 INT8(均匀分档) /FP8(浮点格式)
      3. NF4(专门为模型权重设计的压缩格式),步骤像给数据 "分档收纳":
        1. 先归一化:把原模型 FP32 权重缩放到 [-1,1] 区间,适配 NF4 的分档范围;
        2. 分档映射:按正态分布分 16 个档位(4bit 能表示 16 个值),把权重映射到最近档位,比如 0.3→0.298、-0.5→-0.525,用 4bit 存档位编号;
        3. 动态反量化:计算(模型推理)时临时解压缩回 FP16/BF16,保证计算精度;
        4. 双重量化(可选):对量化用的缩放因子(就是除了权重外的其他参数系数)再压缩到 8bit,进一步省显存。
        5. 和普通 4bit 的区别:普通 INT4 是均匀分档(比如 - 8 到 7),中间和两头精度一样,对权重来说浪费档位;NF4 是 "按需分配",信息损失更小。
        6. 没有 "NF8" 标准,因为 8bit 本身精度足够,不需要像 NF4 那样定制分档。
        7. 4bit 是 "紧身收纳盒"(省空间但要精准摆放),8bit 是 "宽松收纳盒"(稍占空间但不容易乱)
      4. FP16 和 BF16 的区别:
        1. 像 "精准的实验室天平",能称出 0.001 克的差异,但最多只能称 65 公斤(超了就爆);
        2. 像 "工业地磅",能称几十吨的重物(范围大),但称 0.001 克就不准了。
        3. 核心:两者都是 16 位(占一样的空间),只是 "精准度" 和 "量程" 二选一。
        4. BF16(Brain Float 16)是谷歌专为 AI 训练设计的,么有 BF32,32 位已经满足了足够精度了,就像上面没有 NF8 一样,因为不需要
    2. QLoRA流程:
      1. 准备原材料:同样是需要准备预训练模型,特定的标注数据,普通硬件
      2. 降低精度:
        1. 原模型默认是 32bit 高精度,像一本厚字典,占地方(费显存)
        2. QLoRA 先把原模型压缩成 4bit/8bit 低精度,相当于把厚字典印成小字薄本,页数少了一半多,占地方大大减少
        3. 插入 LoRA 的低秩矩阵(精度 FP16,本来就是这个精度)
        4. 训练低秩矩阵进行微调
    3. 主要优势:极低的内存消耗,使得在单张24GB显存的GPU上微调650亿参数的模型成为可能,同时通过创新的量化与反量化策略,性能损失极小。
    4. 场景:当我们需要对一个超大规模模型(如33B/65B)进行算法研究或轻量实验,但只有有限的GPU资源时,QLoRA是唯一能在如此苛刻条件下完成微调的可行方案。相比LoRA显存占用再降65%。

    3 适配器调整(模块化处理): adapter tuning(多任务时,不同任务的特征隔离性更好(不容易串任务)):

    1. 与LoRA技术类似,适配器调整的目标是在保留预训练模型原始参数不变的前提下,使模型能够适应新的任务。
    2. 核心优势是参数少、显存省、切换任务灵活,适合资源有限又要做多任务的场景。
    3. 调整流程:
      1. 加载预训练模型
      2. 插入适配器模块,在模型的关键层插入小网络,结构像 "漏斗":降维→激活→升维(如输入 768 维→压缩到 64 维→ReLU 激活→恢复 768 维),参数量仅为全量原模型的 1%-5%。
        1. 插件就是3 层极简的小神经网络,结构像 "漏斗"(通常是两层的 MLP)
        2. 核心作用是 "加工特征",降维的目的是为了减少参数量,和低秩的道理一样,低秩低维就可以满足需求
        3. ReLU 激活函数的作用:给网络加「非线性能力」,让它能学复杂规律,通俗讲更像是一个去弱留强的筛选器
        4. 插入位置:
          1. 首选位置:注意力层(Attention)→ 前馈层(FFN)之间(最常用,效果最好)
          2. 次选位置:前馈层(FFN)→ 层归一化(LayerNorm)之间
          3. 注:每一层插一个插件,比如 Llama 2 有 32 层,就插 32 个一模一样的插件(初始化因为是随机数所以不同,训练后各自学不同层的特征,所以每层训练出来的插件结果也不同)
        5. 如何升维降维:
          1. 降维矩阵 W_down ∈ R^{m×d}(m 为瓶颈维,d 为原特征维):用随机高斯分布初始化(均值 0、方差小,避免初始影响过大);
          2. 升维矩阵 W_up ∈ R^{d×m}:用零矩阵初始化,确保训练初期 Adapter 近似恒等映射,不破坏原模型输出;
          3. 与 LoRA 的区别:Adapter 是对特征做降维 - 升维,LoRA 是对权重更新做低秩分解,但两者均为新增可学习小矩阵,不改动主模型权重。
          4. 高维特征降维到「原维度的 1/8~1/16」最合适,不会太小装不下核心信息,又不会太大装过多的没用信息
      3. 训练插件:使用特定标注的训练数据训练,训练时只更新适配器的参数(梯度和优化器状态只算适配器)。
      4. 训练完只存适配器参数(几 MB 到几十 MB),推理时插回原模型即可用,换任务只需换适配器,不用重新训练整个大模型。
        1. 输出公式:h' = h + γ * W_up * σ * (W_down * h)
          1. h'即为加入适配器后的输出结果
          2. γ:为控制 Adapter 影响强度,部分改进工作会加入缩放系数 γ,γ通常取 1 或 0.5,防止任务特征盖过原模型通用特征。
          3. up 和 down 即为上面的升维矩阵和降维矩阵,h 为原始输出结果
          4. σ是非线性激活函数,通常用 ReLU/GeLU 增加表达能力
    4. 核心优势
      1. 参数效率:仅需训练约3-5%的额外参数
      2. 知识保留:最大限度保持预训练知识
      3. 多任务支持:可堆叠不同任务的适配器
    5. 适用场景:当我们需要为一个模型同时掌握多项技能(如翻译、摘要、分类)时,可以为每个任务训练一个独立的适配器。在应用时,通过激活不同的适配器,即可让同一个模型扮演不同的专家角色,实现灵活的多任务部署。
    6. 下图左侧为 transform 中加入适配器位置,右侧为适配器结构

    4 前缀调整(轻量级参数优化): prefix tuning(多任务生成场景下,切换最快、参数量最少):

  1. 核心:在输入前加一段 "专属虚拟 token",只训练这段 token,让模型适配任务 ,全程冻结原模型权重,省参数又灵活
    1. 比如:写作文时,不同主题(任务)用不同开头模板(比如议论文用 "观点 + 例子" 开头,记叙文用 "场景描写" 开头),模板写好了,后面内容自然贴合主题 ------ 前缀调整就是给模型输入加 "专属开头虚拟 token",让模型根据这段 token 输出符合任务的结果。
  2. 调整步骤:
    1. 准备预训练模型
    2. 在输入文本的最前面,插入一段可训练的虚拟 token 序列 (叫 Prefix),比如任务是 "写请假条",就加[请假条开头]这样的虚拟 token(实际是向量,不是文字)。
      1. 前缀长度:一般取 10-100 个 token(远短于输入文本);
      2. 关键:这段 token 是 "空白的",需要训练学出任务专属信息。
      3. 前缀token 生成用高斯分布(均值 0、方差很小)进行初始化,避免初始值过大干扰原模型
    3. 用任务训练数据(比如 "请假事由→请假条范文")训练模型,但只更新前缀 token 的向量 ,原模型权重完全不动。
      1. 训练数据必须是 "前缀 token + 任务输入 + 任务输出" 的格式,和 T5 模型训练所用的数据格式有点像(前缀+输入)
      2. 核心:模型要学习 "前缀 + 输入" 和 "输出" 的对应关系,前缀负责引导任务类型。
    4. 训练后,前缀 token 的向量就 "记住了任务专属规则"(比如写请假条要包含 "请假时间、事由、申请人")用模型做任务时,在输入前加上训练好的前缀 token,模型就能输出符合任务的结果
      1. 实际使用可以把专门的前缀使用自动化的方法表示,毕竟不可能每次直接手动写前缀 token
  3. 适合的场景:首选 "生成类多任务场景",具体包括:
    1. 文本生成:写文案、写邮件、摘要、翻译(多语言切换);
    2. 结构化生成:写表格、写代码片段、生成 JSON 格式内容;
    3. 多任务混合:一个模型同时做 "写请假条 + 写周报 + 写产品描述" 等多个生成任务。
    4. 不适合:纯分类任务(比如情感分类),效果不如 LoRA/Adapter。
    5. 当我们面对一个通过API访问的、无法改动其权重的黑盒模型时,提示调整是唯一可行的"微调"手段。可以通过优化软提示,来让该模型更好地适应特定的任务风格或领域术语。
  4. 核心优势:
    1. 任务切换极灵活:每个任务对应一套前缀,换任务只需要换前缀,不用重新训练模型,像 "换模板" 一样方便;
    2. 参数量极致少:每套前缀只有几十到几百个 token,多任务的总参数量也远低于 LoRA/Adapter;
    3. 原模型能力保留好:全程冻结原模型,不会破坏通用生成能力,多任务之间干扰小。
    4. 训练参数量仅与提示长度相关,是所有方法中最少的,同时能强大地保全模型,完全避免灾难性遗忘。
  5. 补充原理:完全冻结整个预训练模型,在输入序列的嵌入向量前拼接一段可训练的"软提示"向量,在微调时只优化这段软提示向量,使其学会触发模型内部与任务相关的知识(应该就是说,拼接内置的prompt 来实现调整,而不是其他的那种微调)

5 提示调整: prompt/pattern tuning (PET :Pattern-Exploiting Training)(MASK):

  1. 核心是把分类等任务 "包装" 成模型预训练时的完形填空(MLM)任务,通过模板与标签词映射,用少量样本高效训练,全程冻结原模型,只微调 MLM 头部权重。

    1. 和预训练时候 MLM 无监督不同,PET 必须有目标(标签词),不然训练方向就歪了,这是有方向的微调训练
  2. 调整流程(以情感分析为例):

    1. 设计模版:给输入加一句带 [MASK] 的自然语言引导,把任务转成完形填空。
      • 例:输入 "这部电影超好看" → 模板化后:"这部电影超好看。它是 [MASK]。"
      • 作用:引导模型在 [MASK] 位置预测与任务相关的词。
    2. 建立标签词映射:把任务标签(如 "正面 / 负面")对应到具体词汇,作为 [MASK] 的目标输出。
      • 例:正面→"精彩",负面→"糟糕";
      • 本质:用模型熟悉的 "填词" 目标替代陌生的分类目标。
    3. 构建训练样本:拼接成 "输入文本 + 模板" 格式,标签映射为目标词:
      • 输入:[CLS] 这部电影超好看 [SEP] 它是 [MASK] [SEP]
      • 目标:[MASK] 位置预测为 "精彩"(对应正面情感)。
    4. 训练模型
      • 冻结原模型主体,只微调 MLM 预测头;
      • 用交叉熵损失优化,让模型学会 "看到输入 + 模板→填对应标签词"。
    5. 推理预测
      • 输入拼接模板后送模型,获取 [MASK] 位置的词汇概率;
      • 按 Verbalizer 映射回任务标签(如 "精彩"→正面)。
    6. 类比流程:
      1. 模板就是题干,标签词映射就是对照的参考答案,训练模型根据题干找到对应的参考答案
    7. 作用位置:MLM 头部:
      1. MLM 头部是预训练时用于预测 [MASK] 词的输出模块,通常由 "全连接层 + 词表 Softmax" 组成:
        1. 常规下游微调会丢弃该头部,新增分类层;
        2. PET 复用并微调此头部,让 [MASK] 位置输出任务标签词(如 "精彩"→正面情感),通过交叉熵损失优化。
  3. 关键特点:

    • 小样本(零样本)友好:模板 + 映射让模型复用预训练知识,少量标注即可见效;

    • 无额外参数:不新增网络结构,仅微调 MLM 头部,显存占用低;

    • 可解释性强:比如:推理时能直观看到模型结果,不像其他方法只给个标签,不知道中间逻辑。

    • 可集成优化:多个模板加权预测(Pattern Ensembling)提升鲁棒性。

6 P-tuning v1:

  1. "只训提示、不动模型" 的高效微调,核心是在输入前加一组可训练的 "虚拟提示向量",用小型提示编码器优化,全程冻结预训练大模型,以极低参数量适配分类等任务
  2. 调整流程:
    1. 准备预训练模型
    2. 插虚拟提示 + 配编码器
      1. 插入 5-20 个 "虚拟提示 token"(无实际词义,就是一组待优化的向量),放在输入最前面,比如 [P1, P2, P3, P4, P5, 这部电影超好看]
      2. 加一个 "提示编码器"(通常是 BiLSTM+MLP 的小网络),类似 "专门调教虚拟提示的小老师",BiLSTM 负责教向量懂序列逻辑,MLP 负责做最后适配。
        1. BiLSTM:虚拟提示是序列向量,LSTM 擅长学序列依赖,BiLSTM 能前后双向捕捉提示向量间的关联,比单纯 MLP 效果好;
        2. MLP:做一次非线性变换,让提示向量能更好适配下游任务,相当于给 LSTM 的输出再精调一下;
    3. 定任务模板 + 标签映射
      1. 模板:把任务转成完形填空,比如 [P1,P2,P3,P4,P5] 这部电影是[MASK]的
        1. PET 是离散模板,因为都是文字模板
        2. P-turning 是连续向量,因为是编码后的结果
      2. 标签映射:人工标签→模型要填的词,比如 "正面→精彩,负面→糟糕"。
    4. 输入的拼接与编码:把虚拟提示向量(经编码器生成)和原始文本的词嵌入拼在一起,形成模型能认的输入向量序列。
    5. 模型推理算输出:模型按正常流程处理输入,重点预测 [MASK] 位置该填啥(目标是 "精彩" 或 "糟糕")。
    6. 训练:
      1. 用交叉熵损失,比较模型预测的词和人工标签映射的词(比如模型填了 "一般",就和目标 "精彩" 算差距)。
      2. 损失只回传给提示编码器和虚拟提示向量,模型主体参数一动不动 ------ 相当于 "只罚小教练,不罚大模型"。
        1. 本质来说就是单独训练提示编码器模型,因为预训练模型的参数是不动的,预训练模型只是用来提取信息
        2. 如何只罚小教练呢?靠 "禁止大模型参数计算梯度" 实现梯度只传提示编码器:实际操作只需要requires_grad=False 即可实现,这样就可以让大模型完全不参与,而小模型的梯度是可更新的。
    7. 推理:
      1. 加载提示 + 拼输入:把训练好的虚拟提示向量和编码器加载进来,和新文本拼接成输入。
        1. 编码器就是上面训练好的提示编码器模型,这个模型来根据新文本动态生成虚拟提示向量,这是该方法的核心
      2. 预测 + 映射回标签:模型填 [MASK] 后,把词映射回人工标签(比如 "精彩"→正面),输出最终结果。
    8. 与 PET 和前缀提示的关系:
      1. 继承 PET 的核心:把下游任务(比如分类)转成完形填空(MLM)任务,靠 [MASK] 预测 + 标签词映射出结果,复用模型预训练知识,小样本效果好;
      2. 继承前缀调整的核心:用可训练的虚拟提示向量(不是 PET 的离散文字模板),放在输入最前面引导任务,参数量极少;
      3. 通俗说:P-tuning v1 = PET 的 "完形填空解题思路" + 前缀调整的 "虚拟前缀引导",取两者之长,补两者之短。

7 P-tuning v2:

  1. 核心就是:冻结预训练大模型,在 Transformer 每一层都插入可学习的虚拟提示向量(前缀),并训这些小参数,效果追平全量微调但成本极低
  2. 关键:和 v1 比,v2 去掉了 BiLSTM/MLP 编码器,直接在每层插提示,效果更直接、训练更简单
  3. 调整流程(以情感分类为例):
    1. 准备预训练模型
    2. 插入虚拟提示:在 Transformer 每一层的 Self-Attention 里,给 Key 和 Value 都加一组 "虚拟前缀向量"(Kp、Vp),这些是唯一要训的参数(约占模型 0.1%-3%)。
      1. 虚拟前缀向量长度一般在 10-20 token 之间,每层的自注意力中虚拟前缀向量长度相同
      2. 关于在框架中如何实现 Q/K/V 的自动化划分
        1. 首先输入只有一份,但是 QKV 对应的权重参数矩阵并不一样,从而让输入的数据向 QKV 三个方向生成
        2. 这样生成后的 QKV 才能生成注意力计算的值
        3. 如何初始化参数矩阵呢?
          1. 值太大:输入经过线性变换后会变成超大数,激活后全是 1/0,梯度直接消失;
          2. 值太小:输入变换后全是接近 0 的数,梯度也传不下去;
        4. 初始化方法:
          1. Xavier 初始化(也叫 Glorot 初始化)
            1. 核心定位:适合用「Sigmoid/Tanh」激活函数的层(比如早期 Transformer 的部分层)
            2. 逻辑:让权重的初始值满足 "输入层的方差 = 输出层的方差"------ 简单说就是 "输入经过权重变换后,数值规模不变"。
            3. 权重从均匀分布 中随机采样,采样范围由 "输入维度 (in) + 输出维度 (out)" 决定:范围:[-√(6/(in+out)), √(6/(in+out))]
          2. He 初始化(也叫 Kaiming 初始化)
            1. 核心定位:适合用「ReLU/Leaky ReLU」激活函数的层(比如 CNN、现代 Transformer 的 FFN 层)。
            2. 逻辑:ReLU 会把负数变成 0,相当于 "丢了一半信息",所以 He 初始化在 Xavier 基础上 "补了这一半"------ 让输出方差 = 2× 输入方差。
            3. 权重从正态分布 中随机采样,均值为 0,标准差由 "输入维度 (in)" 决定:标准差:√(2/in)
    3. 初始化提示向量
      • 简单版:随机初始化;
      • 高效版:用任务相关词的词嵌入初始化(如分类任务用 "好 / 坏" 的向量),减少训练步数。
        • 直接从预训练模型中提取提示向量
    4. 输入拼接:
      • 原始文本 → 经过模型的词嵌入层,直接转成标准词嵌入;
      • 每层都把 "虚拟前缀向量(Kp、Vp)" 拼到原始 Key/Value 前面,形成新的输入张量。
    5. 前向计算:模型按正常流程算注意力、FFN,但每层都先看前缀向量,相当于 "先记住任务要求再处理文本"。
      1. 先记住是因为拼接在向量最前方,注意力机制会先注意到,然后起到引导的作用
    6. 计算损失:用任务标签(如分类的 "正 / 负")算损失,只针对提示向量的输出。
    7. 加载参数:不用动大模型,只加载训练好的 "每层虚拟前缀向量"。
    8. 生成输出
      • 新文本 → 转词嵌入;
      • 每层自动拼接前缀向量,模型按训练好的 "引导逻辑" 计算,输出结果。
        • 可以类比 T5 模型训练,前缀向量会通过训练学习到如何匹配合适的文本
      • 注:有点类似前缀调整,不同的文本加入训练好的不同前缀向量,只是一个在输入层添加,一个是每层自注意力层都添加
    9. 通俗说:训练是 "教每层怎么看提示",推理是 "直接用学会的提示引导每层干活"。
  4. 核心优势(碾压 v1 和很多方法)
    1. 效果强:每层都插前缀,引导力贯穿模型全程,小样本场景下效果追平全量微调,比 LoRA/Adapter 在小样本任务上更稳;
    2. 结构极简:去掉了 v1 的 BiLSTM 编码器,直接插前缀向量,代码实现比 v1 简单,训练速度更快;
    3. 显存占用低:只训前缀向量,参数量只有原模型的 0.1%~3%,普通 8G 显卡就能跑 7B 模型的微调;
    4. 多任务灵活:一个模型配多套前缀,换任务只换前缀,不用重新训练模型。
  5. 适用场景(精准匹配优势)
    1. 小样本 / 极低样本任务
      1. 比如只有 10~100 条标注数据的分类任务(医疗文本分类、法律文书分类),其他方法容易过拟合,P-tuning v2 能稳住效果。
    2. 多任务混合场景
      1. 比如一个模型要同时做 "情感分类 + 文本匹配 + 意图识别",换任务只加载对应前缀,切换成本极低。
    3. 大模型轻量化微调
      1. 比如 7B/13B 规模的模型,全量微调显存不够,用 P-tuning v2 能以极低显存成本完成适配。
  6. P-turning v1 和 v2 的设计导致的缺点:
    1. 生成类任务效果一般
      • 设计初衷是为了分类任务,做文本生成(写文案、写摘要)时,效果不如前缀调整 ------ 因为生成需要长序列引导,而 P-tuning 的前缀是针对每层注意力的,对生成的连贯性支持不足。
    2. 对前缀长度敏感
      • 前缀长度选得不好(太短引导力不够,太长参数量爆炸),效果会断崖式下降;而 LoRA 只需要调一个r(秩)参数,容错率更高。
    3. 推理时要额外加载前缀
      • 虽然前缀体积小,但相比 PET(不用加载额外参数),部署时要多存一套前缀文件;而 LoRA 可以把低秩矩阵合并到原模型,部署更省心。
    4. 深层任务调试麻烦
      • 每层都有前缀,出问题时很难定位是哪一层的前缀出了问题;而 Adapter 是每层插一个独立模块,调试更方便。

8 区别:

  1. LoRA与适配器调整的主要区别在于(比较重要):

    1. LoRA:在模型的权重矩阵中引入低秩矩阵来实现微调。这些低秩矩阵作为原有权重矩阵的外挂项,在实际计算时对原有权重矩阵的输出进行调整。(改原权重的局部,推理更快)
    2. 适配器调整:通过在模型各层中添加小型神经网络模块,即"适配器",来实现微调。适配器独立于模型的主体结构,仅适配器的参数在微调过程中更新,而模型的其他预训练参数保持不变。和 LoRA 一样是在输出的时候多了外挂项(多任务学习和管理上更为直观,推理速度稍慢)
    3. 显存占用方面差不多
  2. 提示调整与P-Tuning的主要区别在于:

    1. 提示调整:使用静态的、可训练的虚拟标记嵌入,在初始化后保持固定,除非在训练过程中更新。这种方法相对简单,因为它只涉及调整一组固定的嵌入参数,在处理多种任务时表现良好,但可能在处理特别复杂或需要细粒度控制的任务时受限
    2. P-Tuning:使用一个可训练的LSTM模型(称为提示编码器prompt_encoder)来动态生成虚拟标记嵌入,允许根据输入数据的不同生成不同的嵌入,提供更高的灵活性和适应性,适合需要精细控制和理解复杂上下文的任务。这种方法相对复杂,因为它涉及一个额外的LSTM模型来生成虚拟标记嵌入。
  3. 除此之外的方法:

    1. 除了以上PEFT,当前还存在PILL(Pluggable Instruction Language Learning)、SSF(Scaling & Shifting Your Features)(IA³(通过缩放激活值来微调)、BitFit(仅偏置项微调新兴技术) )等其他类型的微调方法。
      1. PILL是PEFT的一个特定实现,特别关注于如何通过插入可训练的模块或插件来提升模型的任务适应性。这些插件被设计为与原始模型协同工作,以提高模型在处理特定任务时的效率和效果。
      2. SSF核心思想是对模型的特征(即模型层的输出)进行缩放(Scaling)和位移(Shifting)。简单来说,就是通过调整特征的比例和偏移量来优化模型的性能。
    2. 这种方法可以在改善模型对特定任务的响应时,不需要调整或重新训练模型中的所有参数,从而在节省计算资源的同时保持或提升模型性能。这对于处理大规模模型特别有效,因为它减少了训练和调整所需的资源和时间。
  4. 微调策略:

    1. 微调与迁移学习:微调实际上是迁移学习(宏观概念)的一个实例,其中预训练的模型(通常在大型通用数据集上训练)被用作特定任务的起点。这种方法使得即使是对于小数据集的任务,也可以实现高效的学习
    2. 选择微调策略:选择哪种微调方法取决于多个因素,包括任务的复杂性、可用的数据量、计算资源和期望的性能。
      1. 例如,对于需要细粒度控制的复杂任务,P-Tuning v2或LSTM基础的P-Tuning可能更适合。而对于计算资源有限的情况,可以选择LoRA或Adapter Tuning等方法。
    3. 微调与模型泛化能力:微调时需要注意的一个关键问题是保持模型的泛化能力。过度的微调可能会导致模型对特定训练数据过拟合,而忽略了其在实际应用中的泛化能力。

9 场景适配总结:

  1. 内存与速度权衡
    • 极致内存优化:QLoRA(5%~10%)> P-Tuning v2(3%~10%)> Prefix Tuning(5%~15%)> LoRA(10%~30%)> Adapter(15%~40%)
    • 推理速度优先级:Full Fine-tuning ≈ LoRA(合并后)> QLoRA > P-Tuning v2 > Prefix Tuning > Adapter
  2. 方法间关系
    • LoRA 与 QLoRA:QLoRA 通过量化进一步压缩内存,是 LoRA 在超大规模模型场景的延伸
    • Adapter 与 Prefix/P-Tuning:Adapter 侧重特征变换,Prefix/P-Tuning 侧重任务提示,分别适配不同任务类型
    • 所有 PEFT 方法均以 "冻结主干、训练增量参数" 为核心,区别在于参数注入位置与变换方式
  3. 选择建议
    • 通用任务优先选 LoRA(平衡性能与效率)
    • 超大模型选 QLoRA(显存是核心约束)
    • 多任务选 Adapter(灵活切换)
    • 生成任务选 Prefix/P-Tuning v2(提示引导能力强)
    • 资源充足时用全参数微调(追求极限性能)
方法 核心思路 适用场景 推理速度 优缺点 与其他方法关系
LoRA 冻结主干,训练低秩矩阵(A/B),推理时合并到原权重 通用 NLP 任务(分类 / 生成)、中等规模模型、多任务快速切换 无额外延迟 ✅ 参数少(0.1%-5%)、性能接近全量;❌ 对低秩假设敏感 Adapter 的低秩替代,比 Prefix Tuning 性能更稳
QLoRA 4-bit 量化主干 + LoRA,训练时冻结量化权重 超大模型(65B+)、显存受限场景(单卡训练)、边缘部署 接近 LoRA ✅ 极致显存节省、支持超大规模模型;❌ 训练速度略慢(-15%~-30%) LoRA 的量化增强版,兼顾低内存与性能
Adapter 插入瓶颈层(如 Down→ReLU→Up),仅训练新增模块 多任务并行、跨模态适配、轻量级模型定制 延迟 + 10%~30%(额外前向计算) ✅ 模态解耦好、多任务灵活;❌ 结构侵入性、推理延迟 与 LoRA 互补,适合多任务但不适合低延迟场景
Prefix Tuning 训练任务相关前缀向量,注入注意力层 文本生成(摘要 / 对话)、小样本学习 延迟 + 5%~15%(前缀处理) ✅ 生成任务性能优、参数极少;❌ 超参敏感(长度 / 位置) Prompt Tuning 的结构化升级,适合生成任务
P-Tuning v2 统一提示层设计,跨层共享提示向量 复杂问答、创意写作、领域知识增强 延迟 + 5%~10% ✅ 提示泛化强、适配多任务;❌ 训练稳定性依赖超参 Prefix Tuning 的改进版,解决提示冲突问题
Full Fine-tuning 所有参数可训练,无结构改动 领域深度定制(医疗 / 法律)、海量数据场景 基准速度(无额外开销) ✅ 性能上限高;❌ 成本极高、易过拟合 所有 PEFT 方法的性能参考基准
  1. 方法通用的可选增强技巧:

    1. 对比微调(Contrastive Fine-Tuning):让模型"分清好坏"

      1. 通俗解释:训练时不光给正样本,还给负样本,让模型学会 "对比着判断"。
        1. 锚样本(Anchor):原始输入文本 → 比如 "这部电影超好看";
        2. 正样本(Positive) :锚样本的正确标签词 → 比如 "精彩"(对应正面情感);
        3. 负样本(Negative) :锚样本的错误标签词 / 同类错误文本 → 比如 "糟糕"(对应负面情感)、"这部电影超烂"。
      2. 通过对比损失函数(如InfoNCE)拉近正样本距离,推远负样本距离
        1. 最常用的损失是 InfoNCE 损失 ,核心逻辑是:
          1. 锚样本和正样本的特征向量尽可能接近(相似度越高越好);
          2. 锚样本和负样本的特征向量尽可能远离(相似度越低越好);
          3. 损失函数会惩罚 "锚正离得远""锚负离得近" 的情况,逼着模型学出精准的特征。
      3. 适用场景:语义相似度计算;检索增强生成;对话系统
      4. 数据构造:正样本:语义相似的文本对; 负样本:随机采样或困难负样本挖掘
    2. 渐进式解冻(Progressive Unfreezing),比较适合:P-tuning v2/Adapter/LoRA

      1. 通俗解释:训练前期冻结全部模型参数 ,训练后期解冻模型最后 1~2 层,一起微调。
      2. 原因:模型浅层学的是通用特征(比如字词),深层学的是任务特征(比如语义);后期解冻深层,能让模型更好地适配任务。
      3. 作用:效果能再涨 1~3 个点,但代价是显存占用增加(因为要训模型深层参数)。
      4. 优点:
        1. 效果提升明显:解冻深层后,模型能把小模块的任务特征和深层语义结合,准确率涨 1~3 个点;
        2. 避免过拟合:前期小模块学任务规则,后期解冻深层不会破坏已学知识
      5. 缺点:
        1. 显存占用增加:解冻模型层后,要计算这些层的梯度,显存多占 20%~30%;
        2. 调试成本变高:要调 "解冻时机""解冻层数" 两个超参数,比纯训小模块麻烦;
        3. 部署更复杂:解冻后模型参数变了,要保存 "原模型 + 小模块 + 解冻层参数",比纯小模块部署麻烦

10 额外知识补充:

  1. 关于学习率的选择

    微调场景 模型规模 推荐学习率范围 优化器及关键参数 核心适用条件 备注
    常规微调(文本生成 / 问答) 7B/13B(主流) 1e-5 ~ 3e-5 AdamW(默认参数) 通用场景,标注数据量充足(≥10 万条) 优先选 1e-5 试跑,效果不佳再上调
    精细化微调(小数据集) 7B/13B 5e-6 ~ 1e-5 AdamW(权重衰减 0.01) 标注数据量<10 万条 低学习率 + 权重衰减,避免过拟合
    超大规模模型微调 100B+ 1e-7 ~ 5e-6 AdamW(低权重衰减) 千亿级大模型适配 极低学习率保护预训练知识,防止参数震荡
    小模型训练 / 微调 1B 以下 5e-5 ~ 1e-4 Adam 或 SGD(动量 0.9) 小模型适配,数据量充足 高学习率加速收敛,SGD 适合简单任务
    多轮对话 / 任务适配 7B/13B 3e-6 ~ 2e-5 AdamW + 学习率衰减 特定任务(如对话、指令跟随) 后期逐步降速,提升任务适配稳定性
  2. 模型跑起来的显存如何计算?

    1. 推理所需显存:推理显存 ≈ 模型参数总量 × 单参数精度字节数

      FP64 8 精度最高,显存占用最大,仅用于科学计算,LLM 推理 / 训练几乎不用
      FP32 4 标准浮点精度,部分老模型推理用,显存占用是 FP16 的 2 倍
      FP16 2 LLM 主流推理精度,平衡显存与精度,大部分场景首选
      BF16 2 与 FP16 字节数相同,动态范围更广,适合 GPU 训练加速
      INT8 1 量化精度,显存仅为 FP16 的 1/2;注意:仅能表示 [-128, 127] 整数,需专用量化框架(如 GPTQ),推理时需反量化,精度略有损失
    2. 训练所需显存:保守估算:训练显存 ≈ 推理显存 × 4;全参数微调经验值:训练显存 ≈ 模型参数总量 × 20 字节

      1. 训练需要的显存:训练的参数类型,只能是 float / BF16;
      2. 最小训练所需显存保守估算是同参数同类型llm 推理 的 4倍;
      3. 基本上用参数乘以20倍就是实际全参数微调使用的显存大小
      FP16/BF16 2 训练显存包含 4 部分核心开销:1. 模型参数本身(1×)2. 梯度信息(1×)3. 优化器状态(如 AdamW 占 2×,共 4× 基础显存)4. 额外开销:批量数据、中间特征、显存碎片(经验值乘以 20 字节已包含此项)
      FP32 4 极少用于全量训练,显存占用翻倍,仅在需要极高精度时使用
  3. 微调方法使用框架:

    1. 新手易上手 / 通用场景首选Hugging Face Transformers + PEFT
      • 不管是全量微调、LoRA/QLoRA,还是 Prefix/P-Tuning,都能一站式实现,代码模板丰富,社区问题解决快;
      • 搭配accelerate launch命令就能轻松实现多卡训练,无需复杂配置。
    2. 大模型显存受限Transformers PEFT + bitsandbytes(QLoRA)
      • 7B 模型用 4bit 量化,单 8G 显卡就能训;13B 模型单 16G 显卡即可,是中小算力场景的最优解。
    3. 千亿级模型全量微调DeepSpeed + Transformers
      • 开启 ZeRO-3 后,能把显存占用降低 70% 以上,支持多机多卡分布式训练,是工业界大模型微调的标准配置。
    4. 中文大模型微调ColossalAI
      • 对 ChatGLM、Qwen、Baichuan 等中文模型的适配性更好,部分优化逻辑更贴合中文语料特性。
    5. 基础核心:Transformers + PEFT 是所有框架的 "底座",掌握它后切换其他框架仅需适配少量代码;
    6. 性能增强
      1. Unsloth :「Transformers PEFT 的性能增强版」,核心解决「慢、费显存」问题,微调优先选;
      2. ktransformers 是「推理优先的优化框架」,核心解决「推理延迟高」问题,推理优先选;
    7. 硬件适配:NVIDIA GPU 优先选 Unsloth/bitsandbytes,AMD/CPU 优先选原生 Transformers。
    框架名称 核心定位 核心优势 首选适用场景 关键限制
    Hugging Face Transformers + PEFT 业界标配,全场景通用微调框架 1. 一站式支持所有微调方法(全量 / LoRA/QLoRA/P-Tuning/Adapter 等);2. API 极简,新手易上手;3. 无缝对接 Datasets/Accelerate 生态;4. 适配所有主流模型(Llama/ChatGLM/Qwen 等) 所有微调场景(7B/13B 模型、分类 / 生成 / 多模态任务),新手首选 训练速度 / 显存效率一般,无极致优化
    Unsloth Transformers PEFT 的性能增强版(极速微调) 1. 训练速度比原生快 2-5 倍(CUDA 内核优化);2. 显存再降 30%(4bit 预量化模型直接微调);3. API 完全兼容 Transformers PEFT,几乎无需改代码 7B/13B/70B 模型极速微调、显存极度受限(单 8G/16G NVIDIA 卡) 仅支持 NVIDIA GPU,AMD/CPU 不兼容
    ktransformers (ktrans) 高性能推理优先的微调 / 推理框架 1. 推理速度比原生快 3-10 倍(TensorRT/ONNX 编译优化);2. 支持微调 + 推理一体化;3. 适配中文模型推理量化 微调后需要低延迟高吞吐推理(产品级部署、边缘设备) 微调功能不如 Transformers 丰富,配置稍复杂
    DeepSpeed 超大规模模型显存优化训练框架 1. ZeRO-1/2/3 显存优化,千亿级模型单卡 / 多卡训练;2. 集成混合精度、梯度累积;3. 兼容 Transformers 100B + 级模型全量微调、多机多卡分布式训练 配置复杂,需写 json 配置文件
    bitsandbytes QLoRA 量化微调核心依赖 1. 4/8bit 量化,7B 模型单 8G 卡即可训练;2. 无缝对接 Transformers/Unsloth 显存极度受限的大模型微调(7B/13B/70B) 仅支持 NVIDIA GPU,量化有轻微精度损失
    ColossalAI 国产大模型训练框架 1. 适配中文大模型(ChatGLM/Qwen/Baichuan);2. 异构并行 / 零冗余优化,显存效率比肩 DeepSpeed 中文大模型微调、多机多卡分布式训练 社区支持不如 Hugging Face,文档偏中文
    Megatron-LM 万亿级模型专用训练框架 1. 专为千亿 / 万亿参数模型设计;2. 支持模型并行 / 张量并行 100B + 级模型全量微调(GPT-3 级) 部署门槛极高,需多节点集群,仅适合大厂
  4. 参考资料:1 2 3

相关推荐
@小码农2 小时前
202512 电子学会 Scratch图形化编程等级考试四级真题(附答案)
java·开发语言·算法
mit6.8242 小时前
右端点对齐|镜像复用
算法
Xの哲學4 小时前
从硬中断到 softirq:Linux 软中断机制的全景解剖
linux·服务器·网络·算法·边缘计算
生信碱移4 小时前
单细胞空转CNV分析工具:比 inferCNV 快10倍?!兼容单细胞与空转的 CNV 分析与聚类,竟然还支持肿瘤的亚克隆树构建!
算法·机器学习·数据挖掘·数据分析·聚类
Brduino脑机接口技术答疑5 小时前
TDCA 算法在 SSVEP 场景中:Padding 的应用对象与工程实践指南
人工智能·python·算法·数据分析·脑机接口·eeg
keep_learning1115 小时前
Z-Image模型架构全解析
人工智能·算法·计算机视觉·大模型·多模态
点云SLAM5 小时前
Boost中Graph模块中boost::edge_capacity和boost::edge_capacity_t
数据库·算法·edge·图论·最大团·最大流算法·boost库使用
lihaihui19915 小时前
asan 内存问题分析
算法
算法与编程之美6 小时前
探索不同的损失函数对分类精度的影响.
人工智能·算法·机器学习·分类·数据挖掘