PERSONAL AI LAB从零开始,真正训练自己的模型30 天实验计划
MODULE 08 · PROGRESS 0%

LoRA / QLoRA:第一次真正微调自己的模型

用可承担的显存,把自己的训练数据写进 adapter,并做训练前后对比。

8.1 为什么 LoRA 适合个人

全参数微调会为所有权重保存梯度、优化器状态和更新结果,成本很高。LoRA 冻结原模型,在目标线性层旁边增加两个低秩矩阵 A、B,只训练少量参数。最终变化相当于 W + BA。rank 越大表达能力通常越强,但参数和显存也增加。

8.2 QLoRA

QLoRA 进一步把基础模型以低比特形式加载,基础权重保持量化,LoRA 参数通常仍用更高精度训练。这样显存压力大幅下降。注意“4bit 加载”不等于整个训练过程所有计算都只有 4bit。

8.3 第一次训练的策略

第一次实验不要追求最佳分数,只追求可复现闭环:选 0.5B–3B 模型,100–500 条干净数据,固定测试集,1–3 epochs,保存 config 和 seed。先证明 adapter 能成功保存、重新加载,并且至少一个目标行为变好。

8.4 关键超参数

learning_rate 决定更新幅度;batch size 与 gradient accumulation 决定有效 batch;epochs 是遍历训练集次数;lora_r 是低秩维度;lora_alpha 影响缩放;target_modules 决定 LoRA 插在哪些线性层。不要一次改完所有参数。

8.5 过拟合

如果训练问题回答得越来越像金标准,但新问题反而更差,就是典型危险信号。小数据集特别容易过拟合。除了 train loss,还要监控 validation loss 和固定任务 Eval。

8.6 Adapter 与 Merge

训练后得到的通常只是 adapter,比完整模型小很多。部署时可以动态加载 adapter,也可以 merge 到基础权重形成一个合并模型。是否 merge 取决于部署框架、是否要切换多个 adapter、存储和推理需求。

本课最小代码 / 结构

# 伪代码:先理解训练组件关系
base_model = load_model(quantization="4bit")
lora_model = attach_lora(base_model, r=16, alpha=32)
dataset = load_dataset("dataset-v0.1")
trainer = SFTTrainer(model=lora_model, train_dataset=dataset, ...)
trainer.train()
trainer.save_model("outputs/adapter")

动手实验:不做完不算学完

常见错误 / 排错提醒

  • 训练前没有 baseline
  • 只看 loss 就宣布成功
  • 把训练样本原封不动放进测试集
  • 没有保存模型与数据版本号

本课验收产物

你人生第一个真正可加载的 LoRA Adapter + 训练前后评测报告。