前言

大模型微调,简单来说,就是拿一个已经训练好的“基础(Base)大模型”(比如BERT、Qwen、deepseek这些大家伙),然后根据你的具体任务,再稍微训练一下,让它更懂你要做的事情。你可以把它想象成一个已经学了很多知识的学生,现在你只需要再教它一些特定的技能,它就能在你需要的任务上表现得更好。

例子:
假设你有一个已经学会了各种语言知识的AI模型(比如BERT),现在你想让它专门做“情感分析”,就是判断一句话是正面的还是负面的。这时候,你不需要从头训练它,只需要给它一些标注好的数据(比如一堆带标签的评论),让它再学习一下,它就能很好地完成这个任务了。

微调的好处:

  • 省时省力:不用从头训练模型,直接用现成的,稍微调整一下就行。
  • 效果好:大模型已经学了很多通用知识,微调后能在特定任务上表现得很棒。

微调的步骤:

  • 选模型:挑一个合适的预训练模型(比如BERT、Qwen等)。
  • 准备数据:准备好你任务相关的数据(比如情感分析的数据)。
  • 调模型:根据任务稍微改一下模型的结构(比如改一下输出层)。
  • 训练:用你的数据再训练一下模型。
  • 测试:看看模型在你任务上的表现如何。

1.常见的大模型微调方法

1.1 全量微调(Full Fine-Tuning, FFT)

是什么:全量微调就是重新训练模型的所有参数,让它完全适应新任务。比如你有一个已经学会了很多通用知识的模型(比如BERT),现在你想让它专门做“情感分析”,那就把所有参数都重新训练一遍。

优点:性能提升显著,模型能更好地适应新任务。

缺点

  • 计算资源大:需要大量GPU和时间。
  • 灾难性遗忘:模型可能会忘记之前学到的通用知识。比如它本来是“语言通才”,微调后可能只会做情感分析,其他任务反而变差了。

例子
想象你有一个学霸朋友,他什么都懂(数学、语文、英语等)。现在你想让他专门帮你写作文。全量微调就像让他把所有时间都花在写作文上,虽然作文能力提升了,但他可能把数学公式忘光了。


1.2 参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)

PEFT的核心思想是:只调整模型的一小部分参数,而不是全部。这样可以节省计算资源,同时避免灾难性遗忘。

(1)Prompt Tuning

是什么:不改变模型参数,而是为每个任务训练一些小的附加参数(比如一些提示词),这些参数会影响模型的输入表示。

例子
想象你有一个万能助手(预训练模型),你只需要给它一些“提示词”(比如“写一篇关于春天的作文”),它就能完成任务。Prompt Tuning就是训练这些提示词,而不是改变助手本身的能力。

(2)Prefix Tuning

是什么:在模型的输入序列前面加一些固定的“前缀向量”,这些向量在训练中被优化,用来引导模型输出特定任务的结果。

例子
还是那个万能助手,这次你在它开始工作前,先给它一段“开场白”(比如“你现在是一个情感分析专家,请判断这句话的情感”)。Prefix Tuning就是训练这段开场白,让它更好地引导模型完成任务。

(3)LoRA(Low-Rank Adaptation)

是什么:通过低秩分解的方式,给模型添加少量参数,让模型快速适应新任务。这些参数可以轻松切换,适合多任务场景。

例子
想象你的万能助手有一个“插件系统”,LoRA就是给它装一个小插件(比如“情感分析插件”),让它能快速切换到新任务,而不需要重新学习所有东西。


1.3 监督式微调(Supervised Fine-Tuning, SFT)

是什么:用带标签的数据集,通过传统的监督学习方式对模型进行微调。比如你有一堆标注好的电影评论(正面/负面),让模型学习这些数据。

例子
你教一个小孩认动物,给他看一堆带标签的图片(比如“这是猫,这是狗”)。监督式微调就是用这种方式,让模型学会特定任务。


1.4 基于人类反馈的强化学习微调(RLHF)

是什么:通过人类的反馈来调整模型,让它输出的结果更符合人类的期望。比如ChatGPT就是用RLHF来微调的,让它生成的回答更人性化。

例子
想象你在训练一个聊天机器人。每次它回答一个问题,你都会告诉它“这个回答很好”或者“这个回答不太好”。RLHF就是通过这种反馈,让机器人慢慢学会怎么回答得更像人类。


1.5 基于AI反馈的强化学习微调(RLAIF)

是什么:和RLHF类似,但反馈来源是AI系统,而不是人类。这样可以提高效率,降低成本。

例子
还是那个聊天机器人,但这次你让另一个AI来评价它的回答(比如“这个回答是否符合逻辑”)。RLAIF就是用AI的反馈来训练模型,省去了人类参与的成本。


1.6 总结对比

方法 核心思想 优点 缺点 适用场景
全量微调(FFT) 重新训练所有参数 性能提升显著 计算资源大,可能遗忘通用知识 数据量大、任务复杂
Prompt Tuning 训练小型附加参数(提示词) 计算成本低,避免遗忘 需要设计好的提示词 小数据量、多任务场景
Prefix Tuning 在输入前加前缀向量 高效,适合特定任务 需要优化前缀向量 任务导向型场景
LoRA 通过低秩分解添加少量参数 快速适应,轻松切换任务 需要设计低秩结构 多任务、资源有限场景
监督式微调(SFT) 用带标签的数据训练 简单直接,效果好 需要大量标注数据 有标注数据的任务
RLHF 通过人类反馈调整模型 输出更符合人类期望 需要大量人类反馈,成本高 对话系统、生成任务
RLAIF 通过AI反馈调整模型 成本低,效率高 依赖AI反馈的质量 低成本、高效率场景

  • 全量微调:重新训练所有参数,效果好但成本高,适合土豪。
  • PEFT:只调整一小部分参数,省钱又高效,适合普通人。
  • 监督式微调:用标注数据训练,简单直接,适合有数据的任务。
  • RLHF/RLAIF:通过反馈(人类或AI)让模型更聪明,适合需要人性化输出的任务。

2.模型微调主要参数

以下基于最新研究与实践,详细说明大模型微调的核心参数作用及示例:


2.1 基础微调参数

2.1.1 学习率(Learning Rate)
  • 作用:控制模型权重更新的步长,直接影响收敛速度和训练稳定性。过高导致震荡,过低导致收敛缓慢。
  • 示例
    • 全量微调:BERT-base微调文本分类任务,常用 2e-5;GPT-3 175B全量微调可能低至 1e-6
    • LoRA微调:Qwen2-1.5B使用LoRA时,学习率可提升至 3e-4,因仅更新少量参数。
    • 学习率调度
      # 余弦退火调度示例(来自Transformers库)
      args = TrainingArguments(
          learning_rate=3e-4,
          lr_scheduler_type="cosine",
          warmup_steps=100  # 前100步预热学习率
      )
      
2.1.2 批量大小(Batch Size)
  • 作用:单次迭代处理的样本数,影响训练速度和梯度稳定性。
  • 示例
    • 单卡训练:RTX 3090(24GB)上微调LLaMA-7B,batch_size=4;若使用梯度累积(gradient_accumulation_steps=4),等效batch_size=16 。
    • 多卡训练:8卡A100微调Qwen2-1.5B,每卡batch_size=4,总batch_size=32 。
2.1.3 训练轮数(Epochs)
  • 作用:决定模型遍历数据集的次数,需平衡欠拟合与过拟合。
  • 示例
    • 小数据集(1万条):1-2轮,避免过拟合(如新闻分类任务)。
    • 大数据集(百万级):全量微调时可能仅需0.5轮(Partial Epoch),如对话生成任务。
2.1.4 权重衰减(Weight Decay)
  • 作用:L2正则化项,抑制模型复杂度。
  • 示例
    • 通用设置:0.01(BERT微调常见值)。
    • 低资源场景:若数据集小,可增大至 0.1 增强正则化效果2

2.2 高效微调(PEFT)参数

2.2.1 LoRA参数
  • 秩(Rank, r)
    • 作用:低秩矩阵的维度,决定新增参数量。r=8时,7B模型仅新增0.1%参数。
    • 示例:Qwen2-1.5B微调文本分类,设置 r=8
  • Alpha(lora_alpha)
    • 作用:缩放低秩矩阵权重,通常设为 r的倍数(如r=8时alpha=16)。
  • Dropout(lora_dropout)
    • 作用:防止新增层过拟合,推荐 0.1
      peft_config = LoraConfig(
          r=8, 
          lora_alpha=16,
          lora_dropout=0.1,
          target_modules=["q_proj", "v_proj"]
      )
      
2.2.2 Prefix Tuning参数
  • 虚拟Token数(num_virtual_tokens)
    • 作用:在输入前添加的可训练前缀长度,影响任务适配能力。
    • 示例:文本生成任务常用 num_virtual_tokens=20
      peft_config = PrefixTuningConfig(task_type="CAUSAL_LM", num_virtual_tokens=20)
      
2.2.3 Adapter参数
  • 瓶颈维度(bottleneck_size)
    • 作用:Adapter层中间层的维度,控制参数效率。
    • 示例:BERT-base适配器微调,设置 bottleneck_size=64,参数量增加约0.5%。

2.3 资源与优化参数

2.3.1 混合精度(fp16/bf16)
  • 作用:降低显存占用,加速训练。
  • 示例
    # 启用BF16混合精度(需硬件支持)
    args = TrainingArguments(fp16=False, bf16=True)
    
2.3.2 梯度裁剪(gradient_clipping)
  • 作用:防止梯度爆炸,稳定训练。
  • 示例:设置 max_grad_norm=1.0(通用推荐值)4
2.3.3 显存优化策略
  • 参数卸载(offload)
    # 使用accelerate库卸载参数至CPU
    model = accelerate.dispatch_model(model, device_map="auto")
    

2.4 参数调优示例场景

场景1:7B模型全量微调文本分类
  • 参数配置
    args = TrainingArguments(
        learning_rate=2e-5,
        per_device_train_batch_size=4,
        num_train_epochs=3,
        weight_decay=0.01,
        gradient_accumulation_steps=2,
        fp16=True,
        logging_steps=100
    )
    
  • 参考:类似Qwen2-1.5B微调新闻分类任务(代码4)。
场景2:175B模型LoRA微调对话生成
  • 参数配置
    peft_config = LoraConfig(
        r=16,
        lora_alpha=32,
        target_modules=["q_proj", "v_proj"],
        lora_dropout=0.05
    )
    args = TrainingArguments(
        learning_rate=1e-4,
        per_device_train_batch_size=1,
        gradient_accumulation_steps=8,
        bf16=True,
        max_grad_norm=0.3
    )
    
  • 参考:Meta Llama 2微调最佳实践。

2.5 调优原则

  1. 小数据优先降学习率:万级以下数据,学习率建议≤1e-5,避免过拟合2
  2. 多任务微调增大Batch:多任务场景(如分类+生成),batch_size需提升至64+,平衡任务间梯度。
  3. 领域适配扩展LoRA秩:若目标领域与预训练差异大(如医学文本),可增大 r=32 增强灵活性1

通过合理组合参数,可在有限资源下高效完成微调。建议结合实验监控工具(如SwanLab))实时调整参数。

3.实战案例代码推荐(重点学习,尽可能实战操作)

  1. 开源大模型食用指南

该项目是一个围绕开源大模型、针对国内初学者、基于 Linux 平台的中国宝宝专属大模型教程,针对各类开源大模型提供包括环境配置、本地部署、高效微调等技能在内的全流程指导,简化开源大模型的部署、使用和应用流程,让更多的普通学生、研究者更好地使用开源大模型,帮助开源、自由的大模型更快融入到普通学习者的生活中。

本项目的主要内容包括:

  • 基于 Linux 平台的开源 LLM 环境配置指南,针对不同模型要求提供不同的详细环境配置步骤;
  • 针对国内外主流开源 LLM 的部署使用教程,包括 LLaMA、ChatGLM、InternLM 等;
  • 开源 LLM 的部署应用指导,包括命令行调用、在线 Demo 部署、LangChain 框架集成等;
  • 开源 LLM 的全量微调、高效微调方法,包括分布式全量微调、LoRA、ptuning 等。

代码地址:
GitHub - datawhalechina/self-llm

  1. LLaMA-Factory(北航开源)

项目特色

  • 多种模型:LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Qwen2-VL、DeepSeek、Yi、Gemma、ChatGLM、Phi
    等等。
  • 集成方法:(增量)预训练、(多模态)指令监督微调、奖励模型训练、PPO 训练、DPO 训练、KTO 训练、ORPO 训练等等。
  • 多种精度:16 比特全参数微调、冻结微调、LoRA 微调和基于 AQLM/AWQ/GPTQ/LLM.int8/HQQ/EETQ 的
    2/3/4/5/6/8 比特 QLoRA 微调。
  • 先进算法:GaLore、BAdam、APOLLO、Adam-mini、DoRA、LongLoRA、LLaMA
    Pro、Mixture-of-Depths、LoRA+、LoftQ 和 PiSSA。
  • 实用技巧:FlashAttention-2、Unsloth、Liger Kernel、RoPE scaling、NEFTune 和
    rsLoRA。
  • 广泛任务:多轮对话、工具调用、图像理解、视觉定位、视频识别和语音理解等等。
  • 实验监控:LlamaBoard、TensorBoard、Wandb、MLflow、SwanLab 等等。
  • 极速推理:基于 vLLM 的 OpenAI 风格 API、浏览器界面和命令行接口。 代码地址:

GitHub - hiyouga/LLaMA-Factory

  1. Hugging Face Transformers + PEFT
    简介:Hugging Face生态的标准微调库,结合PEFT(Parameter-Efficient Fine-Tuning)实现LoRA、Prefix Tuning等方法。

代码示例:

from peft import LoraConfig, get_peft_model
model = AutoModelForCausalLM.from_pretrained("qwen/Qwen2-1.5B-Instruct")
peft_config = LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj", "v_proj"])
model = get_peft_model(model, peft_config)
  1. llm-course(GitHub 13.5K星)
    简介:涵盖大模型全流程开发教程,包括微调实战、Colab代码示例和路线图。
    代码地址:
    GitHub - mlabonne/llm-course
    特点:
    提供Transformer架构解析、数据集构建、解码策略等代码。
    包含PyTorch和TensorFlow实现案例。

  2. SwanLab训练监控
    简介:与Hugging Face Trainer集成的可视化工具,实时跟踪训练损失、评估指标。文档及案例链接:https://docs.swanlab.cn/
    代码集成示例:

from swanlab.integration.huggingface import SwanLabCallback
trainer = Trainer(..., callbacks=[SwanLabCallback()])
  1. 自定义对话数据集处理
    简介:将用户问题与回答转化为模型输入格式的代码示例(如文本分类、生成任务)。
    代码片段:

将文本和标签转换为input_ids和labels

def process_func(examples):
    inputs = tokenizer(examples["content"], padding="max_length", max_length=128)
    labels = tokenizer(examples["summary"], padding="max_length", max_length=128)
    return {"input_ids": inputs["input_ids"], "labels": labels["input_ids"]}
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐