You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LLaMA-3 8B微调问题求助:过拟合与生成灵活性不足

问题分析与解决方案

核心问题

  • 仅用50组问答对微调LLaMA-3 8B后,模型无法精准匹配训练样本:要么混合多个训练答案输出,仅部分问题能返回正确结果
  • 泛化能力极差:针对训练主题的新问题生成时,始终输出相同答案,过拟合严重;调小超参数后又无法正确匹配训练样本
  • RAG方案因内容主题相似导致检索失效,无法采用

现有微调代码

from unsloth import FastLanguageModel
import torch
max_seq_length = 2048 # 自动支持RoPE缩放,可自定义长度
dtype = None # 自动检测类型,Tesla T4/V100用Float16,Ampere+用Bfloat16
load_in_4bit = True # 4bit量化降低显存占用,可设为False

# 支持的4bit预量化模型列表
fourbit_models = [
    "unsloth/mistral-7b-v0.3-bnb-4bit",      # Mistral v3,速度提升2倍
    "unsloth/mistral-7b-instruct-v0.3-bnb-4bit",
    "unsloth/llama-3-8b-bnb-4bit",           # Llama-3 15T tokens模型,速度提升2倍
    "unsloth/llama-3-8b-Instruct-bnb-4bit",
    "unsloth/llama-3-70b-bnb-4bit",
    "unsloth/Phi-3-mini-4k-instruct",        # Phi-3,速度提升2倍
    "unsloth/Phi-3-medium-4k-instruct",
    "unsloth/mistral-7b-bnb-4bit",
    "unsloth/gemma-7b-bnb-4bit",             # Gemma,速度提升2.2倍
]

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/llama-3-8b-bnb-4bit",
    max_seq_length = max_seq_length,
    dtype = dtype,
    load_in_4bit = load_in_4bit,
    # token = "hf_...", # gated模型需填写HF token
)
model = FastLanguageModel.get_peft_model(
    model,
    r = 16, # LoRA秩,建议值8/16/32/64/128
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 16,
    lora_dropout = 0, # 支持任意值,0为优化设置
    bias = "none",    # 支持任意值,none为优化设置
    use_gradient_checkpointing = "unsloth", # 长上下文场景用True或"unsloth",节省30%显存
    random_state = 3407,
    use_rslora = False,  # 支持秩稳定LoRA
    loftq_config = None, # 支持LoftQ
  )
alpaca_prompt = """Below is a question with an answer that provides a clear explanation.

### Question:
{}

### Response:
{}
"""

EOS_TOKEN = tokenizer.eos_token  # 必须添加EOS_TOKEN,避免生成无限循环

def formatting_prompts_func(examples):
    questions = examples["Question"]
    answers = examples["Answer"]
    texts = []
    for question, answer in zip(questions, answers):
        # 必须添加EOS_TOKEN
        text = alpaca_prompt.format(question, answer) + EOS_TOKEN
        texts.append(text)
    return {"text": texts}

from datasets import load_dataset
dataset = load_dataset("csv", data_files="training-data.csv")
dataset = dataset.map(formatting_prompts_func, batched=True)
from trl import SFTTrainer
from transformers import TrainingArguments
from unsloth import is_bfloat16_supported

trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset = dataset['train'],
    dataset_text_field = "text",
    max_seq_length = max_seq_length,
    dataset_num_proc = 2,
    packing = False, # 短序列场景设为True可提速5倍
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        warmup_steps = 5,
        max_steps = 90,
        learning_rate = 2e-4,
        fp16 = not is_bfloat16_supported(),
        bf16 = is_bfloat16_supported(),
        logging_steps = 1,
        optim = "adamw_8bit",
        weight_decay = 0.01,
        lr_scheduler_type = "linear",
        seed = 3407,
        output_dir = "outputs",
    ),
)
trainer_stats = trainer.train()

针对性解决方案

1. 数据层面优化

  • 拆分验证集:从50组数据中拆分10-15组作为验证集,训练时监控验证损失,一旦验证损失持续上升就停止训练(早停),避免过度拟合
  • 轻度数据增强:对现有问答对做同义词替换、句式改写,扩充到100-150组,保留核心语义的同时提升模型泛化性
  • 对齐原生prompt格式:把当前英文模板改成LLaMA-3 Instruct的原生中文格式,减少格式混淆导致的答案错乱:
    <|begin_of_text|><|user|>{}<|end_of_text|><|assistant|>{}<|end_of_text|>
    

2. 超参数与LoRA调整

  • 减少训练步数:把max_steps从90降到20-30,或改用num_train_epochs=3-5,避免小数据集过度训练
  • 调低学习率:将learning_rate从2e-4降到5e-5~1e-4,降低LoRA参数的更新幅度
  • 添加正则化:把lora_dropout从0调到0.1~0.2,抑制过拟合
  • 缩小LoRA秩:将r从16降到8,减少可训练参数规模,降低过拟合风险

3. 训练策略优化

  • 启用早停机制:在TrainingArguments中添加early_stopping_patience=3和evaluation_strategy="steps",每N步验证一次,验证损失连续上升则停止训练
  • 调整batch配置:显存允许的话,把per_device_train_batch_size调到4,同时将gradient_accumulation_steps降到2,提升训练稳定性
  • 更换优化器:小数据集下用普通adamw替代adamw_8bit,优化器稳定性更好,避免梯度异常

4. 生成阶段调整

  • 限制生成长度:推理时设置max_new_tokens为训练集答案的平均长度,避免冗余内容
  • 调整生成参数:用temperature=0.7、top_p=0.9提升多样性;需精准匹配时,临时将temperature调到0.1~0.3
  • 强制EOS触发:确保生成时eos_token_id=tokenizer.eos_token_id,避免模型无限生成重复内容

5. 替代RAG的折中方案

  • 硬编码规则匹配:对高频固定问题直接做关键词匹配,返回固定答案;非匹配问题再交给模型生成
  • 添加泛化样本:手动构造5-10组主题相关但表述不同的新问答,让模型学习处理变体问题

内容的提问来源于stack exchange,提问作者Mkp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:53:11