lora finetuning tuning guide

LoRA微调参数调优指南

引言 LoRA(Low-Rank Adaptation)是最流行的参数高效微调方法之一,通过在冻结的预训练权重上添加低秩适配矩阵,以极少的可训练参数实现有效的模型微调。然而,LoRA的效果高度依赖参数配置——错误的参数组合可能导致微调无效甚至损害模型能力。本文提供LoRA微调参数调优的系统性指南。 LoRA原理简述 LoRA将权重更新分解为两个低秩矩阵的乘积: W_new = W_frozen + ΔW = W_frozen + B × A 其中A是r×d的矩阵,B是d×r的矩阵,r远小于d。训练时只更新A和B,原始权重W保持冻结。这使可训练参数从O(d²)降低到O(rd),大幅减少显存和计算需求。 核心参数详解 参数一:秩(Rank, r) 含义:低秩矩阵的秩,决定了适配器的表达能力和参数量。 常见取值范围:r = 4, 8, 16, 32, 64 影响分析: r过小(如r=1-4):表达能力不足,难以学习复杂的领域知识。适合简单任务(如风格迁移)。 r适中(如r=8-16):大多数任务的最佳区间。在表达能力和泛化能力间取得平衡。 r过大(如r=64-128):参数量增加,可能过拟合。仅在复杂任务和大数据量时有收益。 选型建议: # 根据任务复杂度选择r task_complexity = { '风格迁移': 4, '分类任务': 8, '问答任务': 16, '代码生成': 32, '多任务微调': 64 } 参数二:缩放因子(lora_alpha) 含义:LoRA更新的缩放系数,实际更新量 = alpha / r × B × A。 常见取值:alpha = 8, 16, 32 与r的关系:alpha和r的比值(alpha/r)控制更新的幅度。常见的经验设置: alpha = 2 × r(如r=8, alpha=16):最常用,更新幅度适中 alpha = r(如r=16, alpha=16):较小的更新幅度,更保守 alpha = 4 × r(如r=8, alpha=32):较大的更新幅度,学习更快但有过拟合风险 参数三:目标模块(target_modules) 含义:LoRA适配器应用于哪些Transformer模块。 ...

2026-06-27 · 3 min · 453 words · 硅基 AGI 探索者
lora vs dora vs qlora

LoRA vs DoRA vs QLoRA:参数高效微调三剑客对比

LoRA vs DoRA vs QLoRA:参数高效微调三剑客对比 引言 全量微调一个 7B 模型需要 ~60GB 显存,这让大多数开发者望而却步。参数高效微调(PEFT)方法通过只训练极少量参数,实现了接近全量微调的效果。其中最具代表性的是: LoRA(2021):低秩分解,PEFT 的奠基之作 QLoRA(2023):4bit 量化 + LoRA,把显存门槛打到 6GB DoRA(2024):解耦方向与大小,效果逼近全量微调 本文从原理到实践,完整对比三者。 1. LoRA:低秩适配 1.1 核心原理 LoRA 假设模型微调时的权重更新 ΔW 是低秩的: W' = W + ΔW = W + BA 其中: W ∈ R^{d×k}:原始权重(冻结,不训练) B ∈ R^{d×r}:可训练矩阵 A ∈ R^{r×k}:可训练矩阵 r << min(d, k):秩,通常 r=8/16/64 # LoRA 的数学表达 # 前向:h = Wx + BAx = (W + BA)x # 反向:只计算 B 和 A 的梯度,W 的梯度为零 # 初始化策略 # A: 正态分布初始化 N(0, σ²) # B: 零初始化(确保训练开始时 ΔW = BA = 0) 1.2 代码实现 import torch import torch.nn as nn class LoRALayer(nn.Module): """LoRA 层的独立实现""" def __init__( self, in_features: int, out_features: int, r: int = 8, alpha: int = 16, dropout: float = 0.0, ): super().__init__() self.r = r self.scale = alpha / r # 缩放系数 # 原始权重(冻结) self.base_weight = nn.Parameter( torch.randn(out_features, in_features), requires_grad=False ) # LoRA 矩阵 self.lora_A = nn.Parameter(torch.randn(r, in_features) * 0.01) self.lora_B = nn.Parameter(torch.zeros(out_features, r)) self.dropout = nn.Dropout(dropout) def forward(self, x: torch.Tensor) -> torch.Tensor: base_out = x @ self.base_weight.T lora_out = (self.dropout(x) @ self.lora_A.T @ self.lora_B.T) * self.scale return base_out + lora_out # 使用 PEFT 库(推荐) from peft import LoraConfig, get_peft_model config = LoraConfig( r=16, lora_alpha=32, lora_dropout=0.05, target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], bias="none", task_type="CAUSAL_LM", ) model = get_peft_model(base_model, config) 1.3 参数量分析 以 LLaMA-7B(hidden_dim=4096)为例: ...

2026-06-25 · 7 min · 1318 words · 硅基 AGI 探索者
lora qlora finetune guide

LoRA/QLoRA 微调实战指南:显存省 10 倍

全参微调的痛点 全参数微调一个 7B 模型需要: 显存:~80GB(模型权重 14GB + 梯度 14GB + 优化器状态 56GB) 硬件:1×A100 80GB 或 2×A100 40GB 成本:每小时 ¥10-30 LoRA(Low-Rank Adaptation)将这个数字降到 ~8GB,QLoRA 进一步降到 ~5GB。 LoRA 原理:低秩分解 核心数学 LoRA 假设模型微调时的权重更新 ΔW 是低秩的。它将 ΔW 分解为两个小矩阵的乘积: 原始:h = W·x W ∈ R^(d×k),参数量 d×k LoRA:h = W·x + B·A·x A ∈ R^(r×k),B ∈ R^(d×r),参数量 r×(d+k) 当 r << min(d, k) 时,参数量大幅减少 import torch import torch.nn as nn class LoRALayer(nn.Module): def __init__(self, original_layer, rank=8, alpha=16): super().__init__() self.original = original_layer # 冻结的原始权重 self.rank = rank self.alpha = alpha self.scaling = alpha / rank d_out, d_in = original_layer.weight.shape # 低秩矩阵 A 和 B self.lora_A = nn.Parameter(torch.zeros(rank, d_in)) self.lora_B = nn.Parameter(torch.zeros(d_out, rank)) # A 用 Kaiming 初始化,B 用零初始化 nn.init.kaiming_uniform_(self.lora_A, a=5**0.5) # B 初始为 0,所以训练开始时 ΔW = 0,不改变原模型行为 # 冻结原始权重 for param in self.original.parameters(): param.requires_grad = False def forward(self, x): original_output = self.original(x) lora_output = (x @ self.lora_A.T) @ self.lora_B * self.scaling return original_output + lora_output 参数量对比 以 7B 模型为例(隐藏层 4096): ...

2026-06-25 · 5 min · 897 words · 硅基 AGI 探索者
lora qlora practice

LoRA/QLoRA 高效微调实践:单卡训练大模型

LoRA 原理:低秩分解 全量微调更新所有参数:ΔW 与 W 同尺寸。LoRA 的核心洞察:微调时的权重更新是低秩的——可以用两个小矩阵的乘积近似。 全量微调: W' = W + ΔW 参数量 d×k LoRA: W' = W + B×A 参数量 r×(d+k), r << min(d,k) A: 高斯初始化, B: 零初始化 7B 模型的 4096×4096 权重矩阵:全量微调 16.7M 参数,LoRA(r=8) 仅 65K 参数,减少 99.6%。 超参数选择 参数 推荐值 影响 r (rank) 8-64 越大表达能力越强 alpha 通常等于r 控制更新幅度 target_modules q_proj,v_proj / 全线性层 影响效果和显存 dropout 0.05-0.1 防止过拟合 r 的经验法则:r=8 简单任务(格式调整);r=16 中等任务(领域适配);r=32 复杂任务(推理能力)。 QLoRA:再省显存 QLoRA = Quantization + LoRA:基础模型量化到 4-bit 存储,仅在 LoRA 参数上用 16-bit 训练。 ...

2026-06-24 · 2 min · 380 words · 硅基 AGI 探索者
鲁ICP备2026018361号