低参数微调原理
LoRA (Low-Rank Adaptation of Large Language Models) 是一种高效的大模型微调技术。其核心思想是在预训练模型参数基础上,通过冻结原始权重 $W_0$,并引入可训练的低秩增量矩阵 $ riangle W = BA$ 来更新模型。
公式表示为: $$W_{new} = W_0 + riangle W = W_0 + BA$$
其中 $W_0 \in \mathbb{R}^{d \times k}$ 是预训练权重,$B \in \mathbb{R}^{d \times r}$,$A \in \mathbb{R}^{r \times k}$,且秩 $r \ll d, k$。相比全量微调,LoRA 仅需优化少量参数,大幅降低显存占用和计算成本。
1. 理论背景
- Intrinsic Dimensionality:论文指出语言模型虽然参数量巨大,但针对特定任务的隐表征空间维度较低,因此低秩分解不会显著影响性能。
- Adapter vs LoRA:Soft-prompt(如 P-Tuning)通过拼接参数增加输入长度;LoRA 通过相加方式引入参数,不占用输入 Token 长度,推理时无额外延迟。
2. 关键细节
- 微调层选择:基于 Transformer 结构,通常对 Self-Attention 层的 $W_q, W_k, W_v, W_o$ 进行微调。消融实验显示仅微调 $W_q$ 效果略差,微调 $W_q, W_v$ 或全部四个层效果相近。注意不同模型参数命名可能不同(如 ChatGLM 使用
query_key_value)。 - Rank 选取:作者对比了 Rank 1-64,发现 4-8 之间效果最佳。但在指令微调场景下,由于任务分布较广,建议尝试 8 以上取值。
- Alpha 参数:本质是缩放系数,通常设为 $\alpha = r$ 以简化超参调整,实际学习率由 $lr$ 控制。
- 初始化策略:矩阵 A 采用均匀分布初始化,矩阵 B 初始化为零。这使得 LoRA 权重在训练初期为零,不影响原始模型输出,便于稳定收敛。
环境配置
跑通微调的关键在于环境搭建。推荐使用支持 Jupyter、大存储、高速网络及高配 PyTorch 环境的云服务。
推荐实例配置:TRX4090 + Python 3.8 + Torch 2.0 + CUDA 12
依赖安装:主要坑点在于 transformers 和 peft 库的版本兼容性。建议参考官方 Issue 解决冲突。
pip install accelerate appdirs loralib bitsandbytes black datasets fire transformers>=4.28.0 git+https://github.com/huggingface/peft.git sentencepiece gradio wandb cpm-kernel
模型初始化与显存优化
模型加载需结合 PEFT 库实现参数高效微调。以下代码整合自 Alpaca-LoRA 和 ChatGLM-Finetune 项目。
from peft import get_peft_model, LoraConfig, prepare_model_for_int8_training, set_peft_model_state_dict
from transformers import AutoTokenizer, AutoModel
import torch
# 加载模型,开启 8bit 量化以节省静态显存
model = AutoModel.from_pretrained(
"THUDM/chatglm-6b",
load_in_8bit=True,
torch_dtype=torch.float16,
trust_remote_code=True,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(, trust_remote_code=)
model = prepare_model_for_int8_training(model)
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
inference_mode=,
r=,
lora_alpha=,
lora_dropout=,
)
model = get_peft_model(model, lora_config)
model.config.use_cache =


