微调方法理论

1 NLP 任务四种范式

NLP 任务的发展可以分为四个阶段:

  • 第一范式:基于传统机器学习,如 TF-IDF + 朴素贝叶斯;
  • 第二范式:基于深度学习,如 word2vec + LSTM,准确率提升,特征工程减少;
  • 第三范式:基于「预训练模型 + Fine-Tuning」,如 BERT + Fine-tuning,小数据集也能训练好模型;
  • 第四范式:基于「预训练模型 + Prompt + 预测」,如 BERT + Prompt,训练数据显著减少。

整体发展趋势是朝着精度更高、少监督甚至无监督的方向发展。

2 Fine-Tuning 与早期方法(简介,已被 LoRA 取代)

Fine-Tuning 是一种迁移学习方式,基本思想是采用已在大量文本上训练的预训练语言模型,然后在小规模特定任务文本上继续训练。痛点:全量微调中所有参数都会更新,显存占用大、训练速度慢,每个下游任务都要保存一份完整模型权重。

2.1 大模型 Prompt 方法(ICL / Instruction-Tuning / CoT)

针对超大规模语言模型(如 GPT-3 1750 亿参数),只需设计合适的模板或指令即可实现零样本学习:

  • In-Context Learning(ICL):通过上下文示例让模型理解任务而无需显式训练,包括 zero-shot / one-shot / few-shot。
  • Instruction-Tuning(指令微调):通过收集大规模指令-响应对,用监督微调(SFT)让模型学会按指令生成输出。
  • Chain-of-Thought(CoT):在 ICL 基础上增加中间推导过程提示,提升 LLM 在算术推理、常识推理等复杂任务上的性能。

2.2 小模型 Prompt 方法(已被 LoRA 取代)

早期面向小模型的 Prompt 方法企业已基本不用,仅作历史背景了解:

  • PET(Pattern-Exploiting Training):通过 Pattern + Verbalizer(合称 PVP)将分类任务转换为 MLM 完形填空。
  • Prompt Tuning(基于 T5):为输入加固定前缀提示,冻结 PLM,只训练 prompt 对应向量。
  • P-tuning v1/v2:用小可训练模块生成连续提示向量插入输入 embedding;v2 改为在模型每一层都注入,达到匹敌 Fine-tuning 的效果。
  • PPT(Pre-trained Prompt Tuning):先在大量无标注语料上预训练 soft prompt,再加载到下游任务微调。

2.3 PEFT 其他早期方法(已被 LoRA 取代)

  • Prefix-Tuning:在模型输入前添加连续的、任务特定的前缀向量,固定 PLM 所有参数,只更新 prefix,并在 Transformer 每层注意力中将 prefix 的 key/value 拼接到原始 key/value。
  • Adapter-Tuning:在 Transformer 层中添加 bottleneck 瓶颈结构(向下投影→非线性→向上投影+残差)的适配器模块,只训练适配器参数。

⚠️ 上述 Prompt/Prefix/Adapter 系列方法在当前企业实践中已基本被 LoRA/QLoRA 取代。

3 PEFT 大模型参数高效微调

PEFT(Parameter-Efficient Fine-Tuning) 仅微调少量或额外的模型参数,固定大部分预训练参数,大大降低计算和存储成本,同时性能可与全量微调相当。Huggingface 开源的 PEFT 库支持主流方法。

3.1 LoRA(主流方法,重点)

研究表明预训练模型拥有极小的内在维度(intrinsic dimension),越大的模型有越小的内在维度,这解释了大模型的 few-shot 能力。

LoRA(Low-Rank Adaptation)受此启发,认为参数更新过程也存在"内在秩"。对于预训练权重矩阵 W_0,用低秩分解 ΔW 表示参数更新:

训练过程中冻结 W_0,仅训练 A 和 B,前向传播变为:

基本原理:LoRA 冻结预训练模型权重,在每个 Transformer 块的 Linear 层旁增加"旁支"A 和 B,A 将数据从 d 维降到 r 维(r 是 LoRA 的秩),B 将数据从 r 维升到 d 维,B 初始为 0。训练结束后将 A+B 部分的参数与原大模型参数合并使用,推理时无额外延迟

class LoRALinear:
    def __init__(self, orig_linear, r=8, alpha=16, dropout=0.1):
        self.orig = orig_linear  # 原始线性层(冻结)
        out, inp = orig_linear.weight.shape
        self.r = r
        self.scaling = alpha / r
        # A 用小方差正态初始化,B 用零初始化(稳定训练)
        self.A = Parameter(shape=(r, inp), requires_grad=True)
        self.B = Parameter(shape=(out, r), requires_grad=True)

    def forward(self, x):
        base_out = self.orig(x)
        down = x @ self.A.T      # (batch, r)
        up = down @ self.B.T     # (batch, out)
        return base_out + self.scaling * up

关键超参数:

  • r(rank):低秩矩阵的秩,常用 8/16/64,越大表达能力越强但参数越多;
  • alpha:缩放因子,最终 ΔW 乘以 alpha/r 作为缩放,用于解耦学习率与秩;
  • target_modules:通常加在 attention 投影矩阵(Wq/Wv),位置选择敏感。

特点

  • 优点:训练极少参数,效果接近全参数微调,不同任务的 LoRA 模块可插拔,推理无延迟;
  • 缺点:低秩分解逼近权重更新矩阵,表达能力有限。

3.2 QLoRA(主流方法,重点)

QLoRA 通过对 PLM 进行 4-bit NormalFloat(NF4)量化,并结合 LoRA 微调,在极低内存消耗下高效微调巨型语言模型,性能保持甚至超越全量 16-bit LoRA。

两个关键创新点:

  1. 4-bit NormalFloat (NF4) 量化

    • 信息理论最优的量化方案,专为正态分布数据设计;
    • 双量化(Double Quantization):对量化常数再次量化,进一步减少内存;
    • 分页优化器(Paged Optimizers):GPU 内存不足时将优化器状态分页到 CPU RAM,避免 OOM。
  2. LoRA 微调机制保持不变

    • 在量化后的冻结 PLM 上注入低秩 A 和 B 矩阵;
    • LoRA 权重和优化器状态保持 16-bit 精度(float16/bfloat16)。

工作原理:

  1. 加载和 4-bit 量化基础 PLM(使用 bitsandbytes 库,包含双量化),参数设置为不可训练;
  2. 在量化模型上注入 LoRA 模块(A 和 B 保持 16-bit);
  3. 前向传播时 4-bit 权重即时反量化到 16-bit 与输入相乘,LoRA 模块的 16-bit 权重 BA 也与输入相乘,两者结果相加;
  4. 反向传播时梯度流向 LoRA 模块,不流向 4-bit 权重;
  5. 优化器状态使用分页机制。

特点

  • 优点:极低内存消耗(降低 3-4 倍),单张 24GB GPU 可微调 65B/70B 模型;性能优异;训练速度快;
  • 缺点:极端任务可能受 4-bit 量化影响;训练和调试比标准 LoRA 复杂。

小结

  • Fine-Tuning 与早期 Prompt 方法(PET、P-tuning、Prompt Tuning、PPT)以及 Prefix-Tuning、Adapter-Tuning 在企业实践中已基本被 LoRA/QLoRA 取代;
  • LoRA 通过低秩矩阵分解(W = W₀ + BA)实现高效微调,推理无延迟,是当前主流;
  • QLoRA 在 LoRA 基础上引入 4-bit NF4 量化 + 双量化 + 分页优化器,单卡可微调 65B/70B 模型。